ویرگول
ورودثبت نام
حسین حسن نژاد
حسین حسن نژادSoftware Engineer (Django/Python | Flutter/Dart)
حسین حسن نژاد
حسین حسن نژاد
خواندن ۶ دقیقه·۹ ساعت پیش

مهندسی نرم‌افزار به اندازه کافی برای فریلنسرها

مهندسی نرم‌افزار به اندازه کافی برای فریلنسرها
مهندسی نرم‌افزار به اندازه کافی برای فریلنسرها

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

اما مشکل معمولا چند هفته بعد خودش را نشان می‌دهد:

  • مشتری چیزهایی می‌خواهد که از اول توافق نشده بود.

  • محدوده پروژه مشخص نیست.

  • فیچرها مدام تغییر می‌کنند.

  • طراحی دیتابیس به‌هم می‌ریزد.

  • زمان و هزینه از کنترل خارج می‌شود.

  • پروژه‌ای که ساده به نظر می‌رسید، تبدیل به یک فرسایش طولانی می‌شود.

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

قبل از اینکه کد بزنیم، بدانیم دقیقا چه چیزی می‌سازیم، برای چه کسی می‌سازیم، چرا می‌سازیم و نسخه اول باید شامل چه چیزهایی باشد. این همان چیزی است که می‌توان آن را مهندسی نرم‌افزار به اندازه کافی نامید.


نقشه راه کلی

مسیر پیشنهادی برای یک فریلنسر یا تیم کوچک
مسیر پیشنهادی برای یک فریلنسر یا تیم کوچک

در این مقاله تمرکز اصلی روی بخش‌های قبل از کدنویسی است؛ چون همان‌جا جایی است که بیشتر پروژه‌ها یا درست پایه‌گذاری می‌شوند یا از همان ابتدا مسیر اشتباه را می‌روند.


۱. قبل از هر چیز، مسئله را بفهمید

اولین قدم، انتخاب فریم‌ورک، طراحی دیتابیس یا تخمین قیمت نیست. اولین قدم این است که بفهمید مسئله چیست. خیلی وقت‌ها مشتری به جای مسئله، راه‌حل پیشنهادی خودش را بیان می‌کند. مثلا می‌گوید:

یک سایت شبیه دیوار می‌خواهم.

اما این جمله هنوز نیازمندی نیست. باید بفهمیم دقیقا چرا چنین چیزی می‌خواهد.

سؤال‌های مهم این مرحله:

  • پروژه قرار است چه مشکلی را حل کند؟

  • کاربران اصلی چه کسانی هستند؟

  • الان این مشکل چطور حل می‌شود؟

  • چرا راه‌حل فعلی کافی نیست؟

  • مشتری از نسخه اول چه انتظاری دارد؟

  • موفقیت پروژه یعنی چه؟


۲. از Lean Canvas یا نسخه سبک‌تر آن استفاده کنید

بعد از فهم اولیه مسئله، باید تصویر کسب‌وکاری پروژه را شفاف‌تر کرد. برای این کار Lean Canvas ابزار خوبی است؛ مخصوصا برای پروژه‌های محصولی، مارکت‌پلیس، اپلیکیشن‌های خدماتی و ایده‌هایی که قرار است رشد کنند. اما برای همه پروژه‌های فریلنسری لازم نیست Lean Canvas را خیلی رسمی و کامل پر کنیم. گاهی یک نسخه سبک‌تر، کاربردی‌تر است.

این چند سؤال ساده می‌توانند جلوی بسیاری از سوءتفاهم‌ها را بگیرند:

Mini Canvas برای فریلنسرها
Mini Canvas برای فریلنسرها

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

کاربران بتوانند آگهی ثبت کنند و دیگران بتوانند آن آگهی‌ها را جستجو و مشاهده کنند.

همین شفاف‌سازی، پروژه را از یک غول مبهم به یک نسخه قابل ساخت تبدیل می‌کند.


۳. Scope و MVP را دقیق مشخص کنید

بعد از فهم مسئله و تصویر کلی محصول، باید محدوده پروژه مشخص شود. در پروژه‌های فریلنسری، Scope حیاتی است. چون اگر محدوده شفاف نباشد، پروژه به مرور بزرگ‌تر می‌شود، بدون اینکه زمان و هزینه آن درست مدیریت شود.

Scope یعنی چه؟

یعنی مشخص کنیم پروژه شامل چه چیزهایی هست و چه چیزهایی نیست. برای مثال، در نسخه اول یک سیستم ثبت آگهی:

in-scope and out-of-scope
in-scope and out-of-scope

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

MVP چیست؟

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


۴. نیازمندی‌ها را مهندسی کنید، نه فقط یادداشت

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

  • نقش‌های کاربری

  • قابلیت‌های اصلی

  • قوانین کسب‌وکار

  • محدودیت‌ها

  • حالت‌های خطا

  • معیار پذیرش هر قابلیت

مثلا برای قابلیت ثبت آگهی:

به عنوان کاربر،

می‌خواهم بتوانم یک آگهی ثبت کنم،

تا محصول یا خدمت خود را به دیگران نمایش دهم.

معیار پذیرش:

- عنوان آگهی اجباری است.

- دسته‌بندی اجباری است.

- شهر اجباری است.

- شماره تماس باید معتبر باشد.

- تصویر آگهی اختیاری/اجباری است.

- آگهی قبل از تأیید مدیر منتشر نمی‌شود.


۵. نیازمندی‌های غیرعملکردی را فراموش نکنید

نیازمندی‌های غیرعملکردی مشخص می‌کنند سیستم با چه کیفیتی باید کار کند. مثلا:

  • سیستم چقدر سریع باشد؟

  • چند کاربر همزمان را پشتیبانی کند؟

  • اطلاعات کاربران چطور محافظت شود؟

  • بکاپ چگونه گرفته شود؟

  • اگر خطا رخ داد، چطور متوجه شویم؟

  • سطح دسترسی کاربران چگونه کنترل شود؟

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


۶. قبل از کدنویسی، System Design انجام دهید

System Design یعنی قبل از پیاده‌سازی، تصمیم بگیریم سیستم از چه بخش‌هایی تشکیل می‌شود و این بخش‌ها چطور با هم کار می‌کنند. برای تیم‌های کوچک، System Design نباید پیچیده و سنگین باشد. اما حذف کردن آن اشتباه بزرگی است.

حداقل خروجی‌های این مرحله می‌تواند شامل این موارد باشد.
حداقل خروجی‌های این مرحله می‌تواند شامل این موارد باشد.

معماری ساده اما قابل رشد

در بسیاری از پروژه‌های کوچک و متوسط، انتخاب Modular Monolith بهتر است. یعنی پروژه یکپارچه است، اما داخل آن ماژول‌ها تمیز و جدا طراحی می‌شوند.

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

برای بیشتر پروژه‌های فریلنسری، شروع با Microservice انتخاب خوبی نیست. Microservice پیچیدگی زیادی دارد: دیپلوی جداگانه، مانیتورینگ، ارتباط بین سرویس‌ها، مدیریت خطا، دیتابیس‌های جدا و هزینه عملیاتی بیشتر.


۷. بعد از طراحی، تازه کدنویسی شروع می‌شود

نیازمندی‌ها و طراحی کلی مشخص شدند، کدنویسی مفهومی و هدفمند میشود و در این مرحله باید چند اصل ساده را رعایت کرد، از جمله استفاده حتمی از سیستم کنترل نسخه Git و چیدن ساختاری تمیز برای پروژه، همچنین نباید به صرف کارکرد کد اکتفا کرد و باید به اصول کدنویسی تمیز پایبند بود، مانند جدا کردن منطق کسب‌وکار، مدیریت صحیح خطاها و استفاده از محیط‌های جداگانه برای توسعه (development) و تولید (production) که این کار خود مانع از بروز بسیاری از بحران‌ها خواهد شد.


۸. تست، دیپلوی و نگهداری را سبک اما جدی بگیرید

اکثر پروژه ها بر زمان تأکید دارند که متأسفانه اولین چیزی که قربانی میشود بخش تست است، اما نباید این مراحل را حذف کنید و باید حداقل برای امور اصلی پروژه تست های حداقلی داشته باشید، مثلاً برای ثبت نام، ورود و سطوح دسترسی کاربران که واقعاً مهم هستند و به همریختن آنها بعدها میتواند بحران های جدی ایجاد کند، و از همه مهمتر سناریوهای پرداخت اگر در پروژه وجود دارند یا فرم های حساسی که ممکن است پروژه شامل آنها باشد، در حالی که بسیاری از این تست ها را حتی میتوان یکبار نوشت و با حداقل تغییرات در همهٔ پروژه ها استفاده کرد؛

همچنین باید از ابتدای پروژه تعیین شود که پروژه کجا مستقر (deploy) میشود، بکاپ ها چگونه گرفته شوند، لاگ های سیستم کجا ذخیره گردند و در صورت رخداد خطا از کجا و چگونه متوجه قضیه شویم،

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


جمع‌بندی

مهندسی نرم‌افزار برای فریلنسرها به معنای فرآیندهای سنگین، سندهای طولانی و جلسات بی پایان نیست، بلکه یعنی پروژه را پیش از کدنویسی شفاف کنیم و برای بیشتر پروژه های فریلنسری، رعایت همین مسیر کافی است که با فهم مسئله شروع میشود، سپس به Mini Canvas میرسیم، بعد از آن Scope و MVP را مشخص میکنیم، نیازمندی ها را استخراج کرده، System Design را انجام می دهیم و در نهایت به کدنویسی، تست، دیپلوی و نگهداری میرسیم؛ در این میان فریلنسر حرفه ای فقط کسی نیست که خوب کد میزند، بلکه کسی است که میتواند پروژه را از یک ایده مبهم به یک محصول قابل تحویل، قابل نگهداری و قابل توسعه تبدیل کند و اصل ماجرا ساده است که پیش از اینکه سریع کد بزنید، کمی درست فکر کنید، چون همین مقدار از مهندسی نرم‌افزار برای بسیاری از پروژه ها کافی است.

مهندسی نرم‌افزاربرنامه نویسیکد نویسیفریلنسرنرم افزار
۰
۰
حسین حسن نژاد
حسین حسن نژاد
Software Engineer (Django/Python | Flutter/Dart)
شاید از این پست‌ها خوشتان بیاید