काउंटर हटाने पर असल में क्या-क्या मिटता है
यहाँ काउंटर हटाने पर 33 टेबल खाली होती हैं। कल तक इससे 25 खाली होती थीं।
जो आठ छूट गई थीं, वे सब एक दिन पहले बनाई गई थीं, सुबह 11:10 से दोपहर 15:10 के बीच।
हटाना कैसे काम करता है
काउंटर का मालिक अपना काउंटर हटा सकता है। इसके लिए एक POST अनुरोध, मालिक का टोकन और हाथ से टाइप किया गया काउंटर नंबर चाहिए, क्योंकि यह काम वापस नहीं लिया जा सकता। कुछ भी अलग रखकर नहीं बचाया जाता: छिपी हुई कॉपी रखना ठीक उसका उलटा होता, जो माँगा गया था, और जिसे कॉपी चाहिए, उसके लिए एक्सपोर्ट लिंक बटन के ठीक ऊपर मौजूद हैं।
फिर टेबल की एक सूची एक ही ट्रांज़ैक्शन में खाली की जाती है, मुख्य टेबल सबसे आखिर में, और आर्काइव में एक निशान (टॉम्बस्टोन) छोड़ा जाता है, ताकि यह नंबर कभी किसी और को न दिया जा सके। अगर कोई भी हिस्सा विफल हो जाए, तो पूरा काम वापस पलट दिया जाता है। आधा हटाने से अच्छा है कि कुछ भी न हटे।
फ़ाइल में इस सूची के ऊपर यह कमेंट लिखा है:
“हर वह टेबल, जो इस काउंटर के बारे में कुछ जानती है। सूची के रूप में, कोड में बिखरी हुई नहीं: जो कुछ यहाँ छूट जाता है, वह अनाथ पंक्ति बनकर पीछे रह जाता है, और किसी को पता नहीं चलता।”
कमी पैदा होने से एक दिन पहले ही कमेंट ने उसका वर्णन कर दिया था
कल एक नई सुविधा के लिए छह नई टेबल आईं — पेज पर समय, स्क्रॉल की गहराई, एग्ज़िट पेज — और उनके साथ दो और। 11:10 से 15:10 के बीच।
हटाने वाली सूची उसी दिन बदली गई थी, एक दूसरी नई टेबल जोड़ने के लिए। आठों टेबल उसके बाद आईं, और सूची फिर नहीं बदली। इसलिए एक दोपहर तक काउंटर हटाने पर व्यवहार से जुड़े डेटा की 4,840 पंक्तियाँ आठ टेबल में बिखरी हुई पीछे रह जाती थीं। अगले दिन यह कमी मिली और बंद कर दी गई; इससे जो बात सामने आई, वह यह है कि सूची को पूरा रखने के लिए याददाश्त के अलावा किसी और चीज़ की ज़रूरत थी।
यह लापरवाही की कहानी नहीं है। किसी ने सूची लिखी, ठीक-ठीक समझा कि यह सूची क्यों है, लिखा कि इसके पिछड़ जाने पर क्या होता है, और उसी दिन एक टेबल के लिए इसे अपडेट भी किया। फिर भी यह पिछड़ गई, क्योंकि दो चीज़ों को याद के भरोसे एक-दूसरे से मेल में रखना ऐसा काम है, जिसे इंसान भरोसेमंद ढंग से करते रहते हैं – ठीक उस दोपहर तक, जब वे नहीं करते।
सुधार, और दूसरा सुधार
आठों नाम अब सूची में हैं। उन्हें अंत में जोड़ने के बजाय वर्णानुक्रम में उनकी जगह पर डाला गया, क्योंकि क्रम से लगी सूची में कमी दिख जाती है, जबकि सिर्फ़ अंत में जुड़ती जाने वाली सूची में नहीं।
यह छोटा सुधार है। जो सुधार मायने रखता है, वह एक स्क्रिप्ट है, जो डेटाबेस से पूछती है कि किन टेबल में काउंटर नंबर है, सूची को दोहराने के बजाय उसे सोर्स फ़ाइल से पढ़ती है, और दोनों की तुलना करती है। जो भी नई टेबल जोड़ता है, वह इसे एक बार चलाता है। इसे उस तरह भुलाया नहीं जा सकता, जैसे किसी सूची को, क्योंकि यह कुछ भी सहेजकर नहीं रखती — यह हर बार जवाब स्कीमा से निकालती है।
पहली बार चलने पर ही इसे कुछ और भी मिला: आठ और टेबल में 25 पंक्तियाँ, जिनका काउंटर नंबर न लाइव टेबल में है और न आर्काइव में। ये हटाए गए काउंटर नहीं हैं — वे टॉम्बस्टोन छोड़ जाते हैं। ये ऐसे नंबर थे, जो किसी के भी नहीं थे, ज़्यादातर साफ़ तौर पर टेस्ट नंबर, उस समय के, जब आर्काइव वाली जाँच मौजूद नहीं थी। इन्हें वेब रूट के बाहर एक फ़ाइल में लिखा गया और फिर हटा दिया गया।
इससे निकलने वाला आम सबक
जिस भी सूची को किसी और चीज़ के साथ मेल में रखना हो, वह देर-सबेर मेल से बाहर हो जाएगी, और यह कमी दिखाई नहीं देगी, क्योंकि जिस सूची से कोई प्रविष्टि छूटी हो, वह बिल्कुल पूरी सूची जैसी ही दिखती है।
बचाव अनुशासन नहीं है। बचाव यह है कि एक पक्ष को दूसरे से निकाला जाए और जाँचा जाए कि दोनों मेल खाते हैं — और यह जाँच उसी पल चलाई जाए, जब कोई नई चीज़ जोड़ता है, न कि उस पल, जब किसी के मन में सवाल उठता है।
सूची के ऊपर लिखा कमेंट एक शब्द को छोड़कर हर बात में सही था। उसमें लिखा था कि किसी को पता नहीं चलता। पता चला, एक दिन बाद, क्योंकि किसी ने याददाश्त के बजाय स्क्रिप्ट से खोजबीन की।