مخاطب این سری نوشته ها برنامه نویسانی هستند که علاقه دارند که Functional Programming رو یاد بگیرند یا در حال یادگیریش هستند یا عزیزان وارسته ای که از همون ابتدا به سراغ رشته ریاضیات رفتند و التماس دعا ما رو هم پذیرا هستند.
چند وقتی هست که خودم برنامه نویسی Functional Programming با استفاده از زبان Scala رو به صورت جدی تری شروع کردم و متوجه شدم که برای این که این کار رو درست انجام بدم باید دانش پایه ای زیرینش که Category Theory هست رو یاد بگیرم. مطالب زیادی در این باره در اینترنت هست ولی یکی از اونها که واقعا ارزش وقت گذاشتن و خوندن داشت مطالبی بود که آقای Milevski به صورت ویدئو و کتاب اختصاصا برای برنامه نویسها تهیه کرده و به صورت رایگان در اختیار عموم قرار داده:
ویدئو ها:
کتاب:
https://bartoszmilewski.com/2014/10/28/category-theory-for-programmers-the-preface/
مطالب هم بسیار ساده و قابل فهم تنظیم شده و هم بسیار جذاب توضیح داده میشه و یک دید فلسفی هم پشت صحبتهاش هست که جذابیت صحبتها رو دو چندان می کنه. تصمیم گرفتم در مورد این مجموعه صحبت کنم. ترجمه این مجموعه کار بی فایده ای به نظرم میرسه چون مطلب اینقدر گویا و شیوا بیان میشه که احتیاجی به ترجمه شخص دیگر نیست به خصوص که مخاطب این نوشته هم برنامه نویس های با سابقه ای هستند که قصد یادگیری یا بهتر کردن مهارتهای برنامه نویسی Functional رو دارند در نتیجه احتمالا مشکلی با مطالعه متون انگلیسی ندارند.
من در اینجا فقط سعی می کنم در مورد مطالبی که از این مجموعه ویدئو ها یاد میگیرم بحث کنم سوالاتی بپرسم و هدفم از راه انداختن این بحث ها ایجاد امکان یادگیری عمیقتر موضوع برای خودم و دیگران هست.
لطفا قبل از این که ادامه مطلب رو بخونید برید و اولین قسمت این مجموعه رو مطالعه کنید. مطمئنم که بعد از دیدنش خودتون هم دلتون میخواد راجع بهش با یکی سر و کله بزنید
کاربرد و انگیزه:
من عقیده دارم کلا هیچ علمی نباید همینطوری بی دلیل مطالعه بشه، باید یک دلیل اساسی برای شروع مطالعه یک علم داشته باشیم وگرنه خیلی زود سرخورده میشیم و کم میاریم چون خیلی زود ممکنه به این نتیجه برسیم که خب که چی؟! این همه مطلب رو مطالعه کردم نتیجه اش قرار هست چی بشه؟
در مورد Category Theory برای من و تمام اون عزیزانی که میخوان برنامه نویسی فانکشنال انجام بدهند واضح هست: برای این که بتونم برنامه نویسی فانکشنال رو عمیقتر و بهتر یاد بگیرم. در حقیقت این نظریه خودش یک زبان فانکشنال هست منتها به خالص ترین شکلش. این که چرا من می خوام برنامه نویسی فانکشنال یاد بگیرم یک مطلب جداگونه ای هست که در این مقال نمی گنجه.
در مقایسه با Lambda Calculus:
خب یکی از اولین اسمهای ریاضی که معمولا یک برنامه نویس فانکشنال باهاش برخورد می کنه lambda calculus یا جبر لامبدایی هست و معمولا این برخورد تجربه ناخوشایندی هست:
((λg.(g(g(λx.x)))) (λh.((λf.(f(f(λz.z)))) (λw.(h(w(λy.y)))))))
اولین بار که باهاش مواجه شدم احساس کردم دارم فحش میشنوم. ولی همونطور که درجریانید متاسفانه تمام زبان های فانکشنال بر پایه ی این جبر بنا نهاده شدن و اگر یک مقدار پیش رفته باشید متوجه شدید که این زبان در حقیقت خیلی ساده است و نباید گول ظاهرش رو خورد. از طرفی چیز خیلی به درد بخوری هم اینجا برای یادگیری نیست. من به عنوان یک برنامه نویس هیچ وقت لازمم نشده با lambda calculus سر و کله بزنم. معمولا وقتی رفتم سراغش که یک پیچ جاده رو اشتباهی پیچیدم. تا اینجای کار برداشت من این بوده که lambda calculus برای برنامه نویس های فانکشنال بیشتر شبیه به RFC ها برای بقیه برنامه نویسهاست هیچ کس حتی نگاه هم بهشون نمیندازه ولی همه تظاهر می کنند که خیلی بهش مسلط هستند و باید بهش مسلط بود. من به شخصه ترجیح میدم هیچ وقت دیگه سراغش نرم، هر چند که ممکنه خیلی زود نظرم درباره اش عوض بشه. (آخرین باری که مجبور شدم راجع بهش بخونم زمانی بود که سعی کردم یک روش عمومی برای تبدیل توابع recursive به توابع tail recursive پیدا کنم که به Continuation-passing style رسیدم که کمک چندانی بهم نکرد در پیدا کردن راه حل)
در واقع اون قسمتی از ریاضیاتی که هم جذابیت بیشتری می تونه داشته باشه و هم عمق بیشتری Category Theory هست.
بسیاری از مفاهیم برنامه نویسی فانکشنال مثل Map, FlatMap, Functor, Monoid, Monad, Applicative و ... در واقع معادل یک به یک مفاهیمی هستند با همین نام در Category Theory. ما در واقع با یادگیری یک زبان فانکشنال در حال یادگیری Category Theory هستیم ولی به شکل ناخالصش.
ما میتونیم تا مدتها مشغول کد زدن به یکی از زبونهای نیمه فانکشنال مثل پایتون باشیم و هیچ وقت این چیزا هم لازممون نشه ولی به محض این که بخوایم یکم جدی تر موضوع رو دنبال کنیم باید بریم سراغ این مفاهیم و چه بهتر که برای یادگیریش بریم سراغ ریشه اش به جای این که صرفا پیاده سازی این مفاهیم رو در یک زبان خاص یاد بگیریم.
بحث:
تو ویدئو اول این مجموعه میبینیم که میلوسکی ۲ چیز رو به هم مرتبط میکنه:
۱- نحوه ای که ذهن ما تکامل پیدا کرده و توانایی تجرید رو بدست آورده
۲- نحوه حل مسئله تجزیه و ترکیب که ما در تمام علوم داریم. یعنی شکوندن مسئله به مسائل کوچکتر و حل کردن هر کدام از اونها و ترکیب کردن جواب این جواب ها
آیا این تنها روش حل کردن مسائل هست؟ آیا ما نحوه ی متفاوتی از تفکر سراغ نداریم که به جای شکوندن مسئله به مسائل کوچکتر به نوع متفاوتی با مسائل مواجه بشه؟
پی نوشت:
۱- برای اون دسته از خوانندگانی که برنامه نویس هستند ولی با این وجود احساس می کنند من دارم به زبون مریخی صحبت می کنم، یا از خودشون میپرسن اصلا فانکشنال دیگه چه کوفتیه؟!، ارجاعتون میدم به اولین قسمت ویدئویی که لینکش رو در همین مطلب گذاشتم
۲- هدف نهایی من از نوشتن این مطالب درست کردن یک کامیونیتی جمع و جور از برنامه نویس های فانکشنال هست، چون ایمان دارم که برنامه نویس های فانکشنال تاثیر گذار ترین برنامه نویسهای آینده خواهند بود و میدنم اگر قرار باشه کار بزرگی در این زمینه انجام بدیم اون کار باید به صورت جمعی انجام بشه
۳- اگر بعد از تماشای اولین قسمت ویدئو کلی سوال یا موضوع جالب به ذهنتون رسید کامنت دونی این مطلب متعلق به شماست