دانستنی‌ها

چرا بهینه‌سازی زودهنگام، ریشه‌ی تمام مشکلات است؟

یکی از سخت‌ترین قسمت‌های توسعه نرم‌افزار، دانستن این نکته است که باید روی چه چیزی وقت گذاشت. همه ما دوست داریم کد بنویسیم و چیزهای جدیدی بسازیم اما برنامه‌نویسان گران و کمیاب هستند، پس یکی از چالش‌های بزرگ این است که از زمانمان درست استفاده کنیم. هیچ کدام از ما دوست نداریم کدی به دست مشتری دهیم که  آن را دوست نداشته‌باشند یا اصلا کار نکند. پس چه مقدار باید روی بهینه‌سازی عملکرد نرم‌افزار زمان گذاشت؟ این یک مصالحه است. اگر هیچ بهینه‌سازی عملکردی انجام ندهیم، محصولمان احتمالا یک فاجعه خواهد بود. مثلا راه‌اندازی وبسایت healthcare.gov یکی از معروف‌ترین شکست‌های این زمینه است. همچنین نمی‌خواهیم زمان زیادی روی بهینه‌سازی‌هایی بگذاریم که نتیجه محسوسی ندارند. بسیاری از تیم‌های توسعه درگیر بهینه‌سازی عملکرد و مقیاس‌پذیر کردن پروژه خود می‌شوند در حالی از عملکرد محصول خود مطمئن نیستند. بهینه‌سازی زودهنگام چیست؟ بهینه‌سازی زودهنگام (Premature optimization)، به معنای گذاشتن زمان زیاد روی چیزی‌است که ممکن است اصلا نیاز نشود. شاید جمله معروف «بهینه‌سازی زودهنگام ریشه تمام مشکلات است» را شنیده باشید. این جمله از دانشمند بزرگ رایانه، دونالد کنوت است. وی در کتاب معروفش «هنر برنامه‌نویسی رایانه» می‌نویسد: مشکل اصلی این است که برنامه‌نویسان زیاد از حد نگران بهره‌وری در زمان‌های اشتباه و در جاهای اشتباه هستند. بهینه‌سازی زودهنگام ریشه‌ی تمام مشکلات (یا حداقل بیشتر آن‌ها) در برنامه‌نویسی است. متن اصلی درباره بهینه‌سازی زودهنگام در دهه‌ی ۱۹۶۰ در کتاب مربوطه چاپ شده. در آن زمان مین‌فریم‌ها و کارت‌ های پانچی مرسوم بودند.  هر سیکل‌ پردازنده نیز، نایاب و ارزشمند بود. چگونه بهینه‌سازی زودهنگام امروز معنی پیدا می‌کند؟ بسیاری از تیم‌های توسعه، امروزه به صورت پیوسته (و با دوره تناوب کم) کدها را عرضه می‌کنند. بیشتر تیم‌ها از متودولوژی‌های agile استفاده می‌کنند. اعضای این تیم‌ها می‌دانند که اگر یک باگ در نرم‌افزار پیدا شود، می‌توانند به سرعت و سهولت پچ رفع باگ را روی سرورها قرار دهند. با تغییرات صورت گرفته در صنعت توسعه نرم‌افزار، همچنان تمایل به بهینه‌سازی زودهنگام وجود دارد، به همین خاطر همچنان باید برنامه‌نویسان را نسبت به آن هشدار داد. بهینه‌سازی زودهنگام چیزیست که باید در هرروز از توسعه نرم‌افزار از آن دوری کرد چرا که امروز هم به اندازه روزهای مین‌فریم و کارت‌های پانچ خطرناک است. مثال بارز این موضوع، استارت‌آپ‌هایی هستند که زمان زیادی را صرف مقیاس‌پذیر کردن نرم‌افزار خود برای میلیون‌ها کاربر می‌کنند. این نگرانی خوبی برای فکر کردن است اما نه لزوما برای عمل کردن. پیش از اینکه لازم باشد درباره سرویس‌دهی به تعداد زیاد کاربران فکر کنید، باید مطمئن شوید اصلا ۱۰۰ کاربر پیدا می‌شوند که محصول شما را دوست داشته باشند و از آن استفاده کنند؟ پس ابتدا باید به بازخورد کاربران توجه کرد تا مقیاس کردن محصول برای کاربرانی که وجود ندارند. چرا باید بازخورد کاربران را در اولویت قرار دهید؟ بهترین روش برای توضیح این موضوع، می‌تواند یک داستان ساده باشد. من هم‌اکنون در حال کار روی یک پروژه‌ی جنبی هستم که مربوط به بازاریابی محتوا و اندازه‌گیری عملکرد آن است. برای این پروژه نیاز است از گوگل آنالیتیکس اطلاعات جمع‌آوری شود و یکسری اطلاعات از صفحات یک وبسایت خزش (crawl) شود و در نهایت در قالب یک داشبورد به کاربر نمایش داده شود. احتمالا نیاز است که حجم زیادی اطلاعات جمع‌آوری شود، فرایند جمع‌آوری اطلاعات هم خود فرایند زمان‌بری است. اگر من بخواهم این محصول را به تعداد زیادی کاربر بفروشم احتمالا بابت هر دو مورد، مشکل مقیاس‌کردن خواهم داشت. اما با این وجود، تمرکز من نه روی عملکرد و مقیاس‌کردن، بلکه روی تست کردن و ساخت نمونه‌های آزمایشی از قابلیت‌های مختلف است. در واقع بیشترین توجه من روی گرفتن بازخورد از کاربران و بهتر کردن قابلیت‌ها و امکانات محصول نهایی‌ است. من تلاش می‌کنم که زمانم را روی چیزهایی که ممکن است هیچ‌گاه نیاز نشوند نگذارم. چیزهایی که ممکن بود زمانم را روی آن‌ها هدر دهم به جای اینکه من زمان بگذارم تا خود محصول را بهتر کنم، ممکن بود روی یکی از موارد زیر زمان بگذارم: بررسی حالت‌های مختلف برای نگه‌داری و بازیابی (query) همه اطلاعات مورد نیاز از گوگل آنالیتیکس که ممکن بود در حد «big data» شود! چگونه عملیات خزش را به شکل هفتگی زمان‌بندی کنم و بین تعداد زیادی worker پخش کنم. بررسی اینکه آیا باید کد خود را روی چندین سرویس ابری مستقر (deploy) کنم تا از دسترس‌پذیری بالای آن مطمئن شوم. بررسی کنم که چگونه باید معماری محصولم را طراحی کنم تا به شکل جهانی روی دیتاسنترهایی در سراسر جهان عمل کند. اطمینان حاصل کنم که همه‌ی اجزای کدم پوشش تست ۱۰۰ درصد دارد. تست‌های خودکار مصنوعی بسازم. همچنین به این موارد بالا، همه امکاناتی که در زمان تست محصول توسط کاربر می‌توانم تصمیم بگیرم که توسعه دهم یا ندهم را هم اضافه کنید. فعلا: هیچ کدام از این چیزها اگر کاربری نباشد که به او خدمات دهم، استفاده صحیح از داکر یا کوبرنتیز، تست‌های خودکار یا استقرار پیوسته قطعا هدردادن انرژی هستند! اما می‌دانید چه چیزی اهمیت دارد؟ فهمیدن اینکه آیا کاربران قابلیت‌ها یا خود محصول را دوست خواهند داشت؟ من می‌توانم در آینده به مواردی که در بالا لیست کردم بپردازم، اما اکنون از بهینه‌سازی زودهنگام پرهیز می‌کنم. چرا بازخورد گرفتن از کاربران محصول اولویت است؟ کار کردن روی مجموعه‌ی امکانات محصول و بازخورد گرفتن از کاربر، مهم‌تر (و حتی سخت‌تر از) کار کردن روی بهینه‌سازی عملکرد یا رفع مشکلات مقیاس‌پذیریست. همچنین شناسایی مجموعه‌ی ویژگی‌ها و نیازمندی ها، می‌تواند تصمیمات بهینه‌سازی را دستخوش تغییر کند. برای پروژه‌ی جانبی من که بالاتر از آن یاد کردم، اگر من تصمیم بگیرم که مشتری من، استارت‌آپ‌ها در مقابل برندهای بزرگ خواهند بود، میزان دیتایی که باید جمع‌آوری شود و مجموعه‌ امکانات مورد نیاز به شکل باورنکردنی تغییر خواهد کرد. پس من می‌گویم مفهوم بهینه‌سازی زودرس مفهومی گسترده‌تر از خود «بهینه‌سازی سرعت اجرا و کارایی»ست بلکه به جایی که زمان و انرژی‌مان را متمرکز می‌کنیم هم مربوط می‌شود. ما همیشه باید تلاشمان را معطوف به مشکل درستی کنیم و برای رفع همان تلاش کنیم. مثلا نباید برای ساختن چیزهایی زمان بگذاریم که هرگز قرار نیست استفاده شوند. ابتدا روی نوشتن کدی کار کنید که می‌دانید مردم قرار است از آن استفاده کنند. همیشه برای بهتر کردن آن زمان خواهید داشت. جمع‌بندی اگر اطمینان داشته باشید که مشغول ساختن چیز صحیحی هستیم، باید زمان بیشتری برای معماری صحیح آن، عملکرد، مقیاس‌پذیری و … آن بگذاریم. پیدا کردن این تعادل همواره چالش‌برانگیز است. مثل بسیاری از چیزها در زندگی، جواب این سوال هم همیشه «بستگی دارد» است. البته که کارایی و مقیاس‌پذیری نرم‌افزار شما مهم هستند. فقط لازم است مطمئن شوید که در حال پیاده‌سازی مجموعه درستی از قابلیت‌ها هستید. به کمک بازخورد گرفتن زودهنگام و گاه‌به‌گاه از کاربر، از بهینه‌سازی زودهنگام جلوگیری کنید. منبع: وبسایت stackify . . . . با ما همراه باشید آدرس کانال تلگرام: JavaCupIR@ آدرس اکانت توییتر: JavaCupIR@ آدرس صفحه اینستاگرام: javacup.ir آدرس گروه لینکدین: Iranian Java Developers

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا