یک App.js خالی و یک نشانگر چشمک‌زن، حس پتانسیل محض را منتقل می‌کنند. بدون محدودیت. بدون کدهای آماده (boilerplate) که به شما بگویند چه کار کنید. اما این بوم سفید، آزادی نیست؛ بلکه دعوتی باز برای بازسازی جهان از صفر است.

مالیات صفحه خالی

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

متوجه می‌شوید که ساخت یک لیست ساده، فقط نوشتن یک تابع map نیست. باید تصمیم بگیرید که در حین بارگذاری داده‌ها، اسکلت برنامه چه شکلی باشد، آیا می‌لرزد یا می‌لغزد، و تأخیر تا زمان نمایش آن چقدر باشد. باید تصمیم بگیرید وقتی شبکه در میانه‌ی اسکرول قطع می‌شود، چه اتفاقی بیفتد. آیا باید به طور خودکار دوباره تلاش کند؟ دکمه‌ای نشان دهد؟ یا صفحه قبلی را برای همیشه کش (cache) کند؟ باید تصمیم بگیرید که دو فیلتر فعال چگونه با هم تعامل می‌کنند و وقتی آن ترکیب نتیجه‌ای ندارد، حالت خالی (empty state) چه شکلی باشد. حتی باید تصمیم بگیرید که «صفر نتیجه» برای کاربر شما چه معنایی دارد.

این‌ها مسائل مربوط به «رسمی‌سازی» (formalization) هستند. تبدیل یک مفهوم مبهم به یک رفتار مشخص، سازگار و تکرارپذیر، سخت‌ترین بخش ساخت نرم‌افزار است. خودِ کد، صرفاً بازتاب آن انتخاب‌هاست. به همین دلیل است که قابلیت شخصی‌سازی بی‌نهایت، یک ویژگی (feature) نیست؛ بلکه یک مالیات است و صورت‌حساب آن در قالب تصمیمات خردی می‌رسد که سریع‌تر از آنچه انتظار دارید، روی هم انباشته می‌شوند.

تصمیماتی که مدام می‌گیرند

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

زمانی هزینه می‌دهید که یک مهندس جدید می‌آید و می‌پرسد چرا به جای یک کتابخانه استاندارد، منطق بازگشت (retry logic) سفارشی را انتخاب کرده‌اید، و هیچ‌کس پاسخ آن را نمی‌داند. زمانی هزینه می‌دهید که آپدیت مرورگر، یک هندلر لمسی که خودتان نوشته‌اید را از کار می‌اندازد، چون هیچ‌کس مستند نکرده که چرا آن آستانه (threshold) روی چهل و هشت پیکسل تنظیم شده است. زمانی هزینه می‌دهید که یک وصله امنیتی، شما را مجبور به بازنویسی (refactor) جریان احراز هویت اختصاصی‌تان می‌کند، چون هرگز چرخش توکن بازنشانی (refresh token rotation) را پیش‌بینی نکرده بودید.

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

هوش مصنوعی، تله‌ی سرعت

هوش مصنوعی این پویایی را خطرناک‌تر می‌کند، نه کمتر. یک مدل زبانی بزرگ می‌تواند یک ماژول کامل احراز هویت را در سی ثانیه تولید کند. می‌تواند یک لایه وضعیت (state layer) ایجاد کند، یک استراتژی کشینگ پیش‌نویس کند و قبل از اینکه قهوه‌تان سرد شود، محافظ‌های ناوبری (navigation guards) را بنویسد.

اما نکته اینجاست: هوش مصنوعی هزینه تصمیم‌گیری را کاهش می‌دهد، در حالی که هزینه مالکیت آن‌ها را دقیقاً به همان اندازه بالا نگه می‌دارد. اکنون می‌توانید بدهی فنی (technical debt) را سریع‌تر از هر تیمی در تاریخ ایجاد کنید. کد در روز دمو کار می‌کند. تست اولیه (smoke test) را پشت سر می‌گذارد. شش ماه بعد، وقتی ارائه‌دهنده OAuth یک نقطه اتصال (endpoint) را منسوخ می‌کند یا منطق ابطال کش (cache invalidation) در یک اتصال کند دچار تداخل زمانی (race condition) می‌شود، شما در حال عیب‌یابی تصمیماتی هستید که آن‌ها را به یک ماشین برون‌سپاری کرده بودید.

صورت‌حساب پنهان همیشه سر وقت می‌رسد. این هزینه با ساعت‌های مهندسی، جابه‌جایی بین زمینه‌ها (context switching) و فرسایش تدریجی سرعت پرداخت می‌شود.

خریدهای خسته‌کننده را برای دهه‌ها تهیه کنید

یک فریم‌ورک یا پلتفرم خوب، یک قفس نیست؛ بلکه خریدنِ زمان است.

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

یک فریم‌ورک بالغ، این الگوها را یک بار رسمی می‌کند. تصمیم می‌گیرد:

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

سپس رفتار را مستند می‌کند، موارد خاص (edge cases) را تست می‌کند و در حالی که شما خواب هستید، وصله‌ها (patches) را منتشر می‌کند. شما می‌توانید انرژی خود را صرف آن ده درصد نهایی کنید که واقعاً متعلق به خودتان است: تعامل نوآورانه، یا بیزنس خاص