X
تبلیغات
رایتل

  بازنویسی کد از ابتدا ، یک اشتباه استراتژیک در برنامه های تجاری!!!


  شنبه 29 تیر‌ماه سال 1392

این ترجمه ( با جرح و تعدیل ) یک مقاله قدیمی ( اما هنوز مفید و آموزنده ) از وب سایت Joel Spolsky به بهانه بیرون آمدن نسخه جدید netscape است :

یکی از بدترین اشتباهات یک برنامه نویس  ، یک تیم نرم افزاری و یا شرکت نرم افزاری بزرگ در کسب و کارش این است که تصمیم بگیرد که کد را از پایه بازنویسی کند

NetScape ، Microsoft ، Borland نمونه هایی از شرکت های بزرگی هستند که در مقطعی این اشتباه را مرتکب شدند و به شدت ضربه خورده و سهم خود در بازار را کاملا یا به طور نسبی به رقیبان واگذار کردند .

ما برنامه نویس هستیم . برنامه نویس ها ، در باطن خود ، معمار هستند و اولین کاری که  وقتی به یک زمین می رسند می کنند این است که آن را با بولدوزر صاف کنند و یک چیز عالی بسازند . ما با نوسازی تدریجی میانه ای نداریم و این چیزی نیست که ما را هیجان زده کند .

 یک دلیل ظریف وجود دارد که برنامه نویسان همیشه دوست دارند کدهای موجود را دور بریزند و از اول شروع کنند . دلیلش این است که آنها فکر می کنند کد قدیمی افتضاح است .و جالب اینجاست که آنها در بیشتر مواقع اشتباه می کنند . اینکه آنها فکر می کنند کد قدیمی یک افتضاح است ، ناشی از یک قانون اصلی  برنامه نویسی است :


خواندن کد از نوشتن آن سخت تر است .


به همین دلیل استفاده مجدد از کد سخت است . دلیل این که هر فردی از تیم شما تابع متفاوتی برای انجام یک کار مشابه دارد همین است . نوشتن تابع خودشان آسانتر و جالب تر است تا اینکه بخواهند سردر بیاورند کد قدیمی چطور کار می کند .

دلیل این افتضاح بودن چیست ؟

آنها می گویند " خوب ، به این تابع نگاه کن . دو صفحه است . هیچکدام از این کدها جایشان اینجا نیست . من نمی دونم نصف این فراخوانی API ها برای چیست " 

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

وقتی شما کدهایتان را دور میریزید و از اول شروع می کنید ، شما دارید تمام آن تجربه ، باگ های جمع آوری شده و سالها کار برنامه نویسی را و دانش کسب شده را دور می ریزید . 

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

با ادامه دادن استفاده از یک نسخه قدیمی از کد برای چندین سال ( در زمان کار بر روی نسخه ی کاملاً جدید ) ، شما خود را در موقعیت خطرناکی قرار می دهید و قادر به هیچگونه تغییر استراتژیک یا واکنش به تقاضای امکانات جدید از طرف بازار نخواهید بود چون کد قابل توسعه ای ندارید . شاید کسب و کارتان را در این مدت تعطیل کنید

با نوشتن کدی که وجود دارد ؛ شما مقدار زیادی پول و سرمایه را هدر می دهید .

آیا گزینه ی دیگری وجوددارد ؟ به نظر می رسد که اتفاق نظر بر این است که کد قدیمی Netscape خیلی بد بود . خوب ؛ شاید بد بوده است اما می دانید ؟ بر روی تعداد خیلی زیادی از کامپیوترها در دنیا به خوبی کار می کرد .
وقتی یک برنامه نویس می گوید که کدش افتضاح است ( که همیشه هم  می گوید ) سه چیز باعث آن است :
اول ، وجود مشکلات معماری . کد به خوبی نوشته نشده است .این مشکلات را می توان  یکی یکی با جابجا کردن محتاطانه کدها ، refactor کردن ، تغییر interface ها و ... حل کرد .می توان این تغییرات را توسط یک برنامه نویس انجام داد . حتی تغییرات نسبتا بزرگ در معماری را می توان بدون دور ریختن کد قدیمی انجام داد . جابجا کردن و  تمیزکاری کدها ، ساختن کلاسهای پایه درست و با معنی ، ساختن interfaceهای دقیق بین ماژول ها  همراه با احتیاط و بدون ایجاد کردن باگ های جدید .

دلیل دوم این است که کد ناکارآمد است . شایع بود که کد مربوط به رندر کردن در netscape کند است . اما این تنها بخش کوچکی از پروژه را تحت تاثیر قرار می داد. که می توان آن را بهبود داد یا بازنویسی کرد.لازم نیست که تمام پروژه را بازنویسی کنید .

دلیل سوم زشت بودن کد قدیمی است . برای مثال پروژه با این قرارداد شروع شده که متغیرها با زیرخط شروع شوند اما بعدا قرارداد به m_ تغییر کرده . که کد را زشت می کند . این مشکلات را می شود به راحتی با یک ماکرو حل کرد ونیازی به بازنویسی پروژه نیست .

مهم است که به یاد داشته باشید وقتی از ابتدا شروع می کنید هیچ دلیلی وجود ندارد که فکر کنید دارید کار بهتری نسبت به بار اول انجام می دهید . اول از همه احتمالا تیم اولیه را هم ندارید که بر روی نسخه قبل کار کرده اند در نتیجه تجربه بیشتری هم ندارید . شما فقط اشتباهات قبلی را دوباره تکرار می کنید و مشکلات جدیدی را ایجاد می کنید که در نسخه اولیه هم نبوده است .

اگر دارید به صورت آزمایشی و تجربی کار می کنید می توانید تابعی که هفته قبل را بعد از اینکه الگوریتم جدیدی را یافتید از بین ببرید . اشکالی ندارد . می توانید یک کلاس را refactor کنید تا استفاده از ان اسانتر شود . این هم اشکالی ندارد . اما دور انداختن تمام برنامه یک حماقت خطرناک است . و اگر Netscape دارای یک نظارت  صحیح و تجربه در صنعت نرم افزار بود.شاید به این شکل خودزنی نمی کردند .