आर्किटेकचर डिजाइनिंग को बर्बाद करने से कैसे रोकें [बंद]


53

मैंने हाल ही में विश्वविद्यालय से स्नातक किया है और एक प्रोग्रामर के रूप में काम शुरू किया है। मुझे यह नहीं लगता कि "तकनीकी" मुद्दों को हल करना मुश्किल है या उन चीजों के साथ डिबगिंग करना जो मैं कहूंगा कि 1 समाधान होगा।

लेकिन वहाँ समस्याओं का एक वर्ग है कि एक स्पष्ट समाधान नहीं है लगता है - सॉफ्टवेयर वास्तुकला की तरह बातें। ये बातें मुझे परेशान करती हैं और मुझे बहुत तकलीफ देती हैं।

मैं घंटों और घंटों का समय यह तय करने की कोशिश करता हूं कि मेरे कार्यक्रमों और प्रणालियों को "वास्तुकार" कैसे किया जाए। उदाहरण के लिए - क्या मैं इस तर्क को 1 या 2 वर्गों में विभाजित करता हूं, मैं कक्षाओं का नाम कैसे दूं, क्या मुझे यह निजी या सार्वजनिक करना चाहिए, आदि इस प्रकार के प्रश्न मेरे बहुत समय लेते हैं, और यह मुझे बहुत निराश करता है। मैं सिर्फ कार्यक्रम बनाना चाहता हूं - आर्किटेक्चर को धिक्कार है।

मैं आर्किटेक्चर चरण के माध्यम से अधिक तेज़ी से और कोडिंग और डीबगिंग चरण पर कैसे प्राप्त कर सकता हूं जो मुझे पसंद है?


61
और भी बहुत कुछ करके। आपको पता चलेगा कि क्या काम करता है और क्या नहीं। ध्यान दें कि यहां प्रश्न पूछना वास्तविक कोड के संदर्भ के बिना चर्चा के उसी प्रवृत्ति का अनुसरण कर रहा है: समय जिसे करके सीखने में खर्च किया जा सकता है। इस सामान का बहस करना मज़ेदार है, और कुछ पैटर्न अन्य लोगों की तुलना में बेहतर हैं, लेकिन वास्तव में अनुभव के बिना एक सार्थक राय होना बहुत मुश्किल है (पढ़ें: निशान)।
जारेद स्मिथ

5
आर्किटेक्चर आपकी योजना का चरण है - इसे ठीक करें और यह आपके प्रयास का 90% है, बाकी कोडिंग, डिबगिंग और उपयोगकर्ता स्वीकृति के साथ है। इसे छोड़ना या इसे रोकना अनुशंसित नहीं है , जैसा कि आप अचूक, अनपेक्षित समाधानों के साथ समाप्त कर सकते हैं, इसलिए यदि आप इसे करना पसंद नहीं करते हैं, तो आपको संभवतः किसी और को इसे करने की आवश्यकता है ... नामकरण सबसे कठिन मुद्दों में से एक है सॉफ्टवेयर विकास, एक डेवलपर 5 लाइन विधि के नाम पर दिनों के लिए तड़प सकता है। जब तक कुछ और होना चाहिए, तब तक सब कुछ निजी बनाएं। जब वे एक से अधिक कार्य करते हैं तो विभाजन को विभाजित करते हैं।
मू

5
OOP के मामले में, आप SOLID सिद्धांतों को समझकर और उनका उपयोग करके शुरू कर सकते हैं । आपको अपने कुछ सवालों के जवाब देने में मदद करनी चाहिए (जैसे कि यह निजी या सार्वजनिक होना चाहिए, विभाजन करना या कुछ तर्क को विभाजित नहीं करना चाहिए ...) आपके द्वारा किए गए निर्णयों के पीछे एक तर्क देकर।
njzk2

8
मुझे लगता है कि यह सवाल उतना अच्छा नहीं है जितना इसका स्कोर बताता है। प्रश्न में संदर्भ का बहुत अभाव है । यह कुछ इस बारे में भी कहता है कि प्रोग्रामिंग कैसे (शायद) गलत-सिखाई जाती है। कंप्यूटर साइंस को इस तरह से नहीं पढ़ाया जाना चाहिए कि कोड से भिखारी को लकवा मार जाए।
बेसिल स्टारीनेवविच

3
"कोडिंग के सप्ताह आपको नियोजन के घंटे बचा सकते हैं।"
मिकीफ

जवाबों:


59

परफेक्ट अच्छे का दुश्मन है।

उस ने कहा, आपको कोनों को नहीं काटना चाहिए। सॉफ़्टवेयर डिज़ाइन पर लंबे समय तक प्रभाव रहेगा, और भविष्य में आपको (और आपके साथियों) समय और प्रयास की बचत होगी। इसे सही होने में अधिक समय लगेगा। अधिकांश समय बिताए प्रोग्रामिंग एक कीबोर्ड पर हथौड़ा नहीं मार रही है, लेकिन एक व्हाइटबोर्ड द्वारा यह पता लगाया जाता है कि किसी समस्या को कैसे हल किया जाए।

लेकिन आप भी पूर्णता के बारे में चिंता नहीं करनी चाहिए। यदि दो डिज़ाइन एक गतिरोध से लड़ते हैं, तो इसका मतलब है कि वे एक ही अच्छाई के बारे में संभावना रखते हैं। बस एक साथ जाओ। ऐसा नहीं है कि जब आप उस डिज़ाइन की खामियों का पता लगाते हैं तो आप चीजों को बदल नहीं सकते।

(और उम्मीद है कि एक बार आपको यह पता लगाने में भी मदद मिलेगी कि तकनीकी मुद्दों को डीबग / हल करने का सिर्फ एक तरीका नहीं है।)


25
विश्लेषण द्वारा पक्षाघात भी दिमाग में आता है।
माइक ६५५३५

7
कभी-कभी एक डिजाइन निर्णय के लिए सही अंतिम मध्यस्थ एक चौथाई है।
कैंडिड_ओरेंज

11
YAGNI और चुंबन और GTFO;)
JollyJoker

10
इस उत्तर को पढ़ने वाले किसी भी व्यक्ति के लिए - भगवान के प्यार के लिए "सही शत्रु के दुश्मन" का उपयोग न करें ताकि अभावपूर्ण क्रियान्वयन को सही ठहराया जा सके। इस कहावत का उद्देश्य आपको ओवरगिनरिंग से रोकना है, न कि सुस्त करना और किसी प्रकार की खराब डिज़ाइन वाली गंदगी जैसे विंडोज विस्टा या ऐप्पल III बनाना।
टी। सार -

@ T.Sar: विस्टा की विफलता वस्तुतः 0% तकनीकी विफलता और लगभग 100% MBA विफलता थी।
whatsisname

39

सरल और छोटे कार्यक्रमों के लिए (जैसे स्रोत कोड के दस हजार से कम लाइनों के साथ), आप कोड लिखते समय उन्हें आर्किटेक्ट कर सकते हैं। यदि आप एक पुनरावृत्त और वृद्धिशील विकास दृष्टिकोण अपनाते हैं , तो आप उत्तरोत्तर वास्तु निर्णय ले लेंगे: इसलिए कोड की कुछ दर्जन पंक्तियाँ लिखें (कुछ एकल सूक्ष्म सुविधा को जोड़ते हुए), उन्हें तब तक सुधारें जब तक कि आपके कंपाइलर से कोई चेतावनी वापस न आए, परीक्षण करें कि आपका डीबगर, और दोहराएँ।

क्या मैं इस तर्क को 1 या 2 वर्गों में विभाजित करता हूं, मुझे कक्षाओं का नाम कैसे देना चाहिए, क्या मुझे यह निजी या सार्वजनिक करना चाहिए, आदि इस प्रकार के प्रश्न मेरे समय का इतना हिस्सा लेते हैं

उन्हें नहीं करना चाहिए। और वे एक छोटे से कार्यक्रम के लिए ज्यादा मायने नहीं रखते हैं (क्योंकि छोटे, सरल कार्यक्रमों में सुधार करना आसान है, जैसे नाम बदलने के लिए, आदि ...)। आपको केवल अपने स्रोत कोड की पठनीयता के अनुरूप और प्राथमिकता देने की आवश्यकता है । आपको जरूरत हो सकती है, समय-समय पर, अपने कार्यक्रम के कुछ छोटे हिस्सों (और यह एक बड़ी बात नहीं है) को थोड़ा सा रिफैक्ट करने के लिए ।

इसकी तुलना कई मुफ्त सॉफ्टवेयर परियोजनाओं (लिनक्स कर्नेल जैसे बड़े वाले) से भी करें। डेवलपर्स ने शुरुआती चरणों में महत्वपूर्ण प्रयास "आर्किटेक्चरिंग" खर्च नहीं किया। यूएमएल लगभग कभी भी मुफ्त सॉफ्टवेयर में उपयोग नहीं किया जाता है । इसके अतिरिक्त, आप कई मुफ्त सॉफ्टवेयर परियोजनाओं के स्रोत कोड का अध्ययन करके काफी कुछ सीखेंगे

एक नौसिखिया के रूप में, आप या तो एक टीम में एक बड़े सॉफ्टवेयर प्रोजेक्ट पर काम करेंगे, जहां आप बस वरिष्ठ डेवलपर (जो वास्तु निर्णय लेते हैं) पर भरोसा कर सकते हैं, या आप छोटी परियोजनाओं पर अकेले काम करेंगे (आमतौर पर, कुछ दर्जन से कम हजारों स्रोत कोड की लाइनें)। बाद के मामले में, आप समय-समय पर अपने आवेदन को रद्द करते हुए वृद्धिशील वास्तु निर्णय लेंगे, जिसके बाद "वास्तुशिल्प डिजाइन" स्वाभाविक रूप से विकसित होगा।

आर्किटेक्चर चरण और कोडिंग और डीबगिंग चरण के माध्यम से मैं और अधिक तेज़ी से कैसे प्राप्त कर सकता हूं, जो मुझे पसंद है?

छोटे सॉफ्टवेयर प्रोजेक्ट के लिए, जो एक साल से भी कम समय लेते हैं, बहुत आसानी से: आर्किटेक्चर नहीं करते हैं। समग्र डिजाइन पर शायद आधे घंटे के विचार मंथन में खर्च करें। फिर एक पुनरावृत्त और वृद्धिशील विकास दृष्टिकोण के साथ कोड लिखना शुरू करें : कुछ दर्जन लाइनें लिखें, इसे संकलित करें (सभी चेतावनियों और डीबग जानकारी सक्षम के g++ -Wall -Wextra -gसाथ , उदाहरण के लिए CCC के लिए C ++) जब तक आपको कोई चेतावनी नहीं मिलती (और इसे कुछ सरल स्थैतिक स्रोत में पास करें कोड एनालाइज़र, यदि आपके पास एक है, जैसे क्लैंग-एनालाइज़र ), तो उस कोड को डीबगर के साथ परीक्षण करें , इसे अपने संस्करण नियंत्रण (जैसे git) के लिए प्रतिबद्ध करें , कुल्ला और दोहराएं। हालांकि, तकनीकी ऋण से बचना सुनिश्चित करें: जब कोई चीज बुरी तरह से बदबू आती है, तो उसे सुधारने के लिए काम (रिफैक्टरिंग और रीइम्प्लीमेंट करके) करें।

दूसरी ओर, एक टीम के माहौल में, आर्किटेक्चर का काम टीम के प्रत्येक सदस्य की जिम्मेदारी को परिभाषित करने के लिए प्रारंभिक चर्चा को मजबूर करता है। यह चर्चा वरिष्ठ डेवलपर (जो एक नौसिखिया नहीं है) के नेतृत्व में है। चुस्त सॉफ्टवेयर विकास और पौराणिक मानव-माह के बारे में पढ़ें ।

मैं सिर्फ कार्यक्रम बनाना चाहता हूं, वास्तुकला को नुकसान पहुंचाया जाना चाहिए।

उत्कृष्ट अंतर्ज्ञान (कम से कम छोटी परियोजनाओं के लिए)। इसलिए अपने कार्यक्रम के बारे में कुछ मिनट सोचें, और इसे पुनरावृत्त और वृद्धिशील विकास दृष्टिकोण के साथ कोडित करना शुरू करें : कुछ दर्जन लाइनों को कोड करें और सुनिश्चित करें कि वे अच्छी तरह से काम करते हैं, फिर दोहराएं। इससे पहले, इसी तरह की मुफ्त सॉफ्टवेयर परियोजनाओं के स्रोत कोड (और वास्तुकला का निरीक्षण) का अध्ययन करें और आम तौर पर कुछ ग्रंथ सूची संबंधी कार्य और शोध करें।

में कुछ मामलों में, एक के बारे में सोचना metaprogramming दृष्टिकोण: स्थितियों में, जहां आप चाहते हैं देखते हैं उत्पन्न कुछ "स्रोत फ़ाइल" (उदाहरण की तरह पार्सर जनरेटर का उपयोग शामिल जंगली भैंसों , जैसे गोंद कोड जनरेटर बड़ा घूँट , गूगल Protobuf , और कभी कभी आप एक लिखने के लिए चाहते हो सकता है सरल स्क्रिप्ट के लिए- GPP जैसे सामान्य प्रीप्रोसेसर का उपयोग करें - दोहराए जाने वाले कोडिंग से बचने के लिए अपने C ++ या Java कोड में से कुछ का उत्सर्जन करें)।

पुनश्च। मैं एक शोध अभियंता हूँ, कंप्यूटर विज्ञान में पीएचडी और 40 साल का अनुभव है, और मैंने आपके प्रश्न को "आर्किटेक्चर" कभी नहीं किया, जैसे कि कई मध्यम आकार की परियोजनाओं पर सफलतापूर्वक काम किया है, और कुछ बड़े (जीसीसी कंपाइलर) )। मेरे लिए "आर्किटेक्चर" अगले कुछ दिनों या हफ्तों के काम का नियोजन चरण है (और मैं आमतौर पर सपने देखते या सोते समय और निश्चित रूप से बिना किसी कंप्यूटर के, और आमतौर पर बिना पेंसिल के भी)। इसके अलावा, जब अनुसंधान अनुदान लिखते हैं, तो मैं किसी भी तरह और अपूर्ण रूप से एक वास्तुकला डिजाइन कर रहा हूं।

एनबी: कुछ सॉफ्टवेयर परियोजनाओं को दूसरों की तुलना में बहुत अधिक वास्तुकला की आवश्यकता होती है। उदाहरण के लिए, यदि आप एक कृत्रिम हृदय, या एक न्यूरोसर्जरी रोबोट की नियंत्रण प्रणाली लिखते हैं, तो आप उसी तरह से काम नहीं करेंगे जैसे कि औसत मोबाइल-फोन एप्लिकेशन लिखते समय। नोर्विग की टीचिंग खुद को दस साल के पेज में देखें।


1
यही कारण है कि यह आमतौर पर मेरे लिए भी आता है। मैं कार्यक्रम शुरू करने से पहले पर्याप्त मात्रा में समय देता हूं, और जब तक मैं शुरू करता हूं, मेरे पास कई स्पष्ट विचार होंगे कि मैं इसे कैसे संरचना करना चाहता हूं, और मैंने वास्तव में बैठकर इसके बारे में सोचने के लिए एक बिंदु नहीं बनाया। यह किसी ऐसे व्यक्ति से स्वाभाविक रूप से प्रवाहित होता है जो ऐसे मुद्दों से नियमित रूप से निपटता है।
नील

1
जीसीसी के स्रोत कोड को ध्यान में रखते हुए, पूरी तरह से जैविक विकास आमतौर पर ऐसा कुछ नहीं है जो भविष्य के लोगों का आभारी होगा। ज्यादातर जीसीसी योगदान जो मैंने देखा है, विशेष रूप से "मेरी बात बनाने और यहां से जितनी जल्दी हो सके बाहर निकलने के गंभीर मामले हैं" क्योंकि बाकी पहले से ही ऐसा है।
केफिन

1
मेरा दावा है कि प्रत्येक बड़े पर्याप्त कोड का आधार व्यवस्थित रूप से बढ़ता है (देखें गैल का नियम ...)। इसके अलावा, यह एक बड़ी सॉफ्टवेयर परियोजना की वास्तुकला को नौसिखिया बनाने के लिए पूरी तरह से मूर्खतापूर्ण होगा
बेसिल स्टायरनेविच

मैं एक ऐसी टीम पर हूँ जो आपके उत्तर के पहले भाग में वर्णित दो आकारों के बीच कहीं है। हमारी परियोजना दस हजार से अधिक लंबी लाइनों की है, लेकिन इसके लिए लगभग आधा दर्जन से अधिक डेवलपर्स की आवश्यकता नहीं है। हम एक ऐसी स्थिति में हैं जहाँ हमें अपनी वास्तुकला की सावधानीपूर्वक योजना बनाने की आवश्यकता है, फिर भी इतना छोटा है कि हम सभी को स्वयं वास्तुशिल्प निर्णय लेने में सक्षम होने की आवश्यकता है। आपकी सलाह या तो व्यवस्थित रूप से बढ़ती है या किसी वरिष्ठ डेवलपर से पूछती है कि मेरी टीम के लिए विशेष रूप से काम नहीं करेगा। (लेकिन मुझे लगता है कि मेरी स्थिति शायद थोड़ी असामान्य है, भी।)
केविन -

9

तीन मोटो हैं जिन्हें मैं ध्यान में रखना पसंद करता हूं।

  • "सब कुछ संभव के रूप में सरल बनाया जाना चाहिए, लेकिन सरल नहीं"

    "एक वर्ग या दो?" का आपका उदाहरण लेने के लिए, मैं पूछूंगा, "कौन सा सरल उपाय है?"

  • "कोई स्पष्ट कीड़े नहीं" बनाम "जाहिर तौर पर कोई बग नहीं"

    बाद वाला बेहतर है!

    और यही कारण है कि इसे सरल बनाने की आवश्यकता है, अर्थात आप इसके बारे में तर्क कर सकते हैं। एक बड़ा वर्ग हो सकता है (या यह बन सकता है) बहुत बड़ा और बहुत जटिल हो सकता है जिसके बारे में, जिस स्थिति में आप इसे कई छोटी कक्षाओं में विभाजित करते हैं, जहां आप कह सकते हैं "प्रत्येक वर्ग छोटा है और वह कहता है कि यह क्या करेगा - और उनके इंटरफेस सरल हैं, और वे सही तरीके से गठबंधन करते हैं। "

    1. कोड को सिद्धांत में चलना चाहिए (यानी आपके सिर में)।
    2. यदि यह अभ्यास में काम नहीं करता है तो आप इसे तब तक डिबग कर सकते हैं जब तक कि अभ्यास सिद्धांत से मेल नहीं खाता।

    एक नौसिखिया कभी-कभी चरण 1 के साथ परेशान नहीं करता है, अर्थात आपके सिर में चल रहा है (उदाहरण के लिए क्योंकि यह बहुत जटिल है) - लेकिन उस स्थिति में यह केवल "सिद्धांत रूप में" बजाय "सिद्धांत रूप में" चल रहा है, संभवतः इसलिए क्योंकि आप ' टी ने इसे गैर-स्पष्ट कीड़े खोजने के लिए पर्याप्त परीक्षण किया।

  • गैल का नियम

    यह उर्फ ​​"रिफ्लेक्टर" है।

    व्यवहार में इसका अर्थ है:

    1. एक [एन] सरल प्रणाली से शुरू होता है जो काम करता है
    2. अब एक नई सुविधा जोड़ने का समय आ गया है
    3. मौजूदा सिस्टम को रिफ्लेक्टर करें ताकि (जब तक) नई सुविधा को जोड़ना आसान हो जाए
    4. नई सुविधा जोड़ें

    5. ... और ऊपर की तरह दोहराएं

    यह आप की जरूरत से पहले YAGNI यानि रिफ्लैक्टर (आर्किटेक्चर के बारे में चिंता) की तरह माटोस से मेल खाता है ... लेकिन समय रहते ही सही आर्किटेक्चर बनाएं, जब आपको किसी विशेष उद्देश्य के लिए इसकी आवश्यकता हो।


6

आप जो कर सकते हैं वह न्यूनतम संख्या में सार के साथ शुरू होता है जो आपको चाहिए। उदाहरण के लिए, एक फ़ाइल में एक व्यक्ति वर्ग। अब जैसे-जैसे आप कोड और फीचर्स जोड़ते जाते हैं, आप उन चीजों को देखना शुरू करते हैं जिन्हें एक अलग अमूर्त में ले जाने की आवश्यकता होती है। उदाहरण के लिए एकल जिम्मेदारी सिद्धांत (एसओएल के एसओएल) आपको बताता है कि व्यक्ति वर्ग में संबोधित करने से संबंधित तरीके नहीं हैं। तो अब आप जान गए हैं कि आपको एक पता वर्ग की आवश्यकता है।

लेकिन यह सोचने के लिए हमेशा अच्छा होता है कि आपके सिस्टम के लिए "कम से कम संख्या में सार" कैसा लगता है। एक अच्छी पर्याप्त वास्तुकला से शुरू करें और इसे सुधारें जैसे आप जाते हैं।

संपादित करें: @Basile उत्तर इस बात पर एक उदाहरण देता है कि आप अपनी न्यूनतम वास्तुकला पर कैसे सुधार और सुधार कर सकते हैं।


4
मैं असहमत हूं। कम से कम संख्या में सार का उपयोग करने की कोशिश करना लक्ष्य नहीं होना चाहिए। लंबे समय तक एक व्यवहार्य संरचना का निर्माण करना अधिक महत्वपूर्ण है। न केवल न्यूनतम आवश्यक समय से पहले सोचें, बल्कि कोड के निर्माण के बारे में भी सोचें ताकि अन्य लोग इसे भविष्य में भी संभाल सकें। यदि अमूर्त कोड को अधिक पठनीय और व्यावहारिक बनाते हैं, तो यह उसके लिए एक स्पष्ट सुधार है। मैं पुन: प्रयोज्य, मॉड्यूलर कोड लिखना चाहूंगा। उस ने कहा, यह सक्षम होने के लिए अनुभव का मामला है।
बैटल

@Battle आपका कहना यह है कि भविष्य का प्रमाण देना भी उतना ही महत्वपूर्ण है, क्या मैं सही हूं? मैं इस बात से सहमत हूं, हालांकि मुझे लगता है कि आदर्श एक कार्यक्रम बनाना होगा जिसमें कम से कम संख्या में अमूर्त भविष्य के विकास को भी ध्यान में रखा जाए । मेरा तर्क है कि अब और भविष्य में कोई लाभ नहीं होने के साथ एक मनमाना अमूर्त केवल आपके कार्यक्रम को बदतर बना रहा है, बेहतर नहीं है।
नील

2
वास्तविक दुनिया में आपके पास सॉफ्टवेयर के उपयोग के आसपास बहुत सारे संदर्भ होंगे, इसलिए आपकी न्यूनतम वास्तुकला वर्तमान में ज्ञात उपयोग के मामलों को कवर करेगी। मुझे लगता है कि यह आपको एक अच्छा प्रारंभिक बिंदु देता है। अधिकांश समय प्रतिरूपकता और पुन: प्रयोज्य गैर-कार्यात्मक आवश्यकताएं हैं। क्या उन्हें रास्ते में आना चाहिए, अपने कीबोर्ड पर ध्यान न देना और हथौड़ा मारना ठीक है। लेकिन हां, न्यूनतम अमूर्तता अंतिम लक्ष्य नहीं होना चाहिए। लेकिन यह बहुत अच्छी तरह से एक प्रारंभिक बिंदु हो सकता है।
sul4bh

@ नील - हाँ, मैं भविष्य-प्रूफिंग के बारे में बात कर रहा था, और मुझे लगता है कि इसका एक भाग के रूप में कोड को संरचित करने और अमूर्त के साथ क्या करना है। लेकिन मैं मनमाने ढंग से अमूर्तता के बारे में बात नहीं कर रहा था, लेकिन उन्हें कम से कम करने के लक्ष्य के बारे में, जैसे कि वे स्वाभाविक रूप से कुछ बुरा होगा। जब वे बुरे होते हैं तो वे बुरे होते हैं।
बैटल

3
@ मवेशी: पहले से ही "बस के मामले में" संरचना को जोड़ने से आसानी से अतिरंजना होती है। मेरे अनुभव के लिए, हमेशा कोड आधार के वर्तमान आकार के लिए आवश्यक अमूर्तता की संख्या "वास्तव में एक अच्छा लक्ष्य है - कोई कम नहीं, अब और नहीं। जब कोड आधार बढ़ता है, तो सार को जोड़ा जाना चाहिए। इससे पहले नहीं।" मैंने इस उत्तर को कैसे पढ़ा। लेकिन शायद शब्द "अमूर्त की न्यूनतम संख्या" का गलत अर्थ लगाया जा सकता है।
डॉक्टर ब्राउन

5

किसी सिस्टम की वास्तुकला के बारे में सोचने में समय व्यर्थ नहीं जाता है।

मेरा मानना ​​है कि आपके प्रश्न को "वास्तु निर्णय लेने के साथ अधिक कुशल कैसे हो सकता है?"

उस पर मेरा संक्षिप्त जवाब होगा: आपको उन मूल सिद्धांतों की खोज करने की आवश्यकता है जो आपको मज़बूती से और कुशलता से निर्णय लेने की अनुमति देंगे और फिर आपको वास्तव में सॉफ्टवेयर के वास्तविक दुनिया के टुकड़े को बाहर निकालने और आकार देने की आवश्यकता होगी। यह ज्ञान, परीक्षण और त्रुटि और व्यक्तिगत विकास की तलाश की एक लंबी यात्रा होगी।

-

और लंबे जवाब के लिए ...

मुझे पहले अवधारणाओं को स्पष्ट करना चाहिए: मैं एक जटिल सॉफ्टवेयर सिस्टम की संरचना का वर्णन करने के लिए आर्किटेक्चर शब्द का उपयोग करता हूं जब मैं प्रक्रियाओं, सेवाओं, एपीआई और डेटाबेस के साथ काम कर रहा हूं। मैं एक अधिक जटिल प्रणाली से केवल एक टुकड़ा की संरचना का वर्णन करने के लिए शब्द डिजाइन का उपयोग करता हूं , जब मैं कक्षाओं, कार्यों और पुस्तकालयों के साथ काम कर रहा हूं। ये मेरी परिभाषाएँ हैं, कुछ लोगों की अलग-अलग परिभाषाएँ हैं। लेकिन इस संदर्भ में, मेरा मानना ​​है कि आप डिजाइन के बारे में बात कर रहे हैं ।

मुझे लगता है कि इस विषय पर चर्चा करते समय ध्यान रखने योग्य 3 महत्वपूर्ण बातें हैं:

  • आर्किटेक्चर और डिज़ाइन मौजूद हैं उनके बिना स्पष्ट रूप से आरेख या प्रलेखन के माध्यम से वर्णित किया जा रहा है, उनके बिना भी किसी टीम या व्यक्ति ( वास्तुकार ) द्वारा बनाए रखा जा रहा है । किसी भी प्रणाली में एक आंतरिक वास्तुकला और एक आंतरिक डिजाइन होता है जिसे बाद के तथ्य के रूप में वर्णित किया जा सकता है।

  • सॉफ्टवेयर विकास प्रोग्रामिंग नहीं है, यह समय के साथ प्रोग्रामिंग है। मैं यह भेद इसलिए कर रहा हूं क्योंकि मुझे लगता है कि यह उद्योग में आने वाले लोगों के लिए सबसे बड़ा अंधा धब्बों में से एक है (खुद को एक समय में शामिल किया गया था)। इसका मतलब यह है कि विश्वविद्यालय की परियोजनाओं या व्यक्तिगत साइड प्रोजेक्ट्स की तुलना में, एक वास्तविक दुनिया सॉफ्टवेयर सिस्टम पर काम करना तेजी से अधिक जटिल है, क्योंकि किसी भी वास्तु निर्णय का सिस्टम के विकास पर समय के साथ बड़ा प्रभाव पड़ेगा। आपके निर्णय अब आपको सताएंगे, गारंटी देंगे।

  • क्योंकि आर्किटेक्चर और डिज़ाइन सहज रूप से मौजूद हैं और क्योंकि कोड आधार एक जीवित चीज़ है जो समय के साथ विकसित होता है, वास्तुकला और डिजाइन को भी विकसित करने की आवश्यकता है। वे या तो कीट समय पर किए गए सचेत निर्णयों के माध्यम से एक नियंत्रित तरीके से विकसित होंगे, या वे कोडिंग द्वारा संचालित, असाधारण रूप से विकसित होंगे। यह समझना महत्वपूर्ण है, क्योंकि इसका अर्थ है "वास्तुकार पहले और लिखने का कोड दूसरा" का पारंपरिक दृष्टिकोण त्रुटिपूर्ण है। बेशक, खरोंच से एक परियोजना शुरू करते समय, कुछ वास्तुशिल्प और डिजाइन कार्य को ऊपर-सामने करने की आवश्यकता होती है। लेकिन इसके अलावा, सिस्टम को विकसित करते समय अभी भी बहुत सारे वास्तुशिल्प और डिजाइन निर्णय लेने होंगे।

उपरोक्त को और अधिक विकृत करने के लिए, इस तथ्य से अवगत होना बहुत महत्वपूर्ण है कि आप कोड लिखते समय डिज़ाइन निर्णय ले रहे होंगे , या तो सचेत रूप से या नहीं। आपको उन निर्णयों में से अधिकांश को सचेत रूप से और गंभीर रूप से करने की दिशा में प्रयास करना चाहिए, क्योंकि किसी भी निर्णय को हल्के ढंग से लिया गया भविष्य के काम पर एक बड़ा प्रभाव डाल सकता है (यह प्रभाव आमतौर पर कोड आधार में ही प्रकट होता है कि बग को ठीक करने या सुविधाओं को लागू करने के लिए बदलना बहुत मुश्किल हो जाता है)। रॉबर्ट सी। मार्टिन ने अपनी पुस्तक "क्लीन आर्किटेक्चर" (जो कि मैं जिस तरह से अत्यधिक अनुशंसा करता हूं) में, डेटा के साथ, इसे खूबसूरती से चित्रित किया है।

तो, अब जब हम जानते हैं कि वास्तुकला और डिजाइन क्यों महत्वपूर्ण हैं, तो कौन से मूल सिद्धांत हैं जो हमें अच्छे निर्णय लेने के लिए उचित ढांचा दे सकते हैं? मेरे करियर में पहले भी यह सवाल था, मुझे ऐसा लगा कि मेरे टूलसेट में कुछ गायब है लेकिन पता नहीं क्या था, यह नहीं जानता कि इसका वर्णन कैसे करना है या इसकी तलाश करना है। मैं इनमें से कुछ सिद्धांतों को साझा करूंगा, जिन्हें मैंने समय के साथ खोजा था और मुझे आशा है कि वे आपके जीवन को थोड़ा आसान बनाएंगे:

  • मार्टिन फाउलर की पुस्तक "रिफैक्टरिंग: इम्प्रूविंग द डिज़ाइन ऑफ़ एक्सिस्टिंग कोड" को पढ़कर बहुत ही सरल लेकिन शक्तिशाली कोडिंग ट्रिक्स का एक सेट निकाला जा सकता है। यहाँ सूचीबद्ध करने के लिए बहुत सारे हैं, लेकिन ये बहुत ही निम्न-स्तरीय, कोडिंग-समय के निर्णय हैं जो आप अपने कोड संरचना में बहुत सुधार कर सकते हैं और डिज़ाइन निर्णय लेने में आपकी सहायता कर सकते हैं। पुस्तक आपके व्यक्तिगत वर्कफ़्लो में इकाई परीक्षण को एकीकृत करने और परीक्षण योग्य कोड लिखने के लिए भी एक अच्छा मामला बनाती है।

  • विशेष रूप से OOP के लिए, आपको SOLID सिद्धांतों को देखना चाहिए । वे थोड़े सार हैं और पहली बार में अपने दिमाग को लपेटना मुश्किल है, लेकिन बहुत शक्तिशाली है। मेरा सुझाव है कि आप सबसे अधिक लाभ प्राप्त करने के लिए पहले 2 से शुरू करें:

एकल जिम्मेदारी सिद्धांत : एक वर्ग में केवल एक ही जिम्मेदारी होनी चाहिए (यानी सॉफ्टवेयर के विनिर्देश के एक हिस्से में परिवर्तन कक्षा के विनिर्देश को प्रभावित करने में सक्षम होना चाहिए)।

खुला / बंद सिद्धांत : "सॉफ़्टवेयर इकाइयाँ ... विस्तार के लिए खुली होनी चाहिए, लेकिन संशोधन के लिए बंद।"

  • विरासत पर रचना की अवधारणा

    सिद्धांत यह है कि वर्गों को एक आधार या माता-पिता वर्ग से विरासत के बजाय बहुरूप व्यवहार और कोड का पुन: उपयोग उनकी रचना (अन्य वर्गों के उदाहरणों को शामिल करके जो वांछित कार्यक्षमता को लागू करते हैं) प्राप्त करना चाहिए।

  • युग्मन की अवधारणाएं ("सॉफ़्टवेयर मॉड्यूल के बीच अन्योन्याश्रय की डिग्री") और सामंजस्य ("एक मॉड्यूल के भीतर के तत्व एक साथ संबंधित हैं।")
  • सूखी (खुद को दोहराना नहीं) की अवधारणा
  • आदेश / क्वेरी जुदाई अवधारणा ( "हर विधि या तो एक आदेश है कि एक कार्रवाई करता है, या एक प्रश्न है कि फोन करने वाले के लिए डेटा देता है होना चाहिए, लेकिन दोनों नहीं")
  • स्टेटफुल बनाम स्टेटलेस सिस्टम की अवधारणा (मेरे अंगूठे का नियम है: राज्य को संभालने से बचें, जितना संभव हो उतना स्टेटलेस सिस्टम बनाएं)।

बेशक, ये सिर्फ अवधारणाएं हैं, नियम नहीं। पहला कदम उन्हें समझ रहा है और उनके बारे में पता कर रहा है। अगला वास्तव में अभ्यास और निर्माण अनुभव में उनका उपयोग करना है जब आपको उनका पालन करना चाहिए और जब आपको नहीं करना चाहिए। और फिर इन अवधारणाओं की अपनी समझ, उनके नकारात्मक पक्षों और एक दूसरे के साथ उनकी जटिल बातचीत को परिष्कृत करने की एक सतत प्रक्रिया है।

मुझे लगता है कि सबसे मूल्यवान सलाह जो मैं आपको दे सकता हूं वह है: स्वयं के साथ धैर्य रखें। आपने बस एक लंबी लेकिन पूरी होने वाली सड़क को शुरू किया। अभ्यास और प्रयोग करते रहें, ध्यान दें कि क्या काम करता है और क्या नहीं और आप केवल समय के साथ बेहतर हो जाएंगे।


यह कुछ ऐसा है जिसे अनुभव के साथ सीखना चाहिए। यह आपका आधा काम है, और इसे बुरी तरह से करना बहुत बड़ी लागत है, लेकिन यह स्कूल में नहीं पढ़ाया जाता है क्योंकि कंप्यूटर विज्ञान और सॉफ्टवेयर विकास लगभग पूरी तरह से अलग चीजें हैं।
कोई यू

1

जो आप वर्णन करते हैं उनमें से अधिकांश वास्तव में (महत्वपूर्ण) वास्तुकला नहीं है - अच्छा नामकरण और अच्छे वर्ग का डिजाइन कुछ ऐसा है जो आपके लिए दूसरा स्वभाव होना चाहिए। यह बस आप और अधिक बेहतर कोड प्राप्त करेंगे। इस तरह की चिंताओं के लिए सबसे अधिक उपयोगी आमतौर पर जोड़ी प्रोग्रामिंग है - यह इस तरह की समस्याओं को स्पष्ट करने में मदद करता है और आपको यह कुशलतापूर्वक सीखने में मदद करता है।

जहां वास्तुकला आवश्यक है वह परियोजना से पहले है:

  1. सटीक आवश्यकताओं और गैर कार्यात्मक आवश्यकताओं को इकट्ठा करें (मुझे कितने समर्थन / सेकंड का समर्थन करने की आवश्यकता है?)। इस चरण में कोई भी मिसमैच कोडिंग नरक की ओर ले जाएगा - इस तथ्य के बाद छूटे हुए विचारों को एकीकृत करना, समय की खपत, कष्टप्रद और कभी-कभी असंभव है। मुझे पता है कि यह कोडिंग के रूप में मजेदार नहीं है, लेकिन कोड को कुछ ऐसा करने के लिए प्राप्त करने की कोशिश कर रहा है जिसे इसके लिए डिज़ाइन नहीं किया गया था और भी कम मज़ेदार है।

  2. यदि अप्रोच करें, तो अपने सिस्टम के बंधे हुए संदर्भों को परिभाषित करें और सुनिश्चित करें कि आपके पास आपकी शब्दावली सीधी है, उदाहरण के लिए यदि व्यवसाय "फ्रोबेल्स" के बारे में बात करता है, तो सुनिश्चित करें कि आप "*** फ्रोबेल्स" के साथ कक्षाओं / इंटरफेस आदि का नाम दें। तुच्छ लगता है, लेकिन अगर आप वर्कफ़्लो के बारे में बात करते हैं, जबकि व्यवसाय संचालन के बारे में बात करता है, तो अनुवाद करना बहुत तेज़ी से कष्टप्रद हो जाता है।

  3. यदि आप कई व्यक्तियों / टीमों के साथ काम करते हैं, तो आपके इंटरफेस को जल्दी से वर्णन करते हैं और सुनिश्चित करते हैं कि सभी मान्यताओं और समस्याओं को सभी द्वारा समझा जाता है - यदि आपके पास साझा संदर्भ नहीं है, तो एकीकरण "मज़ेदार" होगा। उदाहरण के लिए, आप एक केले के चित्र जनरेटर का निर्माण करते हैं, लेकिन आपके दृश्य-देव को एक सेब चित्र जनरेटर की आवश्यकता होती है। या आप कुछ ऐसी चीजों का निर्माण करते हैं जो 100 अनुरोधों / उत्तर का जवाब दे सकती हैं, लेकिन 10000 आर / सेकंड की आवश्यकता होती है।

नोट: यह एक माइक्रोसैस आर्किटेक्चर पर मेरे काम से बहुत प्रभावित है। आंतरिक रूप से कैसे कार्य किया जाता है, इसका भी आर्किटेक्चर किया जा सकता है, - लेकिन ज्यादातर समय यह बड़े चित्र के सही होने से कम महत्वपूर्ण होता है।


1

मैं आप पर शब्दों और संक्षिप्त शब्दों का एक गुच्छा नहीं फेंकने जा रहा हूं (जिनमें से अधिकांश कोडर्स / सॉफ्टवेयर इंजीनियरों के बहुमत से शायद ही सहमत हों)। इसके बजाय, निम्नलिखित पर विचार करें:

  1. आप सीख रहे हैं - आप समय बर्बाद नहीं कर रहे हैं, आप विभिन्न तरीकों की कोशिश कर रहे हैं और सीख रहे हैं कि क्या काम करता है। आप बिना किसी योजना के बहुत आगे की योजना बना सकते हैं, पहले समाधान के साथ समस्या को ध्यान में रखते हुए और अगर यह काम नहीं करता है तो इसे बदल सकते हैं। अगर यह अच्छी तरह से काम करता है, महान! आप एक समस्या का एक सरल समाधान मिल गया है। यदि वे अच्छी तरह से काम करते हैं, तो कभी-कभी सरल समाधान ठीक होते हैं और कभी-कभी वे काफी अच्छे होते हैं ।

  2. सब कुछ एक ट्रेडऑफ़ है - आप एक ही सिस्टम को कई अलग-अलग तरीकों से डिज़ाइन कर सकते हैं, समय और स्थान, जटिलता और लचीलेपन, अमूर्तता और पठनीयता, या कई ट्रेडऑफ़्स में से कोई भी संभव हो सकता है। कोई भी समाधान हर तरह से सही नहीं है और कोई भी नियम सॉफ्टवेयर इंजीनियरिंग में अपवाद के बिना नहीं है। जो आपको बताता है या तो भोली है या कुछ बेच रही है।

  3. हाल ही में स्नातक के रूप में, कोडिंग और डिबगिंग बहुत रोमांचक हो सकती है, लेकिन यह समय के साथ बंद हो जाएगा, और अब आप जो कौशल सीख रहे हैं वह आपको अच्छी तरह से काम करेगा।

  4. मेरा तर्क है कि इंजीनियरिंग की तुलना में सॉफ्टवेयर का निर्माण अधिक कला / शिल्प है। महान कला सिर्फ व्यक्तिगत ब्रशस्ट्रोक के बारे में नहीं है, बल्कि कलाकार / शिल्पकार द्वारा किए गए उच्च-स्तरीय निर्णयों और व्यापार के बारे में है।


1

मैं इस सवाल का जवाब देने की कोशिश करूंगा एक वेबडेवलपमेंट के दृष्टिकोण से (अर्थ: एक ऐसे क्षेत्र से आ रहा है जहां लोग वास्तुकला पर बहुत अधिक चर्चा करते हैं)। मैं इसकी व्याख्या करना शुरू करूँगा कि लोग वास्तुकला की परवाह क्यों करते हैं और फिर वास्तुकला के हिस्से को और अधिक तेज़ी से प्राप्त करने के तरीकों की रूपरेखा तैयार करेंगे।

आर्किटेक्चर आपके कोड के लिए दो काम करता है:

  1. इससे आपको और दूसरों के लिए अपने कोड को समझना आसान हो जाता है।
  2. यह आपके कोड को इस तरह से संरचना करने में मदद करता है जिससे इसे विस्तार और एकीकृत करना आसान हो जाता है।

एक कोड शैली आपको कोड के एक विशिष्ट हिस्से को पढ़ना आसान बनाती है, जिससे आपको ऐसे कन्वेंशन मिलते हैं जिन्हें आप पहचान सकते हैं और इसके माध्यम से नेविगेट करने के लिए उपयोग कर सकते हैं। इसी तरह एक अच्छा आर्किटेक्चर आपको यह पहचानने में मदद करता है कि आप वास्तव में एक विशिष्ट सुविधा को संभालने वाले कोड को कहां पाएंगे। उदाहरण के लिए, अधिकांश वेब परियोजनाओं में आर्किटेक्चर बारीकी से संबंधित होता है कि फ़ोल्डर्स और फाइलें कैसे सॉर्ट की जाती हैं। फ्लिपसाइड पर, एक अच्छे आर्किटेक्चर को वास्तव में आपको कोड के बारे में कम सोचने में मदद करनी चाहिए, क्योंकि यह पहले से ही एक सहज स्थान होना चाहिए जहां कोड का कोई भी टुकड़ा हो।

इसके अलावा, एक अच्छा आर्किटेक्चर कई नुकसानों से बचने के लिए एक आशुलिपि प्रदान करता है जो आपके कोड को आसानी से उपयोग करने से बचा सकता है। फिर, यदि आप एक वास्तुकला निर्णय लेते हैं, तो इसे एक सम्मेलन स्थापित करना चाहिए जो आपको कोड लिखने के बारे में कम सोचने में मदद करता है।

अब जिस हिस्से के लिए आप वास्तव में यहाँ हैं:

वास्तुकला के भाग के माध्यम से आप और अधिक तेज़ी से क्या कर सकते हैं:

  1. यह मत करो

जैसा कि कई उत्तर पहले ही बता चुके हैं। पहले अपने आप से पूछें कि क्या आपको वास्तव में वास्तुकला की आवश्यकता है। यदि आपके पास बहुत अधिक कोड नहीं है (और आप यह सुनिश्चित कर सकते हैं कि परियोजना निकट भविष्य में नहीं बढ़ेगी), तो आप बस आर्किटेक्चर भाग को छोड़ सकते हैं और एक साथ कुछ कर सकते हैं जो बस काम करता है। यदि आप अपने करियर के शुरुआती समय में हैं, तो जब भी आप कर सकते हैं, मैं अवसर का उपयोग करूंगा। कुछ बिंदु पर आप बड़ी परियोजनाएँ कर रहे होंगे, और उस बिंदु पर शायद सीखने में देर हो सकती है।

उस रास्ते से बाहर, आप वास्तुकला को कम दर्दनाक बनाने के लिए क्या कर सकते हैं:

  1. जल्दी करो
  2. चुराना
  3. जानें / उससे चिपके रहें
  4. इसे ज़्यादा मत करो

एक वास्तुकला पर निर्णय लेना योजना प्रक्रिया का एक प्रारंभिक हिस्सा होना चाहिए। जैसे ही आपको यह पता चलता है कि आप किस तरह के ऐप / प्रोग्राम / वेबसाइट बना रहे हैं, आपको यह सोचना चाहिए कि यह किस तरह की वास्तुकला का समर्थन करेगा।

इस समय यह बेशर्मी से चोरी करने का समय है। प्रोग्राम आर्किटेक्चर को ठीक से स्थापित करने के तरीके के बारे में बहुत सारे साहित्य हैं, और इन मौजूदा आर्किटेक्चर प्रोटोटाइपों द्वारा उपयोग-मामलों की एक आश्चर्यजनक मात्रा को कवर किया गया है। आपको पता होना चाहिए कि वहां किस तरह के आर्किटेक्चर मौजूद हैं, भले ही आप उन्हें लागू करना नहीं जानते हों।

अगर आप एक तरह की वास्तुकला पर बस गए हैं, तो उससे चिपके रहें। अधिकांश भाग के लिए, आर्किटेक्चर निर्णय सहज होना चाहिए और प्रारंभिक सेटअप के बाद केवल कुछ सेकंड का समय लें। इसका बहुत कुछ अनुभव करने के लिए नीचे आता है।

अंत में, सामान को उखाड़ फेंके नहीं। आप कुछ उदाहरण देते हैं कि किसी चीज को सार्वजनिक या निजी होना चाहिए, और सच्चाई यह है कि यह संभव नहीं है कि आप सब कुछ सार्वजनिक कर दें। हां, आपको इसे इस तरह से नहीं करना चाहिए, और इनमें से कई छोटी गलतियों को एक समय के बाद ढेर कर दिया जाएगा, लेकिन दिन के अंत में यह शायद आपकी परियोजना को भी नहीं मारेगा। सबसे पहले और सबसे महत्वपूर्ण काम का सॉफ्टवेयर बनाना है!

(पुनश्च: यह अंतिम वाक्य आलसी होने का कोई बहाना नहीं है। काम करने वाले सॉफ़्टवेयर को प्राथमिकता देने का मतलब यह नहीं है कि आपको किसी दिन अच्छी कोडिंग सीखने की ज़रूरत नहीं होगी।)


1

उत्तर बहुत सरल है,

  • एक प्रोटोटाइप बनाएं (समय बॉक्सिंग)
  • प्रतिक्षेपक (कारकों की विस्तृत श्रृंखला के आधार पर जितना चाहें उतना समय खर्च करें या करें)

जब आप प्रोटोटाइप का निर्माण कर रहे हैं तो फोकस न्यूनतम व्यवहार्य उत्पाद पर होना चाहिए, और जब आप रिफैक्टिंग कर रहे हों, तो फोकस आपके प्रोजेक्ट या समाधान को स्केलेबल बनाने पर होना चाहिए।


1

आर्किटेक्चर चरण और कोडिंग और डीबगिंग चरण के माध्यम से मैं और अधिक तेज़ी से कैसे प्राप्त कर सकता हूं, जो मुझे पसंद है?

अपने अधिक अनुभवी सहकर्मियों को इस कार्य को (या मदद के लिए पूछकर) वापस करने से।

आपको बस ऐसे निर्णय लेने के लिए आवश्यक अनुभव की कमी है। यूनी आपको एक अच्छी सैद्धांतिक पृष्ठभूमि मिल गई, लेकिन यह केवल आपको एक प्रारंभिक रेखा तक ले जाती है। किसी भी स्थिति में दिए गए आर्किटेक्चर को जज करने का कोई अन्य तरीका नहीं है, यह जानने के बजाय कि अतीत में समान परिस्थितियों में समान आर्किटेक्चर ने कैसे व्यवहार किया था।

उन लोगों के साथ काम करना, जो आपसे बेहतर काम करने का सबसे तेज़ तरीका हैं। यदि आपके पास कोई भी वरिष्ठ व्यक्ति नहीं है, तो आपको एक बेहतर नौकरी की आवश्यकता है। "बेहतर" के रूप में "अपनी आवश्यकताओं को बेहतर" मुकदमा करना। ज्ञान और अनुभव की आवश्यकता इस समय आपकी सबसे अधिक आवश्यकता है, जैसा कि आपकी दुविधा से सिद्ध होता है। आप कोडिंग और डीबगिंग चरण का आनंद लेते हैं? एक सही जूनियर की तरह लगता है। लेकिन एक जूनियर को वरिष्ठ के मार्गदर्शन की आवश्यकता होती है। यह उन नौकरी विवरणों का बिंदु है। इंटरनेट पर अजनबी केवल आपकी मदद कर सकते हैं, आपको एक संरक्षक की आवश्यकता है।


मुझे लगता है कि यह अच्छा जवाब है, लेकिन मैं "उन लोगों के साथ काम करना" बदलने का सुझाव दूंगा जो आपसे बेहतर हैं "से" उन लोगों के साथ काम करना जो आपके साथ अधिक अनुभवी हैं "। 'बेहतर' की व्याख्या अगले वाक्य में प्रदर्शित किए गए तरीकों से की जा सकती है।
जिमीजैम

@JimmyJames मैंने "बेहतर काम पर" बदल दिया है। क्योंकि अनुभव उसका एक हिस्सा मात्र है।
एजेंट_

मैं सामान्य रूप से इससे असहमत नहीं हूं और ठीक यही कारण है कि मुझे लगता है कि 'बेहतर' जरूरी नहीं कि यहां सही शब्द हो। मैं ओपी के लिए सोचता हूं, वे घूम रहे हैं क्योंकि उनके पास डिजाइन की प्रक्रिया का कोई संदर्भ नहीं है। यहां तक ​​कि एक बुरा डिजाइनर / वास्तुकार भी इसमें मदद कर सकता है और तकनीकी रूप से ओपी से बेहतर है। लेकिन एक बार जब ओपी नौकरी को समझते हैं, तो वे संरक्षक की तुलना में 'बेहतर' हो सकते हैं। तो ऐसा नहीं है कि आपका उत्तर गलत है, बस बहुत सी बारीकियाँ हैं जो 'बेहतर' शब्द के उपयोग से स्पष्ट नहीं हैं।
जिमीजैम

1

मैं इस प्रश्न के साथ कुछ गंभीर मुद्दों को देखता हूं। चलो शुरू करते हैं।

आर्किटेकचर डिजाइनिंग को बर्बाद करने से कैसे रोकें

यह सवाल बल्कि भरा हुआ है। इसके अलावा, आप वास्तुकला डिजाइन नहीं करते हैं । आप वास्तुकार । वास्तुकला और डिजाइन पूरक और संबंधित गतिविधियां हैं, लेकिन समान नहीं हैं, भले ही वे ओवरलैप हों।

इसी तरह, आर्किटेक्चर (ओवर-आर्किटेक्चरिंग) करके समय बर्बाद करना संभव है, आप ओवर-डिजाइनिंग और ओवर-कोडिंग में भी समय बर्बाद कर सकते हैं (जरूरत से ज्यादा जटिल तरीके से सामान की कोडिंग करके, या असफल होकर। आवश्यक चीजों के लिए कोड।)

उचित वास्तुकला का उद्देश्य उस कचरे को कोडिंग में रोकना है। ऐसा करना एक जटिल प्रणाली को 1) डिज़ाइन, 2) कोडित और परीक्षण करना, 3) वितरित, 4) बनाए रखा गया, 5) असफलता से उबरना, और 6) अंततः डिकमीशन किया गया।

मेरा अनुभव यह रहा है कि जो लोग सिर्फ कोडिंग का आनंद लेते हैं, वे बिना किसी कोड के सिर्फ यह सोचते हैं कि कैसे एक प्रणाली को संचालित करना है और लंबे समय तक बनाए रखना है, अगले गर्म आलू के लिए आगे बढ़ना है ताकि कुछ खराब आत्मा को बदसूरत golem बनाए रखा जा सके।

लेकिन मैं पीछे हटा...

यह बात है: सिस्टम के लिए पर्याप्त सरल, वास्तुकला स्वयं स्पष्ट है और ध्वनि डिजाइन और कार्यान्वयन प्रथाओं से निकलती है।

यह केवल बड़ी प्रणालियों के लिए होता है, जिसमें बड़ी संख्या में लोग या सिस्टम-स्तरीय सॉफ़्टवेयर शामिल होते हैं जो बहुत जटिल सामान करता है जिसमें स्पष्ट वास्तुकला की आवश्यकता होती है।

मैंने हाल ही में यूनी से स्नातक किया है और एक प्रोग्रामर के रूप में काम करना शुरू कर दिया है। मुझे यह नहीं लगता कि "तकनीकी" मुद्दों को हल करना या डिबगिंग करना मुश्किल है, जो चीजें मैं कहूंगा कि 1 समाधान होगा।

इस पेशे के लिए यह न्यूनतम आवश्यक है, और मुझे खुशी है कि आपको उन्हें करने में कोई समस्या नहीं है (यदि आपने किया तो मुझे चिंता होगी।)

लेकिन वहाँ समस्याओं का एक वर्ग है कि एक समाधान नहीं है लगता है

वे हमारे पेशे की रोटी और मक्खन हैं, उन समस्याओं का प्रकार जिनके लिए नियोक्ता हमारे (आमतौर पर) दूर-से-ऊपर के औसत वेतन का भुगतान करने को तैयार हैं।

तथ्य की बात है, हल करने के लायक समस्याएं वे हैं जिनके पास एक से अधिक समाधान हो सकते हैं। वास्तविक दुनिया की समस्याएं, वे इस तरह हैं। और दुनिया को हमारी विशेषज्ञता की आवश्यकता है, सॉफ्टवेयर डेवलपर्स के रूप में, स्वीकार्य व्यापार-अप के साथ आने के लिए।

- सॉफ्टवेयर आर्किटेक्चर जैसी चीजें।

चीजों की वास्तुकला जटिल प्रणाली की एक अपरिहार्य विशेषता है, उन्हें आभासी / सॉफ्टवेयर या कंक्रीट की दुनिया में होना चाहिए। प्रत्येक प्रणाली जो संचालित होती है, जो इनपुट लेती है और आउटपुट का उत्पादन करती है, यह जटिल होगी और इसमें एक आर्किटेक्चर होगा।

जब हम ऐसी प्रणालियों (एक बैंकिंग प्रणाली, एक शक्ति निगरानी प्रणाली, एक टिकट बिक्री प्रणाली, आदि) के लिए सॉफ्टवेयर विकसित करते हैं, तो हमारा लक्ष्य ऐसे सॉफ्टवेयर का निर्माण करना होता है, जो ऐसी प्रणाली के कार्यों और आवश्यकताओं की नकल करता है।

हम सिर्फ इसे विंग नहीं कर सकते और इसे काउबॉय स्टाइल कोड कर सकते हैं। हमें किसी प्रकार की वास्तुकला की आवश्यकता है। यह विशेष रूप से सच है अगर परियोजना को दर्जनों इंजीनियरों की आवश्यकता होती है, यदि अधिक नहीं।

ये बातें मुझे परेशान करती हैं और मुझे बहुत तकलीफ देती हैं।

वह ठीक है। यह सीखने या सिखाने के लिए आसान विषय नहीं है, बिना अभ्यास के नहीं।

मैं घंटों और घंटों का समय यह तय करने की कोशिश करता हूं कि मेरे कार्यक्रमों और प्रणालियों को "वास्तुकार" कैसे किया जाए। उदाहरण के लिए, क्या मैं इस तर्क को 1 या 2 वर्गों में विभाजित करता हूं, मैं कक्षाओं का नाम कैसे दूं, क्या मुझे इसे निजी या सार्वजनिक करना चाहिए, आदि। इस प्रकार के प्रश्न मेरा बहुत समय लेते हैं, और यह मुझे बहुत निराश करता है। मैं सिर्फ कार्यक्रम बनाना चाहता हूं, वास्तुकला को नुकसान पहुंचाया जाना चाहिए।

दुर्भाग्य से, यह सॉफ्टवेयर आर्किटेक्चर नहीं है।

यह डिजाइन भी नहीं है, लेकिन सिर्फ कोडिंग है। मैं इस पोस्ट के नीचे कुछ सुझाव दूंगा।

आर्किटेक्चर चरण और कोडिंग और डीबगिंग चरण के माध्यम से मैं और अधिक तेज़ी से कैसे प्राप्त कर सकता हूं, जो मुझे पसंद है ?

मुझे इसका जवाब देने के लिए एक कठिन समय मिल रहा है, क्योंकि यह भावनात्मक है।

क्या हम नौकरी पाने की कोशिश कर रहे हैं, या हम सिर्फ अभ्यास का आनंद लेने की कोशिश कर रहे हैं? यह बहुत अच्छा है जब दोनों एक और समान होते हैं, लेकिन वास्तविक जीवन में, कई बार वे नहीं होते हैं।

यह उन चीजों को करने के लिए बहुत अच्छा है जो हम आनंद लेते हैं, लेकिन हमारे जैसे जटिल पेशे में, बस हम जो आनंद लेते हैं, उस पर ध्यान केंद्रित करने के लिए, यह एक फलदायी कैरियर नहीं है।

आप प्रगति नहीं करेंगे, आप नए ज्ञान को परिपक्व या हासिल नहीं करेंगे।

सेना में यह कहावत है, "चूसना को गले लगाओ।"

अन्य वाक्यांशों में समान सलाह है। "अगर यह चूसना नहीं है, तो यह इसके लायक नहीं है" और मेरा पसंदीदा, "अगर यह बेकार है (और यह महत्वपूर्ण है), इसे तब तक करें जब तक यह चूसना बंद न हो जाए।"

मेरी सिफारिशें:

मुझे ऐसा लगता है कि आप अभी भी मतभेदों को समझने के लिए संघर्ष कर रहे हैं

  1. कोडिंग (अपने वर्गों को कैसे कोडित करें, मॉड्यूल या क्या नहीं, नामकरण परंपराओं, पहुंच दृश्यता, गुंजाइश, आदि), आदि

  2. डिजाइन (कितने टियर, फ्रंट-एंड / बैक-एंड / डीबी, प्रत्येक कैसे संचार करता है, कहां जाता है) और अंतर्निहित आर्किटेक्चर निर्णय जो सरल सिस्टम के डिजाइन से आते हैं,

  3. वास्तुकला (जैसा कि हजारों की आवश्यकता वाले जटिल प्रणालियों में पाया जाता है, यदि सैकड़ों-हजारों मानव-घंटे नहीं हैं।)

इसलिए मेरा सुझाव है कि आप इसे अगले स्तर तक ले जाने के लिए पहले विषय (कोडिंग) में गहराई से तल्लीन करें।

साफ कोड

रॉबर्ट "अंकल बॉब" मार्टिन का "क्लीन कोड" शुरू करने के लिए एक अच्छी जगह है।

सॉफ्टवेयर सामंजस्य

इसके अतिरिक्त, मेरा सुझाव है कि आप LCOM या LCOM4 नामक विशिष्ट ऑब्जेक्ट ओरिएंटेड सॉफ़्टवेयर मीट्रिक से परिचित हों।

यह गणितीय हो सकता है और यह बुलेट-प्रूफ नहीं है, लेकिन आपका लक्ष्य अनुभवपूर्वक समझना और पता लगाना चाहिए (या यदि आप चाहें तो नेत्र-गेंद) यदि कोई वर्ग सामंजस्यपूर्ण है या इसमें सामंजस्य का अभाव है।

http://www.aivosto.com/project/help/pm-oo-cohesion.html#LCOM4 https://www.computing.dcu.ie/~renaat/ca421/LCOM.html

सॉफ्टवेयर सिद्धांत

यह "सिंगल रिस्पॉन्सिबिलिटी प्रिंसिपल" या एसआरवाई के साथ निकटता से जुड़ा हुआ है जिससे हम सभी को परिचित होना चाहिए। SRY उन 5 "SOLID" में से एक है, जिनसे हम सभी को परिचित होने की आवश्यकता है यदि हम कोडिंग में पारंगत हो गए हैं।

जैसा कि हम SOLID सिद्धांतों के माध्यम से आगे बढ़ते हैं, हमें अपने आप को "GRASP" सिद्धांतों से परिचित करना होगा , जो शासन करते हैं, या कोड कोड को निर्देशित करते हैं।

अतिरिक्त किताबें

अंत में, मैं निम्नलिखित सुझाव भी दूंगा:

  • मार्टिन फाउलर और केन बेक की "रिफैक्टिंग" इस सूची में पढ़ी जाने वाली अगली पुस्तक होगी।

  • रिचर्ड मिशेल, जिम मैककिम और बर्ट्रेंड मेयर (बाद में एफिल की प्रसिद्धि) द्वारा "डिजाइन द्वारा अनुबंध, उदाहरण के लिए।" यह पुस्तक प्रिंट से बाहर है, लेकिन आप अमेज़ॅन में सस्ती, उपयोग की गई प्रतियां पा सकते हैं।

इसके साथ, आपको सॉफ्टवेयर आर्किटेक्चर को स्थानांतरित करने और मास्टर (या कम से कम मुट्ठी) करने के लिए कोडिंग और डिज़ाइन कैसे शुरू करना है, और अभ्यास के साथ एक अच्छी समझ प्राप्त करनी चाहिए।

मुझे यकीन है कि इन सुझावों को जोड़ने, घटाने या जोड़ने वाले अन्य पेशेवर होंगे। वे अन्य सुझावों के साथ आएंगे, संभवतः अपने स्वयं के अनुभव से मान्य होंगे।

मैं बस इतना ही कह सकता हूं - कोई शॉर्टकट नहीं है।

शुभकामनाएं।


1

यहां बहुत सारी जानकारी है और स्पष्ट रूप से टीएल; डीआर। एक मुख्य बात यह है कि मुझे लगता है कि सिस्टम को कैसे डिज़ाइन किया जाए यह सीखने की कोशिश करते समय लोग गलत हो जाते हैं: वे इस बारे में सोचने की कोशिश करते हैं कि काम कैसे होगा। इसके बजाय, आपको पीछे की ओर काम करने की आवश्यकता है। यही है, डिजाइन / वास्तुकला का मुख्य लक्ष्य यह निर्धारित करना है कि अंतिम परिणाम क्या होना चाहिए।

सादृश्य के रूप में, एक घर की वास्तुकला पर विचार करें। एक वास्तुकार खुद से सवाल पूछना शुरू नहीं करता है: "इस घर में कितनी खिड़कियां होनी चाहिए?", "पहली ईंट कहाँ रखी जानी चाहिए?"। वे कार्यान्वयन विवरण डिज़ाइन नहीं हैं, वे डिज़ाइन से लिए गए हैं। पुरालेख एक दृष्टि से शुरू होता है, शायद एक स्केच क्या खत्म हो गया घर जैसा दिख सकता है। क्या यह एकल परिवार वाला घर है, डुप्लेक्स? क्या यह एक लक्जरी घर है या आसानी से सस्ती है? इसी तरह, चाहे वे चर निजी हों और चाहे आप एक वर्ग को विभाजित करते हों, वास्तुकला के साथ बहुत कम है।

अपने डिजाइन के लक्ष्यों का पता लगाने के साथ पहले शुरू करें। उदाहरण के लिए, क्या यह एक बंद समाधान है? क्या यह दशकों तक विस्तारित और संशोधित और बनाए रखा जा रहा है? इसका उत्तर बहुत अलग डिजाइनों को इंगित करेगा और यह वास्तुकला का बिंदु है। एक बार जब आप समझ गए कि आपको क्या करने की आवश्यकता है, तो डिजाइन का विवरण स्वाभाविक रूप से अनुसरण करता है। ऐसा नहीं है कि ये विवरण स्पष्ट या आसान हैं, लेकिन यह उच्च-स्तरीय योजना है जो इन विकल्पों पर आधारित है।


0

यह कैसे निर्धारित करें कि किसी भी प्रकार के सॉफ़्टवेयर के किसी भी टुकड़े को आर्किटेक्चर करने से पहले आपको कितना समय देना चाहिए, किसी प्रकार का लिखने-संकलन-परीक्षण का लूप बहुत सीधा है: आपके सिर में फिट होने के लिए पर्याप्त जानकारी, और इससे अधिक नहीं। जब तक कि आप जिस परियोजना पर काम कर रहे हैं, वह एक सख्त पद्धति है। जिस स्थिति में एक शुरुआत के रूप में सबसे अधिक संभावना है कि आपको एक वास्तुकला दस्तावेज़ पढ़ना चाहिए, इसे लिखना नहीं।

चीजों के नामकरण के लिए, मेरे लिए जो "लेखन" का हिस्सा है, लेकिन यह निस्संदेह प्रोग्रामिंग का एक बहुत ही महत्वपूर्ण हिस्सा है: आप चीजों को कैसे नाम देते हैं, और कठिन से कठिन नाम के दायरे के बारे में सोचने में संकोच न करें।

सही नाम, सही वास्तुकला, सही प्रतिरूपता और सही सार खोजना अनुभव का हिस्सा है जिसे आप गलतियाँ करके हासिल करेंगे। पिछले कुछ वर्षों में मैंने एक कार्यक्रम को पांच बार करने के बारे में लिखा है और प्रत्येक बार कोड बहुत अलग था क्योंकि हर पिछले पुनरावृत्ति ने मुझे एक बेहतर डिजाइन पर संकेत दिया था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.