برای آنکه بتوانیم به این پرسش پاسخ درستی دهیم باید با تعداد زیادی از توسعهدهندگان گفتوگو کنیم، برگههای مرتبط با برنامهنویسی را موردبررسی قرار دهیم، کدهای نوشتهشده توسط افراد مختلف را تحلیل کنیم و بالاخره عوامل مثبت و منفی را دستهبندی کنیم تا آنگاه بتوانیم علت خوب یا بد بودن یک قطعه کد را بیان کنیم. عوامل بسیار زیادی باعث میشوند تا کدهای یک نرمافزار خوب یا بد شناخته شوند، اما بهطورکلی همه برنامهنویسها بر این موضوع اتفاقنظر دارند که شش عامل اصلی خوانایی، فهم آسان، توضیحات، قابلیت نگهداری، ساده و انعطافپذیر بودن و درنهایت اجرایی بودن باعث میشوند کدهای یک نرمافزار متمایز از کدهای مشابه شود. در ادامه به این شش عامل پرداختهایم.
به نظر میرسد همه طراحان و توسعهدهندگان در این مورد اتفاقنظر دارند که یکی از مهمترین عاملهای موفقیت یک نرمافزار، خوانا بودن کدهای آن است؛ یعنی کدهایی که توسط طراحان و برنامهنویسها در مدتزمان اندکی قابل خواندن و فهمیدن باشند، به عنوان کد خوب شناخته میشوند. لوک برنام، مهندس ارشد نرمافزار در Lionbridge میگوید: «اگر من احساس کنم توانایی درک کدی را در 5 دقیقه یا کمتر از آن ندارم، نشان میدهد، کدنویس کارش را بهدرستی انجام نداده است.» کامپیوتر اهمیتی به نام متغیرها یا تورفتگی موجود در کدها نمیدهد اما این موضوع برای مردم بااهمیت است. یک کد فقط یکبار نوشته میشود، اما هزاران مرتبه خوانده میشود. ازاینرو بهکارگیری نامهای بامسما برای متغیرها و بهکارگیری درست تورفتگی در زمان کدنویسی باعث افزایش خوانایی کد شده و کیفیت کدها را افزایش میدهد. کدنویسی خوب به معنی پیادهسازی درست سبکبندی کدها است. رعایت فاصله مناسب، بهکارگیری درست تورفتگی کدها، پیروی از قواعد مرسوم و از همه مهمتر انتخاب نام مناسب برای متغیرها ازجمله عوامل مؤثر در خوانا بودن یک کد به شمار میروند. بهطور مثال شکل 1 بههیچعنوان یک حرکت هوشمندانه درزمینه رعایت تورفتگیها نیست. اگر یک تابع دارای دو آرگومان است، این دو آرگومان را در دو خط قرار دهید. اگر یک عبارت ریاضی از واژههای ریاضی استفاده میکند، سعی کنید هر یک از آنها را در خط مربوط به خود قرار دهید. بهطور خلاصه، خوانایی بیشتر برابر با درک بیشتر است، همین موضوع باعث میشود تا زندگی راحتتر شود.
شکل1: عدم رعایت درست سطح تورفتگی در کدها باعث میشود خوانایی آنها به طرز محسوسی کاهش یابد.
زمانی که افراد با نگاه کردن به کدهایی بهسرعت آنها را درک کنند، نرمافزارها نیز به همان سرعت به جلو پیش خواهند رفت. زمانی که یک گروه نرمافزاری گرد هم میآیند و نرمافزاری را خلق میکنند، اعضاء این گروه تا ابد در کنار یکدیگر نخواهند بود و عضوهای جدیدی به گروه اضافه خواهند شد، درنتیجه اگر کدهای یک محصول نرمافزاری با وضوح کامل نوشتهشده باشند، برنامهنویسهای جدید بهسرعت کدها را درک کرده و قادر هستند نرمافزار را با سرعت بیشتری به جلو هدایت کنند.
لوک برنام در ادامه صحبتهای خود میافزاید: «در کنار قالببندی و نامگذاری مناسب، توضیحات درجشده در کنار کدها میتواند به طرز شگفتانگیزی به فهم سادهتر کدها کمک کند؛ اما هرگونه توضیحی مناسب نیست. من به توضیحاتی که اعلام میدارند یک حلقه For چگونه کار میکند نیازی ندارم. (شکل 2) من به توضیحاتی نیاز دارم که به من بگویند یک قطعه کد چرا و به چه دلیل استفاده شده و قرار است چهکاری انجام دهد. (شکل 3) به نظر من کدی خوب است که نشان دهد در ذهن نویسنده کد چه چیزی گذشته است.»
توضیح خوب نهتنها به طراحان دیگر کمک میکند تا از فلسفه کدها آگاه شوند، به خود برنامهنویس هم کمک میکند. یک برنامهنویس زمانی که کدهایی را مینویسد میداند بر مبنای چه منطقی رفتار کرده است، اما چند سال بعد، بهطور دقیق نمیداند یک قطعه کد به چه منظوری نوشتهشده و چهکاری انجام میدهد. درواقع پارادایم برنامهنویسی ادیبانه به چیزی فراتر از یکسری توضیحهای مختصر بازمیگردد، بهطوریکه دربرگیرنده مستنداتی است که اقدام به توضیح کدها میکند. کوین مویلن مهندس ارشد نرمافزار در Genuine Interactive این موضوع را بهسادگی اینگونه بیان میکند: «نظرات بسیار عظیم و حائز اهمیتاند.» البته در این زمینه دو دیدگاه وجود دارد، عدهای بر این باوراند که قطعه کدی خوب است که نیاز به هیچ توضیحی نداشته باشد و بتواند خودتعریف باشد، اما در طرف مقابل گروه دیگری بر این باور هستند که کدها با هر کیفیتی که تولیدشده باشند، به توضیح نیاز دارند.
شکل2: هر فرد غیر برنامهنویسی با نگاه کردن به این دستورات بهخوبی میداند، قطعه کد اول دریافت کد کشور و قطعه کد دوم برابر بودن عبارت واردشده با US را نشان میدهد.
یک قطعه کد درنهایت ممکن است کارهای پیچیدهای را انجام دهد، اما طراحان خوب، بهترین کدها را به سادهترین شکل ممکن طراحی میکنند. برنامهنویسهای خوب بهدرستی میدانند که کار را چگونه باید انجام دهند، بهطوریکه کدهای نوشتهشده بهدوراز هرگونه پیچیدگی باشند. مویلن دراینباره میگوید: «هر قطعه کدی که برای انجام کار مشخصی طراحیشده است، خواه کوچک یا بزرگ باید وظیفهاش را به بهترین نحوه ممکن انجام دهد. بهترین راهحلها در سادهترین راهحلها قرار دارند.» یک تابع کوچک که بتواند یک وظیفه را بهخوبی به سرانجام برساند از 1000 خط کد که مدیریت آنها کابوس شبانه است، ارزشمندتر است. لوک برنام نیز بر سادهسازی کدها تأکید خاصی دارد، او همواره به اعضای گروه خود توصیف میکند کدها را تا حد امکان ساده کنند. لوک برنام در ادامه صحبتهای خود درباره سادهسازی میافزاید: «کد خوب تنها ساده نیست، بلکه از سادهترین و دم دستترین روشها استفاده میکند. کد خوب به کمترین زمان ممکن برای طراحی نیازمند است. من کدهای زیادی را دیدهام که انواع مختلفی از کارها را بهخوبی انجام میدادند، به دلیل اینکه از ابتدا به سادهترین شکل ممکن نوشتهشده بودند.» شاید این جمله معروف از بیل گیتس را شنیده باشید که میگوید: «من همیشه انسانهای تنبل را برای انجام کارهای سخت در مایکروسافت انتخاب میکنم، به دلیل اینکه یک انسان تنبل همواره سادهترین راه را برای انجام کارها انتخاب میکند.»
شکل3: در این مثال من در نظر دارم تابعی را از یک کتابخانه دیگر فراخوانی کنم. توضیحات بهخوبی بیانگر این موضوع هستند.
خلاصه طراحان بر این باور هستند که ساده نگهداشتن چیزها سرانجام به طراحی نرمافزارهای باکیفیتتر کمک میکند. آمارها نشان دادهاند که بخش عمدهای از باگهای نرمافزاری به علت پیچیده بودن سورس کدها به وجود آمده است.
انعطافپذیری یک قطعه کد نرمافزاری به این معنی است که هر زمان نیازی به تغییر داشته باشد، در سریعترین زمان ممکن تغییر روی آن اعمالشده و نرمافزار گسترش پیدا کند. همچنین قطعه کدی انعطافپذیر است که در آینده به سادهترین شکل ممکن در بخشهای دیگر قابلاستفاده مجدد (reuse) باشد. لوک برنام انعطافپذیری را اینگونه بیان میکند: «نرمافزاری بهخوبی نوشتهشده است که هر دو جنبه نیازهای امروز و نیازهای آینده را در خود جایداده باشد». پیشبینی نیازهای آینده غیرممکن است، اما میتوان نرمافزاری را نوشت که از انعطافپذیری لازم برخوردار باشد و با مختصر تغییرهایی با نیازهای آینده همسو شود. کدی خوب به شمار میرود که طراحان در آینده با اضافه کردن یا تغییر بخشهای مشخصی از کد، بدون آنکه نیازی به شکستن بخشهای دیگر باشد، بتوانند با آن کار کنند.» کریستوفر جانسون در سایت Stack overflow نوشته است: «شما زمانی اطلاع پیدا خواهید کرد یک قطعه کد بهدرستی نوشتهشده است یا خیر که خود تلاش کنید آنها را تغییر دهید.» مایکل رایلی در Stack Exchange نوشته است: «نشانه یک کد خوب، محصولی است که شما کدنویسی آن را شش ماه پیش انجام دادهاید و اکنون شخص دیگری بدون آنکه سؤالی در خصوص این کد از شما داشته باشد توانایی ویرایش آنها را داشته باشد».
در کنار قالببندی و نامگذاری مناسب، توضیحات درجشده در کنار کدها میتواند به طرز شگفتانگیزی به فهم سادهتر کدها کمک کند
مهم نیست یک قطعه کد تا چه اندازه خوب نوشتهشده باشد، این احتمال وجود دارد که یک قطعه کد دارای باگهای نرمافزاری باشد. مویلن میگوید: «کدهای خود را بهگونهای پیادهسازی کنید که در زمان موردنیاز هر شخصی توانایی اصلاح آنها را داشته باشد.» قابلیت نگهداری، یکی از ویژگیهای کلیدی کدهای خوب به شمار میرود. برای آنکه همه کدها قابلیت نگهداری داشته باشند لازم نیست آنها را بیشازحد پیچیده کنید. همواره در پیادهسازی کدهای خود سعی کنید، وظایفی همچون تغییر مقدار آدرسهای URL، دسترسیهای کلیدی، تغییر گذرواژه بانکهای اطلاعاتی و چنین مواردی را به سادهترین شکل ممکن انجام دهید. توجه به این نکته باعث میشود تا نگهداری کدها در آینده بهسادگی امکانپذیر باشد. دیوید ریچمن در Quora نوشته است: «تفاوت کدی که بهدرستی کار میکند با کدی که از طراحی عالی برخوردار است به قابلیت نگهداری آن بازمیگردد.»
سرانجام به بارزترین و مشخصترین ویژگی یک کد نرمافزاری خوب میرسیم. یک کد خوب درنهایت باید قابلیت اجرا داشته باشد. مویلن دراینباره میگوید: «یک قطعه کد نرمافزاری در درجه اول باید کاری را که برای آن طراحیشده است انجام دهد.» لوک برنام دراینباره میگوید: «هرچند همهچیز در سادگی خلاصه میشود، اما اگر یک نرمافزار توانایی انجاموظیفهای را که از آن انتظار داریم نداشته باشد، مهم نیست چقدر خوب به نظر برسد، چون فاقد ارزش خواهد بود».