سالها پیش در پروژهای قرار بر این شد که با ترکیب دو محصول مختلف و قدیمی شرکت، به محصولی جدید برسیم. از ابتدا، طراحی سختافزار این دو دستگاه با رویکرد پلتفرمی مشترک برای چند محصول صورت گرفته بود. دستگاه جدید هم قرار بود بر روی این پلتفرم تولید شود.
ظاهراً کار ساده بود! من فقط باید به کدهای هر دو دستگاه نگاه میکردم و پس از بررسی با ترکیب کردنشان به کد دستگاه جدید میرسیدم. اما متاسفانه این پروسه در مرحلهی بررسی متوقف شد. چراکه تنها کسی که میتوانست راز کدهای قبلی را بشکند، برنامه نویس قبلی بود! خوشبختانه یا متاسفانه کار سختی نبود که مدیرم را قانع کنم، پروژه را از صفر بنویسم!
بله بهترین راهحل نبود، اما هر کس که نگاهی به کدها میانداخت متوجه عمق فاجعه و علّت این انتخاب میشد. شاید اگر کدها باکیفیت نوشته میشدند، این هزینه به شرکت تحمیل نمیشد. با صرف کمترین انرژی قسمتهای مختلف برنامه کنار هم چیده میشدند و برنامه جدید با سرعت و اطمینان بالا توسعه پیدا میکرد.
اما آیا کد باکیفیت فقط در چنین حالتی به کار ما میآید؟
بعید میدانم به این سوال پاسخ منفی بدهید. اما برای اینکه اهمیت کد باکیفیت بیشتر برایتان روشن شود، میخواهم سراغ ماجرایی دیگر بروم.
قحطی چیپ | Global Chip Shortage
درست زمانی که سایهی کرونا بر روی مردم دنیا سنگینی میکرد، قحطی شدید و عجیبی از آیسی همزمان در حال وقوع بود. برای افراد عادی اتفاق محسوس و مهمی حداقل در کوتاه مدت به حساب نمیآمد. اما برای اهل صنعت و تولید کابوس بود. میکروکنترلری که تا دیروز با التماس فروشنده 3 دلار خریداری میشد، با 120 دلار و منت کشی هم به سختی گیر میآمد.
اما ارتباط این اتفاق با کد باکیفیت چیست؟
یکی از درسهای تلخی که بسیاری از افراد و شرکتها در این ماجرا گرفتند، ارزش سرمایهگذاری بر روی کد باکیفیت بود. بسیار پیش میآمد که شرکتی محصول چند ده هزار دلاریاش لنگ یک چیپ چند ده دلاری شده بود. اگرچه آیسی مدنظر زمان طراحی، نایاب شده بود. اما میتوانستند با پردازندهای دیگر جای خالی آن را پر کنند تا مجبور نشوند بازار را به رقیب ببازند.
با پردازندهای دیگر؟! مگر میشود کدی که برای یک میکروکنترلر STM32 نوشته شده را در میکروکنترلر PIC اجرا کرد؟
با فرض مشابه بودن امکانات سختافزاری مورد استفاده، باید بتوان این کار را کرد. البته اگر کد با کیفیت نوشته شده باشد.
به چه کدی باکیفیت گفته میشود؟ | High Quality Code
اگر کمی در اینترنت جستجو کنید، خواهید دید که معیارهای مختلفی برای کد باکیفیت بیان میشود. در اینجا سعی میکنم مواردی که به نظرم با اهمیت میرسند را بیاورم. اگرچه حوزهی کاری من امبدد سیستم هست و این مطلب بیشتر با رویکرد امبدد سیستم نوشته شده، اما این توضیحات میتواند برای سایر برنامهنویسان هم مفید باشد.
maintainability | نگهداری کد:
- انعطاف پذیری: هر چقدر هم که کد شما عالی و بینقص باشد، تغییرات اجتناب ناپذیرند. این تغییرات میتوانند حاصل نیازهای جدید بازار باشند یا به خاطر عدم تولید یک از آیسیهای مدارتان. کدی که مینویسیم باید در مقابل تغییرات آینده انعطاف پذیر باشد. نه اینکه اگر سنسور دما عوض شد، مجبور شویم سر تا پای کد را شخم بزنیم.
- خوانایی: از کد استایل یکسان در برنامه استفاده کردهاید یا شتر گاو پلنگی است که خودتان هم با دیدنش سر درد میگیرید؟
- پیچیدگی: تمام سعی خود را کردهاید که نبوغ و مهارتتان را با به کارگیری ویژگیهای زبان برنامهنویسی به سایرین نمایش دهید؟
- داکیومنت: آیا قسمتهایی از کد که نیاز به توضیح بیشتر دارند، داکیومنت شدهاند؟
- تست اتوماتیک: اگر قرار باشد یک عملکرد یا یک خط کد جدید به برنامه اضافه شود، میتوان مطمئن بود که ویژگیهای قبلی هنوز کار میکنند؟ تست سریع و اتوماتیک عملکردهای قبلی به کمک یونیت تستها امکان پذیر است؟
portability | انتقال پذیری:
- چند درصد از کد را میتوان بر روی پردازندهی دیگر اجرا کرد؟
- امکان استفاده مجدد درایورهای نوشته شده در پروژههای دیگر وجود دارد؟ آیا اجزای مختلف برنامه با حداقل وابستگی (loosely coupled) به سخت افزار و یا یکدیگر توسعه یافتهاند؟
testability | امکان تست:
میدونم! تو دنیای امبدد سیستم unit test یک واژهی بسیار غریبه. اصلاً مگه میشه برای نرمافزاری که وابسته است به سختافزار یونیت تست نوشت؟
علاوه بر ویژگیهای بالا میتوان چیزهای دیگر هم مثل قابلیت اطمینان کد اضافه کرد. اما احساس میکنم چیزی مثل قابلیت اطمینان حاصل رعایت ویژگیهای بالاست و اضافه کردنش به لیست بالا اضافه است. سعی میکنم در آینده اگر ویژگی را دیدم که جایش در اینجا خالی است، آن را اضافه کنم. همچنین هر از گاهی مفصلتر در خصوص یکی از این موارد توضیح بدم و لینکش را هم در اینجا بیاورم. شما هم اگر موردی به نظرتان میرسد، حتماً زیر این نوشته بنویسید.
شاید یکی از دلالیل اینکه کدها خیلی مرتب نوشته نشده باشه این هستش که، وقفه زیادی بین کد زدن، بدلیل انجام دادن کارهای متفاوت، و عدم تمرکز روی فقط یه کار داشته باشیم.
فکر می کنم این رو کامل لمس کرده باشی😜
سلام علیجان، اتفاقاً وقتی که با پراکندگی فکری مواجه هستیم، کد باکیفیت اهمیت بیشتری پیدا میکنه. چراکه خودمون هم به سرعت فراموش میکنیم، چیکار کردیم. گاهی ما نیاز داریم مثلاً یک شماره رو سریع یادداشت کنیم، تا یادمون نره. اینجا قابل قبوله که کف دستمون بد خط بنویسیم، به این شرط که در اولین فرصت سراغش بریم و بهش رسیدگی کنیم. اما اینکه بخواهیم کل یک رمان رو به بهانه اینکه من کلی کار و مشغله فکری دارم، بدخط و ناخوانا بنویسیم، کار منطقی نیست. به خصوص امروزه که کلی ابزار داریم که میتونه بهمون کمک کنه. تو این پست خواستم اشارهای کنم به اهمیت این موضوع. انشالله در آینده در خصوص ابزارها و راهکارهایی که میتونن کمکمون کنن، مینویسم.