ساده بودن با کوچک بودن یکی نیست
خلاصهٔ کاملتر
ماجرا از یه سؤال بعد از سخنرانی نویسنده دربارهٔ یه باگ پوشش کد شروع میشه؛ باگی که ۹ ماه وقت شرکتش رو گرفته بود. یه دوستش پرسیده چطور ابزار بسازیم که این داستانهای دیباگ حماسی لازم نشه، و جواب اونموقعش این بوده که «باید سادگی رو اولویت بدیم». نویسنده میگه از این جواب راضی نیست، و بقیهٔ مقاله تلاشیه برای اینکه بگه سادگی دقیقاً چیه.
مثالش دو برنامه برای شمردن فراوانی کلمههای یه فایله. اولی یه پایپلاین کوتاه شله که خیلیها بهش میگن ساده: هر ابزار کوچیکه و همه ad-hoc به هم وصل میشن. بعد یه تغییر کوچیک میخواد، اینکه خروجی بهترتیب اصلی فایل چاپ بشه. به گفتهٔ نویسنده تو Clojure این کار سرراسته، کافیه دنبالهٔ کلمهها رو نگه داری و فراوانی هرکدوم رو از یه map بخونی:
(->> (slurp "README.md")
(re-seq #"[a-zA-Z]+")
(map str/lower-case)
frequencies
(sort-by val >))تو Bash ولی همون تغییر به چند فایل موقت و یه سری regex و sort و join و cut بیریخت میکشه. نویسنده میگه دلیلش اینه که برنامهٔ اولی کوچیک بود، نه ساده.
تعریف سادگی رو از سخنرانی Simple Made Easy ریچ هیکی وام میگیره: sim-plex یعنی «یه رشته»، مقابل com-plex که چند چیز رو به هم میبافه. نویسنده بهجای «پیچیده» کلمهٔ «کوپلشده» رو میذاره تا ابهام نباشه. با این زبون، پایپلاین یونیکس کوچیکه ولی کوپلشده؛ چون man page خود uniq میگه خطهای تکراری غیرمجاور رو نمیگیره، پس مجبوری اول مرتب کنی و شمارش به ترتیب گره میخوره. جدا کردن این دو تا از هم بعدش تقریباً غیرممکن میشه.
نویسنده معتقده جملهٔ معروف «هر برنامه یه کار رو خوب انجام بده» تو عمل دربارهٔ اندازهست نه سادگی: ابزارهای یونیکس کوچیکان، ساده نیستن. سر دیگهٔ ماجرا Google Drive for Desktop هست؛ برنامهای عظیم با file watcher مخصوص هر پلتفرم و کلاینت شبکه و منطق حل تعارض، ولی برای کاربر سادهست: نصبش میکنی، میگی کدوم پوشه رو بپاد و بقیهش با خودشه. یعنی بزرگ بودن با کوپل بودن یکی نیست.
نکات کلیدی:
- سادگی از ریشهٔ sim-plex یعنی «یه رشته»، در مقابل com-plex که چند چیز رو به هم میبافه
- پایپلاین پنجمرحلهای شمردن کلمهها کوچیکه ولی شمارش رو به مرتبسازی کوپل کرده
- uniq خطهای تکراری غیرمجاور رو نمیبینه، پس مرتبسازی قبلش اجباری میشه و کل ورودی تو حافظه جمع میشه
- عوض کردن ترتیب خروجی تو Clojure چند خط کار داره، تو Bash فایل موقت و join و cut
- Google Drive for Desktop مثال برنامهٔ بزرگ ولی ساده از دید کاربره: بزرگی مساوی کوپل بودن نیست




