
एक असली वर्शन 2 में सचमुच क्या लगता है: ईमानदार स्थितियों के 206 कमिट
GeekBye v2 कोई फ़ीचर रिलीज़ नहीं था। यह एक ही विचार पर निशाना साधे 206 कमिट थे: ऐप को अपनी ही स्थिति के बारे में कभी झूठ नहीं बोलना चाहिए। इसकी कीमत क्या है, वह यहाँ है — उस एक-लाइन लॉकफ़ाइल की गलती समेत जिसने हमें कुछ भी शिप करने से लगभग रोक दिया था।
ज़्यादातर "वर्शन 2" रिलीज़ नए फ़ीचरों का ढेर होती हैं जिन पर एक बड़ा नंबर चिपका होता है। GeekBye v2 इसका उलटा था। इसने यूज़र को दिखने वाली लगभग कोई नई क्षमता शिप नहीं की। इसके 206 कमिट एक ही, बिना चमक-दमक वाले विचार पर निशाना साधे थे:
ऐप को आपको ऐसी स्थिति नहीं दिखानी चाहिए जो सच न हो।
यह ज़ाहिर लगता है — जब तक आप गिनना शुरू न करें कि एक डेस्कटॉप ऐप कितने तरीकों से चुपचाप झूठ बोलता है। यह उस अपलोड पर टिकमार्क दिखाता है जो अभी भी रास्ते में है। यह उस सॉकेट पर "कनेक्टेड" कहता है जो एक मिनट पहले मर चुका है। जब आपका ट्रांसक्रिप्ट फ़र्श पर गिराया जा रहा होता है, तब यह चुप रहता है। इनमें से कोई भी क्रैश नहीं है। ये क्रैश से भी बदतर हैं, क्योंकि ऐप गलत होते हुए भी ठीक दिखता है — और आपको बाद में पता चलता है, जब वह रिकॉर्डिंग जिसकी आपको ज़रूरत थी वहाँ नहीं होती।
v2 वह रिलीज़ थी जहाँ हम इन छोटे झूठों में से हर एक का शिकार करने निकले।
वह झूठ जिससे हमें सबसे ज़्यादा नफ़रत थी: वह अपलोड जो "हो गया"
GeekBye आपकी रिकॉर्डिंग को आपके Google Drive पर बैकअप कर सकता है। v1 में Drive से कनेक्शन को एक पृष्ठभूमि विवरण की तरह लिया जाता था — अगर चला तो ठीक; अगर नहीं चला, तो वह विफलता ज़्यादातर अदृश्य रहती। ऐप कनेक्टेड दिखता हुआ चलता रहता। आप मान लेते कि आपकी रिकॉर्डिंग सुरक्षित हैं। कभी-कभी वे नहीं होतीं।
v2 ने इसे ईमानदार कनेक्शन स्थितियों के इर्द-गिर्द फिर से बनाया। Drive अब हमेशा कुछ स्पष्ट, सच्ची स्थितियों में से एक में रहता है — कनेक्टेड, रीकनेक्ट हो रहा, डिस्कनेक्टेड — और ऐप उस स्थिति के हर बदलाव को उसी पल पूरे इंटरफ़ेस में प्रसारित कर देता है जब वह होता है। जब कनेक्शन टूट जाता है, एक ग्लोबल रीकनेक्ट बैनर आपको हर जगह, साफ़-साफ़ बता देता है। ऐप अब यह नाटक नहीं करता कि अपलोड सफल हुआ जबकि नहीं हुआ। अगर आपका बैकअप अभी नहीं हो सकता, तो आपको अभी पता चल जाता है — अगले हफ़्ते नहीं जब आप वह फ़ाइल ढूँढने जाते हैं।
नीचे यह एक छोटी आर्किटेक्चर है, कोई नारा नहीं: कनेक्शन के लिए सत्य का एक ही स्रोत, एक इवेंट जो बदलने पर UI के हर हिस्से तक फैल जाता है, और एक बैनर जो सीधे उस स्थिति से पढ़ता है। ऐसा कोई रास्ता नहीं है जहाँ कनेक्शन टूटा हो और UI जुड़ा हुआ दिखे, क्योंकि दोनों एक ही तथ्य से पढ़ते हैं।
खोई हुई रिकॉर्डिंग का झूठ
दूसरा बड़ा ईमानदारी-सुधार था रिकॉर्डिंग रिकवरी। रियल-टाइम ट्रांसक्रिप्शन को एक ज़िंदा कनेक्शन चाहिए। v1 में, अगर वह कनेक्शन सेशन के बीच में हिचकी ले लेता — Wi-Fi का एक झपका, एक टनल, एक VPN रीकनेक्ट — तो उस अंतराल का ऑडियो बस गायब हो सकता था। ट्रांसक्रिप्ट में एक छेद रह जाता, और कुछ भी आपको नहीं बताता।
v2 ने अनुबंध बदल दिया: ऑडियो को कनेक्शन टूटने के दौरान लोकली सहेजा जाता है और बाद में मिलान किया जाता है। जब लिंक गिरता है, GeekBye ऑडियो को आपकी मशीन पर सुरक्षित रखता है; जब वह वापस आता है, वह बफ़र किया गया ऑडियो भेजा जाता है और सही जगह पर ट्रांसक्रिप्ट में सिल दिया जाता है। नेटवर्क के खराब तीस सेकंड अब आपको मीटिंग के तीस सेकंड नहीं गँवाते। यही वह नींव है जिस पर बाद की विश्वसनीयता रिलीज़ें सीधे बनीं — खराब Wi-Fi पर आपका AI नोटटेकर क्यों रुक जाता है में जो रीकनेक्ट-और-बफ़र मशीनरी है, वह यही विचार है, और मज़बूत किया हुआ।
पॉपअप-तूफ़ान का झूठ
ऐप जिस तरह गड़बड़ी की रिपोर्ट करते हैं, उसमें एक और सूक्ष्म बेईमानी छिपी है: वे ज़रूरत से ज़्यादा रिपोर्ट करते हैं। एक अस्थिर नेटवर्क पल एक ही त्रुटि को पाँच बार दाग सकता है, और अचानक आपके पास एक जैसे लाल टोस्ट का ढेर लग जाता है जो उस एक संदेश को दबा देता है जो असल में मायने रखता है। वह भी ईमानदार नहीं है — वह सूचना का नाटक करता शोर है।
इसलिए v2 ने श्रेणी-आधारित टोस्ट थ्रॉटलिंग और त्रुटि रूटिंग जोड़ी। त्रुटियों को इस आधार पर समूहीकृत किया जाता है कि वे असल में क्या हैं, और हर श्रेणी को दर-सीमित किया जाता है, ताकि एक ही अंतर्निहित समस्या एक साफ़ संदेश पैदा करे, बौछार नहीं। दर-सीमा वाली समस्या दर-सीमा संदेश पर रूट होती है; कनेक्शन वाली समस्या कनेक्शन संदेश पर। ऐप आपको बताता है क्या सच है, एक बार — वही अनुशासन जिसने बाद में जिस दिन हमारे ऐप ने खुद को DDoS किया में एक 429 को लॉगआउट का भेस धरने से रोका।
असली मुद्दा 206 का नंबर है
ईमानदार स्थितियाँ, रीकनेक्ट बैनर, रिकॉर्डिंग रिकवरी, टोस्ट रूटिंग — ये चार विचार हैं। रिलीज़ 206 कमिट की थी। बाकी कहाँ गए?
उस बिना-चमक वाली लंबी पूँछ में जो "कभी कोई झूठी स्थिति न दिखाओ" असल में माँगती है। हर वह जगह जहाँ पुराना UI हकीकत से बेमेल हो सकता था, उसे ढूँढकर फिर से जोड़ना पड़ा ताकि वह किसी बासी प्रति के बजाय सत्य से पढ़े। हर रीकनेक्ट रास्ते को इस तरह बनाना पड़ा कि वह लोकली अंदाज़ा लगाने के बजाय साझा स्थिति को अपडेट करे। रिकॉर्डिंग, ट्रांसक्रिप्शन और अपलोड में फैले दर्जनों छोटे विश्वसनीयता-सुधार — हर एक ने एक खास दरार बंद की जहाँ ऐप सही दिखते हुए गलत हो सकता था।
यही एक असली "वर्शन 2" की कीमत है जब लक्ष्य फ़ीचर नहीं, भरोसा हो। कोई एक हेडलाइन कमिट नहीं है। 206 छोटे कमिट हैं, और रिलीज़ सिर्फ़ एक ही चीज़ महसूस होती है — शांति — क्योंकि सभी 206 एक ही दिशा में खींचते हैं।
रिलीज़ लगभग शिप नहीं हुई
यहाँ युद्ध-कथा है, और अच्छी है, क्योंकि यह हमारे अपने ऐप के हमसे झूठ बोलने की है।
जब आप एक रिलीज़ काटते हैं, एक वर्शन-बंप स्क्रिप्ट नया नंबर पूरे प्रोजेक्ट पर छाप देती है। v2.0.0 पर इसने ऐप का वर्शन अपडेट किया — पर package-lock.json, npm का सटीक डिपेंडेंसी बहीखाता, पुराने वर्शन 1.9.0 की ओर इशारा करता छूट गया। लोकल पर सब ठीक था; बिल्ड करने भर के लिए कोई डिपेंडेंसी दोबारा इंस्टॉल नहीं करता। पर CI npm ci चलाता है, और npm ci का पूरा काम है अगर लॉकफ़ाइल मैनिफ़ेस्ट से असहमत हो तो आगे बढ़ने से इनकार करना। यह एक सख़्ती-फ़ीचर है — और इसने ठीक वही किया जो इसे करना चाहिए, हमारी अब तक की सबसे बड़ी रिलीज़ के बिल्ड को फ़ेल करके।
फिर उसके नीचे एक दूसरी, ज़्यादा चालाक समस्या उभरी। एक नए npm ने एक वैकल्पिक ट्रांज़िटिव डिपेंडेंसी को छाँट दिया था — वह encoding पैकेज जिसे node-fetch खींचता है — गैर-ज़रूरी मानकर, लॉकफ़ाइल से। सिवाय इसके कि हमारे CI के क्लीन इंस्टॉल को उसकी ज़रूरत थी, तो इंस्टॉल एक ऐसे तरीके से टूटा जिसका हमारे कोड से कोई लेना-देना नहीं था और सब कुछ इस बात से था कि बहीखाता सूक्ष्म रूप से गलत था।
दोनों एक-लाइन के सुधार थे: लॉकफ़ाइल को असली वर्शन से फिर से सिंक करना, छाँटी गई एंट्री को बहाल करना। दोनों उसी चीज़ के बिल्कुल सटीक और विनम्र बनाने वाले उदाहरण भी हैं जिसके बारे में v2 था — एक ऐसी स्थिति जिसने सच होने का दावा किया पर थी नहीं। लॉकफ़ाइल को ऐप जिस पर निर्भर है उसका ईमानदार रिकॉर्ड होना चाहिए। जब वह हकीकत से भटका, तो बिल्ड ने ठीक वही किया जो हमारा ऐप अब यूज़र्स के लिए करता है: उसने यह नाटक करने से इनकार कर दिया कि सब ठीक है। पता चलता है कि एक विश्वसनीयता रिलीज़ शिप करना, नीचे तक एक विश्वसनीयता समस्या ही है।
तीन बातें जो v2 ने हमें सिखाईं
- खतरनाक विफलताएँ वे हैं जो चुप हैं। एक क्रैश खुद घोषणा करता है। एक झूठा "कनेक्टेड", एक भूतिया सफल अपलोड, एक अदृश्य छेद वाला ट्रांसक्रिप्ट — ये आपका भरोसा इसीलिए तोड़ते हैं क्योंकि कुछ भी गलत नहीं दिखता। चुप झूठों का शिकार करो।
- ईमानदारी एक आर्किटेक्चर है, कोई संदेश नहीं। आप "सच बोलो" को एक बैनर की तरह UI पर चिपका नहीं सकते। बैनर को बाकी सब की तरह उसी एक सत्य-स्रोत से पढ़ना होगा, वरना वह खुद एक और चीज़ बन जाता है जो गलत हो सकती है। एक तथ्य, फैलाया हुआ — कभी दो प्रतियाँ नहीं जो आपस में असहमत हो सकें।
- अपने नंबर के लायक एक वर्शन 2 ज़्यादातर अदृश्य होता है। अगर आपका v2 एक फ़ीचर-लिस्ट है, तो वह मार्केटिंग वाला v1.5 है। एक असली v2 वे 206 कमिट हैं जिन्हें कोई अलग-अलग नहीं दिखा सकता, जो मिलकर एक ऐसा प्रोडक्ट बनते हैं जो बस आपसे झूठ बोलना बंद कर देता है।
GeekBye v2.0.0 वह नींव है जिस पर तब से हर रिलीज़ बनी है। वह नींव क्या ढोती है, इसके लिए देखें खराब Wi-Fi पर आपका AI नोटटेकर क्यों रुक जाता है, जिस दिन हमारे ऐप ने खुद को DDoS किया(v2.0.1), और जब फ़ायरवॉल WebSocket ब्लॉक करता है तब लाइव ट्रांसक्रिप्शन(v2.0.8)। उस शांति के लिए जिसकी सेवा में यह सब था, देखें GeekBye v2 में नया क्या है।