My number one rule is hope for the best, plan for the worst!
قانون اول برنامهریزی!
نمونه آموزندهای از بازسازی کد
مقدمه: بازسازی کد
بازسازی کد یا refactoring، یک واژهی تخصصی است که معنی آن، بهبود کیفیت کد یک سیستم است بدون آن که تغییری در رفتار خارجی آن ایجاد شود. مشابه غیرافزاری بازسازی کد، بازسازی داخلی یک خانه است که بدون آن نمای خارجی خانه دچار تغییر شود، اجزای داخلی آن مانند تاسیسات و چیدمان وسایل تغییر میکنند.
حالا اگر بهبود کیفیت کد منجر به خطاهای جدید یا تغییرات در رفتار سیستم گردد، آیا چنین کاری، بهبود یا بازسازی کد است؟ مسلما خیر! پاسخ این پرسش از این بابت اهمیت دارد که هر تغییری در کد، بازسازی محسوب نمیشود ولی بازسازی حتما با تغییر کد همراه است: هر گردی گردو نیست!
در بازسازی کد، بهترین رویکرد، اعمال تغییرات هدفمند و کوچک است. برعکس رویکرد ایجاد تغییرات بزرگ و گسترده، بازسازی کد اقدامی درازمدت و پیوسته است (آهسته و پیوسته). دلیل چنین رویکردی این است که اعمال یکبارهی تغییرات بزرگ و گسترده، موجب ریسک بیشتر و نیازمند زمان طولانیتری است.
رهرو آن نیست
که گه تند و گهی خسته رود
رهرو آن اسـت که آهستـــــه و پیـــوسته رود
بدیهی است که یکی از مزایای بازسازی کد این است که وقت گذاشتن پیشاپیش و تدریجی برای افزایش کیفیت کد باعث افزایش سرعت تیم در آینده میشود.
پرسش:
به تازگی، نمونهی آموزنده و جالبی از بازسازی کد خواندم که در اینجا با شما در میان میگذارم. ابتدا صورت پرسش را مطرح میکنم تا آن را بررسی نمایید.
آیا پیشنهادی برای بازسازی کد زیر دارید؟ قبل از ارائه پیشنهاد، چه پرسشهایی برای شما مطرح است؟ لطفا با پاسخهای پیشفرض خود، کد زیر را بازنویسی نمایید و اگر دوست داشتید آن را اینجا به اشتراک بگذارید.
if(user.role === "admin" && user.isActive && user.permissions.some(p => p === "edit")) {
// Do stuff
}حرف زدن که هزینه نداره، کدت رو نشون بده! 🙂
برایان کرنیگان
پ.ن.
شاید ترجمه بهتر این باشد: حرف زدن که مالیات نداره، کدت رو نشون بده!
شهرت برایان کرنیگان در کنار دنیس ریچی به دلیل کتاب معروف برنامهنویسی C است.
منبع کد: کتاب Refactoring TypeScript نوشتهی James Hickey
الگوی ایجاد نرمافزار: تجزیه – ترکیب!
پیشگفتار:
مدتی است که با خود میاندیشم تجربیاتم را در حوزهی نرمافزار در اینجا بنویسم، هم ماندگار خواهد شد و هم شاید به دوستی کمک کند. نمیدانم “الگوی ایجاد نرمافزار” عبارت مناسبی هست یا نه، ولی تا یافتن عبارت مناسبتر از آن استفاده خواهم کرد.
داستانی از عبید زاکانی:
گویند؛
روزی “مطربی” نزد “مرحوم کرباسی” که از علمای “عهد فتحعلی شاه” بود آمد و حکم شرع را در مورد “رقصیدن” پرسید.
کرباسی با عصبانیت جواب داد:
“عملی است مذموم و فعلی است حرام.”
مطرب پرسید: “حضرت آقا، اگر من دست راستم را بجنبانم حرام است؟”
مرحوم کرباسی گفت: “خیر!”
مطرب پرسید: “اگر دست چپم را بجنبانم؟!”
مرحوم کرباسی گفت: “خیر!”
سپس مطرب از “حکم شرعی” در مورد تکان دادن پای راست و چپ پرسید و هر بار مرحوم کرباسی گفتند: “خیر” ایرادی ندارد. اصولا دست و پا برای “جنبانده شدن” خلق گشته اند.
مطرب که منتظر این فرصت بود از جای خود بلند شد و در مقابل دیدگان بهت زده مرحوم کرباسی و حاضران مجلس “شروع به رقصیدن کرد” و گفت: “حضرت آقا، رقص همان تکان دادن دست ها و پاهاست که فرمودید حرام نیست.
مرحوم کرباسی در جواب گفت: “مفرداتش” خوب است…
ولی “مرده شوی ترکیبش را ببرد”
به این معنی که تک تک امور به تنهایی خوب هستند اما مجموعشان فعل حرام است و به درد نمی خورد.
منبع: اینجا
مفردات نرمافزاری:
یکی از روشهای حل مساله این است که مساله را به قسمتهای کوچکتری تقسیم کنید و بعد از حل هر قسمت که انتظار میرود پیچیدگی کمتری داشته باشد، از ترکیب راهکارها به پاسخ اصلی برسید. برای نمونه در طراحی الگوریتم، الگوریتم را به چند گام تقسیم میکنیم و هر یک از گامها را به تعدادی زیرگام. بعد از آن که جزییات هر زیرگام نهایی شد، آنها را با یک فرایند معکوس، سر هم میکنیم تا به الگوریتم نهایی دست پیدا کنیم. مثلا برای تولید و چاپ اعداد اول (به گونهای که چاپ آنها نیز بر مبنای یک الگوی خاص باشد)، مساله را به دو گام تولید اعداد اول و چاپ اعداد تولیدشده تقسیم میکنیم. بعد از حل هر دو گام، از سر هم شدن آنها، کل مساله حل میشود. در این شرایط هر بخش پاسخ ما به تنهایی فوقالعاده است و به خوبی کار میکند.
بعضی اوقات نیز به ناچار هر گام از مساله با یک تکنولوژی خاص انجام میشود. مثلا شما برای ایجاد اعداد اول تصمیم میگیرید که از یک کتابخانه موجود استفاده کنید. همچنین فرض کنید که برای چاپ اعداد هم از کتابخانهی دیگری استفاده مینمایید. دو گام/بخش راهکار شما به صورت جداگانه به خوبی کار میکنند.
ترکیبهای نرمافزاری:
نکته اینجاست که وقتی پاسخ تکتک اجزا (گامهای الگوریتم یا زیربخشها) را پیدا میکنید، هنگام سرهمبندی این اجزا با این واقعیت مواجه میشوید که این راهکارها قابل تجمیع در یک راهکار جامع و اصلی نیستند. به عبارت دیگر فرایند تجمیع که فرایندِ عکس فرایند تجزیه است، وقتی روی زیرراهکارها پیاده میشود، یا انجامپذیر نیست و یا در صورت انجامپذیری، موجود تجمیعشده پاسخ مسالهی اصلی نیست. این اتفاق به ویژه وقتی گامها/اجزا با تکنولوژیهای متفاوت و به صورت جداگانه پیش برده میشوند، بسیار بیشتر به چشم میخورد.
اینجاست که عبید زاکانی جلوی شما ظاهر میشود و با صدای بلند برایتان میخواند: تجزیهاش خوب بود، ولی مردهشور ترکیبش را ببرد!
برای این که ذهنمان به هم نزدیک شود اجازه بدهید مثالی بیان کنم. نمیدانم تا حالا رادیو یا ضبط یا کامپیوترهای قدیمی را باز کردهاید یا خیر. یکی از بستگان جوان ما عادت داشت که وقتی رادیوی خانهشان خراب میشد، آن را با آچار و پیچگوشتی باز میکرد و بعد از ساعتها کار مهندسی فشرده و طاقتفرسا 🙂 ، وقتی میخواست رادیو را دوباره سرهم کند یک سری قطعه و یک عالمه پیچ اضافه میآورد. به عبارت ساده فرایند سرهمبندی مطابق با فرایند جداسازی پیش نمیرفت. البته این فامیل ما همیشه میگفت که کارخانهی سازندهی رادیو این تجهیزات را به عنوان قطعات یدکی و اضافی در رادیو قرار داده است. 🙂
امیدوارم تجزیه و ترکیبهایتان فوقالعاده باشد.
گزیده:
یک برنامهنویس بد به راحتی میتواند دو شغل جدید در هر سال ایجاد کند. 🙂
دیوید پرناس
منبع عکس: گنجور
کجایی؟ باران آمد!
… و باران آمد.
این روزها دمای هوای کانادا در حال ثبت رکوردهای جدیدی است. دمای هوای ایالت بریتیش کلمبیا به دمای بیسابقهی 46 درجه رسید و دمای اینجا هم رکورد 37 درجه را پشت سرگذاشت. نبود زیرساخت مناسب برای هوای گرم مانند کولر و دیگر خنککنندهها، تحمل شرایط را واقعا غیرممکن میکند.
اما دیروز (دوم ژوئن) باران آمد و هوا را خنکتر کرد. دمای امروز 24 درجه سانتیگراد است!
دیدن باران با یادآوری بیبالان و ترانهی لیلایِ علیرضا قربانی هم خالی از لطف نبود. دلم برای روزهای بارانی تنگ شد؛ روزهایی که مادر ما را از رفتن به حیاط خانه منع میکرد! نگران بود که خیس شویم و بعدش بیمار! کجایی مادر؟ باران آمد!
کجایی ای که عمری در هوایت نشستم زیر بارانها، کجایی
اگر مجنون اگر لیلا، غریبم در بیابانها، کجایی
کجای این شب تاریک به روی ماه در بستی
نه میگویی نه میدانم کجا هستم کجا رفتی
من آتش بودم اما تو به خاکستر نشستی
نه میگویی، نه میدانم کجا ماندم، کجا هستی
اگر شب هست و فردا نیست اگر راهی به رویا نیست
چه آهوها که در چشمان لیلا نیست،
اگر گم کردهام خود را، مرا در گریه پیدا کن
اگر از شِکوه لب بستم، سکوتم را تماشا کن
به افتخار هانیه!
مقدمه:
یکی از مهمترین جاذبههای یادگیری متدهای توسعهی نرمافزار برای من، امکان بهکارگیری آنها در زندگی است. هر از گاهی که به نتایج انتقال تجربیات و آموختههایم از دنیای نرمافزار به زندگی روزمرهام میاندیشم، خوشحالی همراه با شگفتی وجودم را فرا میگیرد.
این نوشته را به افتخار هانیه نوشتم، دختری از بستگان خیلی دور، دوستان خیلی نزدیک.
پس به افتخار هانیه شروع میکنم.
داستان نمودارها:
امسال هانیه کنکور داشت. من هم از راه دور، هر از گاهی با او صحبت میکردم و اگر سوالی در مورد برنامهریزی داشت پاسخ میدادم. در کنار تغییر مدل ذهنی و رفتاری هانیه، جذابترین بخش این ماجرا برای من، حل مسالههای ریاضی بود. بدترین بخش این ماجرا هم این بود که باید قبول میکردیم ما محکوم به تلاش هستیم، نتیجه دست ما نیست. پس باید “لذت ببر و سخت تلاش کن” را آویزهی گوشمان میکردیم.
از هانیه خواستم که یک نمودار تهیه کند که محور ایکس آن روزهای هفته و محور ایگرگ آن مدت زمان درس خواندنش بود. نموداری شبیه به نمودار زیر.
هانیه در ابتدای هر هفته برنامهریزی و برآورد میکرد و بعد در طول هفته آن چه که اتفاق میافتاد را ثبت میکرد. نموداری شبیه به نمودار زیر: خط قرمز برآورد و خط سیاه، مقدار واقعی است.
نکتهای که باید در نگاه به این نمودار یادمان میماند این بود که: مهم این است که یک ابزار سادهی تصویری برای نگاه به گذشته و با هدف بهبود آینده داریم. و مهمتر این که اندازهگیریهای تک بعدی از یک سیستم پیچیده، علمیترین اشتباه رایج است.
بعد از مدتی توافق شد که روش برنامهریزی را تغییر بدهیم. به پیشنهاد هانیه قرار شد به جای برنامهریزی اول هفته، او تلاش کند که در هر روز، تعداد ساعت مشخصی را به درس خواندن اختصاص دهد، به غیر از آخر هفته. در نتیجه نمودار به شکل زیر تغییر کرد و خط پیشبینی از آن حذف شد.
تحلیل تکنیکال:
تحلیل تکنیکال (فنی) (به انگلیسی: Technical analysis) در امور مالی، تجزیه و تحلیل فنی یک روش تجزیه و تحلیل برای پیشبینی جهت قیمتها از طریق مطالعه دادههای بازار گذشته، و در درجه اول قیمت و حجم است. [ویکی پدیا]
ابزارهای زیادی برای تحلیل تکنیکال مورد استفاده قرار میگیرند که یکی از آنها الگوهای نموداری یا به انگلیسی Chart Patterns هست. ایدهی این ابزار این است که الگوهایی در نمودار قیمت وجود دارد که تکرارپذیر است. اگر شما بتوانید الگو را در نمودار قیمت یک سهم یا اوراق بهادار پیدا کنید احتمالا میتوانید ادامهی آن را پیشبینی کنید.
برای نمونه یکی از این الگوها که به الگوی سر و شانه معروف است در شکل زیر دیده میشود. [مرجع: خانه سرمایه] رفتار قیمت به گونهای است که شبیه سر و سرشانه یک انسان میشود. برای نمونه اگر قیمت در نقطه شانه سمت راست باشد، پیشبینی میشود که قیمتها کاهش یافته و با سرعت بریزد.
الگوهای درسخواندن هانیه:
پس از چند باری که هانیه نمودارها را فرستاد، به نظرم رسید که نمودارها شکلهای جالبی میسازند. به یاد الگوی نمودارها در تحلیل بازارهای مالی افتادم و برای شاد کردن هانیه و تغییر فضای پرفشار پشت کنکور، شروع کردیم به انتخاب اسم برای نمودارها: الگوی سقوط آزاد، برگشت به بازی و سجده طولانی، …. الگوی یقه هفت را در شکل زیر میبینید.
نمایشگاه نمودارهای هانیه:
حالا در تصاویر زیر میتوانید برخی از نمودارهای درسخواندن هانیه را ببینید. جذاب نیست؟! 🙂
![]() |
![]() |
![]() |
![]() |
سخن پایانی:
امیدوارم هانیه و هانیههای سرزمینام راهشان در زندگی را هر چه زودتر پیدا کنند. به عزیز دلبندم، هانیه، افتخار میکنم. بر این باورم که جدای از رتبهای که در آزمون ورودی دانشگاهها کسب خواهد کرد، آن چه در این مسیر یاد گرفت و تجربه کرد، در زندگی آیندهی او تاثیر شگرف خواهد داشت.
پانوشت:
قبل از انتشار، این نوشته رو برای هانیه فرستادم تا از ایشان اجازهی انتشار بگیرم و خواهش کردم اگر دوست دارند متنی به آن اضافه کنند. متن تکمیلی هانیه رو اینجا اضافه کردم:
“من واقعا الان احساساتی شدم نمیدونم چی بگم…..
رسم نمودار در طول هفته باعث شد بتونم خودم رو ارزیابی کنم همچنین در طی هفتههای آینده بتونم دید مناسبی از عملکرد خودم داشته باشم و در پایان که شما هم مشاهده میکنید تونستم تلاش و پیشرفت خودم رو در طی این مدت ببینم” .
گزیده:
چهرهات را همیشه رو به خورشید نگهدار. و آنگاهست که سایهها از تو عقب میمانند. والت ویتمن












