هزینه‌های تولید و نگهداریِ نرم‌افزارِ شما می‌تواند به شکل چشمگیری کاهش یابد!

تولید نرم‌افزارِ باکیفیت، فرایندی پُرهزینه و گران‌قیمت است. اما می‌توان با روش‌هایی اصولی و بهینه آن را مدیریت کرد تا با کمترین هزینه بیشترین ارزش را خلق کنید. می‌توان اثربخش‌تر و کارامدتر کار کرد، تا هزینه‌های نگهداری نه‌تنها بیشتر از تولید نشود، که تا حد خوبی کاهش یابد.

علی‌رقم هزینه‌ی بالای تولید و نگهداری، نرخِ شکست پروژه‌های نرم‌افزاری همچنان بالاست!

از گذشته تا امروز نرخِ شکستِ پروژه‌های نرم‌افزاری بالا بوده است. اگرچه این نرخ در سال‌های اخیر کمی بهتر شده است، اما همچنان ۶۵-۸۰ درصد از پروژه‌های صنعتِ IT نمی‌توانند به اهدافِ مقررِ خود برسند؛ یا دیرتر از موعد اجرایی می‌شوند و یا هزینه‌ها بیش از پیش‌بینیِ اولیه می‌شوند و یا بطور کلی لغو می‌شوند.

نه تنها هزینه‌ی تولیدِ نرم‌افزار بسیار بالاست، بلکه از لحاظِ ریسک (احتمالِ شکست) قابلِ مقایسه با دیگر صنایع نیست. این واقعیت، برخلافِ ظاهرِ صنعتِ نرم‌افزار و باورِ عموم است. عدم درکِ درست تفاوتِ بین ابزار و محصولِ نرم‌افزاری به این اشتباه دامن می‌زند. نگاهِ ساده‌انگارانه به نرم‌افزار عاقبتی جز شکست یا تولیدِ محصولی پُرایراد و پرهزینه ندارد. عاقبتی که در کشورِ ما غریب نیست.

عواملِ شکستِ پروژه‌های نرم‌افزاری

عواملِ زیادی وجود دارد، از عدمِ شفافیت در نیازمندی‌ها بگیرید تا مسائلِ فرهنگیِ یک سازمان. برخی از این عوامل پُررنگ‌تر و برخی کم‌اثرتر هستند. از طرفی برای برخی از عوامل پُراثرتر، موانعِ کمتری برای برطرف کردن آن‌ها وجود دارد. به عنوان مثال «داشتنِ معماریِ مناسب» شدنی‌تر و کم‌مانع‌تر از تغییرِ فرهنگِ سازمانی است، ولی تاثیرِ بسزایی در موفقیت و نگهداریِ محصولِ نرم‌افزاری دارد.

جهانِ اول در تکاپوی یافتن راه‌هایی بهینه‌تر است تا از هزینه‌ی تولیدِ نرم‌افزار بکاهد و ریسکِ آن را کم‌تر کند.

کشورهای پیشرفته برای کاهشِ هزینه‌های تولید و نگهداریِ نرم‌افزار و همچنین کم‌کردنِ ریسک آن، بطورِ جدی در پِی یافتن راه‌هایی برای اثربخشیِ بیشتر هستند. سالانه بنیادهای تحقیقاتی نظیر DORA بواسطه‌ی پژوهش‌گرانِ مجرب به طُرق مختلف تیم‌های موفق و ناموفق نرم‌افزاری را بررسی و تحلیل می‌کنند تا متوجه شوند که چگونه می‌شود بدونِ کاستی از کیفیت، از هزینه‌ها کم کرد و محصول را مطابقِ با نیازمندی واقعی سریع‌تر به بازار رساند.

کم‌کردنِ هزینه به روشِ افزایشِ بهره‌وری و کاهشِ احتمالِ شکست. نه زدن از کیفیت!

کم‌تر کردنِ هزینه یعنی در کم‌ترین زمانِ ممکن، محصولی باکیفیت تولید کنید و از هزینه‌های نگهداری آن کم کنید. خیلی از اوقات هزینه‌های نگهداریِ نرم‌افزار بیش از هزینه‌ی تولیدِ اولیه می‌شود.

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

رسالتِ جنبشِ دواپس کم‌کردنِ هزینه‌ها و ریسکِ پروژه است

استفاده از روش‌های اصولیِ فنی و مدیریتی، منطبق با نیاز و ساختارِ سازمان، کلیدِ کم‌کردن هزینه‌های تولید و نگهداری است. دقت بفرمایید با ارزش‌ترین داراییِ یک تیم‌ِ نرم‌افزاری، توسعه‌دهندگان آن است. روش‌های جدید و مهندسی شده، رضایتِ توسعه‌دهندگان را نیز به همراه دارد و سازمان را به محلی جذاب برای کار کردن تبدیل می‌کنند و از burn out نیرو‌های فنی جلوگیری می‌کند.

الزاماتِ فنیِ توسعه‌ی باکیفیت و مطمئن

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

پایپلاین‌های CI/CD

پایپلاین‌ها بخش بسیار مهمی از فرایندِ توسعه هستند. بقدری که برخی DevOps را معادل با پایپلاین‌های CI/CD می‌دانند! عمده‌ی پایپلاین‌هایی که دیده‌ام، نیمه‌اتومات بودند و در بخشی از فرایند، نیاز به دخالت یا توجهِ انسانی دارند. اما پایپلاین‌های باکیفیت تمام‌اتومات و idempotent هستند و می‌توانند بسیار پیچیده‌تر و فراتر از گفته‌های درونِ اینترنت باشند. در دنیای واقعی شما باید یک اپلیکیشن‌ را منطبق با git workflow در چندین محیط مختلف با زیرساخت‌های متفاوت (کوبرنتیز، سوارم و…) و تکنولوژی‌های گوناگون (داکر، هِلم و…) دیپلوی کنید. البته دیپلوی فقط بخشی از کار است. پایپلاین می‌تواند شاملِ تمامِ اموری شود که در مرحله‌ی ادغام و تحویل انجام می‌شود.

مانیتورینگ و مشاهده‌پذیری

اهمیتِ مانیتورینگ‌ و مشاهده‌پذیری فراتر از آن چیزی است که امروز به آن پرداخته می‌شود. این مقوله به جد مورد کم لطفی است. و همچنین برخلافِ تصور عموم، مانیتورینگ چیزی نیست که «انسان» آن را رصد کند. زمانی مانیتورینگ کامل است که بصورت اتومات رخداد را تشخیص داده و فردِ مدنظر را از طریقِ alert برای کنکاشِ بیشتر مطلع کند. و مشاهده‌پذیری دقیقا برای کنکاش بیشتر است. درست است که خیلی از تیم‌های ایرانی همچنان با مفاهیم log، trace و metric غریبه هستند، اما امروز در جهانِ مدرن مشاهده‌پذیری چیزی فراتر از این سه عامل شده است و بطور گسترده از هوش‌مصنوعی برای پیش‌بینی و تحلیل استفاده می‌کنند. بطور کلی در مانیتورینگ ما متوجه این می‌شویم که چیزی درست کار نمی‌کند، و در مشاهده‌پذیری آن چیز و علت رخدادش را پیدا می‌کنیم. 

زیرساخت به صورت کد (IaC)

اگر در یک چیز افراط جایز باشد، احتمالا آن کُدی‌فای کردن هرچیزی است. حتا پیشنهاد می‌کنم مستنداتِ نرم‌افزاریِ خود نظیر اسنادِ C4 را به بواسطه ابزارهایی نظیرِ PlantUML تبدیل به کُد کنید تا نه تنها نگهداری و بروزکردنِ آن آسان‌تر باشد، بلکه بتوانید تغییرات آن را نیز رصد کنید. در واقع وقتی شما «چیزی» را به کُد تبدیل می‌کنید، از تمام مزایای کد نظیر version control و reusable بودن بهره‌مند می‌شوید و فرآیندهای زمان‌بر مانند تنظیمِ سرورها یا شبکه‌ها را تسریع کنید. و چه چیز فرخنده‌تر از آن که وابستگیِ مهمی همچون زیرساخت نرم‌افزاری خود را به کد تبدیل کنیم تا در صورت نیاز بتوانیم آن را به سریع‌ترین شکل ممکن بازیابی کنیم. IaC به عنوان یک مفهوم، بر اصل خودکارسازی تاکید می‌کند که یکی از اصول اساسی دواپس و SRE است. نمی‌خواهم رویایی حرف بزنم، ولی اگر زیرساخت شما کدیفای شده باشد، این امکان مهیا است که آن را با پایپلاین‌های CI/CD ادغام کرد و از مزایای محیط‌های موقت نیز (ephemeral environment) بهره‌مند شد.

اَبر (Cloud)

پردازشِ ابری بی‌شک یکی از مهمترین عواملِ سرعتِ بالا، امنیت، و کم‌کردن هزینه‌هاست. طبقِ گزارش DORA 2022 تنها ۱۰درصد از جامعه‌ی آماری از پردازش ابری استفاده نمی‌کنند. پس اگر استفاده‌کننده‌ی ابرِ خصوصی یا عمومی نیستید، لازم است «محضِ احتیاط» در تصمیمِ خود بازنگری کنید و مطمئن شوید که درست تصمیم گرفته‌اید. متاسفانه به ۲ دلیل ما در ایران از این نعمتِ بزرگِ تکنولوژی محروم هستیم. اولین و مهمترین دلیل تحریم‌های آمریکاییست. ما بطور قانونی امکان استفاده از سرویس‌های ابری نداریم. ولی احتمالا اگر امکان آن را هم داشتیم، به دلیلِ «دلاری» بودن هزینه‌ها سخت می‌توانستیم به آن اتکا کنیم. سرویس‌های ایرانی نظیرِ ابرآروان گزینه‌های مناسبی هستند، ولی متاسفانه فعلا به بلوغِ کافی نرسیده‌اند و قابلِ مقایسه با نمونه‌های جهانی نظیرِ AWS ، Azure و… نیستند. طبقِ تعریفِ سازمانِ استانداردِ آمریکا (NIST) سرویسِ ابری باید ویژگی‌هایی داشته باشد که در زیر لیست شده است.

مستند‌نویسی

از بینِ مدل‌هایی که سازمان را ترسیم می‌کنند، من اعتمادِ زیادی به مدلِ وِستروم دارم. این مدل را در بخش خودش توضیح می‌دهم، ولی فعلا به این بسنده کنیم که از نظر وستروم، کلیدِ موفقیتِ سازمان‌های پیچیده نظیر سازمان‌های نرم‌افزاری، جریانِ خوبِ اطلاعات است. جریانِ اطلاعات، یک بحث است، وجودِ اطلاعاتِ خوب یک بحث دیگری است که موضوع صحبت من در بخش مستندنویسی است. مستندات در واقع حافظه‌ی سازمان هستند، بدیهی است که این حافظه نباید در گرو فرد یا افراد باشد، و باید در پایگاهِ دانشِ سازمان در دسترسِ عموم باشد. همچنین مستندات باید تک‌نسخه و بروز باشند. ابزارهایی نظیر کانفلوئنس و نوشِن این امکان را بخوبی فراهم میکنند. می‌دانم که مستندنویسی فرایندِ لذت بخشی نیست و عموما توسطِ توسعه‌دهندگان موکول می‌شوند به پایان پروژه و سرهم کردن چند سندِ بی‌کیفیت، اما شاید دانستنِ تاثیرِ مستنداتِ خوب بتواند رویکرد شما را در تولید اسنادِ باکیفیت تغییر دهد.
برای دانستنِ تاثیرِ مستندنویسی بر کیفیتِ محصولِ نهایی، پیشنهاد می‌کنم گزارشات دورا در سال‌های 2018 و 2019 را دنبال کنید.

گیت‌اوپس (GitOps)

گیت‌اوپس (GitOps) رویکردی برای مدیریتِ زیرساخت و دیپلوی اپلیکیشن‌هاست که در آن از Git به عنوانِ Single Source of Truth استفاده می‌شود. در این رویکرد وضعیتِ مطلوب (Desired State) در مخازنِ گیت تعریف می‌شود و بواسطه‌ی یک فرایند (Deployment Pipeline) در محیط‌های مختلف اعمال می‌شود. باتوجه به استفاده از گیت به عنوانِ مرجعِ حقیقیت، این امکان مهیا می‌شود که تغییرات را براحتی رصد و بازبینی کنید، و از آن مهم‌تر، در صورتِ بروزِ خطا، می‌توان به راحتی به نسخه‌های گذشته rollback کرد. رویکردِ گیت‌اوپس بطورِ کامل با اصل Infrastructure as Code (IaC) هم‌خوانی دارد. به‌همین دلیل از تمام مزایای IaC بهره‌مند است. همچنین ابزارهایی مانند ArgoCD و Flux بطور گسترده برای پیاده‌سازی گیت‌اوپس استفاده می‌شوند و قابلیتِ نظارت و اعمالِ خودکارِ تغییرات را فراهم می‌کنند. GitOps می‌تواند یک لایه شفافیت و اتوماسیون را قوی‌تر کند و برای تیم‌هایی که زیرساخت‌های ابری پیچیده دارند یک راهکارِ قدرتمند ارائه دهد.

کانتینرسازی و ارکستراسیون

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

تستِ مستمرِ کیفیت و امنیت

با اجرای مداومِ تست‌های خودکار، می‌توان باگ‌ها و آسیب‌پذیری‌های امنیتی را در مراحل اولیه‌ی توسعه شناسایی کرد، پیش از آنکه به مشکلاتِ بزرگتری در تولید تبدیل شوند.  تستِ مستمر به تیم‌های توسعه اطمینان می‌دهد که تغییراتِ جدید به کیفیتِ کلیِ محصول آسیب نمی‌رسانند، و این اطمینان باعثِ تسریع در توسعه و انتشارِ نرم‌افزار می‌شود. با استفاده از ابزارهای تستِ امنیتی مانند SAST (تستِ ایستا) و DAST (تستِ دینامیک)، اکثرِ  آسیب‌پذیری‌های نرم‌افزار پیش از آنکه بدخواهانِ سیستم بتوانند از آن‌ها سوءاستفاده کنند شناسایی می‌شوند. تست‌های ایستا به دلیلِ تحلیلِ سورس‌کد و اجرا نکردنِ اپلیکیشن، بسیار سریع هستند و می‌توان آن را در پایپلاین‌های ci نیز قرار داد. در واقع امنیت از ابتدا (Shifting Security Left) یک رویکرد پیشگیرانه در توسعه‌ی نرم‌افزار است که به شناسایی و برطرف کردن آسیب‌پذیری‌های امنیتی در مراحل اولیه‌ی چرخه‌ی حیاتِ نرم‌افزار تمرکز دارد. این روش شامل استفاده از ابزارها و تکنیک‌هایی است که امنیت را به بخشِ جدایی‌ناپذیر از فرآیند توسعه تبدیل می‌کند.

مهندسیِ آشفتگی (Chaos)

اشک هایی که بعدِ هر شکست میریزیم ، همان عرق هایی است که برای پیروزی نریخته ایم- ناشناس. 

مهندسیِ آشفتگی (Chaos Engineering) یک رویکردِ عملی برای بهبودِ قابلیتِ اطمینان و استحکامِ سیستم‌های توزیع‌شده است. در این روش، به‌صورت عمدی خطاها و اختلالاتی در سیستم ایجاد می‌شود تا رفتار آن در مواجهه با شرایطِ غیرمنتظره بررسی و نقاطِ ضعفِ آن شناسایی شود. هدفِ اصلیِ مهندسیِ آشفتگی این است که اطمینان حاصل شود سیستم در برابرِ مشکلاتی نظیر خرابی سرورها، تأخیرهای شبکه، افزایش ترافیک یا حتی قطعی‌های کامل مقاوم بوده و همچنان قادر به ارائه خدمات به کاربران باقی می‌ماند. مهندسیِ آشفتگی از آن دست اقداماتی هست که هیچوقت در عمل تجربه‌ نکرده‌ام. اما تصور می‌کنم خوابِ راحت برای کسب‌وکار با چنین مانور‌هایی و برگزاری جدیِ جلساتِ postmortem امکان پذیر است. در دنیای سیستم‌های توزیع‌شده که پیچیدگی روزافزونی دارند، اعتماد به عملکرد پایدار سیستم‌ها بدونِ آزمودنِ آن‌ها در شرایطِ واقعی قطعا هزینه‌هایی به همراه خواهد داشت.

الزاماتِ غیرفنی

گرچه الزاماتِ فنی از اهمیت زیادی برخوردار هستند، اما عموما این سطح از بروز بودن فنی در سازمان‌هایی که فرهنگِ مُولد ندارند بسیار سخت است. فرهنگ‌ِ سازمانی نقشِ تعیین کننده‌ای در موفقیتِ تیم‌های نرم‌افزاری بازی می‌کند. بقدری که گاها جمله‌ی اشتباهِ «دواپس یعنی فرهنگ» را می‌شنویم. اگرچه دواپس معادل فرهنگ نیست، اما فرهنگ یکی از ارکانِ اصلیِ آن است.

فرهنگِ سازمانی

رویکردهای متنوعی برای مُدل کردن یا الگوسازیِ «فرهنگ سازمانی» وجود دارد. به‌عنوان مثال، فرهنگِ سازمانی را می‌توان صرفا «ارزش‌هایی (values)» دانست که رفتارِ تیم‌ها را می‌سازند. یا آنکه از جنبه‌های مختلف‌تری به آن نگاه کرد. فرهنگِ سازمانی را می‌توان با سه سطح در سازمان تعریف کرد: ۱.مفروضاتِ بنیادین، ۲.ارزش‌ها، و ۳.مصنوعات. بحث‌هایی که در جمع‌های دواپسی در خصوص اهمیتِ مقوله‌ی فرهنگِ سازمانی می‌شود، در سطحِ دوم (ارزش‌ها) است. الگو و مُدلی که برای بیان و تفسیر این سطح من درنظر می‌گیرم مُدلِ جامعه‌شناسی بنامِ Ron Westrum است. ایشان در سال ۱۹۸۸ گونه‌شناسیِ (typology) فرهنگ‌های سازمانی را در ۳ دسته ایجاد کرد. اول، بیمارگونه (Pathological) (قدرت محور)، دوم، بوروکراتیک (Bureaucratic) (قانون محور) و سوم، مُوَلِد (Generative) (شایسته‌سالار). وِستروم معتقد بود که فرهنگِ سازمانی، تعیین کننده‌ی «نحوه‌ی جریان اطلاعات (information flow)» در سازمان است. و سه خصیصه برای «اطلاعاتِ خوب (good information)» معرفی کرد: ۱.ابهامِ پرسش‌کننده را کامل برطرف می‌کند. ۲.همواره در دسترس است. ۳.در قالبی است که استفاده‌کننده می‌تواند به بهترین نحو از آن استفاده کند.
جریانِ «اطلاعاتِ خوب»، امری حیاتی برای داشتنِ عملکردِ «درست» و «مطمئن» در محیط‌های حساس است. محیط‌های عملیاتیِ محصولاتِ نرم‌افزاری یکی از همین محیط‌های حساس است که هر تغییری می‌تواند پیامدهای گسترده (high-consequence) داشته باشند. 

بودجه‌ی خطا

به عنوان کسی که مسئولیت‌ِ محیط‌های عملیاتی حساس را به‌دوش داشته‌ام، توصیه می‌کنم که پیش از هرچیز با مدیرانِ سازمان (یا مدیرِ فنی) در خصوصِ بودجه‌ی خطای تیمِ عملیات صحبت کنید و ظرفیتِ تیم را برای خطا مشخص کنید.

یکی از مشکلاتی که در سازمان‌های مختلف تجربه کرده‌ام، عدمِ درکِ درستِ محیطِ عملیاتی توسطِ مدیران و توسعه‌دهندگان است. تیم عملیات نیازمند یک بودجه‌ی خطا است تا بتواند با فراغ‌بال و برنامه‌ریزی شده تغییرات را در محیط عملیاتی اعمال کند. مسئله‌ی وجود «بودجه‌ی خطا» یک چیز است، پذیرش آنکه سرویس در محیط عملیاتی، پایداری ۱۰۰ درصدی ندارد و عملیات نیازمند زمانی برای اعمال تغییرات و مانورهای عملیاتی است، چیز دیگری است. عموما در پیشفرض ذهنی مدیرانِ سازمان‌های ایرانی، بودجه‌ی خطا جایی ندارد و لازم است بواسطه‌ی افرادِ عملیاتی در این خصوص فرهنگ‌سازی شود.

بودجه خطا مقدار مشخصی از خطا یا عدم دسترسی است که برای یک سیستم در یک بازه زمانی مشخص قابل‌قبول در نظر گرفته می‌شود. این مفهوم بر اساس توافق سطح خدمات (SLA/SLO) تعریف می‌شود. اگر مثلاً سطح توافق‌شده برای در دسترس بودن سیستم ۹۹.۹٪ باشد، بودجه خطا ۰.۱٪ زمان عدم دسترسی در آن بازه زمانی است. البته قابل ذکر است که بودجه‌ی خطا برای نسخه‌گذاری نیز درنظر گرفته می‌شود، اما این مقوله راحت‌تر توسط سازمان‌ پذیرفته می‌شود تا تغییرات و مانورهای عملیاتی.

رهبری

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

رهبری امری یادگرفتنی است، ذاتی نیست. وبسایت متمم محل مناسبی برای تقویت مهارت‌های نرم، من‌جمله رهبری است. 

اندازه‌گیریِ بهبودِ عملکردِ تیم نرم‌افزاری

مهندس یعنی اندازه‌گیر. یکی از پُرچالش‌ترین اقداماتِ یک تیم مهندسی نرم‌افزار، اندازه‌گیریِ کمّی عملکردِ تیمِ نرم‌افزاری است. پیشنهاد من ۴ متریک متعالیِ DORA می‌باشد که در بحث اندازه‌گیریِ عملکرد مطرح است. توضیحاتِ بیشتر در این خصوص خارج حوصله بحث است، برای اطلاعات بیشتر به کتاب Accelerate یا مقاله‌ی من در ویرگول مراجعه کنید.

بهبودِ تجربه‌ی توسعه‌دهندگان (DevEx)

تجربه‌ی توسعه‌دهنده (Developer Experience یا DevEx) به احساسی که توسعه‌دهندگان نسبت به کارِ خود دارند، طرز فکر آن‌ها و ارزشی که برای کارشان قائل هستند، اشاره دارد. در پژوهش‌های انجام شده، بیش از ۲۵ عاملِ اجتماعی-فنی شناسایی شده که بر تجربه توسعه‌دهنده تأثیر می‌گذارد. به عنوان مثال، وقفه‌های مکرر (interruptions)، ضرب‌الاجل‌های غیرواقعی، و ابزارهای نامعقول توسعه می‌توانند تاثیر بسیار منفی داشته باشند. در مقابل، وظایف مشخص، کدهای سازمان‌یافته، و فرآیندهای دیپلوی بدون دردسر تجربه مثبت‌تری ایجاد می‌کنند.

یک تصور اشتباه رایج این است که تجربه توسعه‌دهنده (DevEx) بیشتر تحتِ تأثیرِ ابزارها قرار دارد. اما تحقیقات نشان می‌دهد که عوامل انسانی مانند داشتن اهدافِ روشن برای پروژه‌ها و احساسِ امنیتِ روانی در تیم تأثیرِ قابل‌توجهی بر عملکردِ توسعه‌دهندگان دارند. بهبودِ تجربه‌ی توسعه‌دهنده نه تنها بهره‌وری را افزایش می‌دهد، بلکه باعث افزایشِ رضایت، تعامل و ماندگاریِ کارکنان نیز می‌شود.

در این خصوص بیشتر بخوانید.

روش‌های مدرن توسعه‌ی نرم‌افزار چیست؟

مدرن نه به معنای جدید، به معنای آنکه در دنیای مدرن این روش‌ها به عنوان practiceهای مطمئن و آزموده شده پذیرفته شده است. البته که برخی از این روش‌ها عمر نسبتا کوتاهی هم دارند، اما به عنوان یکی از پایه‌های توسعه‌ی مدرن درنظر گرفته می‌شوند.

مدیریتِ چابک (Agile)

اجایل ماحصلِ اجماعِ 17 تن از بهترین مهندسانِ نرم‌افزار است. سالیانِ سال است که رویکردِ اجایل توسطِ تیم‌های پیشگامِ نرم‌افزاری استفاده می‌شود. اما با این وجود عمده‌ی تیم‌های نرم‌افزاری فقط نامِ اجایل را یدک می‌کشند و در عمل چابک نیستند. اجایل منتقدانِ جدی هم دارد، و این مسئله اعتبارِ این متدولوژی را نشان می‌دهد. نکته‌ی مهم آن است که بدانیم اگرچه ذاتِ اجایل قابلِ انطباق با اکثر سازمان‌هاست، اما تنها راهِ درستِ توسعه‌ی نرم‌افزار نیست. ولی بی‌شک یکی از بهترین‌هاست.

طراحیِ دامنه‌محور (DDD)

رویکرد یا مکتبِ DDD از زمان معرفی آن توسط Eric Evans تا کنون بسیار مترقی‌تر شده است. الگوهای استراتژیکِ DDD در حوزه‌ی تعامل‌ِ تیم‌ها، تحلیل، مدل کردنِ کسب‌وکار و طراحیِ اپلیکیشن بسیار کارامد هستند. تحقیقات و سمینارهای متعددی همچنان در این حوزه برگزار می‌شود و روش‌های جدیدی معرفی می‌شوند که عموما زیر چترِ DDD قرار می‌گیرند. الگوهای تکتیکال آن نیز اگرچه جدید و الزاما مختص به DDD نیستند، اما تاثیر شگرفی در کیفیتِ کدِ تولیدی خواهند داشت. 

توسعه‌ی Cloud Native

توسعه‌ی Cloud Native یکی از رویکردهای مدرن در توسعه نرم‌افزار است که برای بهره‌برداری از امکانات و قابلیت‌های زیرساخت‌های ابری طراحی شده است. این روش توسعه تمرکزِ زیادی بر چابکی، مقیاس‌پذیری، و قابلیتِ تحملِ خطا دارد. ۱۲ فاکتور مجموعه‌ای از اصول است که توسطِ تیمِ Heroku ارائه شد و هدف آن ارائه راهنمایی‌هایی برای طراحی و توسعه‌ی برنامه‌های cloud native است.

ادغامِ مستمر (CI)

بسیاری از تیم‌های توسعه‌ی نرم‌افزار عادت دارند که فیچرها را برای روزها یا حتی هفته‌ها بر روی برنچ‌های جداگانه توسعه دهند. ادغام این برنچ‌ها زمانِ زیادی می‌برد و نیازمندِ دوباره‌کاریِ قابلِ توجهی است. با پیروی از اصل work in small batches و build quality in، تیم‌های با عملکردِ بالا، برنچ‌ها را کوتاه‌مدت نگه می‌دارند (کمتر از یک روز کار) و به طورِ مکرر آن‌ها را در برنچِ اصلی ادغام می‌کنند. هر تغییر باعث شروعِ فرایندِ ساخت (build) می‌شود که شامل اجرای تست‌ها (unit tests) نیز هست. اگر هر بخشی از این فرایند شکست بخورد، توسعه‌دهندگان فوراً آن را برطرف می‌کنند.

 

تحویلِ مستمر (CD)

به موجز ترین شکلِ ممکن، تحویلِ مستمر (CD)، یعنی مجموعه‌ای از توانمندی‌ها (capabilities) که این امکان را فراهم می‌کنند که در کمترین زمانِ ممکن، تغییرات را (از هر نوعی) عملیاتی کنیم یا به عبارتِ دیگر به دستِ کاربرنهایی برسانیم.

حیف باشد که وبسایت به نام تحویلِ مستمر باشد و بخواهیم به همین تعریف مختصر از آن بسنده کنیم. به همین دلیل پیشنهاد میکنم برای درکِ درستِ تحویلِ مستمر (CD) به مقاله‌ی مرتبط به آن مراجع کنید.

تحویل مستمر (Continuous Delivery) چیست؟

هوش مصنوعی

هوش مصنوعی نه تنها سبک زندگی عوام مردم را تحت تاثیر قرار داده است، بلکه در سال‌های اخیر با معرفی LLMها، تاثیر شگرفی در تولید نرم‌افزار داشته است. گزارش ۲۰۲۴ در DORA به شکل مفصلی در خصوص تاثیر هوش‌مصنوعی در روند توسعه‌ی نرم‌افزار است.

آمار هوش مصنوعی

رویکرد TDD

بسیاری از تیم‌های توسعه‌ی نرم‌افزار عادت دارند که فیچرها را برای روزها یا حتی هفته‌ها بر روی برنچ‌های جداگانه توسعه دهند. ادغام این برنچ‌ها زمان زیادی می‌برد و نیازمند دوباره‌کاریِ قابل توجهی است. با پیروی از اصل work in small batches و build quality in، تیم‌های با عملکرد بالا، برنچ‌ها را کوتاه‌مدت نگه می‌دارند (کمتر از یک روز کار) و به طور مکرر آن‌ها را در برنچ اصلی ادغام می‌کنند. هر تغییر باعث شروع فرایند ساخت (build) می‌شود که شامل اجرای تست‌ها (unit tests) نیز هست. اگر هر بخشی از این فرایند شکست بخورد، توسعه‌دهندگان فوراً آن را برطرف می‌کنند.

 

Shift Left Security

به موجز ترین شکل ممکن، تحویل مستمر (CD)، یعنی مجموعه‌ای از توانمندی‌ها (capabilities) که این امکان را فراهم می‌کنند که در کمترین زمان ممکن، تغییرات را (از هر نوعی) عملیاتی کنیم یا به عبارت دیگر به دست کاربرنهایی برسانیم.

حیف باشد که وبسایت به نام تحویل مستمر باشد و بخواهیم به همین تعریف مختصر از آن بسنده کنیم. به همین دلیل پیشنهاد میکنم برای درک درست تحویل مستمر (CD) به مقاله‌ی مرتبط به آن مراجع کنید.

تحویل مستمر (Continuous Delivery) چیست؟

?

هوش مصنوعی نه تنها سبک زندگی عوام مردم را تحت تاثیر قرار داده است، بلکه در سال‌های اخیر با معرفی LLMها، تاثیر شگرفی در تولید نرم‌افزار داشته است. گزارش ۲۰۲۴ در DORA به شکل مفصلی در خصوص تاثیر هوش‌مصنوعی در روند توسعه‌ی نرم‌افزار است.

آمار هوش مصنوعی

اُپن‌سورس به معنای مجانی نیست!

در خلاف ظاهر ماجرا، محصولات اُپن‌سورس «رایگان» نیستند، و مشمول هزینه‌های پنهانی می‌شوند که سازمان در طول زمان مجبور به پرداخت آن است. برای راه‌اندازی و نگهداریِ محصولات اُپن‌سورس زمان زیادی صرف می‌شود (در نسبت با محصولات تجاری) و نیازمند نیروی گران متخصص هستند. علی‌رغم این‌ها، هزینه‌ی تعمیر و بهبود خرابی‌ موقت این ابزارها ممکن است بیش از هزینه‌ی خرید ابزار تجاری بشود، که در صورت خرابی توسط شرکت ارائه دهنده اصلاح می‌شوند.

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

This is a staging environment