نمیدونم آیا شما هم این جمله رو شنیده اید:
The sooner you begin 'writing code', the longer it'll take you to get done.
فکر میکنم مخاطب این جمله کسانی هستن که میخوان نوشتن یک برنامه جدید رو استارت بزنن. البته به نظرم ما انواع مختلف برنامه داریم با پیچیدگیهای مختلف. طبق تجربه و کمی از شمّ کدنویسی که دارم، میتونم بگم هرچی برنامه پیچیدهتر بشه و معماری نامشخصتری داشته باشه این قضیه بیشتر برقرار میشه. توی برنامههای محاسباتی که من در موردش پست مینویسم که فبها.
قضیه به اونجایی بر میگرده که اصولا الگوریتمهایی که مسایل ریاضیاتی مشکل رو برای ما حل میکنن، تبدیل به کدی میشن که تقریبا برای کسی که الگوریتم رو درک نکرده، نامفهومه. یعنی این کد با کد اسمبلی دیکامپایل شدهی یک برنامه، یا با یک متن به زبان میخی، هیچ فرقی نداره چون اصولا جفتش ناخواناست. بزارید یک مثال بزنم:
فرض کنید میخواهیم تابع به توان رساندن رو دوباره بنویسیم! طبق تجربه میگم بعضی جاها ممکنه لازم بشه، چون مثلا تابع Math.Pow در زبان سی شارپ چندان بهینه نیست و اگر سرعت بالایی نیاز دارید بهتره از این تابع استفاده نکنید (توضیحات بیشتر) . خوب برگردیم به صورت مساله، اولین راه و ساده ترین راهی که به ذهن من میرسه این هست:
public static long IntPow(long a, long b) { long result = 1; for (long i = 0; i < b; i++) result *= a; return result; }
این کد تقریبا خوانا هست. یعنی اگر ما بدونیم هدف این کد چی هست، میتونیم روند این کد رو بفهمیم و در صورت لزوم کد رو اشکالزدایی (Debug) کنیم. ولی به این یکی کد نگاه کنید (منبع کد)
int IntPow(int x, uint pow) { int ret = 1; while ( pow != 0 ) { if ( (pow & 1) == 1 ) ret *= x; x *= x; pow >>= 1; } return ret; }
این دقیقا همون تابع به توان رساندن هست و به ازای ورودی یکسان با کد اول، خروجی دقیقا یکسان خواهد داد. ولی این بهخاطر بهینه کردن کد و پایین آوردن زمان اجرا از الگوریتم دیگری استفاده کرده و باعث شده که کد ناخوانا بشه. بدون دانستن الگوریتم پشت این کد، فهمیدن این کد تقریبا ممکن نیست. یا حداقل زمان و اعصاب زیادی میخواد! من خودم متوجه نمیشم چکار کرده، چون الگوریتمش رو ندیدم.
کد شمارهی ۲ (کد بهینه ولی ناخوانا) مصداق بارز این جمله هست:
هرچه زودتر دستبهکار کدنویسی شوی، دیرتر آنرا تمام خواهی کرد!
فرض کنید کسی که کد دوم رو نوشته یک روز همینطوری هوس میکرد و میگفت بزار امروز برم یه کدی بنویسم که توی استک اورفلو ۴۶۱عدد امتیاز بگیره، حالا چی بنویسم؟! و بعد هم هیچ کدی نوشته نمیشد. این کد اول توی ذهن طرف طراحی شده (شاید از اول تا آخرش) و احتمالا بعدش روی کاغذ اومده و در آخر در زبان سیشارپ پیاده شده. هرچی برنامه پیچیدهتر و بشه این قضیه بیشتر برقرار خواهد بود. پس الگوریتمها حتما باید اول طراحی بشن بعد به کد تبدیل بشن. شاید زمان مورد نیاز طراحی الگوریتم با زمان پیاده سازی اش تقریبا برابر باشه ولی قسمت اعظم کار طراحی الگوریتم هست نه نوشتن کد اون چون وقتی الگوریتم طراحی شد میشه به سرعت اون رو بصورت کد درآورد...