تیغ اوکام، فلسفه و اهمیت تفکر مینیمال در توسعه نرم‌افزار

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

just for header
just for header

از 2 روز پیش اگه در توییتر فعال هستید احتمالا مشاهده کردید که بحثی شد درباره اینکه چطور فریمورک ها (و لایبرری ها) با گرفتن کنترل Architecture برنامه باعث کاهش خلاقیت برنامه نویس میشن و خیلی حرفهای مشابه... البته که در همون جا مخالفان زیادی از جمله خود بنده داشت، دفاع من از فریمورک ها این بود که خیلی اوقات تحت چهارچوب نبودن باعث ایجاد یک برنامه Monolithic و بسیار بزرگ میشه و راه توسعه چابک رو برای نرم‌افزار مخصوصا اگر در تیم‌های Agile توسعه داده میشه مسدود خواهد کرد. در همین مورد تو فکر بودم و برام سوال شد چطور باید با وجود استفاده از فریمورک ها در طولانی مدت، چابکی توسعه رو حفظ کرد؟ جوابش رو از قبل میدونستم ولی الان از جهت متفاوتی بهش رسیدم :)


تیغ اوکام what؟

William of Ockham
William of Ockham

ویکیپدیا در مورد خود اوکام میگه:

ویلیام اکام منطق‌دان و فیلسوف انگلیسی بود. او در سال ۱۲۸۵ میلادی در دهکده اُکام، در جنوب لندن زاده شد. او به احتمال قوی شاگرد دانس اسکوتوس بود. اکام مدتی در پاریس به تدریس مشغول بود و در مبارزه‌ای که میان کلیسا و دولت در جریان بود، به طرفداری از ناسیونالیسم برخاست و در نتیجه مغضوب کلیسا شد و ناچار شد، به حاکم باواریا پناه ببرد. در حقیقت دوره فلسفه مدرسی با اکام پایان می‌پذیرد.

و در مورد اصلی که بنیان گذاشت میگه:

تیغ اُکام (Occam's razor) اصلی منسوب به ویلیام اکام است. در سده ۱۴ میلادی ویلیام اُکام اصلی را مطرح کرد، که به «تیغ اکام»، «اُستُرهٔ اُکام»، «اصل امساک» یا «اصل اختصار تبیین» آوازه یافت. طبق این اصل، هرگاه در بارهٔ علت بروز پدیده‌ای دو توضیح مختلف ارائه شود، در آن توضیحی که پیچیده‌تر باشد احتمال بروز اشتباه بیش‌تر است و بنا بر این در شرایط مساوی بودن سایر موارد، احتمال صحیح بودن توضیح ساده‌تر بیش‌تر است.

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




مینیمالیسم در توسعه نرم‌افزار

Eat, Sleep, Code, Repeat
Eat, Sleep, Code, Repeat


رویکرد حداقلی را میتوان تقریبا در هر مقوله ای از زندگی پیاده کرد، و چه چیزی بهتر از برنامه نویسی؟ از انعطاف پذیرترین حرفه هایی که میشه یاد گرفت :)

همانند سبک‌زندگی مینیمالیستی، آیا میتوان در برنامه نویسی (و طراحی رابط یا تجربه کاربری) هم چنین گفت:

از دست هر آنچه که برای تو بلااستفاده است خلاص شو و تلاش کن روی چیزایی که برای تو راحتی و خوشحالی میارن تمرکز کنی

قطعا خیر، این تعریف برای توسعه دهندگان نرم افزار بسیار سست و ناپایدار است.

مینیمالسم فواید زیادی برای کسانی که قبولش کنند دارد. آقای Matt D’Avella در مستند خود درباره مینیمالیسم بحث را اینگونه عنوان میکند: ویدیو در یوتیوب

قبلنا جکی در همین مضمون دیده بودم که میگفت: "چطور در NodeJS یک برنامه سلام-دنیا مینویسی؟" جواب؟ "معلومه، میزنم npm i hello-world"

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

const _ = require('lodash');
_.filter([0, 1, 2, 3], item => item > 0);

این کار کاملا بیهوده و احمقانه‌ست وقتی داریم:

[0, 1, 2, 3].filter(item => item > 0);

فکر کنم تا اینجا منظورم رو گرفتید. اما شاید بگید، خب میشه از لایبرری های کوچکتر از استفاده کرد اگه نگران حجم هستی؟ باید بگم خیر، برای کار های به این کوچکی اصلا نیازی نیست به node_modules خودتونو از اینی که هست سنگین تر کنید! به چند دلیل:


  • درهم و برهمی - کتابخانه ها ممکن است با یکدیگر همپوشانی داشته باشند، و ممکن است روش های مختلفی برای انجام کارها وجود داشته باشد. ممکن است مشخص نباشد که کدام رویکرد صحیح است.
  • مطابقت با نظر دیگری - همه کتابخانه ها مجموعه قوانین خاص خود را به همراه می آورند ، هر چقدر هم که به نظر نرسیده باشد. به عنوان مثال ، ممکن است شما مجبور شوید داده های خود را طوری تغییر دهید که توسط کتابخانه تازه معرفی شده شما قابل قبول باشد - شاید فقط به جای اعشار ، اعداد را بگیرد.
  • بار ذهنی بیشتر - اگر كتابخانه دارای آسیب پذیری باشد كه شما برای به روزرسانی باید آن را به روز کنید؟ چه تعداد بسته / کتابخانه را به روز می کنم؟ کدام کتابخانه ها را به روز می کنم و چگونه اطمینان می دهد که همه موارد دیگر را خراب نمی کند؟ آیا پچ جدید تغییرات ارزشمندی دارد؟


این مورد آخر یکبار واقعا اتفاق اقتاد! یک توسعه دهنده npm هنگامی که فهمید فرانت‌اند یک سایت خرید و فروش بیت‌کوین از کتابخانه وی در پنل کاربری کاربران استفاده میکند، با یک بروزرسانی پکیج خود را با حاوی کد های بکدور کرد :)) البته خوشبختانه با هوشمندی تیم npm کد مخرب سریع شناسایی شد اما هیچ تضمینی نیست که ما هم اینقدر شانس داشته باشیم!

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


توصیه های من برای مینیمالیست شدن در برنامه‌نویسی

1) از چاه دیپندنسی ها بیاید بیرون: یا بهتر بگم، قبل npm install کردن کمی فکر کنید

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


2) جان من چرا کد های قدیمی رو هنوز بصورت کامنت نگه میداری؟

داری قطعه کدی رو تغییر میدی، کارت که تموم شد، تست میکنی، کاملا سالم اجرا میشه، حالا کامیت میکنی؟ نه، قبلش باید کد های قبلی که از ترس خراب کردن کامنت کردی پاک کنی، نباید احساس insecure بودن داشته باشی، پاکشون کن و کد جدید رو با یه کامنت دقیق و زیبا کامیت کن. مرسی :)


3) کمتر کد بزن، یا اصلا کد نزن "در مواردی خاص"

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


4) ایده های خودت رو به چالش بکش

ایدئالیسم بودن بخش بزرگی از مینیمالیسم بودنه، هرگز نباید بگی "اینطور انجامش میدم چون همیشه اینطور انجام میدادیمش" این تورو به جلو نمیبره اگه مثلا همیشه از jwt استفاده کرده بودید، یبار هم که شده از macaroons استفاده کنید. اینو همینطوری گفتم، این کارو نکنید، jwt عالیه :))


5) از کدی که قبلا نوشتید استفاده کنید

البته که در این مورد خودتون استادید ولی فقط همینو بگم که این کار به جونیور ها اصلا توصیه نمیشه ولی فرض کنید طرف مثلا 5 ساله داره asp.net میزنه حالا بره از پروژه قبلی یکم کد کپی کنه و وقتشو صرفه جویی کنه دیگه به جایی برنمیخوره که!


توصیه هام تموم شد :) امیدوارم تونسته باشم چیزی که در ذهن دارم رو واضح پیاده کنم

ممنونم از اینکه این مطلب رو مطالعه کردید، اگه خوشتون اومد میتونید روی دکمه ❤️ کلیک کنید و یا از نوشته قدیمی‌تر من هم دیدن کنید.


خوشحال میشم اگه نظراتم رو نقد کنید، توییترم: TahaCodes