टॉप-डाउन उन चीजों का वर्णन करने का एक शानदार तरीका है जो आप जानते हैं, या उन चीजों को फिर से बनाने के लिए जो आपने पहले ही बनाई हैं।
टॉप-डाउन सबसे बड़ी समस्या यह है कि बहुत बार बस कोई "टॉप" नहीं होता है। आप अपना दिमाग बदल लेंगे कि सिस्टम को विकसित करते समय और डोमेन की खोज करते समय सिस्टम को क्या करना चाहिए। आपका शुरुआती बिंदु कुछ ऐसा कैसे हो सकता है जिसे आप नहीं जानते (यानी आप सिस्टम को क्या करना चाहते हैं)?
एक "स्थानीय" टॉप डाउन एक अच्छी बात है ... कोडिंग के आगे कुछ सोच स्पष्ट रूप से अच्छी है। लेकिन बहुत ज्यादा सोचना और योजना बनाना नहीं है, क्योंकि आप जो कल्पना कर रहे हैं वह वास्तविक परिदृश्य नहीं है (जब तक कि आप पहले से ही वहां नहीं रहे हैं, यानी यदि आप निर्माण नहीं कर रहे हैं, लेकिन फिर से निर्माण कर रहे हैं)। नई चीजों का निर्माण करते समय ग्लोबल टॉप-डाउन सिर्फ बकवास है।
नीचे-ऊपर होना चाहिए (विश्व स्तर पर) दृष्टिकोण जब तक आप समस्या का 100% नहीं जानते हैं, आपको कोडित होने के लिए बस ज्ञात समाधान की आवश्यकता है और आप संभावित वैकल्पिक समाधानों की तलाश में परवाह नहीं करते हैं।
लिस्प दृष्टिकोण आसुत तल-अप है। आप न केवल नीचे का निर्माण करते हैं, बल्कि ईंटों को जिस तरह से आप चाहते हैं, उन्हें आकार भी दे सकते हैं। कुछ भी तय नहीं है, स्वतंत्रता कुल है। बेशक स्वतंत्रता जिम्मेदारी लेती है और आप इस शक्ति का दुरुपयोग करके भयानक चीजें कर सकते हैं।
लेकिन भयानक कोड किसी भी भाषा में लिखा जा सकता है। यहां तक कि भाषाओं में जो मन के लिए पिंजरे के आकार का होता है, इस उम्मीद के साथ बनाया गया है कि उन भाषाओं के साथ भी बंदरों को अच्छे कार्यक्रम मिल सकते हैं और चल रहे हैं (इतने स्तरों पर एक विचार इतना गलत है कि यह सिर्फ इसके बारे में सोचने पर भी दर्द होता है)।
आपका उदाहरण एक वेब सर्वर के बारे में है। अब 2012 में यह एक अच्छी तरह से परिभाषित समस्या है, आपके पास पालन करने के लिए चश्मा है। एक वेब सर्वर सिर्फ एक कार्यान्वयन समस्या है। खासतौर पर अगर आप किसी वेब सर्वर को वेब सर्वर के अन्य गजिलिज के समान लिखने का लक्ष्य रखते हैं जो कि बाहर हैं तो कुछ मिनुतिया के अलावा कुछ भी स्पष्ट नहीं है। यहां तक कि आरएसए के बारे में आपकी टिप्पणी अभी भी औपचारिक विनिर्देशों के साथ स्पष्ट रूप से परिभाषित समस्या के बारे में बात कर रही है।
एक अच्छी तरह से परिभाषित समस्या के साथ, औपचारिक विनिर्देशों और पहले से ही ज्ञात समाधानों के साथ कोडिंग बस डॉट्स में कनेक्ट हो रही है। उसके लिए टॉप डाउन ठीक है। यह प्रोजेक्ट मैनेजर स्वर्ग है।
कई मामलों में हालांकि डॉट्स को जोड़ने के लिए उपयोग किए जाने वाले कोई भी सिद्ध-ज्ञात दृष्टिकोण नहीं है। वास्तव में बहुत बार यह कहना मुश्किल है कि डॉट्स क्या हैं।
उदाहरण के लिए मान लीजिए कि आपको एक स्वचालित कटिंग मशीन को निर्देश देने के लिए कहा जाता है ताकि वे उन भागों को संरेखित कर सकें जो एक मुद्रित सामग्री को काट सकें जो कि सिद्धांतिक दोहराव वाले लोगो के अनुरूप नहीं है। आपको मशीन द्वारा लिए गए सामग्री के हिस्से और चित्र दिए गए हैं।
एक संरेखण नियम क्या है? आप तय करें। एक पैटर्न क्या है, इसका प्रतिनिधित्व कैसे करें? आप तय करें। भागों को कैसे संरेखित करें? आप तय करें। क्या भागों को "तुला" किया जा सकता है? यह निर्भर करता है, कुछ नहीं और कुछ हाँ, लेकिन निश्चित रूप से बहुत ज्यादा नहीं। अगर सामग्री को केवल एक हिस्से के लिए इसे स्वीकार करने में कटौती करने के लिए क्या करना है? आप तय करें। क्या सभी सामग्री रोल समान हैं? बेशक, लेकिन आप उपयोगकर्ता को हर रोल के लिए संरेखण नियमों को अनुकूलित करने के लिए बग नहीं कर सकते ... यह अव्यवहारिक होगा। कैमरे क्या तस्वीरें देख रहे हैं? सामग्री, जो भी इसका मतलब हो सकता है ... यह रंग हो सकता है, यह काले रंग से अधिक काला हो सकता है जहां बस प्रकाश प्रतिवर्त पैटर्न को स्पष्ट करता है। एक पैटर्न को पहचानने का क्या मतलब है? आप तय करें।
अब इस समस्या के लिए एक समाधान की सामान्य संरचना को डिजाइन करने का प्रयास करें और पैसे और समय में एक उद्धरण दें। मेरी शर्त है कि आपके सिस्टम का आर्किटेक्चर भी ... (हां, आर्किटेक्चर) गलत होगा। लागत और समय का अनुमान यादृच्छिक संख्या होगी।
हमने इसे लागू किया और अब यह एक कार्य प्रणाली है, लेकिन इस प्रणाली के आकार के बारे में हमारे दिमाग को बड़ी संख्या में बदल दिया। हमने पूरे उप-सिस्टम जोड़े हैं जो अब मेनू से भी नहीं पहुंच सकते हैं। हमने एक से अधिक बार प्रोटोकॉल में मास्टर / गुलाम की भूमिका निभाई। शायद अब हमारे पास इसे बेहतर बनाने के लिए पर्याप्त ज्ञान है।
निश्चित रूप से अन्य कंपनियों ने भी इसी समस्या को हल किया ... लेकिन जब तक आप इन कंपनियों में से एक हैं, तब तक शायद आपकी टॉप-डाउन विस्तृत परियोजना एक मजाक होगी। हम इसे ऊपर-नीचे डिज़ाइन कर सकते हैं। आप ऐसा नहीं कर सकते क्योंकि आपने पहले कभी ऐसा नहीं किया था।
आप शायद इसी समस्या को हल कर सकते हैं। हालांकि नीचे काम करना। आप जो जानते हैं उससे शुरू करते हैं, जो आप नहीं सीखते हैं उसे जोड़ते हैं।
नए जटिल सॉफ्टवेयर सिस्टम विकसित किए गए हैं, डिज़ाइन नहीं किए गए हैं। हर अब और फिर कोई व्यक्ति खरोंच से एक बड़ा नया जटिल बीमार-निर्दिष्ट सॉफ़्टवेयर सिस्टम डिज़ाइन करना शुरू कर देता है (ध्यान दें कि एक बड़े जटिल सॉफ़्टवेयर प्रोजेक्ट के साथ केवल तीन संभावनाएँ हैं: a] विनिर्देशन अस्पष्ट है, b] विनिर्देश गलत है और आत्म-विरोधाभासी है या सी] दोनों ... और सबसे अधिक बार [सी] मामला है)।
ये हज़ारों-हज़ार घंटों की विशिष्ट विशाल-कंपनी परियोजनाएं हैं, जो अकेले पावरप्वाइंट स्लाइड और यूएमएल आरेख में फेंक दी जाती हैं। संसाधनों की शर्मनाक मात्रा को जलाने के बाद वे पूरी तरह से विफल हो जाते हैं ... या कुछ बहुत ही असाधारण मामले में वे अंततः एक अतिप्राप्त सॉफ़्टवेयर वितरित करते हैं जो प्रारंभिक चश्मे के केवल एक छोटे हिस्से को लागू करता है। और उस सॉफ़्टवेयर को उपयोगकर्ताओं द्वारा गहराई से घृणा की जाती है ... आपके द्वारा खरीदे जाने वाले सॉफ़्टवेयर की तरह नहीं, बल्कि आपके द्वारा उपयोग किए जाने वाले सॉफ़्टवेयर की तरह।
क्या इसका मतलब यह है कि मुझे लगता है कि आपको केवल कोड करने के लिए सोचना चाहिए? बिलकूल नही। लेकिन मेरी राय में निर्माण नीचे (ईंटों, कंक्रीट कोड) से शुरू होना चाहिए और ऊपर जाना चाहिए ... और विस्तार से आपका ध्यान और ध्यान एक अर्थ "फीका" में होना चाहिए जैसा कि आपके पास जो है उससे दूर हो रहा है। टॉप-डाउन को अक्सर प्रस्तुत किया जाता है जैसे कि आपको एक ही बार में पूरे सिस्टम में समान स्तर का विवरण रखना चाहिए: बस इसे हर नोड को विभाजित करते रहें जब तक कि सब कुछ स्पष्ट न हो जाए ... वास्तविकता में, सब-सिस्टम सब-साइट से सबसिस्टम "विकसित" होते हैं। यदि आपके पास किसी विशिष्ट समस्या में पिछला अनुभव नहीं है, तो सब-सिस्टम, मॉड्यूल या लाइब्रेरी का आपका टॉप डाउन डिज़ाइन भयानक होगा। आप एक अच्छी लाइब्रेरी डिज़ाइन कर सकते हैं, जब आपको पता होगा कि किस तरह से काम करना है, न कि दूसरे तरीके से।
लिस्प के कई विचार अधिक लोकप्रिय हो रहे हैं (प्रथम श्रेणी के कार्य, क्लोजर, डिफ़ॉल्ट के रूप में डायनामिक टाइपिंग, कचरा संग्रह, मेटाप्रोग्रामिंग, इंटरएक्टिव विकास) लेकिन लिस्प अभी भी आज भी है (भाषाओं के बीच मुझे पता है) कोड को आकार देना कितना आसान है आपको क्या चाहिए
उदाहरण के लिए कीवर्ड पैरामीटर पहले से मौजूद हैं, लेकिन अगर वे मौजूद नहीं थे तो उन्हें जोड़ा जा सकता है। मैंने ऐसा किया था (एक संकलन समय पर खोजशब्द सत्यापन सहित) एक खिलौना लिस्प कंपाइलर के साथ मैं प्रयोग कर रहा हूं और यह ज्यादा कोड नहीं लेता है।
सी ++ के बजाय सबसे अधिक आप प्राप्त कर सकते हैं सी ++ विशेषज्ञों का एक समूह है जो आपको बता रहा है कि कीवर्ड पैरामीटर उपयोगी नहीं हैं, या एक अविश्वसनीय रूप से जटिल, टूटा हुआ, आधा समर्थित टेम्पलेट कार्यान्वयन है जो वास्तव में उपयोगी नहीं है। क्या C ++ क्लास प्रथम श्रेणी की वस्तुएं हैं? नहीं और इसके बारे में आप कुछ नहीं कर सकते। क्या आप रनटाइम पर या संकलन के समय आत्मनिरीक्षण कर सकते हैं? नहीं और इसके बारे में आप कुछ नहीं कर सकते।
लिस्प की यह भाषा लचीलापन है जो इसे नीचे-ऊपर की इमारत के लिए महान बनाती है। आप न केवल सबरूटीन्स का निर्माण कर सकते हैं, बल्कि वाक्य रचना और भाषा के शब्दार्थ भी। और एक अर्थ में लिस्प खुद ही नीचे-ऊपर है।