بازنویسیِ کدِ کارراهافتاده، اغلب برای دلِ خودته
خلاصهٔ کاملتر
نویسنده با یه اعتراف شروع میکنه: یه تابستون چند هفته ساعت ۴ صبح بیدار میشد تا کدی رو که کارفرماش قبلاً بابتش پول داده بود بازنویسی کنه. اون کد هر روز تو پروداکشن اجرا میشد و روی CakePHP بود؛ چون نویسنده CakePHP بلد نبود ولی Laravel رو دوست داشت، تیکهتیکه پورتش کرد به Laravel. مرجش کردن، ولی به گفتهٔ خودش هیچوقت توجیهِ کسبوکاری براش نیاورد، چون نبود: برنامه همون کار رو برای همون کاربرها با همون سرعت انجام میداد. تنها چیزی که بهتر شد، حسِ خودِ نویسنده به کد بود.
به گفتهٔ نویسنده قویترین دلیل علیه بازنویسی، تلاشِ لازم نیست، بلکه حافظهست: کدی که سالها تو پروداکشن اجرا شده، سندِ مکتوبِ هر باگیه که یکی بهش خورده و بیسروصدا حلش کرده. اون شرطِ عجیب یا اون retry با timeoutِ مشکوک، اغلب «بافتِ زخم»ان و هر زخم نشونهٔ یه حادثهست که تو ندیدیش. اون به حرف جوئل اسپولسکی تو سال ۲۰۰۰ اشاره میکنه که بازنویسیِ کامل رو «بدترین اشتباه استراتژیک» یه شرکت نرمافزاری میدونست: کد رو دور بندازی، فیکسها رو هم دور انداختی و دوباره به همون باگها برمیخوری.
نویسنده میگه نکتهای که تو داستان خودش از دستش داده بود اینه: «ناآشنا» با «خراب» فرق داره. وقتی یه ابزار رو خوب بلد نیستی، هرچی باهاش ساخته شده اشتباه به نظر میرسه، چون هنوز دلیلِ انتخابها رو نمیبینی. اون توصیه میکنه از فرضِ مخالف شروع کنی: آدمهای قبل از تو احمق نبودن و کد به دلیلی این شکلیه، حتی اگه اون دلیل دیگه برات پیدا نباشه.
البته به گفتهٔ نویسنده این یعنی همهچیز رو فریز کنی نیست؛ اونجوری آخرش یه رانتایمِ منقضی با CVEهای باز رو تو ۲۰۲۶ اجرا میکنی. بعضی بدهیها واقعاً سررسید میشن: وقتی رانتایم یا یه وابستگیِ کلیدی EOL شده و مسیر ارتقا نداره؛ وقتی فقط یه نفر سیستم رو میفهمه و همون تازه استعفا داده؛ وقتی هر فیچر جدید بهخاطر طراحی سه برابر هزینه داره و میتونی روندشو نشون بدی؛ یا وقتی کسبوکار قابلیتی میخواد که کد برای رشد بهش ساخته نشده. تستِ ساده اینه: میتونی روی دردش عدد بذاری؟ اگه هیچ عددی درنیاد، اون چیزی که داری یه ترجیحِ سلیقهایه.
نویسنده میگه AI این معادله رو عوض میکنه، ولی نه اونجوری که میگن. استدلال تازه اینه که حالا بازنویسی ارزونه چون مدل تو یه بعدازظهر یه ماژول رو پورت میکنه — ولی تایپ کردن هیچوقت بخشِ گرونِ بازنویسی نبود، «بازکشف» بود. ایجنت یه نسخهٔ تمیز و بهظاهر منطقی تولید میکنه ولی نمیدونه چرا اون کدِ قدیمی اون timeoutِ عجیب رو داشت، چون دلیلش تو یه ترد اسلکِ ۲۰۲۱ و یه postmortemِ لینکنشدهست. پس بافتِ زخم رو حذف میکنه، تو دیپلویش میکنی و دوباره به همون باگهای قدیمی میخوری. راهِ خروج، مدلِ کندتر نیست؛ نوشتنِ «دلیلها» به زبون سادهست تا نفرِ بعدی — یا مدلِ بعدی — «چرا» رو بگیره، نه فقط «چی» رو.
نکات کلیدی:
- بیشتر بازنویسیها به سلیقه و یادگیریِ مهندس جواب میدن، نه به کسبوکار
- کدِ کارکرده دفترچهٔ باگهای حلشدهست؛ دور انداختنش یعنی تکرارِ همون باگها
- «ناآشنا» با «خراب» فرق داره؛ فرض کن سازندههای قبلی احمق نبودن
- بازنویسی وقتی درسته که بتونی روی دردش عدد بذاری: CVE، کندیِ توسعه، ریسکِ نیرو
- AI بازنویسی رو ارزونتر نمیکنه چون بخشِ گرونش بازکشفِ دلایل بود، نه تایپ




