مغز برنامه‌نویس: چگونه کد چانک‌شده بنویسیم (۵)

  • یوسف مهرداد بی‌بالان

چگونه کد قطعه‌بندی شده یا چانک‌شده (chunkable code) بنویسیم؟ — ادامه

راهکار سه: از فانوس‌های راهنما استفاده کنید
پیش‌گفتار
:
اجازه دهید ابتدا معنی بیکن (beacon) را با هم مرور کنیم. در سایت farsi123.com معنی بیکن به قرار زیر است:

۱- آتشی که برای مخابره برفراز تپه یا برج و غیره روشن می‌کردند
۲- آتش (یا نور) راهنما، آتش (یا نور) آگهساز
۳- فانوس دریایی، فار، مناره‌البحر، دریابرج
۴- (فرستنده‌ی رادیویی که برای راهنمایی هواپیما درمه یا شب نشان پراکنی می‌کند) ایستگاه هدایت
۵- (شخص) رهبر، رهنما، منور کننده
من از واژه‌ی «فانوس راهنما» استفاده می‌کنم ولی مطمئن نیستم که پیشنهاد مناسبی برای آن باشد.
ادامه:
آخرین کاری که می‌توانید برای آسان‌تر کردن فرایند قطعه‌بندی (چانک‌ کردن)‌ کد انجام دهید، گنجاندن «فانوس‌های راهنما» است. »فانوس‌های راهنما» بخش‌هایی از برنامه است که به برنامه‌نویس کمک می‌کند تا بفهمد برنامه چه کاری انجام می‌دهد. می‌توانید به «فانوس راهنما» را یک خط از برنامه یا حتی بخشی از آن در نظر بگیرید که وقتی چشم شما به آن می‌افتد به خودتان می‌گویید: “آها، فهمیدم!.”
فانوس‌های راهنما معمولاً نشان می‌دهند که یک قطعه کد حاوی ساختار داده، الگوریتم‌ یا رویکرد خاصی است. به عنوان نمونه، کد پایتون زیر را ببینید که یک درخت دودویی (باینری) را پیمایش می‌کند.
این کد پایتون حاوی چندین فانوس راهنما است که خواننده می‌تواند به کمک آنها بفهمد که کد از درخت دودویی به عنوان ساختار داده استفاده می‌کند:
– توضیحات (کامنت) که در آنها از کلمه “درخت” (tree) استفاده شده است.
– متغیرهایی به نام ریشه (root) و درخت (tree)
– فیلدهایی به نام چپ و راست (left, right)
– متنی که به درخت اشاره می‌کند (“Contents of the tree are”)
فانوس‌های راهنما ابزار بسیار مهمی در زمینه‌ی یادآوری و نشانه‌یابی در طول فرایند درک و فهمیدن کد هستند. آنها معمولا برای برنامه‌نویسان مانند محرک‌های ذهنی عمل می‌کنند تا فرضیه‌های ذهنی خود درباره‌ی کد را تأیید یا رد کنند. به عنوان مثال، در ابتدای خواندن کد پایتون قبلی احتمالا هیچ ایده‌ای ندارید که این کد چه کاری انجام می‌دهد. اما وقتی اولین توضیح را می‌خوانید و چشم‌تان به کلاس Node بیفتد، ناخودآگاه حدس می‌زنید که این کد به بحث درخت‌ها (tree) ارتباط دارد. سپس با دیدن فیلدهای چپ و راست (left, right)، حدس شما درباره‌ی کد تقویت می‌شود.
ما معمولاً چراغ‌های راهنما را به دو دسته تقسیم می‌کنیم: چراغ‌های راهنمای ساده (simple beacons) و چراغ‌های راهنمای مرکب (compound beacons).
منابع:
کتاب «مغز برنامه‌نویس» از انتشارات منینگ

گزیده:
«حکما گفته‌اند کوشا باشید تا آبادان باشید و خرسند باشید تا توانگر باشید و فروتن باشید تا بسیاردوست باشید.» قابوس‌نامه

شوک‌های ذهنی! (۱)

  • یوسف مهرداد بی‌بالان

نمی‌دانم از چه زمانی به این نتیجه رسیدم برخی از واژگانی که در ذهنم با یکدیگر ارتباط معنایی درستی دارند، با تغییر شرایط و موضوع،‌ نه تنها ارتباط بین آنها تغییر می‌کند بلکه گاهی هیچ ارتباطی با هم پیدا نمی‌کنند. اصرار به حفظ ارتباط قبلی بین آنها با وجود تغییر شرایط،‌ من را به بیراهه خواهد برد. به گذشته که نگاه می‌کنم این بیراهه‌ها گاهی به ناکجا آباد رسیده است.

نمونه ۱:
در درس فیزیک در بحث قانون گازها گفته‌ می‌شد که با فرض ثابت بودن دما،‌ اگر فشار گاز را افزایش دهیم، حجم آن کاهش پیدا می‌کند. در نتیجه فشار گاز و حجم آن با یکدیگر رابطه غیرمستقیم دارند، افزایش یکی به کاهش دیگری منجر می‌شود.

شوک ۱: افزایش قطعیت منجر به کاهش عدم قطعیت نمی‌شود!
پیش از آن در ذهنم این گونه بود که بدیهی است که رابطه‌ی قطعیت و عدم قطعیت (شرایط غیرقطعی) مثل رابطه فشار و حجم گازها هستند. مثل رابطه‌ی نور و تاریکی است! افزایش یکی یعنی کاهش دیگری! اگر بتوانید قطعیت را افزایش دهید، عدم‌قطعیت (شرایط غیرقطعی) را کاهش داده‌اید.

بعدها به این نتیجه رسیدم که واقعا این گونه نیست. این اتفاق زمانی افتاد که داشتم کتابی در زمینه‌ی مدیریت پروژه می‌خواندم. شما نمی‌توانید با افزایش قطعیت،‌ عدم قطعیت (شرایط غیرقطعی) موجود را کاهش بدهید! (فکر کنم شما هم دچار شوک ذهنی شدید 🙂 ).

شما نمی‌توانید با برنامه‌ریزی دقیق روزهای آینده (افزایش قطعیت)، مانع از اتفاقاتی شوید که ممکن است در روزهای آینده رخ دهد (کاهش عدم قطعیت). به همین سادگی!

پس گفتار:
حالا هم نمی‌دانم چه بخش‌های دیگری از مدل‌های ذهنی‌ام به مبحث مورد استفاده وابسته‌اند و با تغییر مبحث،‌ کارکرد خودشان را از دست می‌دهند ولی من کماکان پای‌بند مدل ذهنی گذشته‌ هستم. به قول مولانا «چه دانم‌های بسیار است لیکن من نمی‌دانم»

قدیمی‌ترین مدرسه روستایی ایران کجاست؟

  • یوسف مهرداد بی‌بالان

به نقل از همشهری آنلاین:
آمار بالای باسوادی در گیلان بی‌شک مرهون تاریخ دیرپای راه‌اندازی مدرسه روستایی به سبک نوین و همگانی است؛ مدرسه‌ای که برای نحستین بار در سال ۱۳۰۴ شروع به کار کرد و حالا ۹۶ ساله شده است.

آشنایی با قدیمی‌ترین مدرسه روستایی کشور
گزارش‌ها و خبرهای فراوانی از اینکه نخستین مدرسه روستایی کشور در کدام نقطه از کشور به آموزش دانش‌آموزان پرداخته منتشر شده، اما واقعیت این است که قدیمی‌ترین مدرسه ایران در یکی از روستاهایی شرقی‌ترین نقطه استان گیلان افتتاح شده بود. در واقع نخسین و قدیمی‌ترین مدرسه روستایی ایران در روستای بی‌بالان کلاچای از توابع شهرستان رودسر در شرق گیلان قرار دارد.

مهم‌ترین مساله‌ای که باید درباره این مدرسه ابتدایی بدانیم این است که از زمان تاسیس تاکنون فعال بوده و هنوز هم کار تحصیل و آموزش در آن در حال انجام است و خانواده‌های روستا کودکانشان را به کادر تحصیل آن می‌سپرند تا مدارج تحصیل را طی کنند.

این مدرسه در حال حاضر با نام مدرسه محمد باقر صدر شناخته می‌شود.

گزیده:
«هرگاه به مدرسه قدم می‌گذارم، با مشاهده چهره‌های کثیف و تکیده، موهای ژولیده، و برق چشمانِ این کودکان فقیر، دستخوش ناآرامی و انزجار می‌شوم و همان حالتی به‌من دست می‌دهد که بارها از دیدن شراب‌خواران مست، بر من مستولی شده‌است. ای خدای بزرگ! چگونه می‌توانم آن‌ها را نجات دهم؟ نمی‌دانم به کدامین یک کمک کنم. من آموزش و پرورش را فقط برای توده‌ها می‌خواهم و نه کسی دیگر، مگر بتوانم پوشکین‌ها و لومونسف‌های آینده را از غرق‌شدن رهائی بخشم.»
لئو تولستوی

زمستان ۱۳۹۴: دوره تحلیل نیازمندی‌ها

  • یوسف مهرداد بی‌بالان

 

 

خاطره راهی است برای نگه داشتن آن چه دوستش دارید، آن چه که هستید و آن چه هرگز نمی‌خواهید از دست بدهید. کوین آرنولد

مغز برنامه‌نویس: چگونه کد چانک‌شده بنویسیم(۴)

  • یوسف مهرداد بی‌بالان

چگونه کد قطعه‌بندی شده یا چانک‌شده (chunkable code) بنویسیم؟

راهکار یک: از الگوهای طراحی (design pattern) استفاده کنید
اگر می خواهید کدی بنویسید که به راحتی قطعه‌بندی (چانک‌شده)‌ شده باشد، از الگوهای طراحی استفاده کنید. یافته‌های والتر تیچی (Walter Tichy)، استاد علوم کامپیوتر در موسسه فناوری کارلسروهه‌ی آلمان به صورت اتفاقی ارتباط بین قطعه‌بندی کدها با الگوهای طراحی را مورد بررسی قرار داده است. او به دنبال بررسی الگوهای طراحی بود و به ویژه علاقه داشت تا بررسی کند که الگوهای طراحی تا چه میزان می‌تواند هنگام نگهداری کد (افزودن ویژگی جدید یا رفع خطا) (maintenance) به برنامه‌نویسان کمک می‌کند.

تیچی ابتدا آزمایشی را با گروهی از دانشجویان شروع کرد تا بررسی کند که دانستن الگوهای طراحی چه کمکی به آنها در فهمیدن کد می‌کند. نتایج تحقیق تیچی نشان داد که در هنگام نگهداری سیستم، زمانی وجود الگوهای طراحی در کد برای برنامه‌نویسان مفیدتر است که آنها از وجود آن الگوها در کد مطلع باشند.
پس از آن،‌ تیچی تحقیق مشابهی را روی برنامه‌نویسان حرفه‌ای انجام داد. در این آزمایش ابتدا از شرکت‌کنندگان خواسته شد تا کدی را اصلاح کنند. پس از آن، یک کلاس آموزش الگوهای طراحی برای آنها برگزار شد و دوباره از آنها خواسته شد تا کد قبلی را با یا بدون الگوهای طراحی اصلاح کنند. زمان سپری‌شده توسط افرادی که از الگوهای طراحی استفاده کرده بودند کمتر از زمان افرادی بود که بدون استفاده از الگوهای طراحی، کد را اصلاح کرده بودند.

نتایج این مطالعه نشان می‌دهد که دانستن الگوهای طراحی احتمالاً باعث افزایش توانایی شما برای قطعه‌بندی یا چانک‌سازی کدها را افزایش می‌دهد و به دنبال آن، به شما در پردازش سریع‌تر کد کمک می کند.

راهکار دو: توضیح (comment) بنویسید
آیا باید برای کد، توضیح (کامنت)‌ بنویسیم یا کد باید “خود بیان” (document itself) باشد؟ این پرسش یکی از پرسش‌های چالش‌برانگیز در دنیای برنامه‌نویسان است که نظرات متفاوت و متضادی درباره‌ی آن وجود دارد. محققان به این پرسش پرداخته‌اند و به یافته‌های جالبی رسیده‌اند.

تحقیقات نشان می‌دهد وقتی کدی حاوی توضیحات است، برنامه‌نویسان زمان بیشتری را برای خواندن آن صرف می‌کنند. ممکن است فکر کنید این یافته نشانه‌ی بدی است چون به این معنی است که خواندن توضیحاتِ همراه کد باعث کندی در خواندن و فهمیدن کد می‌شود. اما در واقع، این یافته نشان می‌دهد که وقتی برنامه‌نویسان کد را می‌خوانند به توضیحات همراه آن توجه می‌کنند و آن را می‌خوانند. به عبارت دیگر، این یافته نشان می‌دهد اضافه کردن توضیحات به کد، کار عبث و بی‌ارزشی نبوده است.

مارتا الیزابت کرازبی (Martha Elizabeth Crosby)، محقق دانشگاه هاوایی، مطالعاتی روی روش کدخوانی برنامه‌نویسان و نقش توضیحات همراه کد در کدخوانی انجام داده است. کار کرازبی نشان داد که برنامه‌نویسان مبتدی بیشتر از برنامه‌نویسان باتجربه و حرفه‌ای‌ به توضیحات کد توجه می‌کنند. یافته‌های کرازبی نشان می‌دهد افزودن توضیحات به کد می‌تواند روش خوبی برای کمک به برنامه‌نویسان تازه‌کار برای فهمیدن کد باشد.

پایان‌نامه کویین فن ( Quiyin Fan) در سال 2010 در دانشگاه مریلند با عنوان “The Effects of Beacons, Comments, and Tasks on Program Comprehension Process in Software Maintenance,” نشان داد که توسعه‌دهندگان هنگام خواندن کد، وابستگی شدیدی به توضیحات کد دارند. به ویژه توضیحات کلانی مانند “این تابع یک درخت دودویی را چاپ می‌کند” می‌تواند به برنامه‌نویسان کمک کند تا قطعات بزرگتر کد را تکه‌تکه کنند و بفهمند. از سوی دیگر، توضیحات جزیی مانند “یکی به n اضافه می‌کنیم” پس از خطی که متغیر n را یکی افزایش داده است (n = n+1)،‌ نه تنها کمکی به خواندن و فهم کد نمی‌کند بلکه فرایند قطعه‌بندی (چانک‌سازی) را دچار اختلال و کندی می‌کند.

منابع
:
منبع: کتاب «مغز برنامه‌نویس» از انتشارات منینگ

گزیده:

لگوهای طراحی نباید بدون تفکر و بدون یک فرایند تصمیم‌گیری (بدون قید و شرط) مورد استفاده قرار گیرند. اغلب آنها با اضافه کردن سطوحی برای ارتباط غیرمستقیم اجزا باعث انعطاف‌پذیری و تغییر‌پذیری می‌شوند و این سطوح اضافه‌شده می‌توانند موجب افزایش پیچیدگی طراحی یا کاهش کارایی گردند. در نتیجه، الگوهای طراحی فقط زمانی باید استفاده شوند که انعطاف‌پذیری ایجادشده توسط آنها واقعا ضرروی باشد.
اریک گاما یکی از GoF

سخنرانی علمی تورینگ: یادگیری عمیق و هوش مصنوعی

  • یوسف مهرداد بی‌بالان

به تازگی نوشته‌ای از جاشوا بنجو (Yoshua Bengio)،‌ یان لی‌کو (Yann LeCun) و جفری هینتن (Geoffrey Hinton) در بخش «Turing Lecture» نشریه C-ACM با عنوان Deep Learning for AI منتشر شده که مطالعه‌ی آن برای من بسیار آموزنده بود.

بنجو، لی‌کو و هینتن در سال ۲۰۱۸ جایزه تورینگ (معادل نوبل کامپیوتر)‌ را به خاطر کشف‌‌شان که شبکه‌های عصبی عمیق (deep neural networks ) را به یکی از تاثیرگذارترین موضوعات محاسبات و زندگی بشری تبدیل کرد دریافت کردند.

آنها در این نوشته ابتدا به صورت اجمالی به شرح خاستگاه یادگیری عمیق پرداخته‌اند و در ادامه به تعدادی از جدیدترین پیشرفت‌ها آن اشاره کرده‌اند و در پایان چالش‌های آتی آن را مورد بحث و بررسی قرار داده‌اند.

از جمله چالش‌های اشاره شده در این نوشته می‌توان به:
– چالش یادگیری با حداقل یا بدون نظارت خارجی (Little or no external supervision)
– چالش نمونه‌های آزمایشی (test examples) که توزیع (distribution) متفاوتی با توزیع داده‌های آموزشی (training examples ) دارند
– چالش استفاده از یادگیری عمیق برای کارهایی که انسان به صورت گام به گام و طی یک مجموعه از گام‌ها یاد می‌گیرد. به این گونه کارها سیستم شماره ۲ گفته می‌شود. برای اطلاعات بیشتر به کتاب «تفکر سریع- تفکر آهسته» از دنیل کانه‌من مراجعه بفرمایید.

اگر به یادگیری عمیق یا هوش مصنوعی علاقه‌مند هستید،‌ پیشنهاد می‌کنم مطالعه‌ی این نوشته‌ی ارزشمند را از دست ندهید.

گزیده:

“Our intelligence is what makes us human, and AI is an extension of that quality.” Yann LeCun

مغز برنامه‌نویس: حافظه‌ی نمادین (۳)

  • یوسف مهرداد بی‌بالان

شما کد بیشتری نسبت به کدی که خواندید می‌‌بینید
قبل از آن که اطلاعات وارد حافظه‌ی کوتاه‌مدت شوند، وارد مرحله‌ای از پردازش می‌شوند که به آن حافظه‌ی حسی (sensory memory) گفته می‌شود. اگر حافظه‌ی بلندمدت مانند دیسک سخت (hard disk) و حافظه‌ی کوتاه‌مدت مانند حافظه‌ی دسترسی تصادفی ( RAM) باشد، حافظه‌ی حسی مانند بافر ورودی-خروجی (I/O Buffer) است.

حافظه‌ی نمادین (Iconic Memory)
قبل از آن که اطلاعات وارد حافظه‌ی کوتاه‌مدت شود ابتدا از طریق حس‌ها وارد حافظه‌ی حسی می‌شود. موقعی که کدی را می‌خوانید، اطلاعات از طریق چشم‌ها و به صورت مختصر در حافظه‌ی نمادین ذخیره می‌شوند. برای تجربه کردن این موضوع،‌ وقتی این جمله را خواندید، چشم‌هایتان را ببندید. با وجودی که چشمان شما بسته است،‌ کماکان می‌توانید شکل این صفحه را «ببینید»! این تصویر در حافظه‌ی نمادین شما ذخیره شده است.
[مثالی دیگر:‌ شب بیدار می‌شوید تا یک لیوان آب بنوشید و چراغ آشپزخانه را روشن می‌کنید. خیلی سریع و ناگهانی، لامپ می‌سوزد و در تاریکی می‌مانید، اما با توجه به نگاه گذرایی که به آشپزخانه داشته‌اید، می‌توانید مدتی خیلی کوتاه تصور کنید که آشپزخانه چه شکلی بوده است. منبع: سایت خودشکوفا]

حافظه‌ی نمادین و کد
همان طور که گفته شد هر آن چه می‌خوانیم ابتدا در حافظه‌ی نمادین ذخیره می‌شود. اما لزوما هر چه در حافظه‌ی نمادین ذخیره می‌شود توسط حافظه‌ی کوتاه‌مدت پردازش نمی‌شود،‌ در نتیجه وقتی که کدی را با جزییات می‌خوانید ناچارید تصمیم بگیرید که چه چیزی را پردازش کنید و چه چیزی را پردازش نکنید. چنین انتخابی آگاهانه اتفاق نمی‌افتد. و این بدان معناست که از نظر تئوری شما می‌توانید اطلاعات بیشتری درباره‌ی کد را نسبت به آن چه در حافظه‌ی کوتاه‌مدت‌تان پردازش می‌شود، به یاد بیاورید.
به کمک این یافته درباره‌ی حافظه‌ی نمادینُ می‌توان اثربخشی خواندن کد را افزایش داد: ابتدا مدت کوتاهی به کد نگاه کنید و سپس به آنچه دیدید فکر کنید. این تکنیک “کد در یک نگاه” (code at a glance) به شما کمک می‌کند تا تصویری ابتدایی از کد به دست آورید.

در آزمایش دیگری از برنامه‌نویسان مبتدی،‌ متوسط و خبره خواسته شد تا ۲۱ کلمه‌ی کلیدی در زبان الگول را که به آنها آموزش داده شده بود بنویسند. محققان با این آزمایش توانستند بین یادآوری افراد و شیوه‌ی که آنها بین کلمات ارتباطات ایجاد می‌کنند به یافته‌هایی جدیدی برسند. نتایج مطالعه نشان داد که روش گروه‌بندی کلمات کلیدی توسط افراد مبتدی با خبرگان تفاوت دارد. به عنوان مثال، افراد مبتدی اغلب از جملات به عنوان کمک‌ برای حفظ کردن استفاده می‌کنند مثلا “TRUE IS REAL THEN FALSE”. ولی افراد خبره از دانش قبلی خود در زمینه برنامه‌نویسی برای گروه‌بندی کلمات استفاده می‌کنند مثلا آنها “TRUE, FALSE” را “IF, THEN, ELSE” ترکیب می‌کنند. این مطالعه دوباره تأیید کرد که روش فکر کردن خبرگان به کد با افراد مبتدی متفاوت است.

گزیده:
یکی از مزایای داشتن حافظه‌ی بد این است که افراد می‌توانند از این که دارند چیزهای خوب و خوشایند را برای اولین بار تجربه می‌کنند، چندین و چند بار لذت ببرند. 🙂
فردریش نیچه

منابع:
منبع: کتاب «مغز برنامه‌نویس» از انتشارات منینگ
عکس از اینجا

برای خروج از جستجو کلید ESC را بفشارید