ویرگول
ورودثبت نام
میر مجتبی هاشمی جنتی
میر مجتبی هاشمی جنتیدانش آموخته مهندسی نرم افزار | فعال در صنعت | یک برنامه نویس ساده
میر مجتبی هاشمی جنتی
میر مجتبی هاشمی جنتی
خواندن ۱۱ دقیقه·۳ روز پیش

سند ADR چیست و چرا برای معماران و تحلیلگران داده حیاتی است؟

سلام. امیدوارم حالتون خوب باشه. امروز در مورد اسناد ADR باهم صحبت میکنیم. در بسیاری از شرکت‌های مهندسی نرم‌افزار، مخصوصاً در تیم‌هایی که با سرعت بالا محصول می‌سازند، تصمیم‌های فنی مهمی روزانه گرفته می‌شوند؛ تصمیم‌هایی که اثر آن‌ها فقط در لحظه‌ی طراحی یا پیاده‌سازی دیده نمی‌شود، بلکه ماه‌ها و حتی سال‌ها بعد در مقیاس‌پذیری، نگه‌داری، توسعه‌پذیری، کیفیت داده، هزینه‌ی زیرساخت و سرعت تحویل محصول خود را نشان می‌دهند. یکی از مهم‌ترین ابزارهایی که به تیم‌های فنی کمک می‌کند این تصمیم‌ها را شفاف، مستند و قابل‌ردیابی نگه دارند، ADR یا Architecture Decision Record است.

ADR در ساده‌ترین تعریف، یک سند کوتاه اما ساختارمند برای ثبت تصمیم‌های معماری و فنی مهم است؛ تصمیم‌هایی که باید مشخص باشد چه چیزی تصمیم گرفته شد، چرا این تصمیم گرفته شد، چه گزینه‌هایی بررسی شد، چه پیامدهایی دارد، و چه کسی/چه زمانی آن را تأیید کرده است. این سند در ظاهر ساده است، اما در عمل یکی از مؤثرترین ابزارهای مدیریت دانش فنی در سازمان‌های نرم‌افزاری محسوب می‌شود.

ADR فقط یک سند نیست؛ یک «سیستم تصمیم‌گیری» است

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

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

در واقع ADR پاسخ می‌دهد به این سؤال کلیدی:

«چرا این راه را انتخاب کردیم و چرا راه‌های دیگر را انتخاب نکردیم؟»

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

ADR برای چه کسانی است؟

اگرچه ADR در بسیاری از تیم‌ها توسط معمار نرم‌افزار نوشته می‌شود، اما مخاطب آن محدود به معمار نیست. این سند برای طیف وسیعی از نقش‌ها در شرکت‌های مهندسی نرم‌افزار مفید است:

  • معمار نرم‌افزار برای ثبت انتخاب‌های کلان معماری

  • تحلیلگر داده برای مستندسازی تصمیم‌های مربوط به مدل داده، خط لوله داده، کیفیت داده و ذخیره‌سازی

  • توسعه‌دهنده ارشد برای ثبت تصمیم‌های فنی مؤثر بر کدنویسی و ساختار سرویس‌ها

  • DevOps / SRE برای تصمیم‌های مرتبط با استقرار، زیرساخت و پایش

  • Product Engineer برای تصمیم‌هایی که میان نیاز محصول و محدودیت فنی تعادل ایجاد می‌کنند

  • مدیر فنی برای بازبینی و ردیابی مسیر تصمیم‌ها در طول زمان

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

نمونه ADR تولید شده با ابزار adr-tools
نمونه ADR تولید شده با ابزار adr-tools

چرا ADR در شرکت‌های مهندسی نرم‌افزار اهمیت دارد؟

اهمیت ADR را می‌توان از چند زاویه بررسی کرد. نخست اینکه ADR باعث کاهش حافظه‌ی شفاهی سازمان می‌شود. در بسیاری از شرکت‌ها، تصمیم‌ها در ذهن چند نفر کلیدی متمرکز است. این وضعیت در کوتاه‌مدت شاید کارآمد به نظر برسد، اما در بلندمدت خطرناک است. چون سازمان به جای تکیه بر دانش مکتوب، به افراد خاص وابسته می‌شود.

دوم اینکه ADR به شفافیت تصمیم‌ها کمک می‌کند. وقتی تصمیم‌ها ثبت شوند، امکان بازبینی و نقد فنی آن‌ها وجود دارد. تیم‌ها می‌توانند ببینند که آیا تصمیم بر اساس داده، محدودیت، هزینه و اولویت درست گرفته شده یا نه. این شفافیت، سطح بلوغ مهندسی سازمان را بالا می‌برد.

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

چهارم اینکه ADR برای آینده‌پژوهی فنی بسیار ارزشمند است. وقتی بعداً بخواهید دلیل استفاده از یک دیتابیس، یک الگوی معماری، یک ابزار ETL (ETL از سه واژه، استخراج (Extract)، تبدیل (Transform) و بارگذاری (Load) برگرفته شده است و فرآیند یکپارچه سازی داد‌ه‌ها (Data Integration) محسوب می‌شود) یا یک روش پیاده‌سازی را بررسی کنید، ADR به شما نشان می‌دهد که آن تصمیم در چه شرایطی گرفته شده و چه قیودی وجود داشته است.

ADR چه چیزهایی را ثبت می‌کند؟

یک ADR خوب معمولاً این اجزا را دارد:

  1. عنوان تصمیم

  2. تاریخ

  3. وضعیت تصمیممثل: پیشنهادی، پذیرفته‌شده، ردشده، منسوخ‌شده

  4. زمینه یا Contextمسئله چه بوده؟ چه نیازی وجود داشته؟

  5. تصمیم

  6. گزینه‌های بررسی‌شده

  7. مقایسه گزینه‌ها

  8. دلایل انتخاب

  9. پیامدها و عوارض

  10. نقاط ریسک

  11. مراحل اجرا

  12. ارجاعات و لینک‌ها

نکته مهم این است که ADR نباید صرفاً خروجی نهایی را بگوید؛ بلکه باید مسیر فکری تصمیم را نشان دهد. اگر ADR فقط یک جمله‌ی «ما PostgreSQL را انتخاب کردیم» باشد، هنوز ADR کامل نیست. ارزش ADR در آن است که توضیح دهد چرا PostgreSQL و چرا نه گزینه‌های دیگر.

تفاوت ADR با مستندات عمومی چیست؟

ADR با مستندات مرسوم تفاوت مهمی دارد. مستندات عمومی معمولاً توصیفی‌اند؛ یعنی توضیح می‌دهند سیستم چه‌طور کار می‌کند. اما ADR تصمیم‌محور است؛ یعنی توضیح می‌دهد چه تصمیمی گرفته شد و چرا.

برای مثال، یک سند معماری ممکن است جریان سرویس‌ها، دیاگرام‌ها و اجزای سیستم را توصیف کند. اما ADR می‌گوید چرا ارتباط بین سرویس‌ها رویدادمحور شد، چرا معماری مونو‌لیت به میکروسرویس تغییر کرد، چرا برای گزارش‌گیری از Warehouse جداگانه استفاده شد، یا چرا مدل ذخیره‌سازی داده به شکل خاصی طراحی شد.

به بیان دیگر، اگر مستندات معماری «نقشه» باشند، ADR «منطق انتخاب مسیر» است.

ADR و نقش معمار نرم‌افزار

برای معمار نرم‌افزار، ADR یکی از بنیادی‌ترین ابزارهای ثبت تصمیم است. معمار دائماً بین گزینه‌های مختلف باید انتخاب کند:

  • مونو‌لیت یا میکروسرویس؟

  • REST یا gRPC؟

  • همگام یا ناهمگام؟

  • SQL یا NoSQL؟

  • Cache در چه لایه‌ای؟

  • Event Sourcing لازم است یا نه؟

  • مدل داده متمرکز باشد یا توزیع‌شده؟

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

ADR به معمار کمک می‌کند تصمیم‌ها را از سطح «نظر» به سطح «استدلال قابل‌ردیابی» ارتقا دهد. این موضوع مخصوصاً در سازمان‌هایی که رشد می‌کنند بسیار مهم است، چون تصمیمی که امروز برای ۵ نفر مناسب بوده، ممکن است برای ۵۰ نفر ناکافی باشد. ADR کمک می‌کند این تغییرات با آگاهی و مستندات مناسب انجام شوند.

ADR و نقش تحلیلگر داده

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

تحلیلگر داده با موضوعاتی مثل این‌ها مواجه است:

  • تعریف منبع حقیقت داده

  • انتخاب ساختار انبار داده

  • طراحی مدل ستاره‌ای یا برفی (در آینده بیشتر صحبت میکنیم)

  • نحوه پاک‌سازی و اعتبارسنجی داده

  • تعریف KPIها و شاخص‌های تحلیلی

  • انتخاب ابزارهای ETL/ELT (در آینده بیشتر صحبت میکنیم)

  • تعیین زمان‌بندی به‌روزرسانی داده

  • مدیریت داده‌های ناقص، تکراری یا ناسازگار

اگر این تصمیم‌ها مستند نشوند، بعداً گزارش‌ها با یکدیگر ناسازگار می‌شوند، منابع مختلف یک عدد متفاوت از یک KPI ارائه می‌دهند، و تیم کسب‌وکار اعتماد خود را به داده از دست می‌دهد.

ADR برای تحلیلگر داده کمک می‌کند تصمیم‌های مربوط به مدل داده و خط لوله تحلیلی ثبت شوند و معلوم باشد که چرا یک منبع بر دیگری ترجیح داده شده، چرا یک فیلد حذف یا تبدیل شده، و چرا یک تعریف خاص برای یک KPI پذیرفته شده است.

چه تصمیم‌هایی باید ADR داشته باشند؟

همه چیز نیاز به ADR ندارد. اگر هر انتخاب کوچک را ADR کنید، سندها تبدیل به بایگانی بی‌اثر می‌شوند. ADR باید برای تصمیم‌هایی استفاده شود که اثر معماری، داده‌ای، هزینه‌ای یا عملیاتی قابل توجه دارند. برای مثال:

  • انتخاب پایگاه داده اصلی (توسط هد تیم بانک اطلاعاتی)

  • تغییر مدل معماری

  • تصمیم درباره مسیر ارتباط بین سرویس‌ها

  • انتخاب الگوی ذخیره‌سازی داده

  • تعریف strategy برای replication یا sharding

  • تغییر ساختار warehouse یا data mart

  • انتخاب ابزار orchestration

  • استفاده از message broker

  • انتخاب نوع cache

  • تصمیم درباره استانداردهای naming یا schema evolution

  • تصمیم‌های مربوط به consistency و eventual consistency

قاعده‌ی خوب این است:

اگر تصمیم به‌سادگی قابل بازگشت نیست، یا اگر عدم ثبت آن در آینده هزینه‌زا خواهد بود، احتمالاً باید ADR داشته باشد.

ساختار یک ADR استاندارد

ببینید اگر بخواهیم یک قالب عملی برای ADR ارائه کنیم، ساختار زیر رایج و مؤثر خواهد بود:

1. عنوان

عنوان باید کوتاه، مشخص و توصیفی باشد.

مثلاً:

  • انتخاب PostgreSQL به‌عنوان پایگاه داده اصلی

  • مهاجرت از REST به event-driven communication

  • استفاده از dbt برای لایه تبدیل داده

  • جداسازی OLTP از OLAP

2. وضعیت

وضعیت ADR معمولاً یکی از این‌هاست:

  • Proposed

  • Accepted

  • Deprecated

  • Superseded

  • Rejected

3. زمینه

در این بخش مسئله، محدودیت‌ها و نیازها توضیح داده می‌شود.

مثلاً: حجم تراکنش‌ها زیاد شده، گزارش‌گیری کند است، تیم توسعه به سرعت در حال رشد است، یا نیاز به مقیاس‌پذیری افقی داریم.

4. تصمیم

خلاصه و روشن: چه چیزی انتخاب شد.

5. گزینه‌ها

حداقل 2 تا 4 گزینه بررسی شوند. این بخش مهم است، چون نشان می‌دهد تصمیم از روی بررسی بوده نه ترجیح شخصی.

6. پیامدها

مزایا، معایب، ریسک‌ها و هزینه‌های تصمیم.

7. اجرا

اگر لازم است، قدم‌های عملی مهاجرت یا پیاده‌سازی نیز ذکر شود.

8. تاریخ و مالک

مشخص باشد چه زمانی ثبت شده و مسئول آن کیست.

ویژگی‌های یک ADR خوب

ADR خوب باید چند ویژگی کلیدی داشته باشد:

  • مختصر ولی کامل باشد

  • تصمیم‌محور باشد، نه روایت‌محور

  • مستدل باشد، نه سلیقه‌ای

  • قابل‌جست‌وجو باشد

  • قابل‌نسخه‌گذاری باشد

  • قابل‌ردیابی باشد

  • قابل‌به‌روزرسانی باشد

ADR نباید به‌قدری طولانی شود که کسی آن را نخواند. در عین حال نباید آن‌قدر کوتاه باشد که صرفاً یک جمله‌ی مبهم از آن بماند. تعادل بین عمق و اختصار، یکی از هنرهای اصلی نوشتن ADR است.

نمونه ADR تولید شده با adr-tools
نمونه ADR تولید شده با adr-tools

خطاهای رایج در نوشتن ADR

یکی از خطاهای رایج این است که تیم‌ها ADR را بعد از تصمیم و صرفاً برای «پر کردن مستندات» می‌نویسند. در این حالت ADR بیشتر یک گزارش پسینی است تا یک ابزار تصمیم‌سازی.

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

خطای سوم، تبدیل ADR به متن مبهم و کلی است. عباراتی مثل «به‌دلیل بهتر بودن» یا «به‌خاطر مقیاس‌پذیری» کافی نیستند. باید دقیق گفته شود این بهتر بودن در چه معناست: عملکرد؟ سادگی؟ هزینه؟ تیم‌پذیری؟ نگه‌داری؟

خطای دیگر این است که ADRها نگه‌داری نمی‌شوند. تصمیم‌ها عوض می‌شوند، اما ADRها به‌روز نمی‌شوند. نتیجه این می‌شود که مخزن مستندات پر از اطلاعات قدیمی و گمراه‌کننده است.

ADR و تصمیم‌های داده‌ای: یک مثال مفهومی

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

  • گزارش‌گیری مستقیم از دیتابیس عملیاتی

  • استفاده از replica فقط‌خواندنی

  • ساخت data warehouse مستقل

  • استفاده از pipeline مبتنی بر CDC به معنای (CDC (Change Data Capture)) - در مورد CDC در حوزه بانک های اطلاعاتی و دیتابیس ها با مدیران پایگاه داده خیلی صحبت داریم.

  • انجام ETL شبانه

در ADR باید روشن شود چرا هر گزینه بررسی شد و چرا مثلاً data warehouse مستقل انتخاب شد. شاید دلیل این باشد که گزارش‌گیری مستقیم فشار زیادی به سیستم عملیاتی وارد می‌کند، replica فقط‌خواندنی تأخیر دارد، ETL شبانه برای نیاز near-real-time کافی نیست، و CDC تعادل خوبی بین freshness و complexity ایجاد می‌کند.

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

ADR در چرخه عمر پروژه

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

  • در فاز Discovery برای ثبت گزینه‌های اولیه

  • در فاز Design برای نهایی کردن انتخاب‌ها

  • در فاز Implementation برای جلوگیری از انحراف

  • در فاز Operations برای تحلیل اثر تصمیم‌ها

  • در فاز Refactoring برای ثبت تغییرات بنیادی

  • در فاز Migration برای مستندسازی انتقال از یک فناوری به فناوری دیگر

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

فرهنگ سازمانی و ADR

موفقیت ADR فقط به قالب و ابزار بستگی ندارد؛ به فرهنگ سازمانی هم وابسته است. اگر سازمانی تصمیم‌های فنی را فقط از بالا به پایین دیکته کند، ADR تبدیل به یک تشریفات می‌شود. اما اگر فرهنگ شفافیت، نقد فنی، مستندسازی و بازبینی وجود داشته باشد، ADR به یک ابزار زنده و مؤثر تبدیل می‌شود.

در بهترین حالت، ADR باید بخشی از فرایند طبیعی تیم باشد؛ درست مثل کدریویو، تست و استقرار. یعنی هر تصمیم مهم فنی، قبل یا همزمان با اجرا، در قالب ADR دیده و بررسی شود.

ابزارها و محل نگه‌داری ADR

ADR می‌تواند در یک repository جداگانه یا کنار کد پروژه نگه‌داری شود. بسیاری از تیم‌ها از فایل‌های Markdown استفاده می‌کنند، چون ساده، نسخه‌پذیر و سازگار با Git هستند.

مزیت نگه‌داری ADR در Git این است که:

  • تاریخچه تغییرات مشخص است

  • امکان review و comment وجود دارد

  • با کد و تغییرات فنی هم‌نسخه می‌شود

  • برای تیم‌های فنی ساده و قابل‌دسترس است

بعضی تیم‌ها ADR را در Notion، Confluence یا Wiki نگه می‌دارند. این هم می‌تواند مناسب باشد، اما مهم‌تر از ابزار، دسترسی‌پذیری، نسخه‌پذیری و انضباط نگه‌داری است.

جمع‌بندی

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

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

در دنیایی که پروژه‌ها سریع تغییر می‌کنند، تیم‌ها جابه‌جا می‌شوند و فناوری‌ها دائماً در حال تحول‌اند، ADR یک ابزار لوکس نیست؛ یک ضرورت مهندسی است. سازمانی که ADR را جدی می‌گیرد، در واقع به آینده‌ی سیستم خود احترام می‌گذارد. عزیزانی که میخواهند ADR درست کنند، adr-tools، این استانداردترین ابزار در این حوزه است. اگرچه اصالتاً برای لینوکس/مک نوشته شده، اما در ویندوز از طریق WSL (Windows Subsystem for Linux) یا Git Bash به راحتی اجرا می‌شود.

همیشه ADR داشته باشید. موفق باشید.

مهندسی نرم‌افزار
۳
۰
میر مجتبی هاشمی جنتی
میر مجتبی هاشمی جنتی
دانش آموخته مهندسی نرم افزار | فعال در صنعت | یک برنامه نویس ساده
شاید از این پست‌ها خوشتان بیاید