2.7 दस्तावेज़ीकरण
अवलोकन और प्रेरणा
दस्तावेज़ीकरण वह लिखित ज्ञान है जो लोगों को सॉफ़्टवेयर का उपयोग करने, उसे संचालित करने, और उसे बदलने देता है, बिना केवल कोड से समझ को टुकड़ों में जोड़ने की मजबूरी के। यह कई विधाओं (genres) में आता है: शुरुआत कैसे करें, किसी काम को कैसे पूरा करें, कोई सिस्टम कैसे संरचित है, किसी घटना पर कैसे प्रतिक्रिया दें, कोई API क्या स्वीकार करता है और क्या लौटाता है। हर एक अलग-अलग ज़रूरत वाले एक अलग पाठक की सेवा करता है। अच्छा दस्तावेज़ीकरण वैकल्पिक नहीं है। यही वह अंतर है जो एक बड़े संगठन में फैले हुए ज्ञान और केवल कुछ लोगों के दिमाग़ में रहने वाले ज्ञान के बीच होता है।
बड़ी टीमों के लिए, दस्तावेज़ीकरण की-पर्सन जोखिम (key-person risk) के विरुद्ध आपका सबसे अच्छा बचाव है (वह ख़तरा जब महत्वपूर्ण ज्ञान केवल एक या कुछ लोगों के पास होता है) और नए लोगों को ऑनबोर्ड करने का आपका सबसे तेज़ तरीका। जब सैकड़ों इंजीनियर ऐसे सिस्टम पर निर्भर होते हैं जिन्हें उन्होंने नहीं बनाया, और लोग लगातार जुड़ते, बदलते, और छोड़ते रहते हैं, तो संगठन तभी काम कर सकता है जब ज्ञान लिखा हुआ और खोजने में आसान हो। बिना दस्तावेज़ीकरण वाले सिस्टम भंगुर बन जाते हैं: केवल उनके लेखक ही उन्हें सुरक्षित रूप से बदल सकते हैं, और जब वे लेखक चले जाते हैं, तो संगठन अपने ही सॉफ़्टवेयर को अनुरक्षित करने की क्षमता खो देता है। यह बड़े पैमाने पर सबसे आम और सबसे महँगी विफलताओं में से एक है।
एंटरप्राइज़ और सरकारी संदर्भ दाँव को और भी ऊँचा कर देते हैं। सिस्टम लंबे समय तक जीते हैं, इसलिए आपके दस्तावेज़ीकरण को मूल टीम के चले जाने के वर्षों, यहाँ तक कि दशकों बाद भी अनुरक्षकों की सेवा करनी होगी। नियामक और ऑडिट व्यवस्थाएँ अक्सर नियंत्रण के सबूत के रूप में विशिष्ट दस्तावेज़ों को अनिवार्य करती हैं: आर्किटेक्चर रिकॉर्ड, रनबुक (चरण-दर-चरण परिचालन और घटना-प्रतिक्रिया प्रक्रियाएँ), और निर्णय लॉग। वेंडरों के बीच सौंपे गए सार्वजनिक-क्षेत्र के सिस्टम अनुबंध सीमाओं के पार ज्ञान ले जाने के लिए पूरी तरह से दस्तावेज़ीकरण पर निर्भर करते हैं। और फिर भी दस्तावेज़ीकरण के सड़ने (rot) की प्रवृत्ति के लिए प्रसिद्ध है, इसलिए असली चुनौती सॉफ़्टवेयर के बदलने पर भी इसे सटीक बनाए रखना है।
मुख्य सिद्धांत
- एक विशिष्ट ज़रूरत वाले विशिष्ट पाठक के लिए लिखें; अलग-अलग दस्तावेज़ीकरण प्रकार अलग-अलग उद्देश्यों की सेवा करते हैं।
- दस्तावेज़ीकरण को कोड के करीब रखें और इसे कोड की तरह मानें (docs-as-code)।
- सटीकता पूर्णता को मात देती है; थोड़ा सा भरोसेमंद दस्तावेज़ीकरण, बहुत सारे गलत दस्तावेज़ीकरण से बेहतर है।
- जो जनरेट किया जा सकता है उसे जनरेट करें; जो कोई टूल सत्य के स्रोत से बना सकता है उसे हाथ से अनुरक्षित न करें।
- दस्तावेज़ीकरण के सड़ने के खिलाफ़ सक्रिय रूप से लड़ें; पुराने दस्तावेज़ किसी दस्तावेज़ के न होने से भी बदतर हैं क्योंकि वे गुमराह करते हैं।
- दस्तावेज़ीकरण को खोजने योग्य बनाएँ; न खोजा जा सकने वाला ज्ञान व्यावहारिक रूप से अनुपस्थित है।
- केवल वर्तमान स्थिति ही नहीं, बल्कि निर्णयों और उनके औचित्य (rationale) को भी दर्ज करें।
सिफारिशें
docs-as-code अपनाएँ
दस्तावेज़ीकरण को वर्ज़न कंट्रोल में ठीक उसी कोड के साथ रखें जिसका यह वर्णन करता है, इसे सादे-टेक्स्ट मार्कअप में लिखें, और इसे उसी पुल-रिक्वेस्ट प्रक्रिया से समीक्षा करें। इससे यह वर्ज़न्ड, समीक्षा योग्य, और कोड के करीब बना रहता है, ताकि आप दोनों को साथ-साथ अपडेट कर सकें। इसे एक स्वचालित पाइपलाइन के ज़रिए प्रकाशित करें ताकि नवीनतम संस्करण हमेशा उपलब्ध रहे। दस्तावेज़ों को कोड की तरह मानना वही अनुशासन लाता है जो कोड को भरोसेमंद बनाए रखता है: समीक्षा, इतिहास, और स्वचालन।
Diátaxis फ़्रेमवर्क के साथ सामग्री को संरचित करें
दस्तावेज़ीकरण को चार अलग-अलग प्रकारों में व्यवस्थित करें, क्योंकि इन्हें मिलाना किसी भी पाठक की अच्छी सेवा नहीं करता: ट्यूटोरियल (सीखने-केंद्रित, नए लोगों के लिए), हाउ-टू गाइड (काम-केंद्रित, किसी विशेष लक्ष्य के लिए), रेफ़रेंस (जानकारी-केंद्रित, सटीक और पूर्ण), और स्पष्टीकरण (समझ-केंद्रित, “क्यों” और संदर्भ)। इन्हें अलग रखें और सब कुछ लिखना, नेविगेट करना, और अनुरक्षित करना आसान हो जाता है, क्योंकि हर पेज का एक स्पष्ट काम और एक स्पष्ट ऑडियंस होता है।
आवश्यक परिचालन दस्तावेज़ों को बनाए रखें
हर रिपॉज़िटरी को उसके सामने के दरवाज़े के रूप में एक स्पष्ट README दें: यह क्या है, इसे कैसे बनाएँ और चलाएँ, और आगे कहाँ जाएँ। परिचालन कार्यों और घटना प्रतिक्रिया के लिए रनबुक लिखें, ताकि ऑन-कॉल पर मौजूद कोई भी व्यक्ति कार्रवाई कर सके, सिर्फ़ विशेषज्ञ ही नहीं। ऐसा आर्किटेक्चर दस्तावेज़ीकरण रखें जो सिस्टम की संरचना और मुख्य घटकों की व्याख्या करे। और ऐसा ऑनबोर्डिंग दस्तावेज़ीकरण दें जो किसी नए इंजीनियर को जल्दी उत्पादक बना दे। ये वे दस्तावेज़ हैं जिन्हें आप सबसे ज़्यादा तब याद करते हैं जब वे मौजूद नहीं होते।
सत्य के स्रोत से API दस्तावेज़ और चेंजलॉग जनरेट करें
अपने API रेफ़रेंस दस्तावेज़ीकरण को मशीन-पठनीय अनुबंध (contract) या कोड एनोटेशन से जनरेट करें, ताकि यह वास्तविक इंटरफ़ेस से बेमेल न हो सके। एक चेंजलॉग बनाए रखें, आदर्श रूप से संरचित कमिट या रिलीज़ नोट्स से जनरेट किया हुआ, ताकि उपभोक्ता देख सकें कि वर्ज़नों के बीच क्या बदला। इन्हें स्वचालित करना सबसे सड़न-प्रवण हाथ से अनुरक्षित दस्तावेज़ीकरण को आपकी थाली से हटा देता है और इसे भरोसेमंद बनाए रखता है।
आर्किटेक्चर निर्णयों को दर्ज करें
महत्वपूर्ण आर्किटेक्चरल और डिज़ाइन निर्णयों को हल्के, दिनांकित रिकॉर्ड के रूप में पकड़ें जो संदर्भ, निर्णय, और उसके परिणाम बताते हों। ये निर्णय रिकॉर्ड उस औचित्य को सहेजते हैं जो अन्यथा खो जाता, ताकि भविष्य के अनुरक्षक देख सकें कि सिस्टम जैसा है वैसा क्यों है, बजाय इसके कि वे उस पर दोबारा सवाल उठाएँ या पुरानी गलतियाँ दोहराएँ। ये विशेष रूप से एंटरप्राइज़ और सरकारी सिस्टम की लंबी आयु में फ़ायदेमंद साबित होते हैं।
दस्तावेज़ीकरण के सड़ने के खिलाफ़ जान-बूझकर लड़ें
पुराने हो चुके दस्तावेज़ीकरण को एक दोष मानें। दस्तावेज़ों को उसी बदलाव के हिस्से के रूप में अपडेट करें जो व्यवहार को बदलता है, और इसे एक समीक्षा अपेक्षा बनाएँ। स्वामित्व सौंपें ताकि हर महत्वपूर्ण दस्तावेज़ के लिए कोई ज़िम्मेदार हो। उच्च-मूल्य वाले दस्तावेज़ीकरण की समय-समय पर सटीकता के लिए समीक्षा करें, जो पुराना हो गया हो उसे काट दें, और जिस पर आपको अब भरोसा नहीं है उसे हटा दें या स्पष्ट रूप से फ़्लैग करें। सबसे कम सड़ने वाला दस्तावेज़ीकरण जीवंत दस्तावेज़ीकरण है: सिस्टम के ख़िलाफ़ जनरेट किया गया या टेस्ट किया गया।
ज्ञान प्रबंधन और खोजनीयता में निवेश करें
दस्तावेज़ीकरण को अच्छी खोज, स्पष्ट नेविगेशन, और एक जाने-पहचाने ठिकाने के ज़रिए खोजने योग्य बनाएँ, ताकि लोग बिना किसी से पूछे जो चाहिए वह पा सकें। इसे बहुत सारे असंबद्ध विकी और टूल में बिखरने न दें। और अव्यक्त ज्ञान को पकड़ें, वह अनौपचारिक समझ जो चैट थ्रेड्स और लोगों के दिमाग़ में रहती है, उसके फिसल जाने से पहले उसे टिकाऊ, खोजने योग्य रूप में लाएँ।
ट्रेड-ऑफ़: फ़ायदे और नुकसान
| दृष्टिकोण | फ़ायदे | नुकसान |
|---|---|---|
| Docs-as-code | वर्ज़न्ड, समीक्षा योग्य, कोड के करीब; कम सड़न | इंजीनियर अनुशासन की आवश्यकता; गैर-तकनीकी लेखकों के लिए कम अनुकूल |
| विकी / नॉलेज बेस | संपादित करना आसान; सबके लिए सुलभ | कोड से बेमेल हो जाती है; बिखर जाती है; चुपचाप सड़ती है |
| जनरेट किए गए दस्तावेज़ (API, चेंजलॉग) | हमेशा सटीक; कम अनुरक्षण | स्रोत जो व्यक्त करता है उस तक सीमित; टूलिंग चाहिए |
| हाथ से लिखा गया स्पष्टीकरण | समृद्ध संदर्भ और औचित्य जो मशीनें नहीं बना सकतीं | श्रम-गहन; पुराना होने की प्रवृत्ति |
| Diátaxis संरचना | प्रति पेज स्पष्ट उद्देश्य; नेविगेट और अनुरक्षित करना आसान | शुरुआती संरचना का प्रयास; लेखक अनुशासन चाहिए |
केंद्रीय ट्रेड-ऑफ़ प्रयास बनाम सटीकता और टिकाऊपन है। लिखने में सबसे सस्ता दस्तावेज़ीकरण, एक झटपट विकी पेज, सड़ने और बिखरने के लिए भी सबसे ज़्यादा प्रवण है। सबसे टिकाऊ दस्तावेज़ीकरण, स्रोत से जनरेट किया गया या कोड की तरह समीक्षित, शुरुआत में ज़्यादा अनुशासन माँगता है लेकिन भरोसेमंद बना रहता है। एक अच्छा अंगूठे का नियम: जो जनरेट कर सकते हैं उसे जनरेट करें, बाकी को कोड के करीब और कोड की तरह समीक्षित रखें, और श्रम-गहन हाथ से लिखा गया स्पष्टीकरण उस औचित्य के लिए बचाकर रखें जो केवल इंसान ही दे सकते हैं।
अपनी टीम के साथ चर्चा करने के लिए प्रश्न
क्या आपके दस्तावेज़ पाठक की ज़रूरत के अनुसार अलग-अलग हैं, या ट्यूटोरियल, रेफ़रेंस, और स्पष्टीकरण एक ही पेज पर गड्डमड्ड हो जाते हैं? यह अध्याय ट्यूटोरियल, हाउ-टू गाइड, रेफ़रेंस, और स्पष्टीकरण में Diátaxis विभाजन की सिफ़ारिश करता है, और प्रकारों को मिलाने को एक एंटी-पैटर्न के रूप में सूचीबद्ध करता है जो किसी भी पाठक की अच्छी सेवा नहीं करता। बड़े पैमाने पर, सिस्टम सीख रहा एक नया व्यक्ति और एक सटीक तथ्य ढूँढ रहा एक ऑन-कॉल इंजीनियर अलग-अलग पेजों की ज़रूरत रखते हैं, और एक अकेला मिला-जुला पेज दोनों को धीमा कर देता है। संकेत लाएँ: अपने सबसे ज़्यादा देखे जाने वाले दस्तावेज़ चुनें और जाँचें कि क्या हर एक का एक स्पष्ट काम और एक स्पष्ट ऑडियंस है। सबसे बुरे अपराधियों को अलग-अलग प्रकारों में पुनर्गठित करें, ताकि हर पेज लिखना, नेविगेट करना, और अद्यतन रखना आसान हो जाए। यही संरचना है जो संगठन के बढ़ने पर दस्तावेज़ीकरण को अनुरक्षणीय बनाती है।
क्या आप महत्वपूर्ण आर्किटेक्चर निर्णयों को उनके औचित्य के साथ पकड़ते हैं, या केवल वर्तमान स्थिति को? यह अध्याय हल्के, दिनांकित निर्णय रिकॉर्ड की सिफ़ारिश करता है जो संदर्भ, निर्णय, और परिणाम बताते हों, और नोट करता है कि ये एंटरप्राइज़ और सरकारी सिस्टम की लंबी आयु में सबसे ज़्यादा फ़ायदेमंद साबित होते हैं। इनके बिना, वर्षों बाद कोई अनुरक्षक यह नहीं देख सकता कि सिस्टम जैसा है वैसा क्यों है, इसलिए वे सही विकल्पों पर दोबारा सवाल उठाते हैं या पुरानी गलतियाँ दोहराते हैं। ठोस संकेत के रूप में एक हालिया कठिन निर्णय लाएँ जिसका तर्क अब केवल किसी चैट थ्रेड या किसी की याददाश्त में रहता है। एक छोटा निर्णय-रिकॉर्ड फ़ॉर्मेट अपनाएँ और किसी भी महत्वपूर्ण डिज़ाइन बदलाव के हिस्से के रूप में एक लिखना अनिवार्य करें। औचित्य ठीक वही ज्ञान है जो केवल इंसान दे सकते हैं और जो बिना लिखे सबसे तेज़ी से सड़ता है।
क्या कोई भी ऑन-कॉल इंजीनियर सिस्टम बनाने वाले व्यक्ति को पेज किए बिना, केवल आपके रनबुक से किसी घटना पर प्रतिक्रिया दे सकता है? यह अध्याय रनबुक को एक आवश्यक परिचालन दस्तावेज़ के रूप में नाम देता है ताकि ऑन-कॉल पर मौजूद कोई भी व्यक्ति कार्रवाई कर सके, सिर्फ़ विशेषज्ञ ही नहीं, और एक ऐसी सरकारी टीम का वर्णन करता है जो केवल इसलिए एक सिस्टम विरासत में ले सकी क्योंकि रनबुक अनुबंध सीमा के पार ज्ञान ले गए। की-पर्सन जोखिम वह विफलता है जिससे यह बचाव करता है: जब अकेला विशेषज्ञ अनुपलब्ध हो या चला गया हो, तो एक बिना-दस्तावेज़ीकृत रिकवरी प्रक्रिया एक नियमित घटना को आउटेज में बदल देती है। सबूत लाएँ: एक हालिया घटना लें और जाँचें कि क्या अकेला रनबुक उसे हल कर देता। जिन प्रक्रियाओं से लोग डरते हैं उनके लिए रनबुक लिखें और टेस्ट करें, और ऐसे रनबुक को एक दोष मानें जो खुद पर खड़ा नहीं हो सकता। यही रात दो बजे की रिकवरी और रात दो बजे के एस्केलेशन के बीच का अंतर है।
आपके कौन-से API रेफ़रेंस और चेंजलॉग सत्य के स्रोत से जनरेट किए जाते हैं, और कौन-से अभी भी हाथ से अनुरक्षित हैं और चुपचाप बेमेल होते जा रहे हैं? यह अध्याय आपको रेफ़रेंस दस्तावेज़ीकरण को मशीन-पठनीय अनुबंध या कोड एनोटेशन से जनरेट करने को कहता है ताकि यह वास्तविक इंटरफ़ेस से अलग न हो सके, और यह जनरेट करने योग्य सामग्री को हाथ से अनुरक्षित करने को एक एंटी-पैटर्न के रूप में सूचीबद्ध करता है। एक बड़ी टीम के लिए, एक हाथ से लिखा गया API दस्तावेज़ जो असली इंटरफ़ेस से पीछे रह जाता है, किसी दस्तावेज़ के न होने से भी बदतर है: हर उपभोक्ता जो इस पर भरोसा करता है वह एक टूटा हुआ इंटीग्रेशन लिखता है, और विफलता उस पुराने पेज से बहुत दूर सामने आती है जिसने उसे पैदा किया। ठोस संकेत लाएँ: अपने सबसे ज़्यादा इस्तेमाल होने वाले कुछ इंटरफ़ेस का नमूना लें और प्रकाशित रेफ़रेंस की असली अनुबंध से तुलना करके देखें कि हर एक कितना बेमेल हो गया है। जहाँ आपको बेमेल मिले, वहाँ रेफ़रेंस को बिल्ड में जोड़ें ताकि यह हर बदलाव पर फिर से जनरेट हो, और हाथ से रखी गई कॉपी को रिटायर करें। एंटरप्राइज़ और सरकारी सेटिंग्स में, जहाँ इंटरफ़ेस को टीमों, वेंडरों, और अनुबंध सीमाओं के पार इस्तेमाल किया जाता है जो आप कभी नहीं देखते, एक प्रामाणिक जनरेट किया गया रेफ़रेंस अक्सर इकलौती चीज़ होती है जो इंटीग्रेटरों को काल्पनिक चीज़ों के ख़िलाफ़ बनाने से रोकती है।
हर उच्च-मूल्य दस्तावेज़ का मालिक कौन है, और अगर कोई पुराना हो गया हो तो आपको आज इसका पता कैसे चलेगा? यह अध्याय पुराने हो चुके दस्तावेज़ीकरण को एक दोष मानता है और चेतावनी देता है कि बिना मालिक वाले दस्तावेज़ सड़ जाते हैं क्योंकि उन्हें अपडेट करना किसी का काम नहीं होता, जबकि वर्तमान के रूप में पेश किए गए पुराने दस्तावेज़ आपके पूरे दस्तावेज़ीकरण में भरोसे को नष्ट कर देते हैं। बड़े पैमाने पर ख़तरा एक अकेला गलत पेज नहीं बल्कि भरोसे का धीमा क्षरण है: एक बार जब पाठक पुराने निर्देशों से जल जाते हैं, तो वे पूरे संग्रह पर भरोसा करना बंद कर देते हैं और वापस लोगों को बाधित करने लगते हैं। अपने सबसे महत्वपूर्ण दस्तावेज़ों का एक स्वामित्व नक्शा लाएँ और यह ईमानदार जवाब दें कि सड़न का पता कैसे चलता है, चाहे समीक्षा लय से, जनरेशन से, सिस्टम के ख़िलाफ़ टेस्ट से, या शुद्ध क़िस्मत से। हर मायने रखने वाले दस्तावेज़ को एक नामित मालिक सौंपें, और जीवंत दस्तावेज़ीकरण को प्राथमिकता दें जो जनरेट या टेस्ट किया गया हो ताकि पुरानापन एक शर्मिंदा पाठक के बजाय यंत्रवत् (mechanically) सामने आए। अपनी मूल टीमों से ज़्यादा जीने वाले एंटरप्राइज़ और सरकारी सिस्टम के लिए, बिना मालिक वाला दस्तावेज़ीकरण एक दायित्व है जिसकी कीमत अंततः कोई ऑडिटर या विरासत में लेने वाला वेंडर आपसे वसूलेगा।
आपका दस्तावेज़ीकरण कितना खोजने योग्य है, और कितना महत्वपूर्ण ज्ञान अभी भी केवल चैट थ्रेड्स और लोगों के दिमाग़ में रहता है? यह अध्याय कहता है कि न खोजा जा सकने वाला ज्ञान व्यावहारिक रूप से अनुपस्थित है, बहुत सारे असंबद्ध विकी और टूल में दस्तावेज़ों के बिखरने के ख़िलाफ़ चेतावनी देता है, और आपसे आग्रह करता है कि अव्यक्त ज्ञान को उसके फिसलने से पहले टिकाऊ, खोजने योग्य रूप में पकड़ें। एक बड़े संगठन में अक्सर वही तथ्य सौ बार फिर से खोजा जाता है, फिर से पूछा जाता है, और फिर से जवाब दिया जाता है क्योंकि कोई यह नहीं ढूँढ पाता कि यह पहले से कहाँ लिखा गया था, और हर प्रस्थान अपने साथ अपूरणीय संदर्भ ले जाता है। सबूत लाएँ: गिनें कि आप कितने अलग-अलग दस्तावेज़ीकरण ठिकाने अनुरक्षित करते हैं, केवल खोज से तीन महत्वपूर्ण तथ्य ढूँढने की कोशिश करें, और नोट करें कि असली जवाब आख़िर में कहाँ रहते हुए पाए गए, किसी की याददाश्त में या किसी दबे हुए संदेश में। एक जाने-पहचाने ठिकाने की ओर समेकित करें जहाँ असली खोज और स्पष्ट नेविगेशन हो, और अव्यक्त ज्ञान को पकड़ना काम का एक नियमित हिस्सा बनाएँ, न कि कोई वीरतापूर्ण बचाव अभियान। सार्वजनिक-क्षेत्र और भारी आउटसोर्स किए गए संदर्भों में, जहाँ सिस्टम अनुबंध के ज़रिए वेंडरों और टीमों के बीच से गुज़रते हैं, खोजने योग्य लिखित ज्ञान ही इकलौती चीज़ है जो हैंडओवर से बचकर निकलती है।
क्षेत्रीय दृष्टिकोण
स्टार्टअप। मुट्ठी भर इंजीनियरों और बचाने के लिए कोई रनवे न होने पर, केवल वही दस्तावेज़ीकृत करें जिसकी रात दो बजे के आउटेज या किसी नए हायर को वाकई ज़रूरत होगी: हर सेवा के लिए एक असली README, डिप्लॉय-और-रिकवर प्रक्रिया के लिए एक टेस्ट किया हुआ रनबुक जिससे सब डरते हैं, और उन निर्णयों पर कुछ दिनांकित नोट्स जिन्हें आप अन्यथा भूल जाते। अनुबंध से API दस्तावेज़ जनरेट करें ताकि आपको उन्हें कभी हाथ से अनुरक्षित न करना पड़े। एक दस्तावेज़ीकरण प्लेटफ़ॉर्म बनाने का विरोध करें; जब तक आपको वास्तविक दर्द महसूस न हो, कोड के पास मार्कअप का एक वर्ज़न्ड फ़ोल्डर काफ़ी है।
लघु व्यवसाय। बिना किसी तकनीकी लेखक और तंग बजट के साथ, एक स्टाफ़्ड कार्यक्रम के बजाय अपने टूल पहले से जो दस्तावेज़ीकरण जनरेट करते हैं उन पर और हल्के docs-as-code पर निर्भर रहें। इस चुनाव को खरीद-बनाम-बनाना के रूप में तैयार करें: ऐसे प्लेटफ़ॉर्म को प्राथमिकता दें जो अपना खुद का वर्तमान रेफ़रेंस और खोजने योग्य नॉलेज बेस बनाते हैं, न कि एक विकी जिसे आपको हाथ से संभालना पड़े। अपना दुर्लभ प्रयास उन दो या तीन दस्तावेज़ों पर खर्च करें जिनकी अनुपस्थिति व्यवसाय को रोक देगी, और किसी गलत या गायब पेज को स्वामित्व ठीक करने का ट्रिगर बनने दें।
एंटरप्राइज़। कई टीमों में समस्या एकरूपता और खोजनीयता की है: एक साझा docs-as-code पाइपलाइन, Diátaxis जैसी एक सामान्य संरचना, जनरेट किए गए API रेफ़रेंस और चेंजलॉग, और हर जगह एक ही तरह लागू निर्णय रिकॉर्ड ताकि ज्ञान दर्जनों विकी में न बिखरे। हर उच्च-मूल्य दस्तावेज़ के लिए स्वामित्व सौंपें और केवल मौजूदगी नहीं बल्कि सटीकता मापें। आर्किटेक्चर रिकॉर्ड, रनबुक, और निर्णय लॉग को ऑडिट सबूत मानें, और उन्हें बनाने के तरीके को मानकीकृत करें ताकि एक नियंत्रण समीक्षा को हड़बड़ी के बजाय एक दस्तावेज़ीकृत, बचाव योग्य निशान मिले।
सरकार। खरीद नियम और सार्वजनिक जवाबदेही दस्तावेज़ीकरण को एक शिष्टाचार नहीं बल्कि एक डिलिवरेबल बना देते हैं। आर्किटेक्चर दस्तावेज़ीकरण, रनबुक, और निर्णय रिकॉर्ड को अनुबंधों में अनिवार्य कलाकृतियों (artefacts) के रूप में लिखें, सटीकता के लिए समीक्षित, ताकि ज्ञान एक वेंडर परिवर्तन से बचकर निकले और सिस्टम को जो भी विरासत में लेता है वह इसे संचालित कर सके। आवश्यक करें कि कोई भी अधिकृत ऑपरेटर केवल रनबुक से किसी घटना पर प्रतिक्रिया दे सके, और निर्णय लॉग को इस बात के एक पारदर्शी सार्वजनिक रिकॉर्ड के रूप में रखें कि विकल्प क्यों बनाए गए थे। यहाँ पतला दस्तावेज़ीकरण कोई निजी असुविधा नहीं है; यह करदाता द्वारा वित्तपोषित महँगी रिवर्स-इंजीनियरिंग बन जाता है।
उदाहरण
स्टार्टअप। पाँच लोगों का एक स्टार्टअप हर सेवा के लिए एक असली README और उस एक डिप्लॉय-और-रिकवर प्रक्रिया के लिए एक छोटा रनबुक लिखता है जिससे सब डरते हैं, ताकि रात दो बजे का आउटेज सिस्टम को जानने वाले अकेले संस्थापक को जगाने पर निर्भर न हो। वे अनुबंध से API दस्तावेज़ जनरेट करते हैं बजाय इन्हें हाथ से लिखने के, और अपने डेटाबेस और अपने ऑथ दृष्टिकोण को क्यों चुना इसकी व्याख्या करते हुए कुछ दिनांकित नोट्स टिपते हैं। यह हल्का बना रहता है, लेकिन इसका मतलब है कि छठा और सातवाँ हायर सबको बाधित करने के बजाय दस्तावेज़ों से ऑनबोर्ड होते हैं।
एंटरप्राइज़। एक बड़ी सॉफ़्टवेयर कंपनी अपने सारे दस्तावेज़ीकरण को अपने कोड जैसी ही रिपॉज़िटरी में रखती है, मार्कअप में लिखा हुआ और उन्हीं पुल रिक्वेस्ट में समीक्षित जो उन बदलावों का वर्णन करते हैं जिन्हें वे बताते हैं। API रेफ़रेंस सेवा अनुबंधों से जनरेट होते हैं, इसलिए वे कभी बेमेल नहीं होते। चेंजलॉग संरचित कमिट से जनरेट होते हैं, और आर्किटेक्चर निर्णय रिकॉर्ड बड़े विकल्पों के पीछे के तर्क को सहेजते हैं। हर मर्ज पर एक प्रकाशित दस्तावेज़ीकरण साइट अपने आप बन जाती है। नए इंजीनियर तेज़ी से उत्पादक बन जाते हैं क्योंकि ऑनबोर्डिंग गाइड और रनबुक वर्तमान और खोजने योग्य हैं, और ऑन-कॉल इंजीनियर मूल लेखकों को पेज करने के बजाय रनबुक पर निर्भर रहते हैं।
सरकार। एक राष्ट्रीय एजेंसी एक छोड़कर जा रहे ठेकेदार से एक सिस्टम विरासत में लेती है, अनुबंध सीमा के पार ज्ञान ले जाने के लिए पूरी तरह से दस्तावेज़ीकरण पर निर्भर रहती है। क्योंकि पिछले वेंडर ने आर्किटेक्चर दस्तावेज़ीकरण, रनबुक, और निर्णय रिकॉर्ड को अनिवार्य डिलिवरेबल के रूप में बनाए रखा था, नई टीम मूल लेखकों के बिना सिस्टम को संचालित और संशोधित कर सकती है। जहाँ दस्तावेज़ीकरण पतला था, एजेंसी को महँगी रिवर्स-इंजीनियरिंग का सामना करना पड़ता है। वह अनुभव एक नई नीति को संचालित करता है: दस्तावेज़ीकरण एक संविदात्मक डिलिवरेबल है, जिसे एक बाद के विचार के रूप में नहीं बल्कि सटीकता के लिए समीक्षित किया जाता है, और रनबुक को किसी भी अधिकृत ऑपरेटर को घटनाओं पर प्रतिक्रिया देने देना चाहिए।
व्यावसायिक मामला: प्रेरणाएँ, ROI, और TCO
दस्तावेज़ीकरण आपको छोटे ऑनबोर्डिंग समय, कम की-पर्सन जोखिम, तेज़ घटना प्रतिक्रिया, और किसी सिस्टम के जीवन में बदलाव की कम लागत के रूप में वापस भुगतान करता है। नए इंजीनियर हफ़्तों के बजाय दिनों में उत्पादकता तक पहुँचना, ऑन-कॉल स्टाफ़ एस्केलेट करने के बजाय एक रनबुक से घटनाओं को हल करना, अनुरक्षक किसी सिस्टम को बनने के वर्षों बाद भी आत्मविश्वास से बदलना: ये बड़ी, बार-बार होने वाली बचतें हैं जो एक बड़े संगठन और एक लंबे सिस्टम जीवनकाल में संचित (compound) होती जाती हैं।
दस्तावेज़ीकरण की कीमत क्या है? लेखन और अनुरक्षण का प्रयास। दस्तावेज़ीकरण न करने की कीमत क्या है? आप लगातार भुगतान करते हैं: धीमी ऑनबोर्डिंग में, दोहराए गए सवालों में, की-पर्सन बॉटलनेक में, धीमी घटना रिकवरी में, और चरम स्थिति में, ऐसे सिस्टम जिन्हें कोई सुरक्षित रूप से बदल नहीं सकता, जो महँगी पुनर्लेखन या रिवर्स-इंजीनियरिंग को मजबूर करते हैं। वेंडर-परिवर्तन और ऑडिट परिदृश्यों में, गायब दस्तावेज़ीकरण प्रत्यक्ष संविदात्मक और अनुपालन लागत ला सकता है। नेतृत्व के सामने मामला बनाने के लिए, ऑनबोर्डिंग समय, घटना-प्रतिक्रिया समय, और कितना महत्वपूर्ण ज्ञान व्यक्तिगत दिमाग़ों में बैठा है, इस पर आँकड़े रखें। फिर docs-as-code और जनरेशन को एक मेल खाते अनुरक्षण बोझ के बिना टिकाऊ दस्तावेज़ीकरण पाने के तरीकों के रूप में तैयार करें। और इस पर ज़ोर दें कि गलत दस्तावेज़ीकरण एक दायित्व है, इसलिए निवेश में इसे अद्यतन बनाए रखना भी शामिल होना चाहिए।
एंटी-पैटर्न और नुकसान
- वर्तमान के रूप में पेश किया गया पुराना दस्तावेज़ीकरण: पाठकों को गुमराह करता है और सारे दस्तावेज़ीकरण में भरोसे को नष्ट कर देता है।
- एक-बार-लिखो विकी: पेज बनाए गए और कभी अपडेट नहीं हुए, चुपचाप वास्तविकता से बेमेल होते हुए।
- दस्तावेज़ीकरण विखंडन: ज्ञान बहुत सारे टूल और विकी में बिखरा हुआ ताकि कुछ भी न ढूँढा जा सके।
- दस्तावेज़ीकरण प्रकारों को मिलाना: ट्यूटोरियल, रेफ़रेंस, और स्पष्टीकरण एक पेज पर गड्डमड्ड, किसी भी पाठक की अच्छी सेवा नहीं करते।
- जनरेट करने योग्य सामग्री को हाथ से अनुरक्षित करना: हाथ से लिखे गए API दस्तावेज़ जो अनिवार्य रूप से असली इंटरफ़ेस से अलग हो जाते हैं।
- कबीलाई ज्ञान (tribal knowledge): महत्वपूर्ण समझ केवल लोगों के दिमाग़ और चैट इतिहास में रखी हुई, जो उनके जाने पर खो जाती है।
- एक बाद के विचार के रूप में दस्तावेज़ीकरण: अंत में लिखा गया, अगर बिल्कुल भी लिखा गया, बदलाव के साथ-साथ नहीं।
- कोई स्वामित्व नहीं: ऐसे दस्तावेज़ जिनका कोई ज़िम्मेदार मालिक नहीं है, सड़ जाते हैं क्योंकि उन्हें अपडेट करना किसी का काम नहीं है।
परिपक्वता मॉडल
- लेवल 1, आरंभ। दस्तावेज़ीकरण विरल, बिखरा हुआ, और पुराना है, और ज्ञान लोगों के दिमाग़ में रहता है। जो मौजूद है वह एक बार लिखा गया और फिर कभी नहीं छुआ गया, इसलिए एक आउटेज या एक प्रस्थान का मतलब है सिस्टम की रिवर्स-इंजीनियरिंग करना।
- लेवल 2, विकास। मुख्य दस्तावेज़ मौजूद हैं, जैसे README और कुछ रनबुक, लेकिन इन्हें असंगत रूप से अनुरक्षित किया जाता है और ढूँढना मुश्किल है। कुछ टीमें अच्छी तरह दस्तावेज़ीकृत करती हैं और अन्य मुश्किल से ही, और इस बात की कोई साझा अपेक्षा नहीं है कि किसी रिपॉज़िटरी को क्या रखना चाहिए या यह कहाँ रहना चाहिए।
- लेवल 3, मानकीकरण। Docs-as-code पूरे संगठन में मानक है: Diátaxis जैसी एक सामान्य संरचना, जनरेट किए गए API रेफ़रेंस और चेंजलॉग, निर्णय रिकॉर्ड, और समीक्षा में यह अपेक्षा कि दस्तावेज़ उस कोड के साथ बदलते हैं जिसका वे वर्णन करते हैं। हर उच्च-मूल्य दस्तावेज़ का एक नामित मालिक है, और वास्तविक खोज वाला एक जाना-पहचाना ठिकाना है।
- लेवल 4, प्रबंधन। दस्तावेज़ीकरण को केवल मौजूद ही नहीं, बल्कि मापा जाता है। आप आवश्यक दस्तावेज़ों के कवरेज, कोड-बदलाव दर के मुक़ाबले दस्तावेज़-बदलाव दर, ऑनबोर्डिंग समय, केवल रनबुक से घटना समाधान, और एक परिभाषित पुरानेपन थ्रेशोल्ड के मुक़ाबले ताज़गी को ट्रैक करते हैं, और आप उन मेट्रिक्स की बेसलाइन के मुक़ाबले समीक्षा करते हैं। सड़न को जनरेशन, सिस्टम के ख़िलाफ़ टेस्ट, और लिंक व सटीकता जाँचों के ज़रिए यंत्रवत् पकड़ा जाता है, और पुराने पेजों को संयोग के बजाय सबूत पर फ़्लैग या काटा जाता है।
- लेवल 5, ऑर्केस्ट्रेशन। दस्तावेज़ीकरण निरंतर सुधरता है और पूरे संगठन में एकीकृत है: जीवंत, ज़्यादातर जनरेट किया हुआ या सिस्टम के ख़िलाफ़ टेस्ट किया हुआ, स्वामित्व वाला, खोजने योग्य, और अनुकूलनीय। मेट्रिक्स इस बात में फ़ीड होते हैं कि आप कहाँ निवेश करते हैं, अव्यक्त ज्ञान को काम के एक नियमित हिस्से के रूप में पकड़ा जाता है, और जैसे-जैसे सिस्टम, टीमें, और पाठक बदलते हैं, संग्रह को सक्रिय रूप से फिर से संतुलित और काटा जाता है।
चर्चा के लिए विचार
- कौन-सा दस्तावेज़ीकरण, अगर कल गायब हो जाए, तो आपके संगठन को सबसे ज़्यादा नुकसान पहुँचाएगा, और क्या यह अभी मौजूद है और अद्यतन बना रहता है?
- आप दस्तावेज़ीकरण को अपडेट करने को कोड बदलने का एक अलग काम बनाने के बजाय एक स्वाभाविक हिस्सा कैसे बनाते हैं?
- आप हाथ से लिखे गए दस्तावेज़ीकरण को सत्य के स्रोत से जुड़े जनरेट किए गए दस्तावेज़ीकरण से कहाँ बदल सकते हैं?
- आप कैसे मापते हैं कि आपका दस्तावेज़ीकरण सटीक और उपयोग में है, सिर्फ़ मौजूद नहीं?
- AI सहायकों को यह कैसे बदलना चाहिए कि आप दस्तावेज़ीकरण कैसे लिखते, अनुरक्षित करते, और खोजते हैं, और वे कहाँ प्रशंसनीय-मगर-गलत सामग्री ला सकते हैं?
- जिन लोगों के पास अव्यक्त ज्ञान है उनके जाने से पहले आप उसे कैसे पकड़ते हैं?
मुख्य निष्कर्ष
- दस्तावेज़ीकरण को कोड की तरह मानें: वर्ज़न्ड, समीक्षित, स्रोत के करीब, और स्वचालित रूप से प्रकाशित।
- ट्यूटोरियल, हाउ-टू गाइड, रेफ़रेंस, और स्पष्टीकरण का उपयोग करके सामग्री को पाठक की ज़रूरत के अनुसार संरचित करें।
- उच्च-मूल्य वाली ज़रूरी चीज़ों को बनाए रखें: README, रनबुक, आर्किटेक्चर दस्तावेज़, ऑनबोर्डिंग, और निर्णय रिकॉर्ड।
- API दस्तावेज़ और चेंजलॉग जनरेट करें ताकि वे सत्य के स्रोत से बेमेल न हो सकें।
- स्वामित्व, समीक्षा अपेक्षाओं, और छंटाई के साथ सड़न से लड़ें; गलत दस्तावेज़ीकरण किसी दस्तावेज़ीकरण के न होने से भी बदतर है।
संदर्भ और आगे पढ़ने के लिए
- Daniele Procida, Diátaxis documentation framework
- Andrew Etter, Modern Technical Writing
- Anne Gentle, Docs Like Code
- Google, Developer Documentation Style Guide and Season of Docs guidance (as reference exemplars)
- Michael Nygard, Documenting Architecture Decisions (architecture decision records)
- Andrew Hunt and David Thomas, The Pragmatic Programmer (on knowledge and documentation)
- Keep a Changelog (as a reference convention)