یکی از چیزهایی که همیشه باهاش مشکل داریم، کدهای قدیمیه.
میراثی از گذشتگان، یا گاهی میراثی از نسخه احمقتر خودمون در گذشته 😁
حالا کاری که این روزها میکنیم چیه؟
میایم همین کدهای حساس و قدیمی رو میدیم به سیستمی که کارش حدس زدن محتملترین جواب بعدیه؛ یعنی LLM یا همون چیزی که بهش میگیم هوش مصنوعی.
البته refactoring با AI روی کاغذ خیلی جذابه.
به مدل میگیم:
این ماژول رو تمیز کن، duplicationها رو بررسی و حذف کن، اسمها رو بهتر کن، کد رو سادهتر کن.
و مدل هم شروع میکنه به تغییر دادن کد.
اما مسئله اینجاست که بعد از تموم شدن کار AI، شما ممکنه یک کد تمیزتر، سادهتر و قابلفهمتر داشته باشید، اما از بیرون برنامه باید دقیقاً همان رفتار قبلی رو داشته باشه.
مشکل اینه که درصد بالایی از این کدهای قدیمی تست درستوحسابی ندارن.
اینجاست که فاجعه رخ میده.
البته اگر خوششانس باشید، همون لحظه چیزی خراب میشه و متوجه میشید. اگر بدشانس باشید، چند هفته بعد یک edge case عجیب فعال میشه و میفهمید اون کد داغون بیدلیل اونجا نبوده.
برای همین به نظرم قبل از اینکه از AI بخوایم کد قدیمی رو refactor کنه، بهتره اول ازش بخوایم رفتار فعلی سیستم رو قفل کنه.
یعنی به جای اینکه مستقیم بگیم «کد رو تمیز کن»، اول بریم سراغ اینکه بهش بگیم:
کد رو بخون، رفتار فعلی رو بفهم، و براش تست بنویس؛ اما خود کد رو تغییر نده.
حتی اگر کد زشته، حتی اگر ساختارش بده، حتی اگر اسم متغیرها فاجعه است، اول باید بفهمیم همین کد زشت الان دقیقاً چه کاری انجام میده.
بعد اینجا ما وارد میشیم؛ انسانهای شریف 😁
به جای اینکه مستقیم با کد قدیمی کشتی بگیریم، تستهایی که AI نوشته رو review میکنیم. ببینیم واقعاً رفتار فعلی سیستم رو پوشش میدن یا نه.
وقتی تستها قابل قبول شدن، تازه میشه رفت سراغ مرحله بعد:
حالا refactor کن، ولی به تستها دست نزن.
هر تغییری که میدی، تستها رو اجرا کن. اگر تست شکست، یعنی یا refactor اشتباه بوده، یا چیزی هست که باید دقیقتر بررسی بشه.
فراموش نکنیم که ما تا سالها مجبوریم با کدهای legacy زندگی کنیم، نگهداریشون کنیم و کمکم بهترشون کنیم.
بدون AI، انجام این کار در خیلی از پروژهها شاید اصلاً مقرونبهصرفه نباشه.
اما با AI هم اگر مستقیم بریم سراغ «تمیز کردن کد»، ممکنه فقط technical debt قدیمی رو تبدیل کنیم به technical debt جدید، با ظاهری شیکتر.
برای همین به نظرم در کدهای قدیمی، اولین درخواست از AI نباید این باشه:
«این کد رو تمیز کن.»
درخواست بهتر اینه:
«قبل از اینکه دست به این کد بزنیم، کمک کن بفهمیم الان دقیقاً چه رفتاری داره.»
چون در legacy code، تمیزتر شدن کد کافی نیست.
اول باید مطمئن بشیم چیزی که سالها با هزار بدبختی کار کرده، بعد از refactor هنوز هم همون کار رو انجام میده.