सॉफ्टवेअर बनवणे हे एखाद्या सार्वजनिक सादरीकरणासारखे वाटू शकते. इंटरनेट लाँच, स्क्रीनशॉट्स आणि चेंजलॉगमधील बुलेट पॉइंट्सना महत्त्व देते. त्यामुळे जेव्हा एखादा डेव्हलपर संपूर्ण सत्र एका प्रोजेक्टवर घालवतो आणि दाखवण्यासाठी काहीही दृश्य स्वरूपात नसते, तेव्हा तो दिवस वाया गेला असे वाटणे स्वाभाविक आहे. Food Blog Platform चा नवीनतम डेव्हलपमेंट लॉग (dev log) याच्या अगदी उलट सिद्ध करतो. तिथे दाखवण्यासाठी कोणतेही नवीन रेसिपीज नव्हत्या, कोणतेही रिडिझाइन केलेले कार्ड्स नव्हते किंवा युजर्सना क्लिक करण्यासाठी कोणतेही अतिरिक्त बटन्स नव्हते. फक्त असा कोड होता ज्याची फोडफोड केली गेली, त्याचे परीक्षण केले गेले आणि आधीपेक्षा अधिक चांगल्या प्रकारे पुन्हा एकत्र जोडले गेले.

हे ते अदृश्य काम आहे जे दीर्घकालीन प्रोजेक्ट्स जिवंत ठेवते.

फीचर्सना प्रसिद्धी मिळते; रिफॅक्टरिंग (Refactoring) प्रकल्प चालू ठेवते

जेव्हा तुम्ही फूड ब्लॉग प्लॅटफॉर्म मेंटेन करता, तेव्हा वरवर पाहता ते साधे वाटते. युजर्स रेसिपी पोस्ट करतात, फोटो अपलोड करतात आणि कॅटेगरीनुसार ब्राउझ करतात. पण त्याखाली, तुम्ही इमेज पाइपलाईन्स, घटक आणि सूचनांमधील डेटाबेस रिलेशनशिप्स (database relationships), सर्च इंडेक्स आणि कॅशिंग लेयर्स सांभाळत असता. काळानुसार, तात्पुरते उपाय (quick fixes) साचत जातात. तीन वेगवेगळ्या फाईल्समध्ये कॉपी केलेले एक हेल्पर फंक्शन. एक डेटाबेस क्वेरी जी दहा पोस्टसाठी योग्य होती, पण हजार पोस्ट्स झाल्यावर अत्यंत संथ होते. CSS जे सुरुवातीला व्यवस्थित होते, पण पाच आपत्कालीन पॅचेसमुळे ते एका चक्रव्यूहासारखे झाले.

रिफॅक्टरिंग म्हणजे त्या गोंधळाचा थेट सामना करणे. याचा अर्थ ड्युप्लिकेट लॉजिक एकत्रित करणे असा असू शकतो, जेणेकरून रेसिपी एडिटिंग फॉर्म आणि ॲडमिन डॅशबोर्ड दोन्ही एकाच व्हॅलिडेशन लेयरचा वापर करतील, त्याऐवजी दोन वेगळी व्हर्जन मेंटेन करण्याची गरज पडणार नाही. याचा अर्थ इमेज प्रोसेसिंग सोपे करणे असा असू शकतो, जेणेकरून प्रत्येक वेळी पेज रीलोड होताना कॉम्प्रेशन रुटीन चालण्याऐवजी ते एकदाच चालेल. किंवा कोडबेसची पुनर्रचना करणे असाही याचा अर्थ असू शकतो, जेणेकरून भविष्यात नवीन कंटेंट टाईप जोडताना सहा वेगवेगळ्या डिरेक्टरीजमध्ये शोध घेण्याची गरज पडणार नाही.

यापैकी काहीही युजर इंटरफेसमध्ये (UI) दिसत नाही. साइटवर येणाऱ्या व्हिजिटरला "क्वेरी ऑप्टिमाइझ्ड" किंवा "कंपोनंट डिकपल्ड" असे लिहिलेले बॅनर दिसणार नाही. पण साइट वेगाने लोड होत असेल, तेव्हा त्यांना त्याचा अनुभव येईल. जेव्हा एखादे नवीन फीचर विनंती केल्यावर तीन आठवड्यांऐवजी तीन दिवसांत येते, तेव्हा त्यांना ते जाणवेल. डेव्हलपरने आज नवीन क्षमता (capabilities) जोडल्या नाहीत; त्यांनी फक्त मार्ग मोकळा केला आहे जेणेकरून भविष्यात कोडबेसशी संघर्ष न करता नवीन क्षमता सहज जोडता येतील.

क्लीन कोड (Clean Code) हा भविष्यातील अपयशाविरुद्धचा एक गुंतवणूक आहे

एक महिन्यापेक्षा जास्त काळ टिकणारा प्रत्येक प्रोजेक्ट काही ना काही अडथळे (friction) साचवून ठेवतो. तुम्ही एखादी कल्पना तपासण्यासाठी एक क्विक प्रोटोटाइप बनवता. मग खरोखर युजर्स येतात. त्यानंतर तुम्हाला ऑथेंटिकेशन लेयर, मॉडरेशन क्यू आणि मोबाईल लेआउटची गरज भासते. यातील प्रत्येक नवीन गोष्ट आधीपासून असलेल्या स्ट्रक्चरला जोडली जाते. नियमित देखभालीशिवाय, आर्किटेक्चर एखाद्या अशा घरासारखे वाटू लागते जिथे प्रत्येक नवीन खोली एका वेगळ्या व्यक्तीने डिझाइन केली आहे, ज्याने कधीही मूळ प्लॅन पाहिला नव्हता.

टेक्निकल डेट (Technical debt) म्हणजे शिस्तीचा अभाव नव्हे. एखादी गोष्ट प्रत्यक्षात आणण्यासाठी घेतलेल्या तडजोडीचा तो एक नैसर्गिक परिणाम आहे. धोका तुमच्या कोडमध्ये त्रुटी असण्यात नाही, तर तो इतका काळ त्रुटीपूर्ण ठेवण्यात आहे की एक व्हेरिएबल बदलल्यामुळे तीन इतर फीचर्स बिघडू लागतात. तुम्हाला सर्च बारला स्पर्श करायलाही भीती वाटू लागते कारण गेल्या वेळी प्रयत्न केल्यावर टॅग सिस्टम बिघडली होती. तुम्ही मील-प्लॅनर विजेट जोडण्याचे काम पुढे ढकलून देता कारण तुम्हाला माहित आहे की डेटाबेस स्कीमा इतका गुंतागुंतीचा झाला आहे की तो सोडवण्यासाठी तासनतास लागतील.

रिफॅक्टरिंगसाठी एक दिवस खर्च करणे म्हणजे व्याज तुमच्यावर ओझे बनण्यापूर्वी ते कर्ज फेडण्यासारखे आहे. हे लहान समस्या मोठ्या समस्यांमध्ये रूपांतरित होण्यापासून रोखते. जेव्हा Food Blog Platform शेवटी त्याचे पुढचे मोठे फीचर जोडेल, तेव्हा डेव्हलपरला नाजूक (brittle) कोडभोवती फिरण्याची गरज पडणार नाही. ते नवीन लॉजिक लिहितील, ते एका क्लीन इंटरफेसमध्ये प्लग करतील आणि पुढे बढ़तील. हाच गुंतवणुकीवरील परतावा (return on investment) आहे.

लहान पावले, खरे शिक्षण

सॉफ्टवेअर डेव्हलपमेंटबद्दल एक समज आहे की प्रगती म्हणजे एखादा विलक्षण शोध किंवा रात्रभर सर्व काही पुन्हा लिहिणारे मॅरेथॉन कोडिंग सेशन्स असतात. बहुतेक कार्यरत डेव्हलपर्स तुम्हाला सांगतील की हे केवळ एक स्वप्न आहे. खरी प्रगती म्हणजे एखाद्या मंगळवारच्या दुपारचा 'diff' आहे, जिथे तीन फंक्शन्स लहान झाली, एक अनावश्यक डिपेंडन्सी काढली गेली आणि एका गोंधळवाच्या व्हेरिएबलचे नाव बदलले गेले जेणेकरून पुढच्या वाचकाला ते नक्की काय करते हे समजेल.

Food Blog Platform चा डेव्हलपमेंट लॉग ही लय अगदी अचूकपणे टिपतो. सॉफ्टवेअर बनवणे म्हणजे लहान आणि सातत्यपूर्ण सुधारणा करणे होय. तुम्ही प्रत्येक आव्हानातून शिकता. कदाचित आजचे आव्हान हे समजून घेणे असेल की एखादा विशिष्ट मॉड्यूल दुसऱ्यावर इतके अवलंबून का झाले आहे. कदाचित दोन आठवड्यांपूर्वी घेतलेली शॉर्टकटमुळे आता घेतलेला वेळ वाचण्यापेक्षा जास्त खर्च होत आहे, हे जाणवणे असेल. प्रत्येक कमिट (commit) प्रोजेक्टला अधिक चांगले बनवते, अगदी जेव्हा ती कमिट निर्माण करण्यापेक्षा जास्त गोष्टी डिलीट करते तेव्हाही.

हा दृष्टिकोन तुमची प्रेरणा देखील टिकवून ठेवतो. मोठ्या प्रमाणावर केलेले पुनर्लेखन थकवणारे आणि जोखमीचे असते. जुन्या त्रुटी सोडवताना ते नवीन त्रुटी देखील निर्माण करू शकतात. टप्प्याटप्प्याने केलेले रिफॅक्टरिंग, पूर्ण झाले.