نویسنده: علی محمدی (کارشناس دیجیتال مارکتینگ)
آخرین بروزرسانی: ۲۸ شهریور ۱۴۰۵
برنامهنویسی که ماژول پرداخت را نوشته بود از شرکت رفته است. حالا باید یک درگاه جدید اضافه شود و هیچکس نمیداند چرا ساختار فعلی این شکلی است، کدام بخش را میشود تغییر داد و کدام بخش به سرویس دیگری وابسته است. تیم دو راه دارد: یا هفتهها وقت بگذارد و کد را مهندسی معکوس کند، یا با حدس جلو برود و ریسک خطا را بپذیرد. این هزینهی نبود مستندسازی نرمافزار است.
در این راهنما به سه پرسش پاسخ میدهیم: مستندسازی نرمافزار چیست، چه انواعی دارد و چطور باید انجامش داد تا چند ماه بعد از کد عقب نیفتد و بیاعتبار نشود. این مقاله نقطهی شروع مجموعه مقالات مستندسازی باسینرژی است. هر بخش خلاصهای از یک موضوع است و برای جزئیات بیشتر، به مقالهی تخصصی همان موضوع لینک دادهایم.
مستندسازی یعنی ثبت ساختارمند اطلاعات، تصمیمها و روشهای انجام کار، به شکلی که دیگران بدون حضور نویسنده بتوانند آن را بفهمند و به کار ببرند.
این مفهوم در حوزههای مختلفی کاربرد دارد، از مستندسازی فرایندهای سازمانی و تجربیات مدیران تا مستندسازی سیستمهای مدیریت کیفیت. وجه مشترک همهی آنها یکی است: دانش از ذهن افراد بیرون میآید و به منبعی قابلارجاع تبدیل میشود. در ادامهی این مقاله تمرکز ما روی مستندسازی در توسعهی نرمافزار است؛ حوزهای که محصولش مدام تغییر میکند و به همین دلیل مستندسازی در آن سختتر و حیاتیتر است.
مستندسازی نرمافزار یعنی ثبت ساختارمند نیازمندیها، تصمیمهای طراحی، رفتار کد و روش استفاده از یک نرمافزار، بهگونهای که تیم و کاربران بدون پرسیدن از سازندگان آن را بفهمند.
هر سند نرمافزاری در نهایت به یکی از سه پرسش پاسخ میدهد: چه چیزی ساخته شده، چرا به این شکل ساخته شده و چطور باید از آن استفاده یا نگهداری کرد. سندی که به هیچکدام از این سه پرسش پاسخ ندهد، فقط حجم اضافه است.
مستندسازی نرمافزار حوزهای استاندارد و تعریفشده است. برای نمونه، مجموعه استانداردهای ISO/IEC/IEEE 26511 تا 26515 چارچوب تولید «اطلاعات برای کاربران» نرمافزار را تعریف میکنند؛ از مدیریت فرایند مستندسازی گرفته تا تولید مستندات در تیمهای چابک.
در یک پروژهی واقعی، مستندسازی چند لایهی همزمان دارد:
کامنتگذاری بخشی از مستندسازی است، نه معادل آن. کامنت داخل کد توضیح میدهد یک بخش مشخص از کد چه میکند. مستندسازی به پرسشهای بزرگتری جواب میدهد: این ماژول چرا وجود دارد، چه تصمیم معماری پشت آن است، چه محدودیتهایی دارد و چه چیزی را نباید بدون هماهنگی تغییر داد.
راهنمای کاربر (User Manual) هم فقط یکی از انواع مستندسازی است و به لایهای مربوط است که رو به کاربر نهایی قرار دارد. زیر این لایه، لایههای فنیتری هست که بدون آنها نوشتن یک راهنمای کاربر دقیق هم ممکن نیست.
اگر میخواهید ببینید تیمهای نرمافزاری شناختهشدهی دنیا مستندسازی را چطور میبینند، مقالهی [Documentation چیست؟ چرا تیمهای موفق دنیا آن را جدی میگیرند] را بخوانید.
پاسخ کوتاه به پرسش چرا مستندسازی: چون تیمی که مستند ندارد، هزینهاش را هر روز میپردازد. این هزینه در هیچ گزارشی ثبت نمیشود، اما به شکل وقتی که صرف پرسیدن، حدس زدن و دوبارهکاری میشود، واقعی است. سه دلیل اصلی را در ادامه میبینید. تحلیل کاملتر را در مقالهی [چرا مستندسازی نرمافزار برای هر تیم توسعه ضروری است] آوردهایم.
دانش پروژه در ذهن افراد حبس نمیماند
بزرگترین ریسک یک تیم نرمافزاری این است که دانش پروژه فقط در ذهن دو یا سه نفر باشد. اگر این افراد بروند یا حتی چند هفته در دسترس نباشند، سرعت پروژه بهشدت افت میکند.
مطالعهی مؤسسهی جهانی مککنزی در سال ۲۰۱۲ برآورد کرد که کارکنانی که کارشان به دانش و تعامل وابسته است، حدود ۱۹ درصد زمان کاریشان را صرف پیدا کردن و جمعآوری اطلاعات میکنند. این عدد مخصوص تیمهای نرمافزاری نیست، اما نشان میدهد پیدا کردن اطلاعات چه سهم بزرگی از کار دانشی را میگیرد. در تیمی که مستند ندارد، بخش بزرگی از این جستوجو یعنی پرسیدن از همکار و قطع کردن تمرکز او.
سناریوی ترک یک عضو کلیدی تیم را در مقالهی [اگر برنامهنویس پروژه شما را ترک کند چه اتفاقی میافتد؟] بررسی کردهایم.
خطا و دوبارهکاری کمتر میشود
گزارش Pulse of the Profession مؤسسهی مدیریت پروژه (PMI) در سال ۲۰۱۴، که بر پایهی نظرسنجی از بیش از ۲۰۰۰ متخصص تهیه شده، نشان داد نزدیک به نیمی از پروژههای ناموفق به دلیل مدیریت نادرست نیازمندیها به اهدافشان نرسیدهاند. مستندسازی نیازمندیها اولین حلقهی همین مدیریت است.
همین مشکل در سطح فنی هم تکرار میشود. وقتی قرارداد مشترکی بین تیمها ثبت نشده باشد، تیم فرانتاند فرض میکند API فیلد خاصی را برمیگرداند و تیم بکاند فرض دیگری دارد. نتیجه این است که اختلاف دیر کشف میشود؛ در محیط آزمایشی (Staging) یا بدتر، روی نسخهی اصلی (Production).
تصمیمها قابلبازبینی میشوند
وقتی تصمیمهای فنی همراه با دلیلشان ثبت شوند، تیم بعدی مجبور نیست همان بحثها را از صفر تکرار کند. اگر هم زمانی لازم شد تصمیمی عوض شود، مشخص است آن تصمیم بر چه فرضهایی بنا شده و آیا آن فرضها هنوز برقرارند یا نه.
اهمیت این موضوع در تیمهای کوچک، که هر نفر چند نقش دارد، بیشتر هم هست. در مقالهی [اهمیت مستندسازی در پروژههای نرمافزاری کوچک و متوسط] به آن پرداختهایم.
مستندسازی برای هر نقش معنای متفاوتی دارد و هر نقش هم دلیل متفاوتی برای جدی گرفتنش.
کارفرما: مستندات یعنی مالکیت واقعی پروژه
اگر کارفرمای غیرفنی یک پروژهی نرمافزاری هستید، کد بهتنهایی مالکیت کامل پروژه را به شما نمیدهد. بدون مستندات، دانش پروژه در اختیار تیم یا پیمانکاری میماند که آن را ساخته، و شما برای هر تغییری به او وابستهاید. به همین دلیل، تحویل مستندات باید یکی از شرایط اصلی تحویل پروژه باشد، نه یک بند فرعی در قرارداد.
مقاومت برنامهنویسان در برابر مستندسازی معمولاً به تنبلی نسبت داده میشود، اما دلیل منطقیتری هم وجود دارد. بسیاری از برنامهنویسان سندهایی را دیدهاند که چند ماه بعد از نوشته شدن، دیگر با کد همخوانی نداشتهاند. سندی که قرار است بیاعتبار شود، از نگاه آنها ارزش وقت گذاشتن ندارد.
پاسخ این مقاومت توصیه و فرهنگسازی صرف نیست. پاسخ درست، انتخاب روشی است که بهروز نگه داشتن سند را ارزان کند؛ همان روشهایی که در بخش «روشهای مستندسازی» توضیح دادهایم.
مقالههای مرتبط:
از نگاه مدیریت، مستندات بخشی از دارایی فنی شرکت است. این دارایی ارزش دارد چون وابستگی به افراد را کم میکند، ورود نیروی جدید را سریعتر میکند و شفافیت پیشرفت پروژه را بالا میبرد.
اما این دارایی فقط وقتی ارزش دارد که بهروز باشد. برای همین هر سند باید مالک مشخص داشته باشد و بهروزرسانی سند باید جزئی از تعریف «انجام شدن کار» باشد.
مقالههای مرتبط:
انواع مستندسازی نرمافزار را معمولاً در دو دستهی کلان تقسیم میکنند:
جدول زیر هشت نوع اصلی را در یک نگاه نشان میدهد. در ادامه هر کدام را جداگانه توضیح میدهیم.
این سند در فاز اول پروژه تولید میشود و به این پرسش پاسخ میدهد که «چه چیزی باید ساخته شود». سند نیازمندیهای نرمافزار یا SRS (Software Requirements Specification) سه بخش اصلی دارد:
در تیمهای چابک، این لایه اغلب به شکل بکلاگ و داستانهای کاربری (User Story) نوشته میشود. هدف هر دو شکل یکی است: تیم باید بداند دقیقاً چه چیزی را میسازد، نه آنچه «فکر میکند» کارفرما میخواهد.
بعد از تحلیل نیازمندیها، تیم فنی تصمیم میگیرد آنها را چطور پیاده کند: با چه فناوری، چه معماری و چه الگوی طراحی. این تصمیمها در دیاگرامهای معماری و سندهای ADR (Architecture Decision Record) ثبت میشوند.
ADR فقط تصمیم نهایی را ثبت نمیکند؛ زمینهی تصمیم، گزینههای ردشده و پیامدهای آن را هم مینویسد. یک ADR ساده این شکلی است:
عنوان: استفاده از PostgreSQL بهجای MongoDB برای سرویس سفارشها
وضعیت: پذیرفتهشده
زمینه: دادههای سفارش رابطهایاند و تراکنشهای چندجدولی لازم دارند.
تصمیم: PostgreSQL انتخاب شد.
گزینههای ردشده: MongoDB (پشتیبانی ضعیفتر از تراکنش چندسندی در نسخهی مورد استفادهی تیم)
پیامدها: گزارشگیری سادهتر؛ تغییر ساختار داده نیازمند Migration است.
این لایه را خود برنامهنویس همزمان با نوشتن کد تولید میکند و شامل Docstringها، کامنتهای توضیحی و فایل README است.
یک قاعدهی کاربردی برای این لایه: کد خودش میگوید چه کاری انجام میدهد، پس کامنت باید بگوید چرا اینطور نوشته شده و اگر کسی خواست تغییرش دهد، مراقب چه چیزهایی باشد.
مستندسازی API برای هر سیستمی که از چند سرویس تشکیل شده یا API عمومی دارد، حیاتی است. بدون آن، تیمهای مصرفکننده باید از روی کد یا با آزمون و خطا بفهمند هر سرویس چه ورودیای میگیرد و چه خروجیای برمیگرداند.
استاندارد رایج برای این کار OpenAPI است که نسخههای قدیمیترش با نام Swagger شناخته میشدند. OpenAPI مسیرها، ورودیها، خروجیها، خطاها و روش احراز هویت را در قالبی ماشینخوان توصیف میکند. ابزارهایی مثل Swagger UI، Redoc و Postman از روی همین توصیف، مستندات تعاملی میسازند.
یک مستند API کامل، علاوه بر مسیر و متد، این موارد را هم دارد:
ابزارها و روشهای این حوزه را در مقالهی [مستندسازی API: بهترین ابزارها و روشها (Swagger، Postman)] مقایسه کردهایم.
این دسته شامل برنامهی تست (Test Plan)، موارد تست (Test Case)، گزارش باگ و گزارشهای تست اکتشافی است. این مستندات دو کاربرد دارند:
راهنمای کاربری، پرسشهای متداول، ویدیوهای آموزشی و راهنماهای درون محصول (Tooltip) در این دسته قرار میگیرند. این تنها لایهای است که کاربر نهایی مستقیماً میبیند، و اغلب معیار قضاوت او دربارهی کیفیت کل محصول است.
در این لایه، مستندسازی تصویری کاربرد زیادی دارد؛ مثل اسکرینشاتهای حاشیهنویسیشده و ویدیوهای کوتاه. دلیلش این است که کاربر معمولاً دنبال انجام یک کار مشخص است، نه خواندن یک متن طولانی.
بعد از انتشار، تیم عملیات و پشتیبانی به سندهایی نیاز دارد که در شرایط بحرانی به کارش بیاید. برای مثال:
به این سندها Runbook میگویند. Runbook باید به شکل گامبهگام و قابلاجرا نوشته شود، چون کسی که آن را میخواند زیر فشار زمان است و فرصت تحلیل ندارد.
برنامهی اسپرینت، صورتجلسهها و مصوبات، گزارش پیشرفت و نمودار Burndown نشان میدهند پروژه چطور پیش رفته و چه تصمیمهایی در مسیر گرفته شده است. این دسته برای کارفرما و مدیر پروژه اهمیت ویژهای دارد، چون شفافیت پیشرفت کار را بر اساس داده نشان میدهد، نه بر اساس گزارش شفاهی.
انواع مستند را دیدیم. پرسش بعدی این است که این مستندات را چطور تولید و بهروز نگه داریم. در ادامه چهار رویکرد اصلی را بهطور خلاصه مرور میکنیم. مقایسهی کامل را در مقالهی [روشهای مستندسازی نرمافزار: از رویکرد سنتی تا مستندسازی زنده] بخوانید.
در این روش، مستندسازی یک فاز جداگانه است که پیش یا پس از توسعه انجام میشود. مشکل اصلی این رویکرد این است که سندهای ابتدای پروژه تا زمان تحویل از کد فاصله میگیرند و معمولاً کسی آنها را بهروز نمیکند.
مانیفست چابک «نرمافزار کارآمد» را بر «مستندات جامع» مقدم میداند. اما همان مانیفست تصریح میکند که مستندات هم ارزش دارند؛ فقط اولویتشان پایینتر است. برداشت درست از این اصل «مستند نداشتن» نیست، بلکه مستندسازی کوتاه، هدفمند و همگام با هر اسپرینت است.
راه عملی این رویکرد این است که بهروزرسانی سند مرتبط، جزئی از «تعریف انجامشده» (Definition of Done) هر کار باشد. یعنی کاری که سندش بهروز نشده، هنوز «انجامشده» حساب نمیشود.
در این رویکرد، مستندات با همان ابزارهای کد نوشته و نگهداری میشوند:
مزیت این روش این است که تغییر سند هم مثل تغییر کد قابلردیابی و قابلبازبینی است.
مستندسازی زنده رویکردی است که سیریل مارترِر (Cyrille Martraire) در کتابی به همین نام آن را صورتبندی کرده است. ایدهی اصلی این است که هر جا ممکن باشد، سند از منبع اصلی حقیقت تولید شود؛ یعنی از کد، تستها یا فایلهای توصیف. به این ترتیب سند همیشه با رفتار واقعی سیستم همخوان میماند. چند نمونه:
مستندسازی زنده به این معنا نیست که همهچیز خودکار شود. دلیل تصمیمهای معماری، راهنمای کاربر و زمینهی کسبوکار را همچنان انسان باید بنویسد. تقسیم درست کار این است:
ابزارهای مستندسازی را میتوان در پنج گروه دستهبندی کرد:
باسینرژی در گروه آخر قرار میگیرد. در باسینرژی:
به این ترتیب، مشخص است هر سند به کدام بخش از کار تیم مربوط است.
برای مقایسهی دقیق ابزارها این مقالهها را ببینید:
مدلهای زبانی در چند کار مستندسازی سرعت را بالا میبرند: نوشتن پیشنویس، تولید Docstring، خلاصه کردن تغییرات و ترجمهی مستندات. اما دو محدودیت جدی دارند:
همچنین تصمیم دربارهی اینکه «چه چیزی ارزش مستند شدن دارد» همچنان به قضاوت انسانی نیاز دارد.
یک سند فنی کارآمد، از هر نوعی که باشد، این ویژگیها را دارد:
اگر تیم شما تا امروز مستندسازی جدی نداشته، نقطهی شروع به نوع پروژه و نقش شما بستگی دارد:
مستندسازی نرمافزار یعنی ثبت ساختارمند نیازمندیها، تصمیمهای طراحی، رفتار کد و روش استفاده از نرمافزار، بهگونهای که تیم و کاربران بدون پرسیدن از سازندگان بتوانند آن را بفهمند، استفاده کنند و توسعه دهند.
هشت نوع اصلی عبارتاند از: نیازمندیها، معماری و طراحی، کد و README، API، تست، کاربر نهایی، نگهداری و عملیات، و فرایند پروژه. هفت نوع اول در دستهی مستندات محصول قرار میگیرند و نوع آخر در دستهی مستندات فرایند.
به پروژهی شما بستگی دارد. اگر API دارید، از مستندسازی API شروع کنید. اگر API ندارید، از README و ثبت تصمیمهای کلیدی معماری. در هر دو حالت، بهروزرسانی سند را جزئی از تعریف انجامشدهی هر کار کنید.
هر لایه مالک خودش را دارد:
مسئولیت نهایی بهروز ماندن مستندات با مدیر فنی است.
عدد استاندارد و پذیرفتهشدهای برای این پرسش وجود ندارد و به نوع پروژه بستگی دارد. معیار بهتر از درصد زمان، این است که بپرسید: آیا یک عضو جدید تیم میتواند بدون پرسیدن از دیگران، سرویس یا بخشی را که مسئولش است بفهمد؟ اگر پاسخ منفی است، مستندات کافی نیست.
مستندات فنی برای توسعهدهنده و مسئول نگهداری نوشته میشود و توضیح میدهد سیستم چطور کار میکند. مستندات کاربر برای کاربر نهایی است و توضیح میدهد چطور از سیستم استفاده کند. زبان، عمق و نوع مثالهای این دو کاملاً متفاوت است.
یعنی سند تا جای ممکن از منبع اصلی تولید شود، مثل کد، تستها یا فایل OpenAPI، تا همیشه با رفتار واقعی سیستم همخوان بماند. بخشهایی که به «چرا» پاسخ میدهند همچنان توسط انسان نوشته میشوند.
نه بهطور کامل. هوش مصنوعی در نوشتن پیشنویس، تولید Docstring و خلاصهسازی کمک جدی میکند. اما تشخیص اینکه چه چیزی باید مستند شود و بررسی درستی محتوا همچنان به داوری انسانی نیاز دارد.
بله، اما نه به همهی انواع آن. برای پروژهی کوچک، یک README کامل، مستندات API (اگر API دارید) و چند ADR برای تصمیمهای کلیدی کافی است. همین حداقل، پروژه را از وابستگی کامل به یک نفر نجات میدهد.
در یک مرجع واحد و قابلجستوجو که همهی تیم به آن دسترسی داشته باشند. این مرجع میتواند مخزن Git (در رویکرد Docs as Code)، یک ویکی یا پلتفرمی باشد که مستندات را به کار تیم متصل میکند. آنچه باید از آن پرهیز کرد، پراکندگی مستندات بین چند ابزار است.
مستندسازی نرمافزار سرمایهگذاری روی حافظهی پروژه است، نه یک کار جانبی. هر کدام از هشت نوع اصلی آن، از نیازمندیها تا Runbook، مخاطب و زمان مشخص خودش را دارد.
کلید موفقیت تولید کامل همهی انواع مستند نیست. کلید موفقیت این است که متناسب با مرحلهی پروژه، مستندات ضروری را انتخاب کنید و روشی را به کار بگیرید که بهروز ماندن آنها را ارزان کند؛ یعنی:
اگر میخواهید مستندات API و صفحات محصولتان بهجای فایلهای پراکنده، کنار داستانهای کاربری و تسکهای تیم ثبت شوند، با [پلن رایگان باسینرژی] شروع کنید. این پلن برای همیشه رایگان است، کارت بانکی نمیخواهد و مستندسازی API و مستندات متنی نامحدود دارد.