एक अतिव्यापी सिद्धांत है जो झरना और फुर्तीली दोनों में रिफ्लैक्टर और ऑप्टिमाइज़ करने की आवश्यकता को नियंत्रित करता है: YAGNI (यू ऐनोट गॉन नीड इट)। एक दूसरा सिद्धांत पहले का मूलाधार है: "समयपूर्व अनुकूलन सभी बुराई की जड़ है", सामान्य कहावत का कोडिंग समकक्ष "उत्कृष्टता का दुश्मन पूर्णता है"।
आइए प्रिस्क्रिप्शन लें और उन्हें लागू करें। आपको एक ईटीएल एल्गोरिदम बनाने की आवश्यकता है जो एक विशेष प्रकार की फ़ाइल लेता है, इसकी जानकारी निकालता है, फिर उस जानकारी को एक डेटाबेस में डालता है। इस सप्ताह के लिए आपका लक्ष्य (हमारे उद्देश्यों के लिए यह कोई फर्क नहीं पड़ता कि आप एक फुर्तीली या एसडीएलसी दुकान में हैं) को पूरा करना है।
आप एक स्मार्ट साथी हैं, और आपको बड़ी तस्वीर की झलक दी गई है। आप जानते हैं कि यह एकमात्र प्रकार की फ़ाइल नहीं है जिसके लिए परियोजना को ETL की आवश्यकता होगी। इसलिए, आप इस ईटीएल एल्गोरिदम को दूसरे प्रकार की फ़ाइल पर काम करने के लिए लागू करने पर विचार करते हैं, जिसमें केवल मामूली अंतर है। ऐसा करने से YAGNI का उल्लंघन होगा। आपका काम उस दूसरी फ़ाइल के लिए एल्गोरिदम विकसित करना नहीं है; यह सप्ताह के अंत तक आवश्यक एक फ़ाइल के लिए एल्गोरिदम विकसित करना है। उस लक्ष्य को पूरा करने और स्वीकृति परीक्षणों को पास करने के लिए, आपको उस एल्गोरिथ्म को विकसित करने और इसे सही ढंग से काम करने की आवश्यकता है। अन्य फ़ाइल के साथ काम करने के लिए आपको अतिरिक्त कोड की आवश्यकता नहीं है। आप सोच सकते हैं कि यह अब इसे शामिल करने के लिए आपको समय बचाएगा, और आप सही हो सकते हैं, लेकिन आप बहुत गलत भी हो सकते हैं; अन्य फ़ाइल के लिए एल्गोरिथ्म को आपके कोड का उपयोग नहीं किए जाने वाले सिस्टम के एक क्षेत्र में उपयोग करने की आवश्यकता हो सकती है, या नई फ़ाइल की आवश्यकताएं आपके लिए उन तरीकों से भिन्न हो सकती हैं जिन्हें आप नहीं जानते हैं (फुर्तीली में, उन आवश्यकताएं अभी तक मौजूद नहीं हो सकती हैं)। इस बीच, आपने समय बर्बाद किया है और अनावश्यक रूप से अपने एल्गोरिथ्म की जटिलता को बढ़ाया है।
अब, यह अगले सप्ताह है, और पहले एल्गोरिथ्म पर आपके उत्कृष्ट काम के लिए एक संदिग्ध इनाम के रूप में, आपको दो नए फ़ाइल प्रकारों के लिए एल्गोरिदम बनाने का काम दिया गया है। अब, आपको अपने एल्गोरिथ्म को अधिक फ़ाइलों के साथ काम करने के लिए अतिरिक्त कोड की आवश्यकता है। आप टेम्पलेट पद्धति पैटर्न का उपयोग करके अपने मौजूदा एल्गोरिदम का विस्तार कर सकते हैं, जो फ़ाइल-विशिष्ट व्यक्तिगत चरणों के साथ एक मूल पैटर्न का उपयोग करेगा, या आप अपने मौजूदा एल्गोरिदम से एक सामान्य इंटरफ़ेस प्राप्त कर सकते हैं, दो नए लोगों को विकसित कर सकते हैं जो इंटरफ़ेस का पालन करते हैं, और उन्हें प्लग इन करते हैं। एक ऑब्जेक्ट जो चुन सकता है कि किस एल्गोरिदम का उपयोग करना है।
विकसित करते समय, आपको पता है कि आपके पास एक आवश्यकता है कि सिस्टम प्रति सेकंड 10KB कच्चे डेटा को संसाधित करने में सक्षम हो। आप एक लोड परीक्षण करते हैं और पाते हैं कि आपका प्रारंभिक मसौदा एल्गोरिथ्म 8KB / s संभालता है। खैर, यह AAT पास करने वाला नहीं है। आप एक नज़र डालते हैं और देखते हैं कि आपके एल्गोरिथ्म में कुछ O (मेरा भगवान) है -complexity लूप संरचना; आप इसे सुव्यवस्थित करते हैं और 12KB / s प्राप्त करते हैं। "बहुत अच्छा", आपको लगता है, "लेकिन अगर मेरे पास कोड में एक गरीब लूप था, तो मैं और क्या कर सकता हूं?" buzz आपने अभी-अभी "समयपूर्व अनुकूलन" नियम का उल्लंघन किया है। आपका कोड काम करता है, और सभी आवश्यकताओं को पारित करता है। आप "किए गए" हैं, जब तक कि आवश्यकताओं को 15KB / s की आवश्यकता के लिए अद्यतन नहीं किया जाता है। यदि और जब ऐसा होता है, तो आप कोड को वापस ऊपर खींचते हैं और चीजों को सुधारने के लिए देखते हैं।
विकसित करते समय इस सरल प्रक्रिया का पालन करें, चाहे वह फुर्तीली हो या पारंपरिक एसडीएलसी में: "पहले पास पर, उसे काम करें। दूसरे पास पर, इसे सुंदर बनाएं। तीसरे पास पर, इसे ठोस बनाएं।" इसका क्या मतलब है, जब आप पहली बार कोड की एक पंक्ति बनाते हैं, तो उस कोड को अपना काम सही और बग-मुक्त करें, लेकिन इस कोड के भीतर नियमों को डिजाइन करने के लिए बहुत ध्यान न दें, जैसा कि आप सभी जानते हैं कि अभी आप ' इस क्षेत्र को फिर कभी नहीं छूएंगे। अगली बार जब आप कोड की उस पंक्ति पर जाएँ, तो आपने अपने आप को गलत साबित कर दिया; यह अब सिस्टम का एक-बंद टुकड़ा नहीं है। यह पठनीयता, कोड की संक्षिप्तता और / या DRY सिद्धांतों के लिए इसे रिफ्लेक्टर करता है (आपके पास कुछ कोड करने के लिए कुछ कोड कॉपी-पेस्ट किया जा सकता है; रिफ्लेक्टर एक लूप और / या एक विधि कॉल में)। तीसरी बार जब आप कोड की उस लाइन में या उसके आसपास काम कर रहे हों,
O(my God)-complexity
अगर कुछ और नहीं, तो मुझे हंसी आ गई!