زمستان 1394: دوره متدهای چابک
الگوی ایجاد نرمافزار: تجزیه – ترکیب!
پیشگفتار:
مدتی است که با خود میاندیشم تجربیاتم را در حوزهی نرمافزار در اینجا بنویسم، هم ماندگار خواهد شد و هم شاید به دوستی کمک کند. نمیدانم “الگوی ایجاد نرمافزار” عبارت مناسبی هست یا نه، ولی تا یافتن عبارت مناسبتر از آن استفاده خواهم کرد.
داستانی از عبید زاکانی:
گویند؛
روزی “مطربی” نزد “مرحوم کرباسی” که از علمای “عهد فتحعلی شاه” بود آمد و حکم شرع را در مورد “رقصیدن” پرسید.
کرباسی با عصبانیت جواب داد:
“عملی است مذموم و فعلی است حرام.”
مطرب پرسید: “حضرت آقا، اگر من دست راستم را بجنبانم حرام است؟”
مرحوم کرباسی گفت: “خیر!”
مطرب پرسید: “اگر دست چپم را بجنبانم؟!”
مرحوم کرباسی گفت: “خیر!”
سپس مطرب از “حکم شرعی” در مورد تکان دادن پای راست و چپ پرسید و هر بار مرحوم کرباسی گفتند: “خیر” ایرادی ندارد. اصولا دست و پا برای “جنبانده شدن” خلق گشته اند.
مطرب که منتظر این فرصت بود از جای خود بلند شد و در مقابل دیدگان بهت زده مرحوم کرباسی و حاضران مجلس “شروع به رقصیدن کرد” و گفت: “حضرت آقا، رقص همان تکان دادن دست ها و پاهاست که فرمودید حرام نیست.
مرحوم کرباسی در جواب گفت: “مفرداتش” خوب است…
ولی “مرده شوی ترکیبش را ببرد”
به این معنی که تک تک امور به تنهایی خوب هستند اما مجموعشان فعل حرام است و به درد نمی خورد.
منبع: اینجا
مفردات نرمافزاری:
یکی از روشهای حل مساله این است که مساله را به قسمتهای کوچکتری تقسیم کنید و بعد از حل هر قسمت که انتظار میرود پیچیدگی کمتری داشته باشد، از ترکیب راهکارها به پاسخ اصلی برسید. برای نمونه در طراحی الگوریتم، الگوریتم را به چند گام تقسیم میکنیم و هر یک از گامها را به تعدادی زیرگام. بعد از آن که جزییات هر زیرگام نهایی شد، آنها را با یک فرایند معکوس، سر هم میکنیم تا به الگوریتم نهایی دست پیدا کنیم. مثلا برای تولید و چاپ اعداد اول (به گونهای که چاپ آنها نیز بر مبنای یک الگوی خاص باشد)، مساله را به دو گام تولید اعداد اول و چاپ اعداد تولیدشده تقسیم میکنیم. بعد از حل هر دو گام، از سر هم شدن آنها، کل مساله حل میشود. در این شرایط هر بخش پاسخ ما به تنهایی فوقالعاده است و به خوبی کار میکند.
بعضی اوقات نیز به ناچار هر گام از مساله با یک تکنولوژی خاص انجام میشود. مثلا شما برای ایجاد اعداد اول تصمیم میگیرید که از یک کتابخانه موجود استفاده کنید. همچنین فرض کنید که برای چاپ اعداد هم از کتابخانهی دیگری استفاده مینمایید. دو گام/بخش راهکار شما به صورت جداگانه به خوبی کار میکنند.
ترکیبهای نرمافزاری:
نکته اینجاست که وقتی پاسخ تکتک اجزا (گامهای الگوریتم یا زیربخشها) را پیدا میکنید، هنگام سرهمبندی این اجزا با این واقعیت مواجه میشوید که این راهکارها قابل تجمیع در یک راهکار جامع و اصلی نیستند. به عبارت دیگر فرایند تجمیع که فرایندِ عکس فرایند تجزیه است، وقتی روی زیرراهکارها پیاده میشود، یا انجامپذیر نیست و یا در صورت انجامپذیری، موجود تجمیعشده پاسخ مسالهی اصلی نیست. این اتفاق به ویژه وقتی گامها/اجزا با تکنولوژیهای متفاوت و به صورت جداگانه پیش برده میشوند، بسیار بیشتر به چشم میخورد.
اینجاست که عبید زاکانی جلوی شما ظاهر میشود و با صدای بلند برایتان میخواند: تجزیهاش خوب بود، ولی مردهشور ترکیبش را ببرد!
برای این که ذهنمان به هم نزدیک شود اجازه بدهید مثالی بیان کنم. نمیدانم تا حالا رادیو یا ضبط یا کامپیوترهای قدیمی را باز کردهاید یا خیر. یکی از بستگان جوان ما عادت داشت که وقتی رادیوی خانهشان خراب میشد، آن را با آچار و پیچگوشتی باز میکرد و بعد از ساعتها کار مهندسی فشرده و طاقتفرسا 🙂 ، وقتی میخواست رادیو را دوباره سرهم کند یک سری قطعه و یک عالمه پیچ اضافه میآورد. به عبارت ساده فرایند سرهمبندی مطابق با فرایند جداسازی پیش نمیرفت. البته این فامیل ما همیشه میگفت که کارخانهی سازندهی رادیو این تجهیزات را به عنوان قطعات یدکی و اضافی در رادیو قرار داده است. 🙂
امیدوارم تجزیه و ترکیبهایتان فوقالعاده باشد.
گزیده:
یک برنامهنویس بد به راحتی میتواند دو شغل جدید در هر سال ایجاد کند. 🙂
دیوید پرناس
منبع عکس: گنجور
کجایی؟ باران آمد!
… و باران آمد.
این روزها دمای هوای کانادا در حال ثبت رکوردهای جدیدی است. دمای هوای ایالت بریتیش کلمبیا به دمای بیسابقهی 46 درجه رسید و دمای اینجا هم رکورد 37 درجه را پشت سرگذاشت. نبود زیرساخت مناسب برای هوای گرم مانند کولر و دیگر خنککنندهها، تحمل شرایط را واقعا غیرممکن میکند.
اما دیروز (دوم ژوئن) باران آمد و هوا را خنکتر کرد. دمای امروز 24 درجه سانتیگراد است!
دیدن باران با یادآوری بیبالان و ترانهی لیلایِ علیرضا قربانی هم خالی از لطف نبود. دلم برای روزهای بارانی تنگ شد؛ روزهایی که مادر ما را از رفتن به حیاط خانه منع میکرد! نگران بود که خیس شویم و بعدش بیمار! کجایی مادر؟ باران آمد!
کجایی ای که عمری در هوایت نشستم زیر بارانها، کجایی
اگر مجنون اگر لیلا، غریبم در بیابانها، کجایی
کجای این شب تاریک به روی ماه در بستی
نه میگویی نه میدانم کجا هستم کجا رفتی
من آتش بودم اما تو به خاکستر نشستی
نه میگویی، نه میدانم کجا ماندم، کجا هستی
اگر شب هست و فردا نیست اگر راهی به رویا نیست
چه آهوها که در چشمان لیلا نیست،
اگر گم کردهام خود را، مرا در گریه پیدا کن
اگر از شِکوه لب بستم، سکوتم را تماشا کن
به افتخار هانیه!
مقدمه:
یکی از مهمترین جاذبههای یادگیری متدهای توسعهی نرمافزار برای من، امکان بهکارگیری آنها در زندگی است. هر از گاهی که به نتایج انتقال تجربیات و آموختههایم از دنیای نرمافزار به زندگی روزمرهام میاندیشم، خوشحالی همراه با شگفتی وجودم را فرا میگیرد.
این نوشته را به افتخار هانیه نوشتم، دختری از بستگان خیلی دور، دوستان خیلی نزدیک.
پس به افتخار هانیه شروع میکنم.
داستان نمودارها:
امسال هانیه کنکور داشت. من هم از راه دور، هر از گاهی با او صحبت میکردم و اگر سوالی در مورد برنامهریزی داشت پاسخ میدادم. در کنار تغییر مدل ذهنی و رفتاری هانیه، جذابترین بخش این ماجرا برای من، حل مسالههای ریاضی بود. بدترین بخش این ماجرا هم این بود که باید قبول میکردیم ما محکوم به تلاش هستیم، نتیجه دست ما نیست. پس باید “لذت ببر و سخت تلاش کن” را آویزهی گوشمان میکردیم.
از هانیه خواستم که یک نمودار تهیه کند که محور ایکس آن روزهای هفته و محور ایگرگ آن مدت زمان درس خواندنش بود. نموداری شبیه به نمودار زیر.
هانیه در ابتدای هر هفته برنامهریزی و برآورد میکرد و بعد در طول هفته آن چه که اتفاق میافتاد را ثبت میکرد. نموداری شبیه به نمودار زیر: خط قرمز برآورد و خط سیاه، مقدار واقعی است.
نکتهای که باید در نگاه به این نمودار یادمان میماند این بود که: مهم این است که یک ابزار سادهی تصویری برای نگاه به گذشته و با هدف بهبود آینده داریم. و مهمتر این که اندازهگیریهای تک بعدی از یک سیستم پیچیده، علمیترین اشتباه رایج است.
بعد از مدتی توافق شد که روش برنامهریزی را تغییر بدهیم. به پیشنهاد هانیه قرار شد به جای برنامهریزی اول هفته، او تلاش کند که در هر روز، تعداد ساعت مشخصی را به درس خواندن اختصاص دهد، به غیر از آخر هفته. در نتیجه نمودار به شکل زیر تغییر کرد و خط پیشبینی از آن حذف شد.
تحلیل تکنیکال:
تحلیل تکنیکال (فنی) (به انگلیسی: Technical analysis) در امور مالی، تجزیه و تحلیل فنی یک روش تجزیه و تحلیل برای پیشبینی جهت قیمتها از طریق مطالعه دادههای بازار گذشته، و در درجه اول قیمت و حجم است. [ویکی پدیا]
ابزارهای زیادی برای تحلیل تکنیکال مورد استفاده قرار میگیرند که یکی از آنها الگوهای نموداری یا به انگلیسی Chart Patterns هست. ایدهی این ابزار این است که الگوهایی در نمودار قیمت وجود دارد که تکرارپذیر است. اگر شما بتوانید الگو را در نمودار قیمت یک سهم یا اوراق بهادار پیدا کنید احتمالا میتوانید ادامهی آن را پیشبینی کنید.
برای نمونه یکی از این الگوها که به الگوی سر و شانه معروف است در شکل زیر دیده میشود. [مرجع: خانه سرمایه] رفتار قیمت به گونهای است که شبیه سر و سرشانه یک انسان میشود. برای نمونه اگر قیمت در نقطه شانه سمت راست باشد، پیشبینی میشود که قیمتها کاهش یافته و با سرعت بریزد.
الگوهای درسخواندن هانیه:
پس از چند باری که هانیه نمودارها را فرستاد، به نظرم رسید که نمودارها شکلهای جالبی میسازند. به یاد الگوی نمودارها در تحلیل بازارهای مالی افتادم و برای شاد کردن هانیه و تغییر فضای پرفشار پشت کنکور، شروع کردیم به انتخاب اسم برای نمودارها: الگوی سقوط آزاد، برگشت به بازی و سجده طولانی، …. الگوی یقه هفت را در شکل زیر میبینید.
نمایشگاه نمودارهای هانیه:
حالا در تصاویر زیر میتوانید برخی از نمودارهای درسخواندن هانیه را ببینید. جذاب نیست؟! 🙂
![]() |
![]() |
![]() |
![]() |
سخن پایانی:
امیدوارم هانیه و هانیههای سرزمینام راهشان در زندگی را هر چه زودتر پیدا کنند. به عزیز دلبندم، هانیه، افتخار میکنم. بر این باورم که جدای از رتبهای که در آزمون ورودی دانشگاهها کسب خواهد کرد، آن چه در این مسیر یاد گرفت و تجربه کرد، در زندگی آیندهی او تاثیر شگرف خواهد داشت.
پانوشت:
قبل از انتشار، این نوشته رو برای هانیه فرستادم تا از ایشان اجازهی انتشار بگیرم و خواهش کردم اگر دوست دارند متنی به آن اضافه کنند. متن تکمیلی هانیه رو اینجا اضافه کردم:
“من واقعا الان احساساتی شدم نمیدونم چی بگم…..
رسم نمودار در طول هفته باعث شد بتونم خودم رو ارزیابی کنم همچنین در طی هفتههای آینده بتونم دید مناسبی از عملکرد خودم داشته باشم و در پایان که شما هم مشاهده میکنید تونستم تلاش و پیشرفت خودم رو در طی این مدت ببینم” .
گزیده:
چهرهات را همیشه رو به خورشید نگهدار. و آنگاهست که سایهها از تو عقب میمانند. والت ویتمن
الگوی ایجاد نرمافزار: هزار توی نرمافزاری!
پیشگفتار:
مدتی است که با خود میاندیشم تجربیاتم را در حوزهی نرمافزار در اینجا بنویسم، هم ماندگار خواهد شد و هم شاید به دوستی کمک کند. نمیدانم “الگوی ایجاد نرمافزار” عبارت مناسبی هست یا نه، ولی تا یافتن عبارت مناسبتر از آن استفاده خواهم کرد.
بازی هزار تو
هزار تو یا به انگلیسی maze یکی از بازیها و سرگرمیهای بسیار معروف در دنیاست. زمین بازی، محوطهای است که بازیکنان از یک نقطه وارد آن میشوند و برنده بازی کسی است که از سوی دیگر زمین بازی خارج شود. بین نقطهی ورود و نقطهی خروجِ زمین بازی، مسیرهای تو در تو که بسیاری از آنها بنبست هستند قرار دارد. بازیکنی برنده است که بتواند مسیری را پیدا کند که به نقطهی خروج منتهی میشود.

منبع عکس: اینجا
داستان ناشناختهها در برنامهنویسی
وقتی کاری را شروع میکنید که تجربهای در آن ندارید و برای شما جدید و ناشناخته است، پا در راهی میگذارید که با اما و اگرهای فراوان همراه است.
از آنجا که نمیتوانید مسیری از ابتدا تا انتها را حتی به صورت کلان ترسیم کنید، به ناچار سفرتان در فضایی پر از ابهام و با برداشتن اولین گامهایی شروع میکنید که معمولا چندان هم به آنها مطمئن نیستید. با هر چند قدم، مسیر جدیدی کشف میکنید و با طی کردن هر کوچه یا خیابانی از آن مسیر، امید به پایان رسیدنش در شما افزایش مییابد. وقتی در مییابید که به یک دوراهی یا چندراهی رسیدید، یکی از راهها را انتخاب میکنید و سفرتان را ادامه میدهید.
این سفر به همین سادگی پیش نمیرود. همان طور که حضرت حافظ میفرماید که عشق آسان نمود اول ولی افتاد مشکلها.
به ناگاه با بازشدن مسیر جدید و برداشتن چند قدم در آن، در مییابید که این کوچه و خیابان، بنبستی بیش نیست. از سر اجبار، تمام مسیری را که با امید طی کرده بودید باید برگردید تا به اولین دو راهی یا چندراهی برسید. و روز از نو و روزی از نو، مسیری را انتخاب کنید که بارهای قبل انتخاب نکردهاید و سفرتان را ادامه دهید.
نیازی به گفتن نیست که این تلاش بینتیجه چگونه چون آجهای سوهان تا کجا میتواند اعصاب و روانتان را ذره ذره برادهبرداری کند.
الگوی هزار توی نرمافزار
ناشناختهها بخشی جدانشدنی از دنیای برنامهنویسی است. تغییر تکنولوژی، ظهور تکنولوژیهای جدید و تغییر پارادایمهای برنامهنویسی، تنها برخی از اتفاقات روزمرهی دنیای برنامهنویسی است. دور زمانی، تنها دغدغه برنامهنویسی یادگرفتن یک زبان برنامهنویسی و یک دیتابیس بود! اما امروز، زبان برنامهنویسی کمترین دغدغهی روزمرهی شماست. ترکیب زبان با کتابخانههای برنامهنویسی نوظهور، ترکیب آن با تکنولوژیهایی مانند رایانش ابری، افزایش نجومی حجم دادهها و دهها ترکیب ناشناختهی دیگر، مسالههای روز دنیای برنامهنویسیاند. این ناشناختههای روزافزون به یک نقطه مشترک ختم میشوند: شروع یک بازه هزار توی نرمافزاری.
در مقام یک برنامهنویس چارهای نیست جز پذیرش این بازی هزار تو ، کنار آمدن با آجهای سوهانش و تلاش برای یادگیری تکنیکهای کسب پیروزی در آن.
از بازی لذت ببرید و برای پیروزی، سخت تلاش کنید!
گزیده:
ابتدا تلاش کنید کدتان کار کند، بعد تلاش کنید درست کار کند و سرانجام تلاش کنید سریع باشد. کنت بک
The SPACE of Developer Productivity
The SPACE of Developer Productivity (Link)
Nicole Forsgren, Margaret-Anne Storey, Chandra Maddila, Thomas Zimmermann, Brian Houck, Jenna Butler,
ACM Queue, 28 February 2021
Abstract:
Developer productivity is about more than an individual’s activity levels or the efficiency of the engineering systems relied on to ship software, and it cannot be measured by a single metric or dimension. The SPACE framework captures different dimensions of productivity, and here we demonstrate how this framework can be used to understand productivity in practice and why using it will help teams better understand developer productivity and create better measures to inform their work and teams.
Myths and Misconceptions About Developer Productivity:
– Myth 1: Productivity is all about developer activity.
– Myth 2: Productivity is only about individual performance.
– Myth 3: One productivity metric can tell us everything.
– Myth 4: Productivity measures are useful only for managers.
– Myth 5: Productivity is only about engineering systems and developer tools.
The Dimensions Of Productivity:
– Satisfaction and well-being: How fulfilled, happy, and healthy one is
– Performance: An outcome of a process
– Activity: The count of actions or outputs
– Communication and collaboration: How people talk and work together
– Efficiency and flow: Doing work with minimal delays or interruptions
The Levels:
Individual: One person
Team or Group: People that work together
System: End-to-end work through a system(like a development pipeline)
Example Metrics:












