Forwarded from DevTwitter | توییت برنامه نویسی
سرویسی که گفت: “من دیگه نمیکشم…” و ما رفتیم سراغ Go!
چند ماه پیش متوجه شدم که بار روی یکی از سرویسهامون که مسئولیت محاسبه قیمت، تخفیف و موجودی کالا را برعهده داشت، عجیب بالا رفته.
هی باید بهش ریسورس اضافه میکردیم و هی فاکتور پشتفاکتور… هی سعی می کردیم کد های سمت node js رو باز نویسی کنیم اما باز مشکل وجود داشت
اما یک جایی ایستادم و به مانیتور زل زدم:
«واقعاً تا کی Scale out ؟ تا کی پول بریزیم برای پادهای بیشتر؟»
با بررسی لاگ های کمی که تو سیستم داشتیم و کمی تعمل بیشتر دیدم مشکل ما فقط زبان نیست بلکه دید طراحی ما برای همچین فشاری آماده نشده بود.
و دیدم که مشکل فقط «بار زیاد» نیست؛ مشکل این بود که مدلِ اجرا (single-threaded event loop + heavy allocations) با الگوی کاری سرویس (محاسبهٔ همزمان قیمت/تخفیف/موجودی) همخوانی نداشت.
هرچقدر پاد اضافه میکردیم، هزینه افزایش مییافت اما مشکل اصلی — CPU-bound hot path و فشار GC — همچنان پابرجا بود.
وقتی اینطوری باشه، مهاجرت به runtimeی که برای concurrency و low-overhead execution طراحی شده (مثل Go) یک انتخاب فنی معقول و قابل دفاعه.
پس تصمیم گرفتم همهچیز را با Go دوباره بسازم؛
اما نه صرفاً rewrite — بلکه یک refactor درست در مون
اول از همه، متریکها را جمع کردم.(این کار برای شروع کار حیاتیه)
p95، مصرف CPU، ترافیک همزمان، صف درخواستها…
میخواستم دقیقاً بفهمم کجا درد میکنیم.
بعد شروع کردم به بازطراحی معماری:
سرویس باید کاملاً Stateless میشد
هر درخواست باید موازی و بدون dependency محلی قابل پاسخ باشد
عملیات سنگین محاسبات تخفیف باید Pipeline بشود
با کمک goroutineها و channelها در خواست ها را موازی و سبک تقسیم کردم و شد یک پازل برای گرفتن جواب نهایی
درخواستها را تقسیم کردم، هرکدام موازی، هرکدام سبک، و در نهایت مثل قطعات پازل کنار هم جواب نهایی را ساختیم.
می خواستم برم سمت gRPC که محدودیت زمان اجازه نداد پس رفتم سمت DB و ایندکس گزاری های بهنر و جدا کردن read , write از هم
کش کویری هم اورد وسط و بعد هم از ردیس واسه کش کمک گرفتم
برای invalidate کردن قیمت و موجودی هم معماری event driven کمک گرفتم (حالا هی بگید چرا مهمه بدونیمش)
خوب گفتیم قبل از این که سرور بیاد پایین بفهیم چه خبره تو سیستم… پس یک logging , metrics هم توی سیستم گذاشتم حتی گوروتین ها رو همو پروفایل کردم که oberservity رو افزایش بدم
خلاصه بعد از این کارها . latency تا ۶۰ درصد در پیک ها پایین امد…مصرف cpu قابل حدس شد و هزینه ها به شدت کم شد و بچه های محصول خوشحال (البته بعدش یک عالمه فیچر امد سمتمون)
در کل باید به " performance از همان ابتدای طراحی معماری فکر کرد"
@DevTwitter | <Hessam Zaheri/>
چند ماه پیش متوجه شدم که بار روی یکی از سرویسهامون که مسئولیت محاسبه قیمت، تخفیف و موجودی کالا را برعهده داشت، عجیب بالا رفته.
هی باید بهش ریسورس اضافه میکردیم و هی فاکتور پشتفاکتور… هی سعی می کردیم کد های سمت node js رو باز نویسی کنیم اما باز مشکل وجود داشت
اما یک جایی ایستادم و به مانیتور زل زدم:
«واقعاً تا کی Scale out ؟ تا کی پول بریزیم برای پادهای بیشتر؟»
با بررسی لاگ های کمی که تو سیستم داشتیم و کمی تعمل بیشتر دیدم مشکل ما فقط زبان نیست بلکه دید طراحی ما برای همچین فشاری آماده نشده بود.
و دیدم که مشکل فقط «بار زیاد» نیست؛ مشکل این بود که مدلِ اجرا (single-threaded event loop + heavy allocations) با الگوی کاری سرویس (محاسبهٔ همزمان قیمت/تخفیف/موجودی) همخوانی نداشت.
هرچقدر پاد اضافه میکردیم، هزینه افزایش مییافت اما مشکل اصلی — CPU-bound hot path و فشار GC — همچنان پابرجا بود.
وقتی اینطوری باشه، مهاجرت به runtimeی که برای concurrency و low-overhead execution طراحی شده (مثل Go) یک انتخاب فنی معقول و قابل دفاعه.
پس تصمیم گرفتم همهچیز را با Go دوباره بسازم؛
اما نه صرفاً rewrite — بلکه یک refactor درست در مون
اول از همه، متریکها را جمع کردم.(این کار برای شروع کار حیاتیه)
p95، مصرف CPU، ترافیک همزمان، صف درخواستها…
میخواستم دقیقاً بفهمم کجا درد میکنیم.
بعد شروع کردم به بازطراحی معماری:
سرویس باید کاملاً Stateless میشد
هر درخواست باید موازی و بدون dependency محلی قابل پاسخ باشد
عملیات سنگین محاسبات تخفیف باید Pipeline بشود
با کمک goroutineها و channelها در خواست ها را موازی و سبک تقسیم کردم و شد یک پازل برای گرفتن جواب نهایی
درخواستها را تقسیم کردم، هرکدام موازی، هرکدام سبک، و در نهایت مثل قطعات پازل کنار هم جواب نهایی را ساختیم.
می خواستم برم سمت gRPC که محدودیت زمان اجازه نداد پس رفتم سمت DB و ایندکس گزاری های بهنر و جدا کردن read , write از هم
کش کویری هم اورد وسط و بعد هم از ردیس واسه کش کمک گرفتم
برای invalidate کردن قیمت و موجودی هم معماری event driven کمک گرفتم (حالا هی بگید چرا مهمه بدونیمش)
خوب گفتیم قبل از این که سرور بیاد پایین بفهیم چه خبره تو سیستم… پس یک logging , metrics هم توی سیستم گذاشتم حتی گوروتین ها رو همو پروفایل کردم که oberservity رو افزایش بدم
خلاصه بعد از این کارها . latency تا ۶۰ درصد در پیک ها پایین امد…مصرف cpu قابل حدس شد و هزینه ها به شدت کم شد و بچه های محصول خوشحال (البته بعدش یک عالمه فیچر امد سمتمون)
در کل باید به " performance از همان ابتدای طراحی معماری فکر کرد"
@DevTwitter | <Hessam Zaheri/>
Forwarded from DevTwitter | توییت برنامه نویسی
کتاب Apprenticeship Patterns راهنماییه برای برنامهنویسهایی که میخوان از یه تازهکار، تبدیل به یه حرفهای واقعی بشن.
این ترجمه فارسی، نسخهای روان و کاربردیه از کتاب اصلیه و بهت کمک میکنه مسیر رشد شخصی و فنیت رو آگاهانه طی کنی.
اگه دنبال اینی بدونی چطور باید یاد بگیری، چطور تجربه کسب کنی و چطور خودت رو بسازی، این کتاب دقیقاً همونه که باید بخونی.
github.com/hheydarian/apprenticeship-patterns-persian
@DevTwitter <Hamed Heydarian/>
این ترجمه فارسی، نسخهای روان و کاربردیه از کتاب اصلیه و بهت کمک میکنه مسیر رشد شخصی و فنیت رو آگاهانه طی کنی.
اگه دنبال اینی بدونی چطور باید یاد بگیری، چطور تجربه کسب کنی و چطور خودت رو بسازی، این کتاب دقیقاً همونه که باید بخونی.
github.com/hheydarian/apprenticeship-patterns-persian
@DevTwitter <Hamed Heydarian/>
Forwarded from DevTwitter | توییت برنامه نویسی
توی پروژههای Django معمولاً وقتی میخوای فیلترهای داینامیک بسازی (مثلاً برای API یا صفحه جستجو)، مدیریت query stringها یه دردسر تکراریه.
برای همین یه پکیج نوشتم به اسم django-query-string-parser که کارش اینه query string رو مستقیم تبدیل کنه به Q object، با یه سینتکس خوانا و امن.
چند تا قابلیت مهمش:
- پشتیبانی از عملگرهای مختلف مثل :, !=, >, <, >=, <=, ~=
- ترکیب منطقی با AND / OR و پرانتز
- تعریف فیلدهای مجاز (whitelist) برای امنیت بیشتر
- پشتیبانی از استرینگ، عدد، بولین و null
- خروجی نهایی: یه Q object تمیز برای .filter() یا .exclude()
به درد جاهایی میخوره که بخوای فیلترهای پیچیده ولی قابل خواندن بسازی — مثل APIها، داشبوردها یا پنل ادمین.
نصب:
pip install django-query-string-parser
گیتهاب:
https://github.com/sepehr-mohseni/django-query-string-parser
@DevTwitter | <Nima Naseri/>
برای همین یه پکیج نوشتم به اسم django-query-string-parser که کارش اینه query string رو مستقیم تبدیل کنه به Q object، با یه سینتکس خوانا و امن.
چند تا قابلیت مهمش:
- پشتیبانی از عملگرهای مختلف مثل :, !=, >, <, >=, <=, ~=
- ترکیب منطقی با AND / OR و پرانتز
- تعریف فیلدهای مجاز (whitelist) برای امنیت بیشتر
- پشتیبانی از استرینگ، عدد، بولین و null
- خروجی نهایی: یه Q object تمیز برای .filter() یا .exclude()
به درد جاهایی میخوره که بخوای فیلترهای پیچیده ولی قابل خواندن بسازی — مثل APIها، داشبوردها یا پنل ادمین.
نصب:
pip install django-query-string-parser
گیتهاب:
https://github.com/sepehr-mohseni/django-query-string-parser
@DevTwitter | <Nima Naseri/>
Forwarded from DevTwitter | توییت برنامه نویسی
منطق پشت کلاستر این CockroachDB چقدر قشنگه.
نوعی دیتابیس SQL که به صورت Master Master کلاستر میشه و از پروتکل RAFT استفاده میکنه.
اما چی!؟ ، مگه RAFT ساختارش به صورت Master Slave ایی تعریف نمیشد؟ پس چجوری توی دیتابیس Master Master داره استفاده میشه؟
شاید اونجوری که CockroachDB میگه اصلا Master Master ایی در کار نیست یا تعریف ما متفاوته .
خلاصه اگه علاقه مند هستین چجوری توی CockroachDB ما RAFT داریم، خوشحال میشم مقاله ایی رو که نوشتم مطالعه کنین، حدودا هم ۵ دقیقه وقتتون رو میگیره.
https://medium.com/@parsagheiratian/the-mentality-behind-cockroachdb-0ed524fcc7ec
@DevTwitter | <Parsa Gheiratian/>
️️
نوعی دیتابیس SQL که به صورت Master Master کلاستر میشه و از پروتکل RAFT استفاده میکنه.
اما چی!؟ ، مگه RAFT ساختارش به صورت Master Slave ایی تعریف نمیشد؟ پس چجوری توی دیتابیس Master Master داره استفاده میشه؟
شاید اونجوری که CockroachDB میگه اصلا Master Master ایی در کار نیست یا تعریف ما متفاوته .
خلاصه اگه علاقه مند هستین چجوری توی CockroachDB ما RAFT داریم، خوشحال میشم مقاله ایی رو که نوشتم مطالعه کنین، حدودا هم ۵ دقیقه وقتتون رو میگیره.
https://medium.com/@parsagheiratian/the-mentality-behind-cockroachdb-0ed524fcc7ec
@DevTwitter | <Parsa Gheiratian/>
️️
Forwarded from محتوای آزاد سهراب (Sohrab)
بزرگترین توهینی که به یک فرد میتونید بکنید اینه که موقع بحث کردن باهاش توی موضوعی که بلد نیستید از هوش مصنوعی استفاده کنید و خیلی پررو پررو متن هوش مصنوعی رو کپی پیست کنید تند تند توی بحث.
#غیر_موقت
@SohrabContents
#غیر_موقت
@SohrabContents
Forwarded from 🎄 یک برنامه نویس تنبل (Lazy 🌱)
🔶 نام یک برنامه نویس تنبل آنقدر معروف شده! که کلاهبرداران ارز دیجیتال از اسم این کانال سو استفاده می کند.
@TheRaymondDev
@TheRaymondDev
Forwarded from 🎄 یک برنامه نویس تنبل (Lazy 🌱)
🔶 برای اولین بار در کره جنوبی, 45 دانشجو به دلیل سوابق قلدری در دانشگاه های برتر رد شدند.
#خبر
@TheRaymondDev
#خبر
@TheRaymondDev
Forwarded from 🎄 یک برنامه نویس تنبل (Lazy 🌱)
🔶 برای سایت خودم آمار بازدید ساده نوشتم که چند روز تست کردم و به درستی کار می کند.
این کدی که اشتراک می زارم اینه که بدون نیاز به دیتابیس است و از تاریخهای ذخیره شده برای محاسبه استفاده میکند.
دادهها در جدول wp_options ذخیره میشوند و هر بار که کاربر وارد سایت میشود، بازدید ثبت میشود.
از کوکی استفاده میکند تا هر کاربر فقط یکبار در روز شمارش شود و رباتهای گوگل و موتورهای جستجو را تشخیص داده و شمارش نمیکند.
گیت هاب :
https://github.com/Rayiumir/wp-stats
#وردپرس
@TheRaymondDev
این کدی که اشتراک می زارم اینه که بدون نیاز به دیتابیس است و از تاریخهای ذخیره شده برای محاسبه استفاده میکند.
دادهها در جدول wp_options ذخیره میشوند و هر بار که کاربر وارد سایت میشود، بازدید ثبت میشود.
از کوکی استفاده میکند تا هر کاربر فقط یکبار در روز شمارش شود و رباتهای گوگل و موتورهای جستجو را تشخیص داده و شمارش نمیکند.
گیت هاب :
https://github.com/Rayiumir/wp-stats
#وردپرس
@TheRaymondDev
Forwarded from Codino School (ایمان غفوری)
💥 اولین نسخه از دستور artisan check:stat در لاراول میکروسکوپ منتشر شد.
v1.0.428
@codino
v1.0.428
composer update imanghafoori/laravel-microscope imanghafoori/php-token-analyzer imanghafoori/composer-json
@codino
Forwarded from جامعهٔ فارسی زبان کیدیای
نرمی بصری هنگام تغییر حالت در تنظیمات چندمانیتوره با صفحههای دارای ویآرآر بهبود یافت.
پلاسما ۶.۶.۰
مصرف حافظه پلاسما بیش از ۱۰۰ مگابایت با هوشمندانهتر تخلیه تصاویر پسزمینه غیرضروری کاهش یافت. این عارضه جانبی باعث شد پسزمینههای کاشیشده به دلایل فنی با سیستم جدید غیرممکن شود، پس دوباره به شکل افزونه جدید «کاشیشده» برگردانده شد تا همچنان بتوانید از پسزمینه بینی کد۱ مورد علاقهتان لذت ببرید.
استحکام عملیات کشیدنوانداختن بین پنجرههای اکسویلند و پنجرههای ویلند بومی بهبود یافت.
تغییر وضعیت بلوتوث دیگر رابط کاربری را که با آن تغییر دادید لحظهای نمیبندد.
فعالیت کنونی حالا در پرونده وضعیت ذخیره میشود، نه پرونده پیکربندی.
@KDE_fa
پلاسما ۶.۶.۰
مصرف حافظه پلاسما بیش از ۱۰۰ مگابایت با هوشمندانهتر تخلیه تصاویر پسزمینه غیرضروری کاهش یافت. این عارضه جانبی باعث شد پسزمینههای کاشیشده به دلایل فنی با سیستم جدید غیرممکن شود، پس دوباره به شکل افزونه جدید «کاشیشده» برگردانده شد تا همچنان بتوانید از پسزمینه بینی کد۱ مورد علاقهتان لذت ببرید.
استحکام عملیات کشیدنوانداختن بین پنجرههای اکسویلند و پنجرههای ویلند بومی بهبود یافت.
تغییر وضعیت بلوتوث دیگر رابط کاربری را که با آن تغییر دادید لحظهای نمیبندد.
فعالیت کنونی حالا در پرونده وضعیت ذخیره میشود، نه پرونده پیکربندی.
@KDE_fa
Forwarded from محتوای آزاد سهراب (Sohrab)
این رو علتی که هنوز ننوشتم اینه که اون هفته ارائه من کنسل شد، قرار بود فردا ارائه بدم که استاده پیام گذاشته نمیاد کلاس و کلاس کنسله (مارو مسخره خودش کرده).
من فردا وقت آزاد گیر بیارم این رو یا به رشته تحریر درمیارم یا یک ویدئو میگیرم، احتمالا هم یک شل یونیکسی وایبکد کنیم توی ویدئو و توی این لینوکسشتاین (لینوکس + فرانکشتاین) فرو کنیم :))
@SohrabContents
من فردا وقت آزاد گیر بیارم این رو یا به رشته تحریر درمیارم یا یک ویدئو میگیرم، احتمالا هم یک شل یونیکسی وایبکد کنیم توی ویدئو و توی این لینوکسشتاین (لینوکس + فرانکشتاین) فرو کنیم :))
@SohrabContents
Forwarded from Software Engineer Labdon
Scaling API Independence: Mocking, Contract Testing & Observability in Large Microservices Environments
https://www.infoq.com/presentations/microservices-mocking-observability/
https://www.infoq.com/presentations/microservices-mocking-observability/
InfoQ
Scaling API Independence: Mocking, Contract Testing & Observability in Large Microservices Environments
Tom Akehurst explains strategies for overcoming microservice pain points like environment dependency and slow development. He advocates using realistic API simulation at scale, supported by contract testing , API observability, and GenAI integration. Learn…
Forwarded from Gopher Academy
google/adk-go: An open-source, code-first Go toolkit for building, evaluating, and deploying sophisticated AI agents with flexibility and control.
https://github.com/google/adk-go
https://github.com/google/adk-go
GitHub
GitHub - google/adk-go: An open-source, code-first Go toolkit for building, evaluating, and deploying sophisticated AI agents with…
An open-source, code-first Go toolkit for building, evaluating, and deploying sophisticated AI agents with flexibility and control. - google/adk-go
Forwarded from کانال مهرداد لینوکس
🎉 لینوکس مینت 22.3 و ابزار “System Information” جدید
✅لینوکس مینت ابزار قدیمی «System Reports» را کامل بازطراحی کرده و به «System Information» تبدیل کرده 🤩 تا عملکرد سختافزار را بهتر بهنمایش بده😎
🔹بخش USB: همه دستگاههای متصل شده، نوعشان، شناسهها (ID)، سرعت اتصال و توان مصرفی
🔹بخش GPU: مدل کارت گرافیک، درایورش، وضعیت شتاب سختافزاری
🔹بخش PCI: اطلاعات داخلیتر از قطعات کامپیوتر مثل کنترلرها، درایورها، برندها
🔹بخش BIOS: مادربورد، نسخه BIOS، حالت بوت، وضعیت Secure-Boot
🔥منتظر اپدیت جدید باشید
منبع
@MehrdadLinuxchannel
✅لینوکس مینت ابزار قدیمی «System Reports» را کامل بازطراحی کرده و به «System Information» تبدیل کرده 🤩 تا عملکرد سختافزار را بهتر بهنمایش بده😎
🔹بخش USB: همه دستگاههای متصل شده، نوعشان، شناسهها (ID)، سرعت اتصال و توان مصرفی
🔹بخش GPU: مدل کارت گرافیک، درایورش، وضعیت شتاب سختافزاری
🔹بخش PCI: اطلاعات داخلیتر از قطعات کامپیوتر مثل کنترلرها، درایورها، برندها
🔹بخش BIOS: مادربورد، نسخه BIOS، حالت بوت، وضعیت Secure-Boot
🔥منتظر اپدیت جدید باشید
منبع
@MehrdadLinuxchannel
Forwarded from Gopher Academy
🔵 عنوان مقاله
go-sqlite3: Go Bindings to SQLite Using Wazero
🟢 خلاصه مقاله:
این کتابخانه با نام go-sqlite3 امکان استفاده از SQLite در Go را بدون cgo فراهم میکند. هسته SQLite بهصورت WebAssembly اجرا و درون runtimeِ wazero بارگذاری میشود، در حالیکه رابطی سازگار با database/sql ارائه میدهد. نتیجه این است که بیشتر کدهای موجود مبتنی بر database/sql با کمترین تغییر کار میکنند و در عوض، مزایایی مثل باینریهای کاملاً استاتیک، کراسکامپایل آسان، وابستگیهای کمتر به سیستمعامل و استقرار سادهتر (بهویژه در کانتینر و Serverless) به دست میآید. اجرای SQLite داخل WebAssembly علاوهبر یک محیط ایزوله و قابل پیشبینی، ممکن است محدودیتهایی هم داشته باشد؛ از جمله عدم پشتیبانی برخی افزونههای بومی و کارایی پایینتر نسبت به نسخههای cgo. با این حال برای بسیاری از کاربردها مانند ابزارهای خط فرمان، سرویسهای سبک، تستها و محیطهای ابری، این مبادله بهخاطر قابلحمل بودن و سادگی عملیاتی ارزشمند است.
#Go #SQLite #WebAssembly #wazero #database_sql #cgo #GoBindings #Serverless
🟣لینک مقاله:
https://golangweekly.com/link/176633/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
go-sqlite3: Go Bindings to SQLite Using Wazero
🟢 خلاصه مقاله:
این کتابخانه با نام go-sqlite3 امکان استفاده از SQLite در Go را بدون cgo فراهم میکند. هسته SQLite بهصورت WebAssembly اجرا و درون runtimeِ wazero بارگذاری میشود، در حالیکه رابطی سازگار با database/sql ارائه میدهد. نتیجه این است که بیشتر کدهای موجود مبتنی بر database/sql با کمترین تغییر کار میکنند و در عوض، مزایایی مثل باینریهای کاملاً استاتیک، کراسکامپایل آسان، وابستگیهای کمتر به سیستمعامل و استقرار سادهتر (بهویژه در کانتینر و Serverless) به دست میآید. اجرای SQLite داخل WebAssembly علاوهبر یک محیط ایزوله و قابل پیشبینی، ممکن است محدودیتهایی هم داشته باشد؛ از جمله عدم پشتیبانی برخی افزونههای بومی و کارایی پایینتر نسبت به نسخههای cgo. با این حال برای بسیاری از کاربردها مانند ابزارهای خط فرمان، سرویسهای سبک، تستها و محیطهای ابری، این مبادله بهخاطر قابلحمل بودن و سادگی عملیاتی ارزشمند است.
#Go #SQLite #WebAssembly #wazero #database_sql #cgo #GoBindings #Serverless
🟣لینک مقاله:
https://golangweekly.com/link/176633/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
GitHub
GitHub - ncruces/go-sqlite3: Go bindings to SQLite using wazero
Go bindings to SQLite using wazero. Contribute to ncruces/go-sqlite3 development by creating an account on GitHub.
Forwarded from Linuxor ?
کل علم مهندسی نرم افزار بر پایه تکامل تدریجی و تکرار برای بهبود ساخته شده، یعنی شما یه چیزی میسازین به مرور هی بهتر و سازگار ترش میکنید. (کل شرکت های بزرگ هم همینکارو میکنن)
حالا سوال پیش میآد، یکی میگه من علم مهندسی نرم افزار رو کلا قبول ندارم میخوام یه چیز ابرقهرمان بسازم که تکاملی نباشه و یهویی یه چیز قوی باشه آیا ممکنه؟ جواب بله ممکنه، چون مهندسی نرم افزار الزاما بهینه ترین مسیر رو نرفته یعنی این علمی که داریم الان بهترین مسیرش نیست، ولی اینکه شما بتونید رندوم یه چیز بهینه تر ازش پیدا کنید کار عملا سختیه، ولی ممکنه.
برای مثال یه تیم شاید 10 سال برای تولید یه برنامه آموزش زبان با چت کردن وقت گذاشته باشن و کلی الگوریتم براش نوشته باشن و یه چیز حرفه ای و قابلیت گفتگوی حرفه ای ساخته باشن، اما امروز یه نفر یه هفته ای همین کارو با LLM ها مشابهش رو بسازه. ولی دقت کنید همیشه شانس باهاتون یار نیست و LLM هم ممکنه وجود نداشته باشه.
@Linuxor
حالا سوال پیش میآد، یکی میگه من علم مهندسی نرم افزار رو کلا قبول ندارم میخوام یه چیز ابرقهرمان بسازم که تکاملی نباشه و یهویی یه چیز قوی باشه آیا ممکنه؟ جواب بله ممکنه، چون مهندسی نرم افزار الزاما بهینه ترین مسیر رو نرفته یعنی این علمی که داریم الان بهترین مسیرش نیست، ولی اینکه شما بتونید رندوم یه چیز بهینه تر ازش پیدا کنید کار عملا سختیه، ولی ممکنه.
برای مثال یه تیم شاید 10 سال برای تولید یه برنامه آموزش زبان با چت کردن وقت گذاشته باشن و کلی الگوریتم براش نوشته باشن و یه چیز حرفه ای و قابلیت گفتگوی حرفه ای ساخته باشن، اما امروز یه نفر یه هفته ای همین کارو با LLM ها مشابهش رو بسازه. ولی دقت کنید همیشه شانس باهاتون یار نیست و LLM هم ممکنه وجود نداشته باشه.
@Linuxor
Forwarded from DevTwitter | توییت برنامه نویسی
به اون کاری که امروز کردی نگو "ریفکتور" (Refactor). اگه تست نداره، اون فقط یه "گندکاریِ تمیزه".
این فقط یه جملهی قشنگ نیست؛ این یه زخمه که من هنوز یادمه.
اوایل کارم، میخواستم قهرمان باشم. ️ تو یه پروژهی لگسی، یه "God Function" هزار خطی پیدا کردم و گفتم: "من اینو تمیز میکنم!"
نشستم و تیکهتیکهاش کردم. ۵۰ تا تابع کوچولوی تر و تمیز. اصل DRY رو پیاده کردم. ظاهر کد عالی شد. "تمیز" و "حرفهای". احساس غرور میکردم.
مشکل چی بود؟ اون کد اصلی لعنتی، یه دونه هم تست خودکار نداشت.
اونجا بود که فاجعه اتفاق افتاد. کاری که من انجام دادم، "ریفکتور" نبود؛ "تغییر دادنِ کورکورانه" بود.
اون کد "تمیز" من، چند تا باگ جدید و پنهان داشت. چرا؟ چون اون "کد اسپاگتی" زشت، پر از منطقهای تجاری پنهان و وابستگیهای زمانی بود که فقط تو همون حالت کار میکرد.
من "بدهی فنی" رو پرداخت نکردم؛ من یه بدهی کمبهره (مثل تکرار کد که فهمیدنش ساده بود) رو برداشتم و با یه بدهی پربهره (مثل یه "انتزاع اشتباه" که حالا دیباگ کردنش غیرممکنه) عوض کردم.
این "تلهی کد تمیز"ئه. مهمترین تعریفی که تو این صنعت باید بلد باشیم مال مایکل فدرز (Michael Feathers) ئه: "کد لگسی، کدیه که تست نداره." همین.
تو یه سیستم لگسی، قانون اول "تمیز کن" نیست. قانون اول اینه: "اول امنش کن." برو "تستهای مشخصهیابی" (Characterization Tests) بنویس تا رفتار فعلیِ سیستم (با همهی باگهاش) رو قفل کنی. وقتی اون تور ایمنی رو ساختی، اونوقت حق داری که شروع به تمیزکاری کنی.
@DevTwitter | <Hossein Moradi/>
این فقط یه جملهی قشنگ نیست؛ این یه زخمه که من هنوز یادمه.
اوایل کارم، میخواستم قهرمان باشم. ️ تو یه پروژهی لگسی، یه "God Function" هزار خطی پیدا کردم و گفتم: "من اینو تمیز میکنم!"
نشستم و تیکهتیکهاش کردم. ۵۰ تا تابع کوچولوی تر و تمیز. اصل DRY رو پیاده کردم. ظاهر کد عالی شد. "تمیز" و "حرفهای". احساس غرور میکردم.
مشکل چی بود؟ اون کد اصلی لعنتی، یه دونه هم تست خودکار نداشت.
اونجا بود که فاجعه اتفاق افتاد. کاری که من انجام دادم، "ریفکتور" نبود؛ "تغییر دادنِ کورکورانه" بود.
اون کد "تمیز" من، چند تا باگ جدید و پنهان داشت. چرا؟ چون اون "کد اسپاگتی" زشت، پر از منطقهای تجاری پنهان و وابستگیهای زمانی بود که فقط تو همون حالت کار میکرد.
من "بدهی فنی" رو پرداخت نکردم؛ من یه بدهی کمبهره (مثل تکرار کد که فهمیدنش ساده بود) رو برداشتم و با یه بدهی پربهره (مثل یه "انتزاع اشتباه" که حالا دیباگ کردنش غیرممکنه) عوض کردم.
این "تلهی کد تمیز"ئه. مهمترین تعریفی که تو این صنعت باید بلد باشیم مال مایکل فدرز (Michael Feathers) ئه: "کد لگسی، کدیه که تست نداره." همین.
تو یه سیستم لگسی، قانون اول "تمیز کن" نیست. قانون اول اینه: "اول امنش کن." برو "تستهای مشخصهیابی" (Characterization Tests) بنویس تا رفتار فعلیِ سیستم (با همهی باگهاش) رو قفل کنی. وقتی اون تور ایمنی رو ساختی، اونوقت حق داری که شروع به تمیزکاری کنی.
@DevTwitter | <Hossein Moradi/>
Forwarded from محتوای آزاد سهراب (Sohrab)
توی دانشگاه امروز قرار بود درمورد ساختار سیستم عامل گنو صحبت کنم و یک توزیع مینیمال رو با استفاده از کرنل و بیزیباکس بیلد بگیرم، متاسفانه کلاسم کنسل شد و من روش بیلد رو توی بلاگم نوشتم که اگر کسی دوست داشت برای سرگرمی این کار رو انجام بده.
https://blogfa.sohrabbehdani.ir/kernel-busybox
#فقط_برای_سرگرمی
@SohrabContents
https://blogfa.sohrabbehdani.ir/kernel-busybox
#فقط_برای_سرگرمی
@SohrabContents
Forwarded from Gopher Academy
🔵 عنوان مقاله
switch Statements in Go
🟢 خلاصه مقاله:
این مطلب از Golang Weekly بهصورت عملی سراغ عبارتهای switch در Go میرود و نشان میدهد چگونه میتوان بهجای زنجیرههای if/else طولانی، کدی خواناتر نوشت. ابتدا نحو و قواعد ارزیابی switch، استفاده از چند مقدار در یک case، نقش default، و این نکته که در Go سقوط خودکار بین caseها وجود ندارد و فقط با fallthrough فعال میشود، توضیح داده میشود. سپس فرم بدون تگِ switch { ... } برای نگارش نگهبانهای منطقیِ مرتب معرفی میشود.
بخش بعدی به type switch اختصاص دارد: وقتی با interface سروکار دارید، switch روی v.(type) اجازه میدهد بر اساس نوع واقعی تصمیم بگیرید، از nil بهدرستی عبور کنید و محدوده متغیرها در سربرگ switch و داخل caseها را مدیریت کنید. مقاله الگوهای کاربردی مثل مسیردهی بر اساس روش HTTP، دستهبندی خطاها برحسب نوع، شاخهبندی زمانمحور و استفاده از ثابتها را مرور میکند و در کنار آن به نکات سبک و کارایی اشاره دارد. جمعبندی این است که با رعایت چند قاعده ساده و پرهیز از دامهای متداول، switch در Go ابزاری شفاف، قابل نگهداری و گاه سریعتر از شرطهای زنجیرهای خواهد بود.
#Go #Golang #GolangWeekly #switch #TypeSwitch #GoTips #Programming #Backend
🟣لینک مقاله:
https://golangweekly.com/link/176626/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
switch Statements in Go
🟢 خلاصه مقاله:
این مطلب از Golang Weekly بهصورت عملی سراغ عبارتهای switch در Go میرود و نشان میدهد چگونه میتوان بهجای زنجیرههای if/else طولانی، کدی خواناتر نوشت. ابتدا نحو و قواعد ارزیابی switch، استفاده از چند مقدار در یک case، نقش default، و این نکته که در Go سقوط خودکار بین caseها وجود ندارد و فقط با fallthrough فعال میشود، توضیح داده میشود. سپس فرم بدون تگِ switch { ... } برای نگارش نگهبانهای منطقیِ مرتب معرفی میشود.
بخش بعدی به type switch اختصاص دارد: وقتی با interface سروکار دارید، switch روی v.(type) اجازه میدهد بر اساس نوع واقعی تصمیم بگیرید، از nil بهدرستی عبور کنید و محدوده متغیرها در سربرگ switch و داخل caseها را مدیریت کنید. مقاله الگوهای کاربردی مثل مسیردهی بر اساس روش HTTP، دستهبندی خطاها برحسب نوع، شاخهبندی زمانمحور و استفاده از ثابتها را مرور میکند و در کنار آن به نکات سبک و کارایی اشاره دارد. جمعبندی این است که با رعایت چند قاعده ساده و پرهیز از دامهای متداول، switch در Go ابزاری شفاف، قابل نگهداری و گاه سریعتر از شرطهای زنجیرهای خواهد بود.
#Go #Golang #GolangWeekly #switch #TypeSwitch #GoTips #Programming #Backend
🟣لینک مقاله:
https://golangweekly.com/link/176626/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Dolthub
Switch Statements in Go
Switch statements in Go have unique features that make it easy to write complex flow controls. Read this blog to see what makes them so special.
Forwarded from DevTwitter | توییت برنامه نویسی
This media is not supported in your browser
VIEW IN TELEGRAM
این پروژه اپن سورس جالب strix رو یه نگاه بندازین. یه جورایی انگار یه تیم هکر هوش مصنوعی اپنسورس استخدام کردین که شبانهروزی حواسشون به اپلیکیشنهاتون هست.
این ایجنتهای AI دقیقاً مثل هکرهای واقعی رفتار میکنن. کد شما رو به صورت داینامیک اجرا میکنن، آسیبپذیریها رو پیدا میکنن و برای اینکه ثابت کنن الکی نمیگن، براتون PoC (اثبات مفهومی) واقعی میسازن.
بهترین بخشش اینه که دیگه از شر اون همه false positive (هشدارهای الکی) که ابزارهای اسکن استاتیک میدن خلاص میشید. Strix واقعاً باگ رو پیدا میکنه و بهتون نشون میده.
یه جعبه ابزار کامل هکری هم داره:
- پراکسی HTTP
- اتوماسیون مرورگر
- محیط ترمینال
- و حتی رانتایم پایتون
تازه، میتونه تو CI/CD شما هم ادغام بشه و جلوی کدهای آسیبپذیر رو قبل از اینکه اصلاً به پروداکشن برسن بگیره.
به جای اینکه هفتهها منتظر تست نفوذ دستی بمونید، با Strix میتونید تو چند ساعت یه تست کامل بگیرید.
Github: https://github.com/usestrix/strix
@DevTwitter | <Mehdi Allahyari/>
این ایجنتهای AI دقیقاً مثل هکرهای واقعی رفتار میکنن. کد شما رو به صورت داینامیک اجرا میکنن، آسیبپذیریها رو پیدا میکنن و برای اینکه ثابت کنن الکی نمیگن، براتون PoC (اثبات مفهومی) واقعی میسازن.
بهترین بخشش اینه که دیگه از شر اون همه false positive (هشدارهای الکی) که ابزارهای اسکن استاتیک میدن خلاص میشید. Strix واقعاً باگ رو پیدا میکنه و بهتون نشون میده.
یه جعبه ابزار کامل هکری هم داره:
- پراکسی HTTP
- اتوماسیون مرورگر
- محیط ترمینال
- و حتی رانتایم پایتون
تازه، میتونه تو CI/CD شما هم ادغام بشه و جلوی کدهای آسیبپذیر رو قبل از اینکه اصلاً به پروداکشن برسن بگیره.
به جای اینکه هفتهها منتظر تست نفوذ دستی بمونید، با Strix میتونید تو چند ساعت یه تست کامل بگیرید.
Github: https://github.com/usestrix/strix
@DevTwitter | <Mehdi Allahyari/>