هنوز چند بایت مونده که پیدا کنم...

بالاتر از کد فکر کن

بالاتر از کد فکر کن


میخوام خلاصه ای از سخنرانی لزلی لمپورت سال 2014 در سران اساتید مایکروسافت رو بنویسم. مغز سیستم های توزیع شده و سازنده لاتک (لِی‌تِخ). برنده جایزه تورینگ سال 2013 و مبدع الگوریتم های اسنپ شات و نانوایی مغز متفکر مایکروسافت آژور کازموس دی بی. فکر میکنم یک مدل فکری بسیار زیبایی هست و دونستش نه تنها خالی از لطف نیست که میتونه از ما برنامه نویس های بهتری هم بسازه. این یک ترجمه کلمه به کلمه نیست!

بالاتر از کد فکر کردن


چرا اصلا باید فکر کنیم؟
خوب چون کمک میکنه کلی چیزا رو انجام بدیم.  مثلا:

کی باید فکر کنیم؟
قطعا وقتی از غاز هنوز بیرون نیومدیم! چون اگر ببر ما رو دید دیگه دیره که در مورد نحوه شکار فکر کنیم، یا در مورد مثال دوم قبل از شروع کردن ساخت و ساز دیگه! شما که نمیخواین وقتی دارین سقف میزنین برای خونتون به طراحیش فکر کنید یا مثلا شالوده خونه... اما برای نوشتن یه برنامه هم ما باید زمانی فکر کنیم که هنوز هیچ کدی ننوشتیم.


چطوری  فکر کنیم؟
نوشتن.
نوشتن راه طبیعت برای نشون دادن اینه که چقدر فکر شما مزخرفه!  - دیک گیندن
برای فکر کردن باید بنویسید. اگر فکر میکنید و نمینویسن دارین خودتون رو گول میزنین. ادای فکر کردن رو دارین در میارین.

چی بنویسیم؟
مثلا برای شکار ببر دندون شمشیری ! خوب اون هیچی چون هنوز نوشتن اختراع نشده بود :) مثلا میشد نوشت واو چه کار خطرناکی! وقتی برای ساختن خونه مینویسیم میشه همون طرح اولیه )بلو پرینت( یا اسکچ به قول دوستای معمار. برا برنامه چی ؟ برا برنامه هم باید طرح بزنین اما برای برنامه ما میگیم مشخصات (specifications).

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

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

چطوری مشخصات نویسی کنیم؟
نوشتن نیازمند تفکر هست! پس چطور در مورد برنامه ها فکر کنیم؟ باید مثل دانشمندان کامپیوتر فکر کنیم در موردش. مدل فکری علمی مدل خلی موفقی از تفکر هست. کاری که علم میکنه مدل های ریاضی از واقعیت رو میسازه. در واقعیت سیستم های کامپیوتری تشکیل شده از سیستم های دیجیتال چیزایی مثل پردازنده، کنسول بازی و یا یه کامپیوتر معمولی که برنامه ای رو اجرا میکنه علاوه برا این تعداد زیادی از مدل ها؛ مثل ماشین تورینگ و نظیر این. اما از نظر من دو مدل از همه پر استفاده تر هستن:

  • توابع
  • دنباله ای از حالت ها

شما میتونید یک برنامه رو بر اساس توابع مدل سازی کنید به طوری که تابع یک ورودی رو به خروجی نگاشت میکنه (Map). یا بیش از یک ورودی و بیش از یک خروجی. اما در ریاضی توابع ساده تر هستن. در ریاضی توابع مجموعه ای مرتب از جفت ها هست. مثلا تابع مربع روی اعداد طبیعی به این شکله:


{<0,0>,<1,1>,<2,4>,<3,9>,…}
Square (2) = 4


و همیشه اینطوری میخونیمش که مثلا مربع عدد دو برابر چهار است. و دامنه تابع اولین عضو از اون جفتهاست که اینجا میشه همون اعداد طبیعی
{0,1,2,3,…}.


پس برای تعریف یک تابع باید یک دامنه هم برای اون تعریف کرد و برای هر المان x در این دامنه باید مشخص کنید که این تابع مربع نگاشت خواهد که به خروجی Square (x) = x2 در دامنه خودش البته. 
پس این تعریف یک تابع مربع شد. اما توابع در ریاضی مثل توابع در زبانهای برنامه نویسی نیستن. ریاضی به مراتب راحت تره.


محدودیت های مدل تابعی

  • تعریف میکنه که برنامه چکار میکنه اما مشخص نمیکنه چطور! مثلا مرتب سازی سریع و حبابی هر دو یک عملیات (تابع) رو انجام میدن اما چگونگی متفاوتی دارن.
  • برخی برنامه ها فقط کارشون نگاشت ورودی به خروجی نیست.
  • برخی برنامه ها تا ابد قراره اجرا شن مثل سیستمهای عامل

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


برای مثال بیاین الگوریتم های اقلیدسی رو بررسی کنیم:


الگوریتم فقط یک برنامه انتزاعی هست.
بر گردیم به مثال؛ الگوریتم ب.م.م رو تو ذهنتون بیارید. که خیلی ساده میاد x  رو به M و y رو به N انتساب میده و شروع میکنه عدد بزرگتر رو از عدد کوچکتر کسر میکنه و وقتی که x و y برابر بشن متوقف میشه چون اون عدد GCD یا همون ب.م.م خودمون هست.


برای دو عدد M = 12 و N = 18 فقط یک رفتار وجود داره که اینطوری شروع میشه که 12 رو به x و 18 رو y نسبت میده و شروع به کسر کردن میکنه:


[x = 12, y = 18] -> [x = 12, y = 6] -> [x = 6, y = 6]


و جایی متوقف میشیم که x و y برابر بشن. این خیلی الگوریتم ساده ای بود چون فقط یک رفتار ممکن داشت.

چطوری یک مجموعه ای از رفتارها رو توضیح بدیم؟
اول اینکه یه قاعده ای هست که میگه هر مجموعه بتا از رفتارها حاصل اجتماع دو مجموعه است؛ یک مجموعه از رفتارهایی که خصیصه سلامت رو ارضا میکنن و مجموعه ای از رفتارها که خصوصیت انگیزش رو ارضا میکنن.

حالا این دو چی هستن؟ سلامت و انگیزش
من نمیخوام وارد تعریف های رسمی بشم.

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

ادامه دارد...

نویسنده : محمد ملک مکان
یکشنبه 8 مرداد 1396
+ 70 -

خوشحال میشیم نظرتُ بدونیم