DevTwitter | توییت برنامه نویسی
خب بریم سراغ نتایج StackOverFlow Developer Survey سال ۲۰۲۵ فقط یک چهارم developerها از شغل فعلی شون رضایت دارن استفاده کنندگان از AI agentها اکثرا معتقدند که productivityشون زیاد شده بیشتر developerها به نتایج AI tools اعتماد ندارن که بنظرم منطقی هم هست استفاده…
هرچی از زیبایی Elixir بگم کمه ؛ )
❤3🔥2
Forwarded from DevTwitter | توییت برنامه نویسی
ما وقتی برنامه Go مون رو میبندیم، فقط یه Ctrl+C میزنیم و میگیم:
“خب، shutdown شد!”
و تمام!
ولی واقعیت اینه که خاموش شدن یه سرویس واقعی، اونم توی Production،
خیلی بیشتر از یه سیگنال سادهست.
اگه درست پیادهسازی نشه:
- ممکنه وسط ارسال درخواست، ارتباط قطع شه
- جابها در حال پردازش نصفهکاره بمونن
- کانکشنها به دیتابیس یا Redis نشت کنن
- و حتی برنامه قبل از تموم شدن goroutineها، کلاً بسته شه
تو این مقاله، بهصورت خلاصه نوشتم:
- چطور با signal.NotifyContext درست shutdown رو هندل کنیم
- چطور http.Server رو با Shutdown(ctx) ببندیم
- چطور workerها رو با context و sync.WaitGroup تمیز ببندیم
- و تو Kubernetes چطور از terminationGracePeriodSeconds درست استفاده کنیم
https://medium.com/@a.mousavi/graceful-shutdown-in-go-part-1-build-production-ready-services-without-dropping-requests-b55934c217c1
@DevTwitter | <Arash Mousavi/>
“خب، shutdown شد!”
و تمام!
ولی واقعیت اینه که خاموش شدن یه سرویس واقعی، اونم توی Production،
خیلی بیشتر از یه سیگنال سادهست.
اگه درست پیادهسازی نشه:
- ممکنه وسط ارسال درخواست، ارتباط قطع شه
- جابها در حال پردازش نصفهکاره بمونن
- کانکشنها به دیتابیس یا Redis نشت کنن
- و حتی برنامه قبل از تموم شدن goroutineها، کلاً بسته شه
تو این مقاله، بهصورت خلاصه نوشتم:
- چطور با signal.NotifyContext درست shutdown رو هندل کنیم
- چطور http.Server رو با Shutdown(ctx) ببندیم
- چطور workerها رو با context و sync.WaitGroup تمیز ببندیم
- و تو Kubernetes چطور از terminationGracePeriodSeconds درست استفاده کنیم
https://medium.com/@a.mousavi/graceful-shutdown-in-go-part-1-build-production-ready-services-without-dropping-requests-b55934c217c1
@DevTwitter | <Arash Mousavi/>
🔥5
DevTwitter | توییت برنامه نویسی
ما وقتی برنامه Go مون رو میبندیم، فقط یه Ctrl+C میزنیم و میگیم: “خب، shutdown شد!” و تمام! ولی واقعیت اینه که خاموش شدن یه سرویس واقعی، اونم توی Production، خیلی بیشتر از یه سیگنال سادهست. اگه درست پیادهسازی نشه: - ممکنه وسط ارسال درخواست، ارتباط قطع…
همیشه Graceful shutdown نیاز سیستم های اینترپرایز هست.
🔥6
Forwarded from tech-afternoon (Amin Mesbahi)
از اونجایی که تعداد تیمهایی که تلاش کردن/میکنن تا DDD رو پیادهسازی کنن و یا محصول مبتنی بر معماری مایکروسرویس توسعه بدن، ولی در میانهی راه متوجه دشواریها، مشکلات و یا اشتباهات متعدد طراحی و پیادهسازی میشن، کم نیست؛ خوبه تا پرسش رو مرور کنیم، تا اگر موضوع مورد اقبالی بود بیشتر در موردش گپ بزنیم.
تا حالا به خواستگاه و پیشینهی خالقین DDD یا Microservice توجه داشتید؟ منظورم «خواستگاه نیازهایی» است که به خاطر برطرف شدن اون نیازها، افرادی با «پیشینه و تجربهی مشخص در تعامل با نوع خاصی از مسائل و سازمانها» شروع به طراحی راهکار یا پاسخ برای اون نیازها در اون سازمانها کردن؛ و بعدتر این راهکارها در سازمانهایی با چه مختصات و ابعادی، توسط چه افرادی توسعه و تکامل پیدا کرد تا امروز به انضمام این تعداد کتاب و مقاله و ویدیو و کنفرانس، در اختیار ما باشه؟!
بیاید با هم چند تا سوال کاریکاتوریزه رو مرور کنیم:
۱: از نظر امکانات در دسترس: آیا یک پزشک حاذق که تمام عمرش در پیشرفتهترین بیمارستانهای ژاپن یا سوییس تحصیل و کسبتجربه کرده؛ به صورت مستقیم (و طبیعتا بدون تغییر و سازگارپذیری) میتونه بره در یکی از مناطق محروم اتیوپی شروع به درمان کنه؟
۲: از نظر مقیاسها: آیا مرسومه که از ابزارآلات تعمیر ماشینهای معدن در کارگاه ساعتسازی استفاده کنن یا برعکس؟
هدفم از طرح این دو سوال، اینه که خیلی از مشکلاتی که میبینیم به خاطر یک عدم سازگاری یا تناسب بین نیاز، شرایط، و راهکاره! توجه به پیشنیازهای محیطی، و بستری که یک معماری میتونه توش به شکل صحیح پیاده بشه، یا کمتر مورد توجه قرار میگیره یا با خطای ادراکی روبرو میشه و نتیجهاش یا شکسته، یا دردسر، یا موجود عجیبالخلقهای که کسی قادر به درکش نیست!
🔑 چاره کار چیه؟
» اگر دنبال یک مسیر قابل تعمیم به عام باشیم، راه رو به خطا رفتیم؛ عملا عیار یک architect یا software engineer سنیور یا بالاتر (بسته به سایز سازمان و محصول) در میزان موفقیت و ظرافتهای طراحی مسیر، راهکار و معماری مشخص میشه. قرار هم نبوده و نیست، همه یک میزان موفقیت کسب کنن. خیلیها هم شکست میخورن یا پیروزینمایی میکنن.
(موضوعاتی مثل Strategic DDD یا Modular Monolith/Modulith، شناسایی پیشنیازها، فازبندی تغییرات و پیادهسازی، امکانپذیری transformation و... میتونن محور این سری از مطالب باشن)
👨🏼🦳 مارتین فالر: توی مقاله معروف "Microservice Prerequisites" سه تا پیشنیاز اساسی رو مطرح میکند:
قابلیت Rapid provisioning: قابلیت راهاندازی سریع infrastructure
قابلیت Basic monitoring: نظارت و observability
قابلیت Rapid application deployment: استقرار سریع نرمافزار
«در صورت ادامه بحث، چند مورد دیگه رو هم من بنا به تجربه اضافه خواهم کرد»
👨🏼🦳 کریس ریچاردسون توی کتاب "Microservices Patterns" بحث pattern-based approach رو ارائه میکنه وبارها تأکید داره مایکروسرویس «نسخهی واحد برای همه» نیست و باید دید کِی و چرا سراغش بریم؛ حتی «دلایل نادرست برای پذیرش مایکروسرویس» رو هم مستند کرده.
👨🏼🦳 استفان تیلکوف توی مقاله «Don’t start with a monolith» میگه وقتی هدف نهایی شما معماریِ مایکروسرویس باشه (بهویژه برای سیستمهای بزرگ)، «شروع با مونولیت» غالباً انتخاب درستی نیست و باید از اول به مرزبندیهای سختگیرانه و سیستمهای مستقل فکر کرد. بعدتر تیلکوف الگوی Self-Contained Systems (SCS) رو هم بهعنوان رویکرد همخانواده و کماصطکاکتر معرفی میکنه. ۴ سال بعدش، سم نیومن میاد روی روشها و الگوهای تکاملی برای شکستن مونولیت تمرکز میکنه (نه نفی یا اثبات مطلق هر کدوم)، و راهکارهای عملی برای مهاجرت تدریجی ارائه میده. کتاب معروف نیومن یعنی "Monolith to Microservices" عملاً پاسخ عملیِ «چگونه از مونولیت به مایکروسرویس برسیم؟» حساب میشه (اینو گفتم که بگم بین علما و بزرگان هم تفاوت نظر وجود داره 😁 خصوصا در مورد فالر و ریچاردسون؛ چون فالر استراتژی «اول مونولیت» برای شروع کارهای جدید رو طرح میکنه و میگه با این نکته که حتی اگه بعداً احتمالاً به مایکروسرویس برسید! این دیدگاه روبهروی موضع تیلکوف قرار میگیره و نشون میده اختلافنظر معنادار بین علما جدیه! )
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5🥴2
Forwarded from صادق سپندارند
جریانهای کاریِ معیوب و چگونگی درست کردنشان
اگر صبحها احساس میکنید کار از لحظهی اول «گیر» میکند یا هر پیام کاری «فوری»تر از قبلی میشود و یا هر جلسه برای حل جلسهی قبل است احتمالاً مسئله شما تنبلی یا چیزهایی از این جنس نیست؛ «جریان کار»تان خراب است. خبر خوب؟ درستکردنش پیچیده و گران نیست؛ فقط نیاز به نگاه کردنِ درست دارد.
کتابها و تجربهها یک نکتهی طلایی میگویند: بروید و ببینید کار واقعاً چگونه انجام میشود. پشت داشبوردها همهچیز مرتب است، اما کفِ کار، گرههای کوچک، کوه میشوند. یک استاد مدیریت تعریف میکرد که چرا عملهای پیوند دیر شروع میشدند؛ همه دنبال «دکتر مقصر» بودند، اما با کمی مشاهده معلوم شد گره اصلی «پارکینگ» است! یک اصلاح ساده، کل برنامه را روان کرد.
مشکل رایج بعدی، برچسب “فوری” است. وقتی هر چیزی «اولویت یک» میشود، هیچچیز اولویت ندارد. راهحل: یک صفِ مشترک و شفاف بسازید؛ کارها را رتبهبندی کنید و قبل از شروع مورد بعدی، مورد فعلی را ببندید. یک بانک بینالمللی با همین کارو یک جلسهی هفتگی که همهی ذینفعان در آن روی یک فهرست مشترک تصمیم میگرفتند—میانگینِ زمانِ تأیید پروژهها را از ۱۲۰ روز به ۲۰ روز رساند.
نکتهی غیر شهودی اما حیاتی: استفادهی ۱۰۰٪ از آدمها، خروجی را بیشتر نمیکند؛ گلوگاه میسازد. کمی فضای خالی برای فکر و اصلاح بگذارید. هر جا حس کردید تیم برای عبور از یک پیچ، «میانبُر» میزند، بدانید سیستم دارد سیگنال میدهد: فرایند را ترمیم کنید، نه آدمها را فرسوده.
برای راهانداختنِ جریان، از همین چند حرکت ساده شروع کنید:
•تعریف «تمامشدن» را برای هر کار بنویسید (چه تحویلی، با چه معیار).
•کارهای همزمان را محدود کنید؛ بهجای ۱۰ کار نیمهتمام، ۳ کار کامل.
•تابلوی دیداری بزنید (فیزیکی یا دیجیتال): «در صف / در حال انجام / تمام».
•جلسهی هفتگیِ یکساعتهی بینوظیفهای برگزار کنید؛ یک فهرست مشترک، تصمیمِ واحد.
•بازخوردِ کفِ کار بگیرید؛ اگر از آنچه میبینید خجالتزده نمیشوید، کافی دقیق نشدهاید.
•اندازه بگیرید: زمانِ انتظار، زمانِ انجام، و نرخ بازگشت کار برای اصلاح. فقط همین سه تا.
فلسفهاش ساده است: کارخانهی خوب، «قهرمان» ندارد؛ جریانِ خوب دارد. هر جا کار گیر کرد، بهجای فشار بیشتر، اصطکاک را کم کنید. با شفافسازی، محدودکردن کارِ در جریان، و دیدن واقعیتِ کفِ کار، شلوغیِ بیحاصل به ثباتِ سودمند بدل میشود و ناگهان میبینید بدون اضافهکاری، خروجی بیشتر شده است
#مدیریت #رهبری #جریان_کار #گلوگاه #بهبود_فرایند #اکونومیست #سپندارند
اگر صبحها احساس میکنید کار از لحظهی اول «گیر» میکند یا هر پیام کاری «فوری»تر از قبلی میشود و یا هر جلسه برای حل جلسهی قبل است احتمالاً مسئله شما تنبلی یا چیزهایی از این جنس نیست؛ «جریان کار»تان خراب است. خبر خوب؟ درستکردنش پیچیده و گران نیست؛ فقط نیاز به نگاه کردنِ درست دارد.
کتابها و تجربهها یک نکتهی طلایی میگویند: بروید و ببینید کار واقعاً چگونه انجام میشود. پشت داشبوردها همهچیز مرتب است، اما کفِ کار، گرههای کوچک، کوه میشوند. یک استاد مدیریت تعریف میکرد که چرا عملهای پیوند دیر شروع میشدند؛ همه دنبال «دکتر مقصر» بودند، اما با کمی مشاهده معلوم شد گره اصلی «پارکینگ» است! یک اصلاح ساده، کل برنامه را روان کرد.
مشکل رایج بعدی، برچسب “فوری” است. وقتی هر چیزی «اولویت یک» میشود، هیچچیز اولویت ندارد. راهحل: یک صفِ مشترک و شفاف بسازید؛ کارها را رتبهبندی کنید و قبل از شروع مورد بعدی، مورد فعلی را ببندید. یک بانک بینالمللی با همین کارو یک جلسهی هفتگی که همهی ذینفعان در آن روی یک فهرست مشترک تصمیم میگرفتند—میانگینِ زمانِ تأیید پروژهها را از ۱۲۰ روز به ۲۰ روز رساند.
نکتهی غیر شهودی اما حیاتی: استفادهی ۱۰۰٪ از آدمها، خروجی را بیشتر نمیکند؛ گلوگاه میسازد. کمی فضای خالی برای فکر و اصلاح بگذارید. هر جا حس کردید تیم برای عبور از یک پیچ، «میانبُر» میزند، بدانید سیستم دارد سیگنال میدهد: فرایند را ترمیم کنید، نه آدمها را فرسوده.
برای راهانداختنِ جریان، از همین چند حرکت ساده شروع کنید:
•تعریف «تمامشدن» را برای هر کار بنویسید (چه تحویلی، با چه معیار).
•کارهای همزمان را محدود کنید؛ بهجای ۱۰ کار نیمهتمام، ۳ کار کامل.
•تابلوی دیداری بزنید (فیزیکی یا دیجیتال): «در صف / در حال انجام / تمام».
•جلسهی هفتگیِ یکساعتهی بینوظیفهای برگزار کنید؛ یک فهرست مشترک، تصمیمِ واحد.
•بازخوردِ کفِ کار بگیرید؛ اگر از آنچه میبینید خجالتزده نمیشوید، کافی دقیق نشدهاید.
•اندازه بگیرید: زمانِ انتظار، زمانِ انجام، و نرخ بازگشت کار برای اصلاح. فقط همین سه تا.
فلسفهاش ساده است: کارخانهی خوب، «قهرمان» ندارد؛ جریانِ خوب دارد. هر جا کار گیر کرد، بهجای فشار بیشتر، اصطکاک را کم کنید. با شفافسازی، محدودکردن کارِ در جریان، و دیدن واقعیتِ کفِ کار، شلوغیِ بیحاصل به ثباتِ سودمند بدل میشود و ناگهان میبینید بدون اضافهکاری، خروجی بیشتر شده است
#مدیریت #رهبری #جریان_کار #گلوگاه #بهبود_فرایند #اکونومیست #سپندارند
🔥4👍2
صادق سپندارند
جریانهای کاریِ معیوب و چگونگی درست کردنشان اگر صبحها احساس میکنید کار از لحظهی اول «گیر» میکند یا هر پیام کاری «فوری»تر از قبلی میشود و یا هر جلسه برای حل جلسهی قبل است احتمالاً مسئله شما تنبلی یا چیزهایی از این جنس نیست؛ «جریان کار»تان خراب است.…
"کارخانهی خوب، قهرمان ندارد؛ جریان خوب دارد."
🔥4👍3
Audio
❤3🔥3
🔥3👍1🤣1
Forwarded from فرانت چپتر 🥕
🎮 ایونت حضوری منتینو: تقویت مهارتهای نرم برای برنامهنویسها
یه تجربه متفاوت و کاربردی برای برنامهنویسها و فعالای دنیای تکنولوژی!
توی این رویداد علاوه بر یه بازی گروهی جذاب که مخصوص تمرین مهارتهای نرم کلیدی برای برنامهنویسها طراحی شده، یه پنل گفتوگوی تخصصی هم داریم.
چی در انتظارتونه؟
✨ بازی گروهی تعاملی برای تمرین واقعی مهارتهایی مثل:
✨ کار تیمی
✨ ارتباط مؤثر
✨ حل مسئله
✨ تصمیمگیری درست
رو بهطور واقعی تمرین و تقویت میکنی.
👥 فرصت عالی برای شبکهسازی با آدمای همفکر و هممسیر توی حوزه برنامهنویسی و تکنولوژی
💬 پنل گفتوگو با چند نفر از افراد باتجربه حوزه نرمافزار درباره نقش مهارتهای نرم در رشد شغلی برنامهنویسها
🚀 چند ساعتی کنار هم بازی میکنیم، یاد میگیریم، تجربه ردوبدل میکنیم و کلی کانکشن حرفهای میزنیم.
📅 جمعه ۱۸ مهر
🕒 ساعت ۱۵ تا ۲۰
📍 تهران
🎟 ظرفیت محدوده — همین الان ثبتنام کن!
https://menteeno.app/fa/event/
منتظر حضور گرمتون در ایونت هستیم 🌱
یه تجربه متفاوت و کاربردی برای برنامهنویسها و فعالای دنیای تکنولوژی!
توی این رویداد علاوه بر یه بازی گروهی جذاب که مخصوص تمرین مهارتهای نرم کلیدی برای برنامهنویسها طراحی شده، یه پنل گفتوگوی تخصصی هم داریم.
چی در انتظارتونه؟
✨ بازی گروهی تعاملی برای تمرین واقعی مهارتهایی مثل:
✨ کار تیمی
✨ ارتباط مؤثر
✨ حل مسئله
✨ تصمیمگیری درست
رو بهطور واقعی تمرین و تقویت میکنی.
👥 فرصت عالی برای شبکهسازی با آدمای همفکر و هممسیر توی حوزه برنامهنویسی و تکنولوژی
💬 پنل گفتوگو با چند نفر از افراد باتجربه حوزه نرمافزار درباره نقش مهارتهای نرم در رشد شغلی برنامهنویسها
🚀 چند ساعتی کنار هم بازی میکنیم، یاد میگیریم، تجربه ردوبدل میکنیم و کلی کانکشن حرفهای میزنیم.
📅 جمعه ۱۸ مهر
🕒 ساعت ۱۵ تا ۲۰
📍 تهران
🎟 ظرفیت محدوده — همین الان ثبتنام کن!
https://menteeno.app/fa/event/
منتظر حضور گرمتون در ایونت هستیم 🌱
❤3🔥3
فرانت چپتر 🥕
🎮 ایونت حضوری منتینو: تقویت مهارتهای نرم برای برنامهنویسها یه تجربه متفاوت و کاربردی برای برنامهنویسها و فعالای دنیای تکنولوژی! توی این رویداد علاوه بر یه بازی گروهی جذاب که مخصوص تمرین مهارتهای نرم کلیدی برای برنامهنویسها طراحی شده، یه پنل گفتوگوی…
رفقا این ایونت رو میتونید با کد تخفیف
بچه های خوب فرانت چپتر زحمتش رو کشیدن.
benazad تهیه کنید.بچه های خوب فرانت چپتر زحمتش رو کشیدن.
❤5🔥1
Forwarded from با متمم | هایلایت | محمدرضا شعبانعلی
شرکت دیلویت مجبور شد بخشی از پولی رو که از دولت استرالیا گرفته برگردونه.
پروژه متعلق به وزارت کار بوده و مربوط به تطبیق فرایندهای IT اداره کار با یه سیستم استاندارد (اصطلاحاً: پروژهٔ compliance).
ارجاعات غلط و استناد به اسناد ناموجود، اون هم در پروژهای که ماهیتش تطبیق فرایندها با استانداردها و فریمورکها بوده، عملاً اعتبار کار رو زیر سوال برده.
دیلویت اعتراف کرده که گزارش با کمک هوش مصنوعی مولد نوشته شده و استفاده از هوش مصنوعی مولد منشاء خطا بوده.
گاردین یه گزارش مختصر ازش نوشته
#هوش_مصنوعی_مولد
پروژه متعلق به وزارت کار بوده و مربوط به تطبیق فرایندهای IT اداره کار با یه سیستم استاندارد (اصطلاحاً: پروژهٔ compliance).
ارجاعات غلط و استناد به اسناد ناموجود، اون هم در پروژهای که ماهیتش تطبیق فرایندها با استانداردها و فریمورکها بوده، عملاً اعتبار کار رو زیر سوال برده.
دیلویت اعتراف کرده که گزارش با کمک هوش مصنوعی مولد نوشته شده و استفاده از هوش مصنوعی مولد منشاء خطا بوده.
گاردین یه گزارش مختصر ازش نوشته
#هوش_مصنوعی_مولد
🔥3🤣3
خرسِ برنامه نویس
https://sam-cooper.medium.com/the-country-that-broke-kotlin-84bdd0afb237
فرض کنید شما به انجام یک سری محاسبات بسیار پیچیده ریاضی نیاز دارید، برای این کار سراغ دو ریاضیدان، یکی در شرق کره خاکی و دیگری در غرب میرید. مسئله رو برای هردو بیان میکنید، با در نظر گرفتن اینکه مسئله برای شما یک جواب واحد داشته باشه آیا جواب هر دو ریاضیدان باید یکی باشه؟ آیا منطق و ریاضیات وابسته به نقطه جغرافیایی کار میکنه؟ یعنی جواب ۲ + ۲ در شرق از غرب متفاوته؟ تو ساعت های مختلف چطور؟ (رجوع کنید به formal system ها)
نرم افزار ها چطور؟ آیا انتظار دارید کد شما در غرب یک جور کامپایل شه و در شرق یک جور دیگه؟ اگه نرم افزار رو یک جعبه خیلی بزرگ در نظر بگیریم که یک ورودی میگیره و یک خروجی ثابت میده (یک Pure function بزرگ)، دیگه فرق میکنه که که این جعبه کجای دنیا باشه؟ (لطفا رگولاتوری هارو درنظر نگیرید جلوتر به اون موضوع میرسیم)
این مقاله که امروز صبح خوندم خیلی جالب بود. به طور خیلی خلاصه داستان یک باگ رو میگه در کامپایلر زبان کاتلین که روی سیستم هایی که زبان ترکی داشتند، کاراکتر i و I اشتباها به معادل ترکیشون یعنی İ و ı مپ میشدند. مقاله جالبیه و به نظرم حتما بخونید.
اما مسئله ای که من میخوام بهش اشاره کنم که درون مایه این مقاله رو پوشش میده، مسئله Local Agnostic هست.
اول بگیم locale یعنی چی؟ میتونیم اینطوری تعریفش کنیم که هرچیزی که به یک منطقه، محیط یا کانتکست وابسته است و میتونه نسبت به مکان و یا نحوه اجرای نرم افزار متفاوت بشه، locale نرم افزار ما حساب میشه!
مثال های ساده ای هم ازش وجود داره: مثلا تایم زون، زبان سرور، کشور استقرار سرور، محیط و ...
درمورد رگولاتوری ها هم یک پرانتز باز کنم، رگولاتوری ها به معنی کلاسیک یک Locale حساب نمیشن یعنی system locale نیستن اما میتوان اونها رو به عنوان environment locale به حساب آورد چون در سطح جغرافیایی و سیاسی وجود دارند و باید اعمال بشن. مثلا شما با قوانین اروپا در آمریکا operate نمیکنی یا بالعکس پس من برای ساده سازی موضوع یک دسته بزرگی به اسم Environment Locale در نظر میگیرم که شامل System Locale هم میشه از اینجا به بعد با اسم Locale میریم جلو.
حالا که فهمیدیم locale دقیقا چیه میتونیم بپرسیم locale کجا ها مشکل آفرینه و چطوری میتونیم حلش کنیم؟ locale اونجایی مشکل میشه که تبدیل شه به یک ساید افکت کریتیکال در اجرای برنامه! یعنی چی ؟ یعنی اینکه نرم افزار شما برای درست اجرا شدن و رفتار غیر قابل پیش بینی نشون ندادن باید به این ساید افکت متکی باشه. مثلا باید حتما در تایم زون UTC+4 باشه و در تایم زون های دیگه خروجی های غیر منتظره میده و درست رفتار نمیکنه. توی همین مقاله این موضوع با زبان سیستم عامل تکرار شده.
حالا راه حل چیه؟
اینکه نرم افزار رو درجهتی توسعه بدیم که بیشتر و بیشتر به Locale Agnostic شدن نزدیک بشیم! یعنی چی؟ یعنی اینکه نرم افزار "آگاه" باشه از کانفیگ های سمت سرور و رگولاتوری های جغرافیایی ولی برای Operate کردن در هر نقطه از جهان به اون ها متکی نباشه! مثلا از تایم زون سرور برای ارسال و دریافت زمان استفاده نکنه. Locale-agnostic بودن یعنی abstract کردن این شکل تفاوتها، نه نادیده گرفتنشان.
این دست از ساید افکت ها خیلی نامرئی هستند حتی وقتی بهشون برخورد میکنیم که اصلا انتظارشو نداریم یا اصلا نمیدونیم که وجود دارند، شاید در حال حاضر اصلا برامون اهمیت نداشته باشن! اما حداقلا باید بدونیم که چنین چیز هایی وجود دارند و یک جای کوچکی براشون توی دیزاین و کد ریویو هامون درنظر بگیریم.
نرم افزار ها چطور؟ آیا انتظار دارید کد شما در غرب یک جور کامپایل شه و در شرق یک جور دیگه؟ اگه نرم افزار رو یک جعبه خیلی بزرگ در نظر بگیریم که یک ورودی میگیره و یک خروجی ثابت میده (یک Pure function بزرگ)، دیگه فرق میکنه که که این جعبه کجای دنیا باشه؟ (لطفا رگولاتوری هارو درنظر نگیرید جلوتر به اون موضوع میرسیم)
این مقاله که امروز صبح خوندم خیلی جالب بود. به طور خیلی خلاصه داستان یک باگ رو میگه در کامپایلر زبان کاتلین که روی سیستم هایی که زبان ترکی داشتند، کاراکتر i و I اشتباها به معادل ترکیشون یعنی İ و ı مپ میشدند. مقاله جالبیه و به نظرم حتما بخونید.
اما مسئله ای که من میخوام بهش اشاره کنم که درون مایه این مقاله رو پوشش میده، مسئله Local Agnostic هست.
اول بگیم locale یعنی چی؟ میتونیم اینطوری تعریفش کنیم که هرچیزی که به یک منطقه، محیط یا کانتکست وابسته است و میتونه نسبت به مکان و یا نحوه اجرای نرم افزار متفاوت بشه، locale نرم افزار ما حساب میشه!
مثال های ساده ای هم ازش وجود داره: مثلا تایم زون، زبان سرور، کشور استقرار سرور، محیط و ...
درمورد رگولاتوری ها هم یک پرانتز باز کنم، رگولاتوری ها به معنی کلاسیک یک Locale حساب نمیشن یعنی system locale نیستن اما میتوان اونها رو به عنوان environment locale به حساب آورد چون در سطح جغرافیایی و سیاسی وجود دارند و باید اعمال بشن. مثلا شما با قوانین اروپا در آمریکا operate نمیکنی یا بالعکس پس من برای ساده سازی موضوع یک دسته بزرگی به اسم Environment Locale در نظر میگیرم که شامل System Locale هم میشه از اینجا به بعد با اسم Locale میریم جلو.
حالا که فهمیدیم locale دقیقا چیه میتونیم بپرسیم locale کجا ها مشکل آفرینه و چطوری میتونیم حلش کنیم؟ locale اونجایی مشکل میشه که تبدیل شه به یک ساید افکت کریتیکال در اجرای برنامه! یعنی چی ؟ یعنی اینکه نرم افزار شما برای درست اجرا شدن و رفتار غیر قابل پیش بینی نشون ندادن باید به این ساید افکت متکی باشه. مثلا باید حتما در تایم زون UTC+4 باشه و در تایم زون های دیگه خروجی های غیر منتظره میده و درست رفتار نمیکنه. توی همین مقاله این موضوع با زبان سیستم عامل تکرار شده.
حالا راه حل چیه؟
اینکه نرم افزار رو درجهتی توسعه بدیم که بیشتر و بیشتر به Locale Agnostic شدن نزدیک بشیم! یعنی چی؟ یعنی اینکه نرم افزار "آگاه" باشه از کانفیگ های سمت سرور و رگولاتوری های جغرافیایی ولی برای Operate کردن در هر نقطه از جهان به اون ها متکی نباشه! مثلا از تایم زون سرور برای ارسال و دریافت زمان استفاده نکنه. Locale-agnostic بودن یعنی abstract کردن این شکل تفاوتها، نه نادیده گرفتنشان.
این دست از ساید افکت ها خیلی نامرئی هستند حتی وقتی بهشون برخورد میکنیم که اصلا انتظارشو نداریم یا اصلا نمیدونیم که وجود دارند، شاید در حال حاضر اصلا برامون اهمیت نداشته باشن! اما حداقلا باید بدونیم که چنین چیز هایی وجود دارند و یک جای کوچکی براشون توی دیزاین و کد ریویو هامون درنظر بگیریم.
Medium
The Country That Broke Kotlin
Logic vs language: how a Turkish alphabet bug played a years-long game of hide-and-seek inside the Kotlin compiler
🤔3👌2