سلام. امیدوارم حالتون خوب باشه. امروز در مورد اسناد ADR باهم صحبت میکنیم. در بسیاری از شرکتهای مهندسی نرمافزار، مخصوصاً در تیمهایی که با سرعت بالا محصول میسازند، تصمیمهای فنی مهمی روزانه گرفته میشوند؛ تصمیمهایی که اثر آنها فقط در لحظهی طراحی یا پیادهسازی دیده نمیشود، بلکه ماهها و حتی سالها بعد در مقیاسپذیری، نگهداری، توسعهپذیری، کیفیت داده، هزینهی زیرساخت و سرعت تحویل محصول خود را نشان میدهند. یکی از مهمترین ابزارهایی که به تیمهای فنی کمک میکند این تصمیمها را شفاف، مستند و قابلردیابی نگه دارند، ADR یا Architecture Decision Record است.
ADR در سادهترین تعریف، یک سند کوتاه اما ساختارمند برای ثبت تصمیمهای معماری و فنی مهم است؛ تصمیمهایی که باید مشخص باشد چه چیزی تصمیم گرفته شد، چرا این تصمیم گرفته شد، چه گزینههایی بررسی شد، چه پیامدهایی دارد، و چه کسی/چه زمانی آن را تأیید کرده است. این سند در ظاهر ساده است، اما در عمل یکی از مؤثرترین ابزارهای مدیریت دانش فنی در سازمانهای نرمافزاری محسوب میشود.
اشتباه رایجی که بسیاری از تیمها مرتکب میشوند این است که ADR را صرفاً بهعنوان یک فایل مستنداتی یا یک فرم اداری نگاه میکنند. در حالیکه ADR در واقع بخشی از فرآیند مهندسی تصمیم است. یعنی ADR زمانی ارزشمند میشود که تصمیمهای فنی را از حالت شفاهی، سلیقهای و پراکنده خارج کند و آنها را به یک دارایی سازمانی تبدیل کند.
در شرکتهای نرمافزاری، معمولاً تصمیمها در جلسات، چتها، تماسها، ریویوها و گاهی در ذهن افراد ارشد باقی میمانند. مشکل اینجاست که وقتی فرد تصمیمگیرنده تیم را ترک میکند، یا وقتی پروژه وارد فاز نگهداری و توسعه میشود، تیم جدید دیگر به منطق پشت تصمیم دسترسی ندارد. ADR این شکاف را پر میکند.
در واقع ADR پاسخ میدهد به این سؤال کلیدی:
«چرا این راه را انتخاب کردیم و چرا راههای دیگر را انتخاب نکردیم؟»
این سؤال بهظاهر ساده، در پروژههای واقعی یکی از مهمترین سؤالات است. چون اغلب مشکلات فنی به این دلیل رخ نمیدهند که تیم تصمیم بد گرفته، بلکه به این دلیل رخ میدهند که تیم بعدی دلیل تصمیم قبلی را نمیداند و دوباره همان بحث را از صفر آغاز میکند.
اگرچه ADR در بسیاری از تیمها توسط معمار نرمافزار نوشته میشود، اما مخاطب آن محدود به معمار نیست. این سند برای طیف وسیعی از نقشها در شرکتهای مهندسی نرمافزار مفید است:
معمار نرمافزار برای ثبت انتخابهای کلان معماری
تحلیلگر داده برای مستندسازی تصمیمهای مربوط به مدل داده، خط لوله داده، کیفیت داده و ذخیرهسازی
توسعهدهنده ارشد برای ثبت تصمیمهای فنی مؤثر بر کدنویسی و ساختار سرویسها
DevOps / SRE برای تصمیمهای مرتبط با استقرار، زیرساخت و پایش
Product Engineer برای تصمیمهایی که میان نیاز محصول و محدودیت فنی تعادل ایجاد میکنند
مدیر فنی برای بازبینی و ردیابی مسیر تصمیمها در طول زمان
بهخصوص برای معماران و تحلیلگران داده، ADR نقش بسیار مهمی دارد. زیرا تصمیمهای این دو نقش اغلب در مرز میان نیاز کسبوکار و پیچیدگی فنی قرار میگیرد. معمار درباره ساختار سیستم تصمیم میگیرد و تحلیلگر داده درباره ساختار و جریان اطلاعات. هر دو حوزه اگر مستند نشوند، خیلی سریع به آشفتگی، وابستگیهای پنهان و دوبارهکاری منجر میشوند.

اهمیت ADR را میتوان از چند زاویه بررسی کرد. نخست اینکه ADR باعث کاهش حافظهی شفاهی سازمان میشود. در بسیاری از شرکتها، تصمیمها در ذهن چند نفر کلیدی متمرکز است. این وضعیت در کوتاهمدت شاید کارآمد به نظر برسد، اما در بلندمدت خطرناک است. چون سازمان به جای تکیه بر دانش مکتوب، به افراد خاص وابسته میشود.
دوم اینکه ADR به شفافیت تصمیمها کمک میکند. وقتی تصمیمها ثبت شوند، امکان بازبینی و نقد فنی آنها وجود دارد. تیمها میتوانند ببینند که آیا تصمیم بر اساس داده، محدودیت، هزینه و اولویت درست گرفته شده یا نه. این شفافیت، سطح بلوغ مهندسی سازمان را بالا میبرد.
سوم اینکه ADR به کاهش اصطکاک بین تیمها کمک میکند. بسیاری از اختلافهای بین تیم معماری، توسعه، داده و زیرساخت به این دلیل رخ میدهد که هر تیم تصور متفاوتی از تصمیم دارد. ADR بهعنوان یک منبع مشترک، این اختلاف برداشت را کاهش میدهد.
چهارم اینکه ADR برای آیندهپژوهی فنی بسیار ارزشمند است. وقتی بعداً بخواهید دلیل استفاده از یک دیتابیس، یک الگوی معماری، یک ابزار ETL (ETL از سه واژه، استخراج (Extract)، تبدیل (Transform) و بارگذاری (Load) برگرفته شده است و فرآیند یکپارچه سازی دادهها (Data Integration) محسوب میشود) یا یک روش پیادهسازی را بررسی کنید، ADR به شما نشان میدهد که آن تصمیم در چه شرایطی گرفته شده و چه قیودی وجود داشته است.
یک ADR خوب معمولاً این اجزا را دارد:
عنوان تصمیم
تاریخ
وضعیت تصمیممثل: پیشنهادی، پذیرفتهشده، ردشده، منسوخشده
زمینه یا Contextمسئله چه بوده؟ چه نیازی وجود داشته؟
تصمیم
گزینههای بررسیشده
مقایسه گزینهها
دلایل انتخاب
پیامدها و عوارض
نقاط ریسک
مراحل اجرا
ارجاعات و لینکها
نکته مهم این است که ADR نباید صرفاً خروجی نهایی را بگوید؛ بلکه باید مسیر فکری تصمیم را نشان دهد. اگر ADR فقط یک جملهی «ما PostgreSQL را انتخاب کردیم» باشد، هنوز ADR کامل نیست. ارزش ADR در آن است که توضیح دهد چرا PostgreSQL و چرا نه گزینههای دیگر.
ADR با مستندات مرسوم تفاوت مهمی دارد. مستندات عمومی معمولاً توصیفیاند؛ یعنی توضیح میدهند سیستم چهطور کار میکند. اما ADR تصمیممحور است؛ یعنی توضیح میدهد چه تصمیمی گرفته شد و چرا.
برای مثال، یک سند معماری ممکن است جریان سرویسها، دیاگرامها و اجزای سیستم را توصیف کند. اما ADR میگوید چرا ارتباط بین سرویسها رویدادمحور شد، چرا معماری مونولیت به میکروسرویس تغییر کرد، چرا برای گزارشگیری از Warehouse جداگانه استفاده شد، یا چرا مدل ذخیرهسازی داده به شکل خاصی طراحی شد.
به بیان دیگر، اگر مستندات معماری «نقشه» باشند، ADR «منطق انتخاب مسیر» است.
برای معمار نرمافزار، ADR یکی از بنیادیترین ابزارهای ثبت تصمیم است. معمار دائماً بین گزینههای مختلف باید انتخاب کند:
مونولیت یا میکروسرویس؟
REST یا gRPC؟
همگام یا ناهمگام؟
SQL یا NoSQL؟
Cache در چه لایهای؟
Event Sourcing لازم است یا نه؟
مدل داده متمرکز باشد یا توزیعشده؟
هر یک از این انتخابها روی هزینه، پیچیدگی، عملکرد، توسعهپذیری و نگهداری اثر میگذارد. اگر این تصمیمها مستند نشوند، بعداً معلوم نیست چرا انتخاب شدهاند و آیا هنوز هم معتبرند یا نه.
ADR به معمار کمک میکند تصمیمها را از سطح «نظر» به سطح «استدلال قابلردیابی» ارتقا دهد. این موضوع مخصوصاً در سازمانهایی که رشد میکنند بسیار مهم است، چون تصمیمی که امروز برای ۵ نفر مناسب بوده، ممکن است برای ۵۰ نفر ناکافی باشد. ADR کمک میکند این تغییرات با آگاهی و مستندات مناسب انجام شوند.
برای تحلیلگر داده، ADR کمتر از معمار نیست؛ شاید در برخی سازمانها حتی مهمتر هم باشد. چون تصمیمهای دادهای مستقیماً روی کیفیت تحلیل، گزارشگیری، تصمیمسازی تجاری و عملکرد سیستمهای تحلیلی اثر میگذارند.
تحلیلگر داده با موضوعاتی مثل اینها مواجه است:
تعریف منبع حقیقت داده
انتخاب ساختار انبار داده
طراحی مدل ستارهای یا برفی (در آینده بیشتر صحبت میکنیم)
نحوه پاکسازی و اعتبارسنجی داده
تعریف KPIها و شاخصهای تحلیلی
انتخاب ابزارهای ETL/ELT (در آینده بیشتر صحبت میکنیم)
تعیین زمانبندی بهروزرسانی داده
مدیریت دادههای ناقص، تکراری یا ناسازگار
اگر این تصمیمها مستند نشوند، بعداً گزارشها با یکدیگر ناسازگار میشوند، منابع مختلف یک عدد متفاوت از یک KPI ارائه میدهند، و تیم کسبوکار اعتماد خود را به داده از دست میدهد.
ADR برای تحلیلگر داده کمک میکند تصمیمهای مربوط به مدل داده و خط لوله تحلیلی ثبت شوند و معلوم باشد که چرا یک منبع بر دیگری ترجیح داده شده، چرا یک فیلد حذف یا تبدیل شده، و چرا یک تعریف خاص برای یک KPI پذیرفته شده است.
همه چیز نیاز به ADR ندارد. اگر هر انتخاب کوچک را ADR کنید، سندها تبدیل به بایگانی بیاثر میشوند. ADR باید برای تصمیمهایی استفاده شود که اثر معماری، دادهای، هزینهای یا عملیاتی قابل توجه دارند. برای مثال:
انتخاب پایگاه داده اصلی (توسط هد تیم بانک اطلاعاتی)
تغییر مدل معماری
تصمیم درباره مسیر ارتباط بین سرویسها
انتخاب الگوی ذخیرهسازی داده
تعریف strategy برای replication یا sharding
تغییر ساختار warehouse یا data mart
انتخاب ابزار orchestration
استفاده از message broker
انتخاب نوع cache
تصمیم درباره استانداردهای naming یا schema evolution
تصمیمهای مربوط به consistency و eventual consistency
قاعدهی خوب این است:
اگر تصمیم بهسادگی قابل بازگشت نیست، یا اگر عدم ثبت آن در آینده هزینهزا خواهد بود، احتمالاً باید ADR داشته باشد.
ببینید اگر بخواهیم یک قالب عملی برای ADR ارائه کنیم، ساختار زیر رایج و مؤثر خواهد بود:
عنوان باید کوتاه، مشخص و توصیفی باشد.
مثلاً:
انتخاب PostgreSQL بهعنوان پایگاه داده اصلی
مهاجرت از REST به event-driven communication
استفاده از dbt برای لایه تبدیل داده
جداسازی OLTP از OLAP
وضعیت ADR معمولاً یکی از اینهاست:
Proposed
Accepted
Deprecated
Superseded
Rejected
در این بخش مسئله، محدودیتها و نیازها توضیح داده میشود.
مثلاً: حجم تراکنشها زیاد شده، گزارشگیری کند است، تیم توسعه به سرعت در حال رشد است، یا نیاز به مقیاسپذیری افقی داریم.
خلاصه و روشن: چه چیزی انتخاب شد.
حداقل 2 تا 4 گزینه بررسی شوند. این بخش مهم است، چون نشان میدهد تصمیم از روی بررسی بوده نه ترجیح شخصی.
مزایا، معایب، ریسکها و هزینههای تصمیم.
اگر لازم است، قدمهای عملی مهاجرت یا پیادهسازی نیز ذکر شود.
مشخص باشد چه زمانی ثبت شده و مسئول آن کیست.
ADR خوب باید چند ویژگی کلیدی داشته باشد:
مختصر ولی کامل باشد
تصمیممحور باشد، نه روایتمحور
مستدل باشد، نه سلیقهای
قابلجستوجو باشد
قابلنسخهگذاری باشد
قابلردیابی باشد
قابلبهروزرسانی باشد
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 فقط برای شروع پروژه نیست. در طول چرخه عمر نرمافزار کاربرد دارد:
در فاز Discovery برای ثبت گزینههای اولیه
در فاز Design برای نهایی کردن انتخابها
در فاز Implementation برای جلوگیری از انحراف
در فاز Operations برای تحلیل اثر تصمیمها
در فاز Refactoring برای ثبت تغییرات بنیادی
در فاز Migration برای مستندسازی انتقال از یک فناوری به فناوری دیگر
در واقع 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 داشته باشید. موفق باشید.