+ بازنویسی کد از ابتدا ، یک اشتباه استراتژیک در برنامه های تجاری!!!
این ترجمه ( با جرح و تعدیل ) یک مقاله قدیمی ( اما هنوز مفید و آموزنده ) از وب سایت Joel Spolsky به بهانه بیرون آمدن نسخه جدید netscape است : یکی از بدترین اشتباهات یک برنامه نویس ، یک تیم نرم افزاری و یا شرکت نرم افزاری بزرگ در کسب و کارش این است که تصمیم بگیرد که کد را از پایه بازنویسی کند NetScape ، Microsoft ، Borland نمونه هایی از شرکت های بزرگی هستند که در مقطعی این اشتباه را مرتکب شدند و به شدت ضربه خورده و سهم خود در بازار را کاملا یا به طور نسبی به رقیبان واگذار کردند . ما برنامه نویس هستیم . برنامه نویس ها ، در باطن خود ، معمار هستند و اولین کاری که وقتی به یک زمین می رسند می کنند این است که آن را با بولدوزر صاف کنند و یک چیز عالی بسازند . ما با نوسازی تدریجی میانه ای نداریم و این چیزی نیست که ما را هیجان زده کند . یک دلیل ظریف وجود دارد که برنامه نویسان همیشه دوست دارند کدهای موجود را دور بریزند و از اول شروع کنند . دلیلش این است که آنها فکر می کنند کد قدیمی افتضاح است .و جالب اینجاست که آنها در بیشتر مواقع اشتباه می کنند . اینکه آنها فکر می کنند کد قدیمی یک افتضاح است ، ناشی از یک قانون اصلی برنامه نویسی است : خواندن کد از نوشتن آن سخت تر است . به همین دلیل استفاده مجدد از کد سخت است . دلیل این که هر فردی از تیم شما تابع متفاوتی برای انجام یک کار مشابه دارد همین است . نوشتن تابع خودشان آسانتر و جالب تر است تا اینکه بخواهند سردر بیاورند کد قدیمی چطور کار می کند . دلیل این افتضاح بودن چیست ؟ آنها می گویند " خوب ، به این تابع نگاه کن . دو صفحه است . هیچکدام از این کدها جایشان اینجا نیست . من نمی دونم نصف این فراخوانی API ها برای چیست " این ایده که کد جدید بهتر از قدیمی است آشکارا پوچ است . کد قدیمی استفاده شده است . آزموده شده است . باگ های زیادی پیدا و رفع شده اند . هیچ چیز اشتباهی در آن وجود ندارد . هر کدام از این باگ ها پس از هفته ها استفاده از نرم افزار پیدا شده اند . برنامه نویس شاید دو روز زمان گذاشته است تا این باگ را در محیط آزمایشگاهی بازتولید کند . اگر مثل خیلی از باگ ها باشد رفع آن شاید نیاز به یک خط کد داشته باشد یا شاید چند کاراکتر اما وقت و کار زیادی برای آن دو کاراکتر صرف شده است . وقتی شما کدهایتان را دور میریزید و از اول شروع می کنید ، شما دارید تمام آن تجربه ، باگ های جمع آوری شده و سالها کار برنامه نویسی را و دانش کسب شده را دور می ریزید . شما دارید پیشرو بودن تان در بازار را دور می ریزید . شما دارید دو یا سه سال را به رقبایتان هدیه می کنید و باور کنید در دنیای برنامه نویسی این زمان طولانی است . با ادامه دادن استفاده از یک نسخه قدیمی از کد برای چندین سال ( در زمان کار بر روی نسخه ی کاملاً جدید ) ، شما خود را در موقعیت خطرناکی قرار می دهید و قادر به هیچگونه تغییر استراتژیک یا واکنش به تقاضای امکانات جدید از طرف بازار نخواهید بود چون کد قابل توسعه ای ندارید . شاید کسب و کارتان را در این مدت تعطیل کنید با نوشتن کدی که وجود دارد ؛ شما مقدار زیادی پول و سرمایه را هدر می دهید . آیا گزینه ی دیگری وجوددارد ؟ به نظر می رسد که اتفاق نظر بر این است که کد قدیمی Netscape خیلی بد بود . خوب ؛ شاید بد بوده است اما می دانید ؟ بر روی تعداد خیلی زیادی از کامپیوترها در دنیا به خوبی کار می کرد . وقتی یک برنامه نویس می گوید که کدش افتضاح است ( که همیشه هم می گوید ) سه چیز باعث آن است : اول ، وجود مشکلات معماری . کد به خوبی نوشته نشده است .این مشکلات را می توان یکی یکی با جابجا کردن محتاطانه کدها ، refactor کردن ، تغییر interface ها و ... حل کرد .می توان این تغییرات را توسط یک برنامه نویس انجام داد . حتی تغییرات نسبتا بزرگ در معماری را می توان بدون دور ریختن کد قدیمی انجام داد . جابجا کردن و تمیزکاری کدها ، ساختن کلاسهای پایه درست و با معنی ، ساختن interfaceهای دقیق بین ماژول ها همراه با احتیاط و بدون ایجاد کردن باگ های جدید . دلیل دوم این است که کد ناکارآمد است . شایع بود که کد مربوط به رندر کردن در netscape کند است . اما این تنها بخش کوچکی از پروژه را تحت تاثیر قرار می داد. که می توان آن را بهبود داد یا بازنویسی کرد.لازم نیست که تمام پروژه را بازنویسی کنید . دلیل سوم زشت بودن کد قدیمی است . برای مثال پروژه با این قرارداد شروع شده که متغیرها با زیرخط شروع شوند اما بعدا قرارداد به m_ تغییر کرده . که کد را زشت می کند . این مشکلات را می شود به راحتی با یک ماکرو حل کرد ونیازی به بازنویسی پروژه نیست . مهم است که به یاد داشته باشید وقتی از ابتدا شروع می کنید هیچ دلیلی وجود ندارد که فکر کنید دارید کار بهتری نسبت به بار اول انجام می دهید . اول از همه احتمالا تیم اولیه را هم ندارید که بر روی نسخه قبل کار کرده اند در نتیجه تجربه بیشتری هم ندارید . شما فقط اشتباهات قبلی را دوباره تکرار می کنید و مشکلات جدیدی را ایجاد می کنید که در نسخه اولیه هم نبوده است . اگر دارید به صورت آزمایشی و تجربی کار می کنید می توانید تابعی که هفته قبل را بعد از اینکه الگوریتم جدیدی را یافتید از بین ببرید . اشکالی ندارد . می توانید یک کلاس را refactor کنید تا استفاده از ان اسانتر شود . این هم اشکالی ندارد . اما دور انداختن تمام برنامه یک حماقت خطرناک است . و اگر Netscape دارای یک نظارت صحیح و تجربه در صنعت نرم افزار بود.شاید به این شکل خودزنی نمی کردند .


شنبه 29 تیر 1392

عنوان آخرین یادداشتها