اینم یه تجربه پراکنده دیگه
من این دفعه دومی هست که میرم توی SoftwareTalks شرکت میکنم و این دفعه در مورد legacy code که من دوست دارم کدهای موروثی ترجمهاش کنم حرف زدم. قبل یکیم توی اینترنت گشتم و این موضوعات رو پیدا کردم
<iframe width="560" height="315" src="https://www.youtube.com/embed/B5kxN3if_7A" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>-
تعریف کد قدیمی / موروثی
- کد بد و قدیمی
- کد بدون تست
-
راههای کار با کد قدیمی / موروثی
-
چرا بده؟
- پیچیده است
- سخت است
- کندی توسعه
- حوضله سر بر و انگیزه کش
-
فرصتها
- ارزش آفرینی
- یادگیری
- انجام کاری که دوست داریم. حل مساله ولی از یه نوع دیگه
-
نکات تستی
- نویسنده قبلی رو قضاوت نکنیم
- تست شخصیت/ویژگیهای کد
- استفاده از ابزار تولید تست اتوماتیک
- تغییرات کوچک به همراه قانون دسته پیش آهنگی
- قدمهای آهسته و پیوسته به سمت طراحی بهتر
- نق زدن و اینا رو کنار بگذارید و کاری انجام بدید
- قدمهای صفر: ورژن کنترل و isuue tracker
- با کد آشنا شوید و قسمتهای قطعا بدون استفاده را حذف کنید
- کم کم به سمت ci بروید
-
-
کد قدیمی که بهش افتخار کنیم. یا نگذاریم قدیمی بشه
حسین طالقانی عزیز هم لطف کرده صحبتهای من رو توی این ویدئو رو خلاصه کرده که اینها هستند
نباید یادمون بره کد موروثی، یک ارزش کسبوکاری داره (یه کاری رو الآن داره درست انجام میده!) کد جدید تضمینی نداره که همون کار رو انجام بده :))
چرا با کد موروثی مشکل داریم؟
- چون «هر کدی که خودمون ننوشته باشیم بده»! چون یک اتفاقی اونجا داره میفته که من نمیفهممش، چون من ننوشتمش و کسی هم نیست کمک کنه. بعضی مواقع هم انقدری مستندات زیاده که باز کمکی نمیکنه!
- تغییر کد موروثی سخته، و نیاز به صبر داره و ما آدم صبوری نیستیم.
- «همه دارن با cloud و چیزای خفن کار میکنن، ما داریم با کدهای قدیمی سروکله میزنیم»
برای دور ریختن کد، باید به این سؤال جواب بدیم که «چرا؟». اینجا در مورد این صحبت نمیکنیم که محصول مرده یا دیگه ارزش کسبوکاری نداره (مثل ربات تلگرام و فیلتر شدن تلگرام) و به این خاطر کد رو میریزیم دور.
چه کار بکنیم؟
- اگر source control نداره، اضافه کنیم!
- کم کم کد رو یاد بگیریم: فرصتیه برای حل مسئلهای که از جنس الگوریتم نیست؛ باز کردن کلاف سردر گم. ممکنه توی رزومه خیلی منعکس نشه، اما مهارتیه که همه بهش نیاز داریم «اگر نکشدت، قویترت میکنه» :))
- حذف قسمتهای بلااستفاده (= خونه تکونی)؛ این بهم نشون میده یک دور در کد زدهام.
- تصمیمگیری در مورد اینکه «ارزش وقت گذاشتن برای یک دور دیگر داره؟»
- از اینجا به بعد مسیر مستقیم نیست، یک سری روش داریم:
- نوشتن characteristic test: ثبت رفتار فعلی
- پیشاهنگی: وارد هر جایی عبور میشی، موقع خروج تمیزتر باشه
- از یک گوشهای شروع به بازنویسی میکنیم: آن قسمت را از کد جدا کرده و تر و تمیز مینویسیم (به بقیهاش کاری نداریم!)؛ در کوتاه مدت کارمون سختتر میشه (نمودار پیشرفت تخت یا نزولی میشه)
- بعد از اینکه تست اضافه کردیم، بریم سمت CI. لازم نیست چیز پیچیدهای باشه؛ بیلد کنیم و تستها اجرا بشه تا مطمئن بشیم چیزی رو خراب نکردیم.
- تکرار مراحل بالا! (ترتیب نداره)
- با بهبود مستمر، نگذاریم کد پیر بشه؛ کسی از اینکه کرنل لینوکس یا شاهنامه بهش ارث برسه ناراحت نمیشه
سؤال: از اول به بهترین روش کد بزنیم یا اسپاگتی به نتیجه برسیم و بعد درست کنیم؟
جواب:
ایدهآل یه چیزیه تو ذهن ما فقط برای اذیت کردن ما :))
همیشه محدودیت زمان و انرژی و… داریم، باید به نتیجه برسیم، اما نباید یادمون بره که ممکنه لازمه نگه داریش کنیم.
انقدر کم هزینه بنویس که فردا دلت نسوزه دور بریزی! اگر مشتریهاش زیاد شد، باید یک دور دیگه بازنویسیش کرد.
طبق بررسیهای انجام شده، میزان خطهای پاک شده ۱۰ برابر خطهای اضافه شده است!
تصویر ایدهآل رو باید نگه داشت، اما در عمل باید بهش توجهی نکرد. در بهبودهای کوچک به سمت این ایدهآل باید حرکت کنیم.
سؤال: بدهی فنی رو چطور کنترل کنیم؟
جواب: همیشه بخشی از زمان رو بهش اختصاص بدین؛ مثلا ۱۰-۲۰ درصد.
- ایدهآل یه چیزیه تو ذهن ما فقط برای اذیت کردن ما
- کد بد (Legacy) کدیه که تست نداره!
- کد خوب کدیه که راحت میشه ریفکتورش کرد
- optimization تا زمانی که تبدیل به درد نشده بیهوده است