आप एक जटिलता कूद कैसे प्रबंधित करते हैं?


13

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

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

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

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

संपादित करें: पागल एडी के जवाब में शामिल है "आप इसे चूसते हैं और नई जटिलता को लागू करने के लिए कम से कम महंगा तरीका ढूंढते हैं।" इससे मुझे कुछ ऐसा समझ में आया जो प्रश्न में निहित था लेकिन मैंने विशेष रूप से नहीं उठाया।

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

जवाबों:


8

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

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


6

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

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

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

मेरे पास स्पष्ट रूप से कोई चांदी की गोलियां नहीं हैं, लेकिन मुझे पूरा यकीन है कि सबसे बड़ी गलती यह हो सकती है कि आप यह समझें कि आप इसे समझते हैं और इसे हल किया है।

पहले से ही कवर किए गए अन्य उत्तरों के अलावा इस सब से निपटने के बारे में कुछ विचार:

  • बड़ी विनम्रता
  • स्वीकार करें कि आपका सिस्टम / कार्यक्रम अपूर्ण, अपूर्ण और अपूर्ण है
  • त्रुटियों के लिए तैयार करें
  • बदलाव को स्वीकारें
  • अतिरेक की योजना
  • भविष्य के प्रमाण के बारे में सोचो
  • जीव विज्ञान या समाजशास्त्र को देखें कि जटिल प्रणाली कैसे व्यवहार करती है
  • परस्पर स्थिति से बचने के लिए अपनी पूरी कोशिश करें। स्टेटलेस प्रोटोकॉल (जैसे REST और HTTP) के लिए जाएं।
  • कार्यात्मक प्रोग्रामिंग कुछ दर्द को कम कर सकता है

मुझे लगता है कि मैं आगे और आगे बढ़ सकता हूं। बहुत ही रोचक विषय :)


जीव विज्ञान या समाजशास्त्र को देखें कि जटिल प्रणाली कैसे व्यवहार करती है - C'mon। आपके उत्तर का बाकी हिस्सा ठोस था, लेकिन इसमें वर्णित समस्या का ऐसा परिधीय अनुप्रयोग है।
जिम जी।

1
@ जीम जी हो सकता है। जीवविज्ञान आपके फॉर-लूप्स को अनुकूलित करने में मदद नहीं करेगा, लेकिन यदि आप नए दृष्टिकोण, अंतर्दृष्टि या प्रभावी सार (सॉफ्टवेयर विकास पर) के साथ आना चाहते हैं, तो यह किसी के सैंडबॉक्स से बाहर निकलने में मदद करता है। यह तर्क देते हुए कि जीव विज्ञान (या समाजशास्त्र) का प्रोग्रामिंग से कोई लेना-देना नहीं है, यह कुछ ही तर्क देता है कि OOP या डिज़ाइन पैटर्न का प्रोग्रामिंग से कोई लेना-देना नहीं है। उदाहरण के लिए: OOP : जीवविज्ञान -> एलन के -> OOP / स्मॉलटाक। या डिजाइन पैटर्न : समाजशास्त्र -> शहरी डिजाइन -> क्रिस्टोफर अलेक्जेंडर -> एक पैटर्न भाषा -> डिजाइन पैटर्न।
मैग्लोब

@ जीम जी कंट। कुछ उद्धरण, एलन के: "मैंने सोचा कि वस्तुओं को एक नेटवर्क पर जैविक कोशिकाओं और / या व्यक्तिगत कंप्यूटरों की तरह होना चाहिए, केवल संदेशों के साथ संवाद करने में सक्षम है", और विकिपीडिया: "[डिजाइन पैटर्न] यह विचार वास्तुकार क्रिस्टोफर अलेक्जेंडर द्वारा प्रस्तुत किया गया था। वास्तुकला का क्षेत्र [1] और कंप्यूटर विज्ञान सहित विभिन्न अन्य विषयों के लिए अनुकूलित किया गया है "
मैग्लोब

ठीक है। मैं आपको पारस्परिक स्थिति और अन्य सोने की डली से बचने के लिए अपना प्रयास करने के लिए +1 दे रहा हूं । मेरा कहना यह है कि यदि आपके प्रबंधक ने जटिलता को कम करने का काम किया है, तो आप निश्चित रूप से समस्या के लिए ओकाम के रेजर को लागू करेंगे और काम पर लग जाएंगे। मुझे नहीं लगता कि आप या कोई भी व्यक्ति तत्काल समस्या के लिए मदद के लिए "जीवविज्ञान की ओर देखेगा"।
जिम जी।

2

मैं @ Péter Török के जवाब की भावना से असहमत हूं क्योंकि यह मानता है कि एक टीम (या व्यक्ति) आवश्यक रूप से प्रोजेक्ट जीवनचक्र में सबसे जल्दी जोखिम वाली वस्तुओं को दूर कर सकती है। उदाहरण के लिए, ओपी के मामले में, टीम बहु-थ्रेडेड समाधान से जुड़ी बढ़ती जटिलता को दूर नहीं कर सकती जब तक कि उनकी पीठ दीवार के खिलाफ न हो।

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

यहां बताया गया है कि मैं इस समस्या से कैसे निपटूंगा:

  1. फ्रेड ब्रूक्स की सलाह का पालन करें और अपने डेवलपर्स को एक सर्जरी टीम की तरह व्यवस्थित करें ।
  2. एक बुद्धिमान और "परोपकारी" मास्टर-सर्जन चुनें जो दोनों कर सकते हैं: ए) अपने सहकर्मियों के विश्वास और सम्मान को बढ़ाएं; और बी) समयबद्ध तरीके से कठिन निर्णय लें।
  3. विकास प्रक्रिया के फ्रंट-एंड और बैक-एंड पर जटिलता को कम करने के लिए मास्टर-सर्जन की अपेक्षा करें।

बिंदु # 3 पर अधिक:

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

ओपी के मामले में आईएमएचओ को पहले परीक्षण करना शुरू करना चाहिए था, यह जानने के लिए कि वास्तविक जीवन परिस्थितियों में उनकी वास्तुकला कैसे (और यदि) काम करती है। "मास्टर सर्जन" का सुझाव देकर Btw, आप मूल रूप से लग रहे हैं कि ऐसे लोग हैं जो इस परियोजना के तकनीकी जोखिमों को दूर कर सकते हैं - जिस सटीक बिंदु से आप असहमत हैं।
पेर्ट टॉरक

@ Péter Török: ... एक "मास्टर सर्जन" का सुझाव देकर, आप मूल रूप से इसका अर्थ लगाते हैं कि ऐसे लोग हैं जो परियोजना के तकनीकी जोखिमों को दूर कर सकते हैं : नहीं, मैं नहीं। मैं कह रहा हूं कि ये लोग दोनों हैं: ए) पूरी तरह से पहली जगह में जटिलता से बचने के लिए सबसे उपयुक्त ; और बी) कोड को भेजने के बाद जटिलता से बाहर एक टीम को खोदने के लिए सबसे उपयुक्त।
जिम जी।

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

1
यह मुझे स्वर्गीय, महान, घोड़ा ट्रेनर रे हंट के एक उद्धरण की याद दिलाता है: "आपको अच्छा निर्णय कैसे मिलता है? अनुभव। आपको कैसा अनुभव मिलता है? बुरा निर्णय।"
ग्लेनट्रॉन

1

इंटरफेस के लिए कोड

नई कार्यक्षमता लिखते समय अन्य कार्यक्षमता के साथ इंटरफेस करना, एक इंटरफेस (जावा तरह) के रूप में एक सीमा बनाते हैं जिसके माध्यम से सभी गुजरते हैं। यह करेगा

  1. यह सुनिश्चित करने के लिए कि आप किस प्रकार की कार्यक्षमता का उपयोग करते हैं, उस पर आपका पूरा नियंत्रण है
  2. आपको एक ही कार्यक्षमता के कई कार्यान्वयन करने की अनुमति देते हैं।
  3. समग्र जटिलता को नीचे रखें क्योंकि मॉड्यूल केवल पूरी तरह से इंटरकेटेड होने के बजाय पतले से जुड़े हुए हैं।

0

कोई एक साधारण आधार और मॉडल के साथ शुरू कर सकता है और अचानक परियोजना के विकास में जटिलता की वृद्धि हो सकती है

आश्चर्य की बात नहीं।

यह सॉफ्टवेयर डेवलपमेंट है। यदि आप कुछ नया आविष्कार नहीं कर रहे हैं, तो आप एक मौजूदा, सिद्ध समाधान डाउनलोड कर रहे हैं।

थोड़ा बीच का मैदान है।

यदि आप कुछ नया आविष्कार कर रहे हैं, तो कम से कम एक विशेषता होनी चाहिए जिसे आप पूरी तरह से नहीं समझते हैं। (इसे पूरी तरह से समझने के लिए, आपको एक कार्यान्‍वयन कार्य करना होगा, जिसका आप अभी उपयोग करेंगे।)

इसे कैसे प्रबंधित करें?

  1. यथार्थवादी अपेक्षाएँ रखें। आप कुछ नया आविष्कार कर रहे हैं। ऐसे हिस्से होने चाहिए जिन्हें आप नहीं समझते हैं।

  2. यथार्थवादी अपेक्षाएँ रखें। यदि यह पहली बार सही काम करता है, तो आपने कुछ अनदेखा कर दिया है।

  3. यथार्थवादी अपेक्षाएँ रखें। यदि यह सरल था, तो किसी और ने इसे पहले किया होगा, और आप बस उस समाधान को डाउनलोड कर सकते हैं।

  4. यथार्थवादी अपेक्षाएँ रखें। आप भविष्य की बहुत अच्छी भविष्यवाणी नहीं कर सकते।


2
रुको, तो आप जो कह रहे हैं वह है: यथार्थवादी अपेक्षाएँ?
ग्लेनट्रॉन

0

मन में अप्रचलन के साथ डिजाइन और कोड। यह मान लें कि आज आपको जो कोड चाहिए उसे कल काट दिया जाएगा और उसे बदल दिया जाएगा।


0

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


0

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

हालांकि, स्थानीय, विशिष्ट कारकों का एक मेजबान है जो यहां खेल सकते हैं, जैसे:

  • इस प्रणाली के लिए लक्ष्य। क्या यह एकबारगी बात है? क्या आप मध्यम से लंबी अवधि के लिए इस प्रणाली को काम करने का इरादा रखते हैं?

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

  • टीम के गोल। क्या यह "किसी भी कीमत पर अब ऐसा करना" है, या "चलो इसे सही करना" है?

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

  • समस्या की आपकी समझ। पिछला समाधान काम क्यों नहीं किया?

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

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

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