آیا شباهت‌هایی مابین تهیهٔ قورمه‌سبزی و توسعهٔ نرم‌افزار وجود دارد؟

آیا شباهت‌هایی مابین تهیهٔ قورمه‌سبزی و توسعهٔ نرم‌افزار وجود دارد؟

یکی از چالش‌هایی که علاقمندان تازه‌کار در صنعت توسعهٔ نرم‌افزار با آن دست‌وپنجه نرم‌ می‌کنند، وسواس به ایده‌آل‌گرایی در کدنویسی و عرضهٔ نرم‌افزار یا اپلیکیشن است. به عبارت دیگر، تمایل به داشتن محصولی به اصطلاح باگ‌فیری (بدون مشکل) با بهترین #تجربهٔ کاربری و حداکثر امکانات، گاهی‌اوقات منجر بدین خواهد شد تا اصلاً چنین نرم‌افزاری به بازار عرضه نشود! علاوه بر این، هیچ نرم‌افزاری را نمی‌توان نام برد که از روز اول عالی بوده باشد بلکه به مرور زمان Mature (بالغ و کامل) شده تا در نهایت به جایی برسد که می‌تواند در مقایسه با دیگر رقبا حرفی برای گفتن داشته باشد. در همین راستا، در این مقاله با انجام مقایسه‌ای ملموس مابین پخت قورمه‌سبزی و توسعهٔ نرم‌افزار، قصد داریم این بحث را بیشتر باز کرده و روی اهمیت این موضوع که نرم‌افزار شما نباید از روز اول بالغ و کامل باشد، تأکید خواهیم کرد.

پیش از پرداختن به این موضوع، نقل‌قول جالبی از هم‌بنیان‌گذار لینکداین، Reid Hoffman، وجود دارد با این مضمون که «If you aren’t embarrassed by the first version of your product, you shipped too late» که به صورت تحت‌الفظی می‌توان این نقل‌قول را به صورت زیر تفسیر کرد:

 اگه عرضهٔ اولین نسخه از محصولتون (نرم‌افزارتون) منجر به آبروریزی شما نشده، مسلماً خیلی دیر اون رو به بازار عرضه کرده‌اید!

مسلماً نیاز به توضیح نیست که شبکهٔ اجتماعی لینکداین در مقایسه با دیگر سوشال‌ مدیاها، شبکه‌ای فاخر محسوب می‌شود چرا که گروه هدفش، قشر خاصی از کاربران وب است. حال وقتی می‌بینیم هم‌بنیان‌گذار کسب‌وکاری به این بزرگی روی این نکته انگشت می‌گذارد که اگر نسخهٔ بتای نرم‌افزار شما منجر به خجالت‌زدگی و آبروریزی شما نشده باشد، شکی به خود راه ندهید که خیلی دیر آن را ریلیس (عرضه) کرده‌اید، دیگر نیاز به توضیح نیست که دیگر کسب‌وکارها به خصوص آن‌هایی که نوپا یا #استارتاپ هستند نیز می‌توانند این توصیه را سرمشق خود قرار داده و از اینکه محصولی (نرم‌افزاری) نابالغ عرضه کنند، هراسی نداشته باشند.

هرگز نمی‌توان ظرف ۳۰ دقیقاً قورمه‌سبزی جاافتاده پخت!
برای درک بهتر این موضوع، ضرری ندارد تا به دستور پخت قورمه‌سبزی -که یکی از غذاهای سنتی و لذیذ ایرانی است- نگاهی داشته باشیم. برای این منظور، ابتدا مواد لازم را مد نظر قرار می‌دهیم:
- گوشت گوسفند
- پیاز
- لوبیا قرمز (البته از لوبیا چیتی هم می‌شود استفاده کرد)
- سبزی قورمه (شامل تره، جعفری، گشنیز و کمی شنبلیله)
- لیمو عمانی
- نمک، فلفل و ادویه
- آب و روغن

اکنون می‌رسیم به دستور پخت قورمه‌سبزی که به صورت خلاصه به شرح زیر است:
- لوبیا را از شب قبل خیس می‌کنیم و چند بار آب آن را عوض می‌کنیم.
- سپس به همراه آب و نمک، کمی آن را می‌جوشانیم.
- لیمو عمانی را در ظرف آب می‌گذاریم تا کمی نرم شود.
- پیاز را در روغن سرخ کرده تا طلایی شود.
- گوشت را خرد کرده و با پیاز و ادویه تفت می‌دهیم تا سُرخی آن گرفته شود. 
- لوبیایی که از شب قبل خیساندیم را به گوشت و پیاز اضافه کرده و به همراه کمی آب می‌گذاریم تا نیم‌پز شود.
- در ادامه، سبزی را خرد کرده و سرخ می‌کنیم.
- سبزی سرخ‌شده را به مخلوط گوشت، پیاز و لوبیا اضافه کرده، سپس لیمو عمانی و آب به آن می‌افزاییم.
- پس از یک ساعت تا یک ساعت و نیم، قورمه‌سبزی آمادهٔ میل کردن خواهد بود (اما کماکان نیاز به زمان بیشتر برای جاافتادن دارد که در ادامه بیشتر توضیح خواهیم داد!)

آنچه در بالا گفته شد، شرح مختصری از فرایند طبخ این غذای سنتی است و این در حالی است که برای پخت این غذا به بهترین شکل ممکن، باید یکسری نکات دیگر را هم در نظر گرفت مثل اینکه سبزی تازه باشد، سبزی ریز خُرد شده باشد، گوشت نَپز نباشد و غیره.

چه شباهتی بین پخت قورمه‌سبزی و توسعهٔ نرم‌افزار وجود دارد؟
همان‌طور که دیدیم، پخت برخی غذاها همچون قورمه‌سبزی با تهیهٔ نیمرو که ظرف مدت پنج دقیقه می‌توان آن را درست کرد، کاملاً فرق دارد به طوری که مستلزم صرف زمان، دقت و دستورالعمل (دانش) آشپزی است. در کدنویسی و به طور کلی توسعهٔ نرم‌افزار در مقیاس‌های بزرگ هم داستان تاحدودی از همین قرار است؛‌ به عبارت دیگر، همان‌طور که Reid Hoffman اعتقاد دارد که هرگز نمی‌توان سریع و چابک محصولی عالی به دنیا عرضه کرد، ما هم نمی‌توانیم انتظار داشته باشیم تا یک قورمه‌سبزی جاافتاده با همان میزان زمانی که برای تهیهٔ نیمرو اختصاص می‌دهیم، جلوی مهمان (کاربر) خود بگذاریم!

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

واقعیت امر آن است که نرم‌افزارها در طول زمان و بالا رفتن شمارهٔ نسخهٔ آن‌ها به Maturity (بلوغ) می‌رسند و خبر خوشحال‌کننده این است که مسئله‌ای این‌چنین هرگز به پروژه‌هایی که ما با آن‌ها سروکار داریم محدود نمی‌شود بلکه غول‌های نرم‌افزاری دنیا همچون مایکروسافت، گوگل، اپل و دیگر کمپانی‌های فعال در این صنعت نیز با چنین چالشی مواجه هستند و شاهد چنین ادعایی هم این است که می‌بینیم علیرغم اینکه شرکت‌های فوق‌الذکر از بهترین دولوپرها، تِستِرها و متخصصین تضمین کیفیت (QC) برخوردارند، اما کماکان شاهد باگ‌های غیرقابل‌بخشش در ویندوز، اندروید، مکینتاش و دیگر نرم‌افزارها هستیم!

حال سؤال اینجا است که آیا این شرکت‌ها غیرحرفه‌ای هستند و دولوپرها و تِستِرهای خوبی ندارند یا مشکل جای دیگری است؟ در پاسخ به این سؤال و سؤالاتی از این دست باید بگوییم که هرگز این‌طور نیست که کمپانی‌هایی از این دست دولوپرها و تِستِر‌های خوبی را به خدمت نگرفته‌اند و شاهد این ادعا هم رقابت این شرکت‌ها برای جذب بهترین متخصصین امر نه تنها از ایالات متحدهٔ آمریکا، بلکه از سراسر دنیا است.

با این تفاسیر، می‌رسیم به روی دیگر سکه که چیزی نیست جز اصطلاحاً فرایند جاافتادن نرم‌افزار! در واقع، همان‌طور که قورمه‌سبزی هرچه بماند جاافتاده‌تر می‌شود، نرم‌افزار هم هرچه زمان بیشتری از شروع توسعهٔ آن بگذرد (البته به شرطی که به مرور باگ‌ها حذف شده و فیچرهای جدید به آن اضافه شود) به بلوغ بیشتری می‌رسد و همین می‌شود که در ۱۰۰٪ مواقع، نسخه‌های بتای نرم‌افزارهای مختلف -از سیستم‌عامل گرفته تا موتور جستجو و غیره- اصلاً قابل‌‌مقایسه با آخرین نسخه‌ها نیستند (برای درک بهتر موضوع جاافتادگی، توصیه می‌کنیم چشمان خود را ببندید و شرایطی را تصور کنید که پس از یک مهمانی، مقداری قورمه‌سبزی، برنج و سالاد شیرازی در یخچال باقی مانده است؛ حال روز بعد، از ۵ صبح مشغول کدنویسی بوده‌اید و با باگی دست‌وپنجه نرم کرده‌اید تا اینکه نهایتاً حول و حوش ساعت ۱۲ ظهر، باگ مذکور در کمال ناباوری رفع می‌شود! برای رفع خستگی، سری به یخچال می‌زنید و می‌بینید که از دیشب کمی غذا باقی مانده است و شما هم گرسنه‌اید؛ سپس یک لیمو تُرش تکه کرده، با کمی سُس و فلفل روی سالاد می‌ریزید و قورمه‌سبزی‌ای که به معنای واقعی‌ کلمه جاافتاده است را میل می‌کنید).

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

فرایند جاافتادن یک نرم‌افزار چگونه است؟
برای درک بهتر این موضوع، فرض کنیم یک اپ موبایل توسعه داده‌ایم که یک شبکهٔ اجتماعی برای آشپزها است. نسخهٔ بتای این اپلیکیشن شامل ثبت‌نام در اپ، تکمیل پروفایل، امکان درج پست و همچنین فالو کردن دیگر آشپزها است. توسعهٔ اپ تا این مرحله چیزی در حدود ۲ ماه (به صورت نامتمرکز) به طول انجامیده است. پس از مدتی، می‌بینیم که برخی از کاربران درخواست افزودن فیچرهای جدیدی همچون موارد زیر دارند:
- فراموشی رمز عبور
- امکان بلاک کردن برخی کاربران
- امکان درج کامنت برای پست‌های دیگر کاربران

افزودن این قابلیت‌ها خود نیاز به چند روزی کدنویسی دارد که در نهایت این موارد هم به اپ اضافه می‌شوند. در ادامه، برخی کاربران گزارش می‌کنند که اپ کمی سنگین است. پس از بررسی موضوع، متوجه می‌شویم که اپلیکیشن مد نظر دارای یک باگ پرفورمنسی است (برای آشنایی بیشتر با این دست باگ‌ها، توصیه می‌کنیم به مقالهٔ Performance Bugs: یکی از بدترین انواع باگ‌های برنامه‌نویسی مراجعه نمایید). در نهایت، پس از چند هفته‌ای صرف زمان، مشکل کار پیدا می‌شود. پس از اینکه چند ماهی از ریلیس این اپ در بازار می‌گذرد، مجدد با یکسری Feature Request (درخواست قابلیت جدید) مواجه می‌شویم که عبارتند از:
- قابلیت درج تبلیغات داخل اپ (In-App Ads) برای کسب‌وکارهای مرتبط
- قابلیت پیشنهاد آشپزهایی که به نوعی مرتبط با یکدیگر هستند
- قابلیت مشخص کردن برترین آشپزها بر اساس روز، ماه و سال

با افزودن فیچرهای فوق‌الذکر، اپلیکیشن ما به مراتب جاافتاده‌تر از اولین نسخه‌اش می‌شود. روال حذف باگ‌ها و افزودن قابلیت‌های جدید به همین منوال پیش می‌رود تا جایی که پس گذشت صرفاً یک سال از ریلیس این اپ،‌ نسخهٔ نهایی اصلاً با نسخهٔ بتای آن قابل‌مقایسه نبوده و گویی اپلیکیشنی کاملاً جدید است!

کلام آخر
نیاز به توضیح نیست که هیچ کسب‌وکاری یک شبه به موفقیت‌های بزرگ دست نخواهد یافت و استارتاپ‌های مبتنی بر فناوری -خواه بر پایهٔ سایت و خواه بر پایهٔ اپ موبایل- هم از این قاعده مستثنی نیستند. آنچه در این مورد بسیار حائز اهمیت می‌باشد، این است که همواره با کاربران محصول یا سرویسی که عرضه کرده‌ایم در تعامل باشیم، از ایشان فیدبک بگیریم، در اسرع وقت باگ‌ها را مرتفع ساخته و در مورد درخواست‌های ایشان هم چنانچه با سیاست‌های کاری هم‌خوانی دارند، آن‌ها را در سرویس خود بگنجانیم و مجدد فیدبک بگیریم (به چنین کاری اصطلاحاً تفکر طراحی گفته می‌شود. برای آشنایی بیشتر با این مفهوم، توصیه می‌کنیم به مقالهٔ تفکر طراحی (Design Thinking) چیست؟ مراجعه نمایید).

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



بهزاد مرادی