ابزارهای جدید، مشکلات بی‌پایان

آیا لحظه‌ای که حس کردید عاشق برنامه‌نویسی شدید رو یادتون میاد؟ تجربه‌ای که من در این زمینه داشتم هنوز هم مثل روز جلوی چشمانم هست. یک روز یکی از معلمین دبیرستان ما روی تخته مثالی رو با کیوبیسیک حل کرد تا نشون بده چجوری میتونیم مسائل ریاضی رو به کامپیوتر بفهمونیم. همون مثال کوچیک کافی بود تا یک حس کنجکاوی عجیب در من بیدار بشه. حس کنجکاوی غریبی که کم کم به یک تشنگی بی پایان تبدیل شد؛ اکثر شب ها تا ۴-۵ صبح بیدار بودم و درباره مباحث مختلف برنامه‌نویسی مطالعه می‌کردم. از ۱۵-۱۶ سالگیم هیچ چیز دیگه ای در ذهنم ندارم جز اینکه با علاقه‌ی وصف ناشدنی پیگیر کامپیوتر و برنامه‌نویسی بودم؛ و اولین پروژه‌ی خودم رو به عنوان یک آزادکار در ۱۸ سالگی قبول کردم؛ و تا همین امروز هم کم و بیش یک آزاد کار به حساب میام.

چرا این چیزا رو براتون تعریف کردم؟ تا یکی از معایب بزرگ حرفه‌ی مورد علاقم رو براتون شرح بدم…

در حال حاضر من ۲۸ ساله هستم. یعنی به غیر از چند سال اول که برنامه‌نویسی رو به عنوان یک علاقه‌ی شخصی دنبال کردم، دقیقا ۱۰ سال میشه که در زمینه‌ی برنامه‌نویسی کار حرفه ای انجام دادم. «حرفه‌ای» به این معنی که به عنوان یک حرفه از این راه خرجم رو درآوردم. سوال اینه که اگر یک نجار، یک مکانیک، یک برق‌کار، یک معمار، یا یک موزیسین ۱۳-۱۴ سال از عمر خودش رو به شکل شبانه روزی و مستمر صرف کارش میکرد (که ۱۰ سال از این مدت هم به شکل حرفه‌ای طی شده بود)، آیا نباید انتظار داشت که اون شخص به درجه‌ی خاصی از تبحر رسیده باشه؟

متاسفانه در برنامه‌نویسی همچین انتظاری جاری نیست. در برنامه‌نویسی شما هرچقدر هم که باهوش باشید و هرچقدر هم که تلاش کنید، هیچ وقت به جایی نمیرسید که بتونید حتی به خودتون اطمینان بدید که در حرفه‌ تون به تبحر رسیده اید… و بدتر از اون اینه که نه تنها شما تقصیری ندارید، بلکه کاری هم از دست تون برنمیاد!

هر روز یک زبان جدید بیرون میاد. هر روز یک فریم ورک جدید. هر روز یک کتابخونه‌ی جدید. هر روز یک ابزار جانبی تازه… اغلب اوقات، این ها بدون اینکه هنوز به مرحله‌ای از تکامل برسند با مورد جدیدتری تعویض میشن. چطور امکان داره وقتی هنوز نقص‌ها یا نقاط قوت یک ابزار رو درست محک نزدیم، بریم سراغ تولید یه ابزار جدید؟ وقتی درک عمیقی از ابزار و کاری که قراره انجام بده نداریم، بنابراین نمیتونیم از تجربه‌ی ساخت اون درس بگیریم. نتیجه اش چی میشه؟ اینکه حتی اون ابزار جدیدی که ساخته شده بعد از مدت کوتاهی جاشو به یه ابزار جدیدتر میده چون نتونسته به درستی انتظارات رو برآورده کنه؛ و این چرخه‌ی بی دلیل تولید ابزارها یکی از پس دیگری ادامه پیدا میکنه.

وقتی ابزار جدیدی تولید میکنیم (چه زبان باشه، چه فریم ورک، چه ….)، یعنی از کار ابزارهای قبلی ناراضی هستیم. وقتی از یه ابزار رضایت نداشته باشیم، یعنی در ساخت اون ابزار به یکی از این موردها توجه کافی نکردیم:

  • مشکلی که اون ابزار قصد حل کردنش رو داشته درست درک نکردیم.
  • اون ابزار رو به صورتی پیاده سازی نکردیم که بتونه به شکلی بهینه مشکل مون رو حل کنه.

در هر دو حالت، فقط یک چیز مشخص میشه و اونم اینه که شاید ما به عنوان متخصصین کامپیوتر تا اون حدی که فکر میکنیم باهوش نباشیم!

ممکنه بگید مهم نیست یه ابزار چقدر خوب باشه، شاید مورد سلیقه‌ی همه‌ی افراد واقع نشه؛ و این دلیلی هست که هر روز ابزارهای جدید تولید میشن… در این حالت هم باز با مشکل روبرو هستیم. تا این حد تفاوت سلیقه؟ در کدوم جامعه‌ی حرفه‌ای در این حد تفاوت وجود داره؟ چون حلقه‌ی لوپ با فلان سینتکس ساخته شده و من از این سینتکس خوشم نمیاد، پس یه زبان جدید تولید میکنم… کدوم حرفه همچین طرز فکری داره؟ مثلا یه معمار ممکنه بگه من از این برند خودکار خوشم نمیاد. یا با این رنگ نقشه هام رو نمیکشم. این میشه تفاوت سلیقه؛ ولی بعید میدونم که معمارها هر کدوم برای ترسیم نقشه هاشون چندین هزار ابزار مختلف و متفاوت داشته باشن که هر کدوم هم نیاز به ساعت ها زمان و انرژی برای یادگیریشون باشه!

جالب تر اینکه این همه ابزار جدید، هیچ کدوم ایده‌های جدیدی برای بهبود کار ما ارائه نمیدن! اینکه فکر کنید قابلیت‌های جدید در هر ابزار وجود داره بیشتر یک توهم هست. ایده‌ی زبان های فانکشنال که این روزها همه جا اسم شون رو میشنوید ۵۸ سال پیش توسط زبان لیسپ پیاده سازی شده. یا شیوه‌ی انجام اعمال همروند در زبانی مثل گولنگ، برمیگرده به CSP که ۴۰ سال پیش معرفی شده! یا این مایکروسرویس هایی که الآن حرفش رو میزنید، بدونید که ۳۰ سال پیش هر «تابع» در زبانی مثل ارلنگ به شکل یک مایکروسرویس مستقل طراحی شده بود… باور کنید یا نکنید، غریب به اتفاق قابلیت‌های پر زرق و برقی که در ابزارهای جدید میبینید، همشون در بهترین حالت ۲۰-۳۰ سال عمر دارن.

فکرش رو بکنید؛ ما اونقدرها که ادعا میکنیم هیچ چیز جدیدی رو نکردیم. مشکلاتی که امروز باهاشون روبرو هستیم سال ها پیش راه حل شون کشف شده بود. این ما هستیم که هنوز نتونستیم یک پیاده سازی درست حسابی از این راه حل ها داشته باشیم. هر روز ابزار جدید میسازیم و هر روز بیشتر متوجه میشیم که در ساخت اون ابزار اشتباه کردیم. و کسی نمیدونه این آزمون و خطا قراره تا به کی ادامه پیدا کنه…

این موضوع ضربه‌ی بسیار بزرگی به حرفه‌ی ما زده:

وقتی درصد زیادی از وقت و انرژی برنامه‌نویسان صرف ساخت ابزارهای جدید و یادگیری اون‌ها میشه، انرژی و زمان کمتری باقی می‌مونه که صرف ساخت محصولات واقعی با این ابزارها بشه! ما مشکلات رو شناسایی میکنیم، و برای حل اون‌ها ابزارهایی میسازیم. ولی اینقدر مشغول ساخت ابزار برای اون مشکلات میشیم که دیگه وقت نمیکنیم به کمک این ابزارها واقعا مشکل رو حل کنیم! در نهایت مشکل همچنان سر جای خودش باقی میمونه، و ما هم همچنان در حال ساخت ابزارهایی برای حل اون هستیم!

به زبان ساده تر، اگر قراره هر چند ماه یه زبان تازه یاد بگیرید، پس کی وقت میکنید که واقعا با این زبان‌ها یک محصول درست حسابی بسازید؟

ما برنامه‌نویس ها حتی خودمون به خودمون رحم نمیکنیم! زیاد دنبال این نیستیم که همدیگه رو درک کنیم. فرضا شخصی سال ها با جاوا برنامه‌نویسی کرده. برنامه‌های زیادی با جاوا ساخته. فنون برنامه‌نویسی رو عمیق مطالعه کرده. و برای اینکه به اینجا برسه، سال‌ها زحمت کشیده. اما نمیتونه در فلان شرکت استخدام بشه چون اون‌ها نیاز به برنامه‌نویس پی‌اچ‌پی داشتن! این به نظر شما مسخره نیست؟ این قضیه همونقدر خنده داره که یک شرکت معماری یک معمار رو استخدام نکنه چون اون‌ها عادت دارن طرح هاشون رو با خودکار سیاه بکشن و این فرد عادت داشته با خودکار آبی کار کنه!

یک شغل، یک حرفه، یک مشکل، چندین هزار ابزار! کاری که اون برنامه‌نویس جاوا میخواست انجام بده، دقیقا همون کاری میبود که برنامه‌نویسان پی‌اچ‌پی میخواستن انجام بدن. فقط و فقط به صرف اینکه ابزارها فرق میکردن، اون فرد نمیتونست کار پیدا کنه… چرا این قضیه خطرناکه؟ چون شما به جای اینکه روی حل مشکل تمرکز کنید، روی ابزارها تمرکز میکنید؛ اگر غیر این رفتار کنید جایی براتون کار پیدا نمیشه. در نهایت با جامعه‌ای طرف میشیم که به جای اینکه حل مشکلات رو بلد باشن، کار کردن با فلان ابزار رو بلدن!

منظور من رو اشتباه متوجه نشید. من نمیگم که نباید ابزارهای جدید تولید بشن. مسلم هست که اگر مشکل جدیدی پیدا بشه، باید ابزار جدیدی هم براش ساخته بشه. یا اگر ابزاری واقعا راه حل‌های جدید و بهینه‌تری نسبت به ابزارهای دیگه ارائه میکنه، چه اشکالی داره معرفی بشه. اما قضیه اینه که سال هاست در حرفه‌ی ما مشکل جدید پیش نیومده! اکثر مشکلات امروز ما، سال‌ها قبل شناسایی شده بودند و در همون سال‌ها هم براشون راه حل‌های بسیار مناسبی پیدا شده بود. ما نه تنها با مشکلات جدید روبرو نیستیم، بلکه ابزارهای جدیدی که معرفی میشند هم به نسبت ابزارهای قبلی پیشرفت چندانی ندارند…

مشکل نجارها این بود که میخ رو چطوری توی چوب فرو کنند؛ براین اساس «چکش» به وجود اومد! صدها ساله که چکش بهترین روش برای فرو کردن میخ در چوبه. یه نجار وقتی کار با چکش رو یاد گرفت، دیگه وقتش رو تلف نمیکنه که چندصد تا ابزار عجیب غریب دیگه برای میخ زدن یاد بگیره. در عوض وقت خودش رو صرف این میکنه که چه محصولات جدیدی با میخ و چکش بسازه. فرو کردن میخ در چوب یک مشکل حل شده در نجاری به حساب میاد.

تا زمانی که برای حل یک مشکل ابزارهای جدید ساخته میشه، یعنی اون مشکل یا هنوز حل نشده، یا راه حل ما به شکل بهینه ای اون رو حل نکرده. یعنی یا ما هنوز نتونستیم در جامعه‌ی برنامه‌نویسی برای مشکلات مون ابزارهای خوبی بسازیم، یا مشکلات ما به شکل معجزه آوری غیر قابل حل هستند!

سخن آخر اینکه، ما برنامه‌نویسان به جامعه‌ای تبدیل شدیم که به جای حل مشکلات، به تولید ابزارها دل بستیم. هی ابزار میسازیم و هی میسازیم… هی یاد میگیریم و هی یاد میگیریم…. و مشکلات اما، هنوز سر جای خودشان باقی هستند…

نظرات

comments powered by Disqus