मुझे स्पेगेटी कोड की 200K लाइनें विरासत में मिली हैं - अब क्या?


470

मुझे उम्मीद है कि यह एक सवाल का सामान्य नहीं है; मैं वास्तव में कुछ अनुभवी सलाह का उपयोग कर सकता हूं।

मैं वैज्ञानिकों की एक छोटी सी दुकान में एकमात्र "एसडब्ल्यू इंजीनियर" के रूप में नव-नियुक्त हूं, जिन्होंने पिछले 10-20 वर्षों में एक विशाल कोड आधार के साथ मिलकर काम किया है। (यह लगभग अप्रचलित भाषा में लिखा गया था: G2 - ग्राफिक्स के साथ पास्कल लगता है)। कार्यक्रम खुद एक जटिल रासायनिक प्रसंस्करण संयंत्र का एक भौतिक मॉडल है; यह लिखने वाली टीम को अविश्वसनीय रूप से गहरे डोमेन ज्ञान है, लेकिन प्रोग्रामिंग बुनियादी बातों में बहुत कम या कोई औपचारिक प्रशिक्षण नहीं है। उन्होंने हाल ही में गैर-मौजूद कॉन्फ़िगरेशन प्रबंधन के परिणामों के बारे में कुछ कठिन सबक सीखे हैं। उनके रखरखाव के प्रयासों को भी कोड में खुद को अनजाने "कीचड़" के विशाल संचय से बहुत बाधा आती है। मैं आपको स्थिति की "राजनीति" से अलग कर दूंगा (वहां हमेशा होता है राजनीति!), लेकिन यह कहने के लिए पर्याप्त है कि आगे के मार्ग के लिए क्या आवश्यक है, इस बारे में एक राय नहीं है।

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

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

तो यह है कि मेरे सवाल है: क्या होगा आप सबसे प्रभावी रणनीति की अपनी सूची में मदद करने के स्पेगेटी सीधा (और भविष्य में उसे रोकने में) में शामिल हैं?



13
चूंकि G2 नॉट-कोड जैसा है, बल्कि कुछ गैडफुल GUI द्वारा लिखा गया स्वचालित कोड है, इसलिए मुझे लगता है कि आपको यह निर्दिष्ट करने की आवश्यकता है कि क्या आप वास्तव में G2 में रिफैक्टिंग कर रहे हैं या पूरे लानत चीज़ को कुछ समझदारी से पुनः प्राप्त कर रहे हैं।
एरिक रिपेन

101
जो कुछ भी आप करते हैं, उसे स्क्रैच से दोबारा न लिखें। यह एक गंभीर गलती होगी। रासायनिक ज्ञान के 20 साल: यह ऐसा सामान है जिसे आप कभी नहीं बना पाएंगे। और आप वैज्ञानिकों से सम्मान खो देंगे।
फ्रांसेस्को

13
@ फ्रांसेस्को की टिप्पणी: joelonsoftware.com/articles/fog0000000069.html पर पुनः लेखन नहीं करने पर जोएल स्पोल्स्की की युक्तियुक्त सलाह जोड़ें ।
शासन

16
नीस बोली मैं हाल ही में पढ़ा है कि संबंधित से संबंधित है: "सॉफ्टवेयर एकमात्र इंजीनियरिंग क्षेत्र है जो प्रोटोटाइप को एक साथ फेंकता है और फिर उन्हें वितरित सामान के रूप में बेचने का प्रयास करता है"
क्रिस एस

जवाबों:


466

प्रस्तावना

यह वास्तव में एक कठिन काम है, और इसमें बहुत कुछ शामिल है। इसलिए मैं विनम्रतापूर्वक उचित उपकरण और शैक्षिक सामग्री के लिए संकेत के साथ आपकी टीम के लिए कुछ व्यापक मार्गदर्शक के रूप में यह सुझाव दे रहा हूं।

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

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

नोट: यह सब सीधे G2 जैसे विज़ुअल प्रोग्रामिंग सिस्टम पर लागू नहीं होता है। इनसे कैसे निपटा जाए, इस बारे में अधिक जानकारी के लिए, अंत में परिशिष्ट अनुभाग देखें ।


अधीर के लिए कार्यकारी सारांश

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

अब लंबे संस्करण के लिए ... सावधानी, अपने आप को संभालो!


कठोरता (अक्सर) अच्छा है

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

रिगिडिटी = प्रक्रिया / प्रक्रिया

सॉफ़्टवेयर विकास को ठीक उसी प्रक्रिया और प्रक्रियाओं की आवश्यकता होती है, जिसके लिए रासायनिक कारणों या कारखानों में मैनुअल, प्रक्रियाएं, अभ्यास और आपातकालीन दिशानिर्देश हैं: खराब परिणामों को रोकना, भविष्यवाणी बढ़ाना, उत्पादकता को अधिकतम करना ...

हालांकि, मॉडरेशन में कठोरता आती है!

परियोजना संरचना की कठोरता

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

बिल्ड सिस्टम की कठोरता

यदि प्रत्येक प्रोजेक्ट अलग दिखता है , तो एक अच्छा मौका है कि वे भी अलग तरीके से निर्माण करें । एक निर्माण के लिए बहुत अधिक शोध या बहुत अधिक अनुमान की आवश्यकता नहीं होनी चाहिए। : आप विहित बात करने के लिए और विशेष के बारे में चिंता करने की जरूरत नहीं सक्षम होना चाहते हैं configure; make install, ant, mvn installआदि, ...

उसी बिल्ड सिस्टम का फिर से उपयोग करना और समय के साथ इसे विकसित करना भी गुणवत्ता के सुसंगत स्तर को सुनिश्चित करता है।

आपको READMEपरियोजना की बारीकियों को इंगित करने के लिए त्वरित रूप से आवश्यकता है , और यदि कोई हो, तो उपयोगकर्ता / डेवलपर / शोधकर्ता का मार्गदर्शन करें।

यह आपके बिल्ड इंफ्रास्ट्रक्चर के अन्य भागों को भी बहुत सुगम बनाता है, अर्थात्:

इसलिए अपने बिल्ड (अपनी परियोजनाओं की तरह) को अद्यतित रखें, लेकिन समय के साथ इसे कठोर बना दें, और उल्लंघन और बुरे व्यवहारों की रिपोर्टिंग में अधिक कुशल हों।

पहिया को सुदृढ़ न करें, और जो आपने पहले ही किया है उसका पुन: उपयोग करें।

अनुशंसित पाठ:

प्रोग्रामिंग भाषाओं की पसंद में कठोरता

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

एक मजबूत कोर करने के लिए अपने तकनीकी स्टैक को सरल रखें, और आवश्यक कौशल के रखरखाव और चौड़ाई: एक मजबूत कोर।

कोडिंग कन्वेंशनों और दिशानिर्देशों की कठोरता

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

निरर्थक नियम जो जीवन को कठिन बनाते हैं या कार्रवाई को उस हद तक निषिद्ध करते हैं, जो एकल सरल उल्लंघनों के आधार पर मना कर दिया जाता है, एक बोझ है। हालाँकि:

  • एक सुविचारित जमीनी नियम बहुत सी सोच और सोच को दूर कर देता है : किसी को भी किसी भी परिस्थिति में नहीं टूटना चाहिए;

  • और अनुशंसित नियमों का एक सेट अतिरिक्त मार्गदर्शन प्रदान करता है।

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

कुछ भाषाएं इसे डिजाइन द्वारा लागू करती हैं:

  • जावा सुस्त बकवास की मात्रा को कम करने के लिए था जिसे आप इसके साथ लिख सकते हैं (हालांकि इसमें कोई संदेह नहीं है कि इसे करने के लिए कई प्रबंधन हैं)।
  • इंडेंटेशन द्वारा पायथन की ब्लॉक संरचना इस अर्थ में एक और विचार है।

  • जाओ, इसके gofmtउपकरण के साथ , जो पूरी तरह से किसी भी बहस और प्रयास ( और अहंकार !! ) को दूर ले जाता है : शैली के लिए निहित: gofmtइससे पहले कि आप प्रतिबद्ध हों।

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

इसके अलावा, जैसा कि आप नीचे देखेंगे, कोड प्रलेखन है , और यह एक अन्य क्षेत्र है जहां सम्मेलनों पठनीयता और स्पष्टता को प्रोत्साहित करते हैं।

प्रलेखन की कठोरता

प्रलेखन कोड के साथ हाथ में हाथ जाता है। कोड ही प्रलेखन है। लेकिन चीजों को बनाने, उपयोग करने और बनाए रखने के बारे में स्पष्ट-कट निर्देश होना चाहिए।

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

कोड और टूलिंग पर लागू होने वाली अधिकांश सलाह प्रलेखन पर भी लागू होती है।

संहिता की टिप्पणियों में कठोरता

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

प्रतिबद्ध लॉग में कठोरता

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

कारण एक कारण के लिए किए जाते हैं, और वह कारण ISN'T हमेशा आपके कोड और आपके द्वारा दर्ज किए गए कमिट लॉग की एक पंक्ति द्वारा स्पष्ट रूप से व्यक्त किया जाता है। इसके अलावा और भी बहुत कुछ है।

कोड की प्रत्येक पंक्ति में एक कहानी और एक इतिहास होता है । डिफरेंस इसका इतिहास बता सकते हैं, लेकिन आपको इसकी कहानी लिखनी होगी।

मैंने इस लाइन को अपडेट क्यों किया? -> क्योंकि इंटरफ़ेस बदल गया।

इंटरफ़ेस क्यों बदला? -> क्योंकि पुस्तकालय L1 परिभाषित यह अद्यतन किया गया था।

लाइब्रेरी को अपडेट क्यों किया गया? -> क्योंकि पुस्तकालय L2, कि हमें F की सुविधा के लिए, पुस्तकालय L1 पर निर्भर होना चाहिए।

और फीचर X क्या है? -> समस्या ट्रैकर में कार्य 3456 देखें।

यह मेरी SCM पसंद नहीं है, और यह आपकी प्रयोगशाला के लिए सबसे अच्छा नहीं हो सकता है; लेकिन Gitयह अधिकार प्राप्त करता है, और आपको उपयोग करके short logsऔर , अन्य SCMs सिस्टम की तुलना में अधिक अच्छे लॉग लिखने के लिए मजबूर करने की कोशिश करता है long logs। कार्य आईडी लिंक करें (हाँ, आपको एक की आवश्यकता है) और इसके लिए एक सामान्य सारांश छोड़ें shortlog, और लंबे लॉग में विस्तार करें: परिवर्तन की कहानी लिखें ।

यह एक लॉग है: यह ट्रैक और रिकॉर्ड अपडेट रखने के लिए यहां है।

अंगूठे का नियम: यदि आप बाद में इस बदलाव के बारे में कुछ खोज रहे थे, तो क्या आपका लॉग आपके प्रश्न का उत्तर देने की संभावना है?

प्रोजेक्ट्स, डॉक्यूमेंटेशन और कोड अलाइव हैं

उन्हें सिंक में रखें, अन्यथा वे उस सहजीवी इकाई का निर्माण नहीं करते हैं। जब आपके पास यह अद्भुत काम करता है:

  • आपके SCM, w / लिंक को आपके इश्यू ट्रैकर में कार्य आईडी के लिए स्पष्ट रूप से लॉग इन करता है,
  • जहाँ इस ट्रैकर के टिकट आपके SCM (और संभवतः आपके CI सिस्टम में निर्मित होने वाले बदलावों) से लिंक होते हैं,
  • और एक प्रलेखन प्रणाली जो इन सभी से जुड़ती है।

कोड और प्रलेखन को एकजुट होने की आवश्यकता है

परीक्षण में कठोरता

अंगूठे का नियम:

  • कोई भी नया कोड (कम से कम) यूनिट परीक्षणों के साथ आएगा।
  • कोई भी परिलक्षित विरासत कोड इकाई परीक्षणों के साथ आएगा।

बेशक, इन की जरूरत है:

  • वास्तव में कुछ मूल्यवान परीक्षण करने के लिए (या वे समय और ऊर्जा की बर्बादी हैं),
  • अच्छी तरह से लिखा और टिप्पणी की जा सकती है (ठीक उसी तरह जैसे कोई अन्य कोड आप चेक करते हैं)।

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

बेशक, आपको आगे जाना चाहिए और आपके द्वारा ठीक किए गए प्रत्येक प्रतिलिपि प्रस्तुत करने योग्य बग के लिए एकीकरण परीक्षण और प्रतिगमन परीक्षण होना चाहिए ।

उपकरण के उपयोग में कठोरता

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

इससे परे, सदस्यों को वे जो चाहते हैं, उसका उपयोग करने दें, जब तक वे सभी हैं:

  • उत्पादक ,
  • नियमित रूप से सहायता की आवश्यकता नहीं है
  • नियमित रूप से अपने सामान्य बुनियादी ढांचे के लिए समायोजन नहीं ,
  • अपने बुनियादी ढांचे को बाधित नहीं करना (कोड, बिल्ड सिस्टम, प्रलेखन ... जैसे सामान्य क्षेत्रों को संशोधित करके),
  • दूसरों के काम को प्रभावित नहीं करना ,
  • ABLE अनुरोधित किसी भी कार्य को समय पर करने के लिए

अगर ऐसा नहीं है, तो लागू करें कि वे चूक के लिए वापस आते हैं।


कठोरता बनाम बहुमुखी प्रतिभा, अनुकूलनशीलता, प्रोटोटाइप और आपात स्थिति

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


टीम स्पिरिट मैटर्स

अपने कोडबेस में सेंस ऑफ प्राइड विकसित करें

  • कोड में गर्व की भावना का विकास करना
    • चारदीवारी का उपयोग करें
      • एक निरंतर एकीकरण खेल के लिए लीडर बोर्ड
      • अंक प्रबंधन और दोष की गिनती के लिए वॉलबोर्ड
    • किसी समस्या ट्रैकर / बग ट्रैकर का उपयोग करें

ब्लेम गेम्स से बचें

  • सतत एकीकरण / सतत निरीक्षण खेलों का उपयोग करें: यह अच्छी-मानवयुक्त और उत्पादक प्रतियोगिता को बढ़ावा देता है ।
  • ट्रैक दोष रखें: यह सिर्फ अच्छा घर रखने है।
  • मूल कारणों की पहचान करना : यह भविष्य में होने वाली प्रक्रिया है।
  • लेकिन दोष न दें : यह काउंटर उत्पादक है।

यह कोड के बारे में है, डेवलपर्स के बारे में नहीं

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

यह एक विरोधाभास है: आपको स्वस्थ कार्यस्थल के लिए अहंकार कम प्रोग्रामिंग को प्रोत्साहित करने की जरूरत है लेकिन प्रेरक उद्देश्यों के लिए अहंकार पर भरोसा करना चाहिए।


साइंटिस्ट से लेकर प्रोग्रामर तक

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

किसी ने टिप्पणियों में तर्क दिया कि एक परियोजना और उसके कोड पर 10 से 20 साल बाद, किसी को भी लगाव महसूस होगा। शायद मैं गलत हूं, लेकिन मुझे लगता है कि उन्हें कोड के परिणामों और काम और उसकी विरासत पर गर्व है, न कि खुद कोड या इसे लिखने के कार्य के बारे में।

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


कोड रखरखाव अनुसंधान कार्य का हिस्सा है

कोई भी गंदे शोध पत्र नहीं पढ़ता है। यही कारण है कि वे सहकर्मी-समीक्षा, प्रमाण-पठन, परिष्कृत, पुन: लिखित, और स्वीकृत समय और फिर से प्रकाशित होने के लिए तैयार होने तक के समय को स्वीकार करते हैं। वही एक थीसिस और एक कोडबेस पर लागू होता है !

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


यह सब क्यों??!

हम उपरोक्त सभी से क्यों परेशान हैं? के लिए कोड गुणवत्ता । या यह गुणवत्ता कोड है ...?

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

जब लक्ष्य पहुंच के भीतर हो तो आप कैसे जानते हैं?

गुणवत्ता मापने योग्य है

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

निरंतर निरीक्षण के लिए महान उपकरण हैं । सोनार जावा दुनिया में एक लोकप्रिय एक है, लेकिन यह किसी भी प्रौद्योगिकियों के लिए अनुकूल हो सकता है; और कई अन्य हैं। अपने कोड को माइक्रोस्कोप के नीचे रखें और इन pesky कष्टप्रद कीड़े और रोगाणुओं की तलाश करें।


लेकिन क्या होगा अगर मेरा कोड पहले से ही बकवास है?

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

यहां रहस्य है: आपको कहीं शुरू करने की आवश्यकता है

व्यक्तिगत उपाख्यान: एक परियोजना में, हमने मूल रूप से 650,000+ जावा LOC, JSPs की 200,000+ पंक्तियों, 40,000+ जावास्क्रिप्ट LOC और 400+ एमबी की द्विआधारी निर्भरता वाले एक कोडबेस के साथ काम किया।

लगभग 18 महीनों के बाद, यह 500,000 जावा LOC (MOSTLY CLEAN) , JSP की 150,000 लाइनें और 38,000 JavaScript LOC है, निर्भरता के साथ मुश्किल से 100MB (और ये हमारे SCM में अब नहीं हैं!)।

हम इसे कैसे करेंगे? हमने उपरोक्त सभी किया था। या बहुत कोशिश की।

यह एक टीम प्रयास है, लेकिन हम धीरे धीरे इंजेक्षन हमारी प्रक्रिया नियमों और उपकरणों में, हमारे उत्पाद की हृदय गति की निगरानी के लिए है, जबकि जल्दबाजी में कमी "वसा" दूर: बकवास कोड, बेकार निर्भरता ... हम करने के लिए सभी विकास नहीं रोका ऐसा करें: हमारे पास कभी-कभार सापेक्ष शांति और शांतता है जहां हम कोडबेस पर पागल होने के लिए स्वतंत्र हैं और इसे फाड़ देते हैं, लेकिन अधिकांश समय हम इसे एक "समीक्षा और रिफ्लेक्टर" मोड में डिफ़ॉल्ट रूप से करते हैं जो हमें हर मौका मिलता है। : बिल्ड के दौरान, दोपहर के भोजन के दौरान, बग फिक्सिंग स्प्रिंट के दौरान, शुक्रवार दोपहर के दौरान ...

कुछ बड़े "काम" थे ... हमारे निर्माण प्रणाली को 8500+ XML LOC के विशालकाय एंट बिल्ड से एक मल्टी-मॉड्यूल मावेन बिल्ड में बदलना उनमें से एक था। हमने तब:

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

एक और "उपयोगिता उपकरण बेल्ट" के इंजेक्शन था, भले ही हम निर्भरता कम करने के लिए कोशिश कर रहे थे: गूगल अमरूद और अपाचे कॉमन्स अपने कोड नीचे पतला और और में कीड़े के लिए सतह को कम करने के लिए अपने कोड एक बहुत।

हमने अपने आईटी विभाग को भी मना लिया कि शायद हमारे नए टूल (JIRA, Fisheye, Crucible, Confluence, Jenkins) का उपयोग करना लोगों की तुलना में बेहतर था। हम अभी भी कुछ हम तुच्छ (QC, Sharepoint और SupportWorks ...) से निपटने की जरूरत है, लेकिन यह कुछ और कमरे के साथ छोड़ दिया गया था, एक समग्र सुधार का अनुभव था।

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

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


सुपर-सीक्रेट इन्क्रीमेंटल स्पैगेटी कोड रिफ्लेक्टिंग साइकिल विस्मयकारी गुणवत्ता के लिए

       +-----------------+      +-----------------+
       |  A N A L Y Z E  +----->| I D E N T I F Y |
       +-----------------+      +---------+-------+
                ^                           |
                |                           v
       +--------+--------+      +-----------------+
       |    C L E A N    +<-----|      F I X      |
       +-----------------+      +-----------------+

एक बार जब आप अपने टूलबेल्ट में कुछ गुणवत्ता वाले उपकरण रखते हैं:

  1. कोड गुणवत्ता चेकर्स के साथ अपने कोड का विश्लेषण करें।

    लिंटर, स्टैटिक एनालिसर्स, या आपके पास क्या है।

  2. अपने महत्वपूर्ण हॉटस्पॉट और कम लटके फलों को पहचानें

    उल्लंघन में गंभीरता का स्तर होता है, और बड़ी संख्या में उच्च-गंभीरता वाले बड़े वर्ग एक बड़ा लाल झंडा होते हैं: जैसे, वे रेडिएटर / हीटमैप प्रकार के विचारों पर "हॉट स्पॉट" के रूप में दिखाई देते हैं।

  3. पहले हॉटस्पॉट्स को ठीक करें

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

  4. स्वचालित कोडबेस स्वीप के साथ निम्न स्तर के उल्लंघन को साफ करें ।

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

  5. जब तक आप संतुष्ट न हों तब तक दोहराएं

    जो, आदर्श रूप से, आपको कभी भी नहीं होना चाहिए, अगर यह अभी भी एक सक्रिय उत्पाद है: यह विकसित होता रहेगा।

गुड हाउस-कीपिंग के लिए त्वरित सुझाव

  • जब एक ग्राहक समर्थन अनुरोध के आधार पर हॉटफ़िक्स-मोड में :

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

    • निश्चित रूप से: इसकी समीक्षा करें (नोट्स ले लें, रिपोर्ट जारी करें),
    • हो सकता है: इसे साफ करें (स्टाइल क्लीनअप और मामूली उल्लंघन),
    • आदर्श: refactor यह (बड़े वर्गों और उनके neigbors पुनर्निर्माण)।

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


परिशिष्ट: दृश्य प्रोग्रामिंग वातावरण का प्रबंधन

Bespoke प्रोग्रामिंग सिस्टम की दीवारों वाले गार्डन

ओपी के G2 की तरह कई प्रोग्रामिंग सिस्टम, अलग-अलग जानवर हैं ...

  • कोई स्रोत "कोड" नहीं

    अक्सर वे आपको अपने स्रोत "कोड" के एक पाठीय प्रतिनिधित्व तक पहुंच नहीं देते हैं: यह एक मालिकाना बाइनरी प्रारूप में संग्रहीत किया जा सकता है, या शायद यह पाठ प्रारूप में चीजों को संग्रहीत करता है, लेकिन उन्हें आपसे दूर छुपाता है। Bespoke ग्राफिकल प्रोग्रामिंग सिस्टम वास्तव में अनुसंधान प्रयोगशालाओं में असामान्य नहीं हैं, क्योंकि वे दोहरावदार डेटा प्रोसेसिंग वर्कफ़्लो के स्वचालन को सरल बनाते हैं।

  • कोई टूलींग नहीं

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

  • दस्तावेज़ीकरण का अभाव

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

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

व्यक्तिगत किस्सा 2:दरअसल, मैंने इनमें से एक पर खुद काम किया। मैंने ओपी के अनुरोध के साथ लिंक नहीं किया, लेकिन मेरी परियोजना डेटा-प्रोसेसिंग और डेटा-स्टोरेज सॉफ़्टवेयर के अंतर-जुड़े बड़े टुकड़ों का एक सेट थी (मुख्य रूप से जैव-सूचना विज्ञान अनुसंधान, स्वास्थ्य देखभाल और सौंदर्य प्रसाधन के लिए, लेकिन व्यवसाय के लिए भी खुफिया, या किसी भी तरह के अनुसंधान डेटा के बड़े संस्करणों की ट्रैकिंग और डेटा-प्रोसेसिंग वर्कफ़्लोज़ और ईटीएल) की तैयारी को प्रभावित करने वाला कोई भी डोमेन)। इनमें से एक एप्लिकेशन काफी सरल था, एक विजुअल आईडीई जो सामान्य घंटियों और सीटी का उपयोग करता था: ड्रैग एंड ड्रॉप इंटरफेस, वर्जन प्रोजेक्ट वर्कस्पेस (मेटाडेटा स्टोरेज के लिए टेक्स्ट और एक्सएमएल फाइलों का उपयोग करके), विषम डेटासोर्स के लिए बहुत सारे प्लग-इन योग्य ड्राइवर और एक विजुअल N डेटा स्रोत से डेटा संसाधित करने के लिए पाइपलाइनों को डिज़ाइन करने के लिए कैनवास और अंत में M रूपांतरित आउटपुट उत्पन्न करता है, और संभव चमकदार दृश्य और जटिल (और इंटरैक्टिव) ऑनलाइन रिपोर्ट। आपका विशिष्ट bespoke विज़ुअल प्रोग्रामिंग सिस्टम, उपयोगकर्ताओं की आवश्यकताओं के अनुकूल एक प्रणाली को डिज़ाइन करने के बहाने NIH सिंड्रोम से पीड़ित है।

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

महान, हम बर्बाद हो रहे हैं! - हम इसके बारे में क्या करते हैं?

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

वर्जनिंग और स्टोरेज के बारे में

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

लेकिन फिर भी, यदि वे इस तरह की कार्यक्षमता प्रदान करते हैं, तो शायद आपका समाधान हमारे प्रिय उद्योग-मानक दिशानिर्देशों का पालन करना है, और उन्हें इस प्रोग्रामिंग सिस्टम में स्थानांतरित करना है !!

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

परीक्षण के बारे में

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

निश्चित रूप से, यह एक हैक काम है और निश्चित रूप से "सामान्य" प्रोग्रामिंग के लिए जो सामान्य है, उसके मानक तक नहीं है, लेकिन विचार यह है कि पेशेवर सॉफ्टवेयर विकास प्रक्रिया की झलक को बनाए रखने की कोशिश करते समय सिस्टम के अनुकूल होना चाहिए।

रोड लंबी और खड़ी है ...

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

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

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

दुर्भाग्य से, इसका तात्पर्य यह है कि आपको बहुत अधिक मात्रा में गोता लगाने और लेग-वर्क करने की आवश्यकता हो सकती है। इसलिए...

प्रसिद्ध अंतिम शब्द, और विनम्र अनुरोध:

  • दस्तावेज़ जो आप करते हैं।
  • अपना अनुभव साझा करें।
  • अपने लेखन के लिए किसी भी स्रोत को खोलें

यह सब करके, आप करेंगे:

  • न केवल समान परिस्थितियों में लोगों से समर्थन पाने के अपने अवसरों को बढ़ाएं,
  • लेकिन यह भी अन्य लोगों को मदद प्रदान करते हैं, और अपनी तकनीक स्टैक के आसपास चर्चा को बढ़ावा।

कौन जानता है, आप अस्पष्ट भाषा X के एक नए जीवंत समुदाय की शुरुआत में हो सकते हैं । यदि कोई नहीं हैं, तो एक शुरू करें!

हो सकता है कि यह अंदर से सुंदर हो , लेकिन किसी के पास अब तक कोई सुराग नहीं है, इसलिए इस बदसूरत दीवार को नीचे ले जाने में मदद करें और दूसरों को झांकने दें!


22
नोट: इस पर टिप्पणी साफ हो गई है क्योंकि वे हाथ से निकल रहे थे। हेलेम ने उत्तर में सबसे अधिक प्रासंगिक और उपयोगी लोगों को शामिल किया है। इसके अलावा - पदों के लिए उत्तर 30,000 चरित्र सीमा के पास है। कृपया अत्यधिक सावधानी से संपादित करें।
ChrisF

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

96
मैं इस जवाब को हार्डकवर में कब खरीद सकता हूं?
लार्स

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

5
बहुत कठोर, लंबी घुमावदार और स्पष्ट बताते हुए। यदि यह आपका एजेंडा / रणनीति है, तो कोई भी एक या एक महीने के बाद आपकी बात नहीं सुनेगा।
जोप

101

बहुत पहला कदम होगा एक संस्करण नियंत्रण प्रणाली की शुरूआत (SVN, Git, मर्क्युरियल, TFS, आदि)। यह एक ऐसी परियोजना के लिए होना चाहिए जिसमें फिर से फैक्टरिंग होगी।

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

विरासत कोड से निपटने के तरीके पर एक समान पोस्ट है , यह पालन करने के लिए एक अच्छा संदर्भ हो सकता है - विरासत कोड के साथ काम करने की सलाह


19
दुर्भाग्य से, G2 भाषा की कमियों में से एक यह है कि स्रोत फाइलें मानव-पठनीय नहीं हैं (यह मौलिक रूप से एक ग्राफिकल भाषा है, LabView की तरह ), और इसलिए, संस्करण नियंत्रण को लागू करना गैर-तुच्छ है। यह वास्तव में, हमारी सबसे बड़ी बाधाओं में से एक है, वर्तमान में (आईएमओ)।
20 सितंबर को किमी

4
@kmote: क्या G2 के निर्माता के पास संस्करण नियंत्रण में मदद करने के लिए अपना कोई विशेष उपकरण है? क्या किसी और ने ऐसा उपकरण बनाया है?
FrustratedWithFormsDesigner

39
प्रत्येक स्रोत नियंत्रण पैकेज बायनेरिज़ का प्रबंधन कर सकता है, हालांकि कुछ सीमाओं के साथ। मुझे पता है कि हर उपकरण में कस्टम डिफ दर्शक और संपादक का उपयोग करने की क्षमता है, इस क्षमता का उपयोग करें। बाइनरी स्रोत फाइलें संस्करण नियंत्रण का उपयोग नहीं करने का बहाना नहीं है।
23 सितंबर को मटनज़ जूल

11
आप इंजीनियर G2 फ़ाइल प्रारूप को उल्टा कर सकते हैं और इसे अलग-अलग अनुकूल पाठ प्रारूप में डंप करने के लिए एक उपयोगिता बना सकते हैं। यह कठिन लग सकता है, लेकिन एक कोडबेस के लिए यह बड़ा है, यह प्रयास के लायक होगा (मेरी भोली राय में)।
जॉय एडम्स

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

43

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

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

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


17

3
बेहतर अभी तक .. बल्कि कार्यक्रम चलाने के बजाय, इकाई अपने नए मॉड्यूल का परीक्षण करें :)
डेमियन ब्रेख्त

1
यह सबसे अच्छा तरीका है (संस्करण नियंत्रण में पूरे लॉट को प्राप्त करने के स्पष्ट कदम के साथ)। बड़े जवाबों में सभी दोष बहुत सामान्य है और एक बार में लागू करने के लिए बहुत बड़ा है। जब तक आपके पास समग्र चीज की कुछ अवधारणा नहीं होती है तब तक बच्चे कदम रखते हैं। मुझे एक बार एक 50k प्रोजेक्ट विरासत में मिला (वास्तव में उसी 50k के चार संस्करण)। एक महीने के बाद मेरे पास एक संस्करण था और बुनियादी रिफैक्टरिंग / पुनर्गठन के माध्यम से लगभग 10k लाइनों से छुटकारा मिल गया था। 1-इसे रिपॉजिटरी में चिपका दें, 2-सुनिश्चित करें कि आप इसे बना सकते हैं, 3-रिफ्लेक्टर / रिस्ट्रक्चर, 3 तक दोहराएं।

22

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

मेरा मानना ​​है कि वे बहुत स्मार्ट लोग हैं, लेकिन एक अच्छा डेवलपर बनने के लिए बहुत समय की मांग है। क्या वे एक गतिविधि में इतना समय बिताने के लिए तैयार हैं जो उनका मुख्य व्यवसाय नहीं है? IMHO, यह सर्वोत्तम परिणाम प्राप्त करने का तरीका नहीं है।


16
ओपी पहला पेशेवर डेवलपर है। ओपी के लिए उन्हें अधिक किराया देने के लिए मनाने का सबसे अच्छा तरीका है, ओपी पहले 6-12 महीनों में कुछ स्पष्ट अतिरिक्त मूल्य प्रदान करना है। यदि यह हासिल किया जा सकता है, तो ओपी में विश्वसनीयता होगी और अधिक किराया करने में सक्षम हो सकता है।
MarkJ

20

वाह। लगता है जैसे आपके सामने एक बहुत बड़ी चुनौती है! मैं निम्नलिखित पंक्तियों के साथ कुछ करूँगा:

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

10

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

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

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

ध्यान केंद्रित करने के लिए कुछ बातें:

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

  • ऐसे मामलों की तलाश करें जहां एक ही कार्यक्षमता दोहराई गई हो। एकीकरण की दिशा में काम करें।

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


1
@kmote उन्होंने आपको काम पर नहीं रखा होता अगर वे नहीं पहचानते कि उन्हें मदद की ज़रूरत है और चीजों को बेहतर करना चाहते हैं। कठिन हिस्सा उन्हें यह याद रखने में मदद कर सकता है कि आपका काम समस्या को ठीक करना नहीं है, यह समस्या को ठीक करने में उनकी मदद करना है । बकरू बंजई एक निश्चित आयु के वैज्ञानिक प्रकारों के साथ बहुत लोकप्रिय है - शायद वह आपको चीजों को हल्का रखने में मदद कर सकता है।
कालेब

9

थोड़ा सा Gensym G2 में देखने के बाद ऐसा लग रहा है कि इस समस्या से निपटने का तरीका बहुत हद तक इस बात पर निर्भर करेगा कि कोड आधार इस तरह दिखता है:

यहां छवि विवरण दर्ज करें

या यह:

यहां छवि विवरण दर्ज करें

इसके विपरीत, बीयर की 99 बोतलों के सौजन्य से :

beer-bottles()

i:integer =99;
j:integer;
constant:integer =-1;

begin
for i=99 down to 1
    do
    j = (i+constant);
        if (i=1) then begin
            post"[i] bottle of beer on the wall";
            post" [i] bottle of beer";
            post" Take one down and pass it around ";
            post" No bottle of beer on the wall"; 
        end 
        else begin
            post"[i] bottles of beer on the wall";
            post" [i] bottles of beer";
            post" Take one down and pass it around ";
            if (i=2) then 
                post" [j] bottle of beer on the wall"
           else
                post" [j] bottles of beer on the wall"; 
           end
    end
end

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

यदि अधिकांश कोड आधार बाद वाला है, या यहां तक ​​कि अगर एक बड़ा हिस्सा है, तो आप कोड होने की दिलचस्प समस्या में भाग लेने जा रहे हैं, जो संभवत: अत्यंत विशिष्ट, या बदतर अभी तक होने के कारण अस्वीकार नहीं किया जा सकता है, ऐसा कुछ जो दिखता है यह हटाने योग्य हो सकता है, लेकिन जब तक इसे ठीक से प्रलेखित नहीं किया जाता है, तब तक आप यह नहीं जानते हैं कि क्या आप क्रिटिकल कोड निकाल रहे हैं (एक स्क्रम ऑपरेशन की तर्ज पर कुछ सोचें ) जो पहली नज़र में ऐसा प्रतीत नहीं होता है।

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

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

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

एक बार जब आपके पास कोड की उचित मात्रा में इकाई परीक्षण होते हैं, तो आप इस तरह से रीफैक्टरिंग से संपर्क करना शुरू कर सकते हैं जैसे कि जाइलम द्वारा सुझाया गया ; हालाँकि, याद रखें कि आप उस चीज़ से निपट रहे हैं जो विशेषज्ञ प्रणालियों को विकसित करने और इसे फिर से संगठित करने के लिए है जो एक कठिन लड़ाई हो सकती है। यह वास्तव में एक ऐसा वातावरण है जहां कई बार बेहद सामान्य कोड नहीं लिखने के लिए कुछ कहा जाता है।

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


1
@ हाइलम - कोई विचार नहीं है, और यह पूरी तरह से संभव हो सकता है कि आवेदन में 200,000 एलओसी प्लस एन प्रवाह आरेख और चार्ट हैं। इसलिए 200,000 LOC आवेदन की जटिलता को काफी कम कर सकती है।
rjzii

9

आमतौर पर आप जो शिकायतें सुनते हैं, उनका महत्वपूर्ण समस्याओं से कोई लेना-देना नहीं है। आखिरकार, किसी भी सॉफ्टवेयर प्रोजेक्ट में इन शिकायतों को सुनना पूरी तरह से सामान्य है।

कोड को समझना मुश्किल है? चेक। बड़े पैमाने पर कोड आधार? चेक।

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

यहाँ मैं क्रम में, से निपटने के लिए क्या होगा:

  1. बैकअप, सर्वर और स्थानीय संस्करण दोनों
  2. बग ट्रैकर सेट करें
  3. संस्करण प्रणाली सेट करें
  4. FAQ / विकी सेट करें
  5. सभी वैज्ञानिक / प्रोग्रामर का पहला डेब्यू
    • उन्हें 80/20 नियम की याद दिलाएं। 80% समस्याओं के लिए 20% बग जिम्मेदार हैं।
    • सबसे बड़े मुद्दों पर ध्यान दें, और एन्हांसमेंट अनुरोधों को c c से दूर रखें।
    • यहां उद्देश्य एक बड़ी सूची के साथ लोगों को डराना नहीं है, लेकिन छोटे प्राप्त करने योग्य जीत की सूची है। आखिरकार, आपको अपना मूल्य भी साबित करना होगा।
  6. बिल्ड सिस्टम सेट करें
    • विश्वसनीय बिल्ड मिलने पर काम शुरू करें (इसमें कुछ समय लग सकता है)
    • हर प्रोजेक्ट की पहचान और नाम
    • चक्रीय निर्भरता की पहचान करें
    • यदि कुछ ओपन-सोर्स प्रोजेक्ट से बायनेरिज़ हैं, तो स्रोत प्राप्त करने का प्रयास करें
  7. पहचानें कि G2 कोड को कैसे संशोधित किया जा सकता है, उदाहरण के लिए API, सेवाएं
  8. पहचानें कि G2 कोड का परीक्षण, दस्तावेज कैसे किया जा सकता है।
  9. कोड-समीक्षा प्रणाली सेट करें
  10. दूसरा डेब्यू
  11. बेहतर प्रोग्रामर की एक क्रैक टीम की पहचान करें और अपने मॉड्यूल को लपेटने के लिए उनके साथ काम करें।
  12. संचार, और प्रलेखन को बेहतर बनाने के लिए इस स्तर पर कोड समीक्षाएं हैं। इस स्तर पर इसे आसान रखें। किसी भी प्रक्रिया के मुद्दों को हल करें।
  13. अन्य प्रोग्रामर को सिस्टम रोल आउट करें। क्रैक टीम के सदस्यों को बाकी लोगों के लिए सहकर्मी बनने दें। याद रखें कि स्केलिंग यहां मुद्दा है। आप प्रभावी रूप से एक प्रबंधन भूमिका में हैं।

9

इस तरह के सवाल पूरे कारण सॉफ्टवेयर बढ़ईगीरी परियोजना मौजूद है।

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

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

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


दिलचस्प सुझाव। मैं इसे देख लूँगा। (नोट: डुबोइस पेपर पर टूटा हुआ लिंक)
किमी

7

मुझे लगता है कि सबसे पहले आपको अपनी स्थिति साफ करनी होगी। वे आपसे क्या चाहते हैं?

  • यह बहुत कम संभावना नहीं है कि वे चाहते हैं कि आप एक प्राचीन भाषा सीखें, क्योंकि यह अब एक मृत अंत लगता है: जी 2 जानने या जानने के इच्छुक किसी व्यक्ति को खोजने का एक कम होने की संभावना है, इसलिए कोड के ढहने वाले ढेर में ज्ञान दफन हो जाएगा वर्तमान वैज्ञानिक छोड़ देते हैं या सभी पैच कोड अधिक से अधिक बार विफल हो जाते हैं।
  • क्या वैज्ञानिक (या उनमें से कुछ) एक नई भाषा और बहुत सारी प्रोग्रामिंग प्रतिमान सीखने के लिए तैयार हैं? या क्या वे लंबी अवधि में प्रोग्रामिंग और वैज्ञानिक गतिविधि को अलग करना चाहते हैं, और यदि आवश्यक हो तो शायद कुछ और प्रोग्रामर हैं? यह विशेषज्ञता का एक तर्कसंगत और अधिक कुशल अलगाव लगता है।

मुझे लगता है कि यहां मुख्य आवश्यकता "सिस्टम में ज्ञान को बचाने" के लिए है, इसलिए आपको इसे खुदाई करना होगा!

पहला काम एक दस्तावेज लिखना है।

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

फिर आपको पूछना शुरू करना चाहिए कि वे कहाँ जाना चाहते हैं?

यदि वे G2 से दूर जाने के लिए तैयार हैं, वे किस प्रणाली को देखना चाहते हैं (मंच, भाषा, इंटरफ़ेस, सामान्य संरचना)? आप सिस्टम के चारों ओर एक बाहरी आवरण लिखना शुरू कर सकते हैं यदि संभव हो तो, लक्ष्य संरचना होने पर, लेकिन मूल घटकों को रखते हुए, इस प्रकार धीरे-धीरे एक तरह की रूपरेखा शुरू करें जिससे नए घटकों को इस लक्ष्य वातावरण में लागू किया जा सके। आपको मुख्य सेवाओं (लगातार डेटा कनेक्शन और "टूलकिट": कोर गणना, ड्राइंग, ... लाइब्रेरी) को ढूंढना होगा, और इसलिए आप उन्हें एक नए मंच और भाषा में एक परिचित वातावरण प्रदान करते हैं, जो आपके द्वारा या तो संक्रमण की अनुमति देता है उन्हें: पुराने कोड एक-एक करके, नए वातावरण में पुन: लागू करें (और साफ करें!) लें। जब वह तैयार हो जाता है, तो वे नई भाषा जानते हैं; और सेवा की परत (ज्यादातर आपके द्वारा बनाई गई, क्षमा करें) नए घटकों की मेजबानी के लिए तैयार है।

यदि वे नहीं चलते हैं , तो आपको G2 सीखना चाहिए, और वहां मॉड्यूलर ढांचा बनाना चाहिए, जिसमें आपको या उन्हें घटकों को साफ करना चाहिए (सफाई के साथ)। वैसे भी, भाषा सिर्फ डेटा और एल्गोरिथ्म के पेड़ का एक क्रम है ...

डॉक्स का विश्लेषण और लेखन करते समय, पढ़ें और उपयोग करें और GoF डिज़ाइन पैटर्न का विज्ञापन करें! :-)

... मेरे 2 सेंट


मैं मानता हूं कि चरण # 1 यह है कि वे आपसे क्या चाहते हैं, लेकिन यह काम करने के लिए अगला कदम यह होना चाहिए, और यदि अगला चरण मामलों की स्थिति का दस्तावेजीकरण नहीं करना है, तो वह बहुत अधिक न करें। यदि आप करते हैं तो वे इसकी सराहना नहीं करेंगे।
बिल

@बिल: सवाल कहता है "आगे की राह के लिए क्या जरूरी है, इस बारे में एक राय नहीं है।" वे नहीं जानते! मुझे लगता है कि सिस्टम पर वास्तविक अंतर्दृष्टि के बिना गंभीर बहसें होती हैं जिन्हें "किसी तरह" बचाया जाना चाहिए। इस स्थिति में एक प्रोग्रामर का कार्य स्पष्ट (कम से कम मेरे लिए) है: एक तर्कसंगत निर्णय लेने में मदद करने के लिए तकनीकी दृष्टिकोण से सही विश्लेषण दें।
लोरैंड केडवेस

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

@ बिल: मुझे लगता है कि आप ठीक वैसा ही कहेंगे जैसा मैंने उस दस्तावेज की सामग्री और निर्माण के बारे में लिखा है ... ;-)
लोरैंड केडवेस

4

मैंने अभी-अभी अपने सहकर्मियों के लिए रॉबर्ट मार्टिन के SOLID सिद्धांतों पर प्रस्तुतीकरण करने का काम किया। मुझे नहीं पता कि ये सिद्धांत G2 में कितने अच्छे हैं, लेकिन जब से आप 5-7 मूल फंडामेंटल की तलाश कर रहे हैं, तो ये शुरू करने के लिए एक अच्छी तरह से स्थापित सेट की तरह लगते हैं। यदि आप इसे 7 तक राउंड करना चाहते हैं, तो आप DRY से शुरू कर सकते हैं और फेल-फास्ट में फेंक सकते हैं।


1
ऊह, उत्कृष्ट सुझाव! इस मुफ्त ईबुक सारांश के साथ इस अच्छे अवलोकन की याद दिला दी ।
किमी।

3

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

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

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


3

ऐसी स्थिति में काम करने के लिए सबसे महत्वपूर्ण सिद्धांत हैं:

  1. धैर्य रखें। एक छेद जिसे खोदने में 20 साल लग गए, वह कुछ हफ्तों में भरा नहीं जा सकता है।

  2. सकारात्मक रहें। शिकायत और बड़बड़ाने के प्रलोभन का विरोध करें।

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

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

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

  6. छोटे-छोटे ऐप बनाएं। जब एक विरासत कोडबेस के साथ काम करते हैं, तो मुझे लगता है कि मुझे एक लुगदी के लिए जमीन मिल गई है। मैं थोड़ा हेल्पर ऐप बनाकर अपनी भावना वापस लाता हूं। हो सकता है कि वे ऐप आपको उस विशाल G2 कोडबेस को पढ़ने और समझने और संशोधित करने में मदद करने जा रहे हों। हो सकता है कि आप एक मिनी आईडीई या पार्सर उपकरण बना सकते हैं जो आपको अपने वातावरण में काम करने में मदद करेगा। ऐसे कई मामले हैं जहां मेटा-प्रोग्रामिंग और टूल-बिल्डिंग न केवल आपको विशाल गतिरोध से बाहर निकलने में मदद करेगी, जो कि विरासत कोडबेस आप पर थोपते हैं, वे आपके मस्तिष्क को आपकी जी 2 भाषा द्वारा अप्रतिबंधित उड़ान भरने की क्षमता भी देते हैं। अपने टूल और हेल्पर्स को उस भाषा में लिखें, जिस भाषा में आप उन्हें सबसे तेज़ और बेहतरीन बना सकते हैं। मेरे लिए, उन भाषाओं में पायथन और डेल्फी शामिल हैं। यदि आप एक पर्ल व्यक्ति हैं, या आप वास्तव में C ++ या C # में प्रोग्रामिंग पसंद करते हैं, तो उस भाषा में अपने सहायक उपकरण लिखें।


3
  1. संशोधन नियंत्रण : डोमेन विशेषज्ञों को वापस लौटने में सक्षम होने का लाभ दिखाते हैं, देखें कि किसने क्या बदला, आदि (यह सभी-बाइनरी फ़ाइलों के साथ कठिन है, लेकिन अगर सामग्री वास्तव में कोड है, तो निश्चित रूप से कुछ प्रकार के G2-to- हैं पाठ कनवर्टर जो भिन्नता को सक्षम कर सकता है।)

  2. निरंतर एकीकरण और परीक्षण : डोमेन विशेषज्ञों को अंत-से-अंत परीक्षण बनाने में शामिल करें (आसान, क्योंकि उनके पास पहले से ही इनपुट और अपेक्षित आउटपुट कहीं न कहीं होना चाहिए) और छोटी इकाई परीक्षण (कठिन, क्योंकि स्पेगेटी कोड में संभवतः बहुत सारे वैश्विक चर शामिल हैं) लगभग सभी कार्यक्षमता को कवर करें और मामलों का उपयोग करें।

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

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


3

"कार्यक्रम ही एक जटिल रासायनिक प्रसंस्करण संयंत्र का एक भौतिक मॉडल है ..."

"चूंकि G2 नॉट-कोड जैसा है, बल्कि कुछ गॉडफुल GUI द्वारा लिखित स्वचालित कोड ..." - एरिक रेपेने

माना जाता है कि आपके सॉफ़्टवेयर का मुख्य लक्ष्य अनुकरण करना है (शायद अनुकूलन करें, पैरामीटर अनुमानों पर चलें) एक जटिल रासायनिक संयंत्र, या एक के हिस्से ... तो मैं एक अलग सुझाव देना चाहूंगा:

आप सार को निकालने के लिए उच्च-स्तरीय गणितीय मॉडलिंग भाषा का उपयोग करने पर विचार करने के लिए अच्छी तरह से कर सकते हैं, मुख्य गणितीय मॉडल, हाथ से कोडित सॉफ्टवेयर से बाहर

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

आपके उद्योग में व्यापक रूप से उपयोग किए जाने वाले तीन वाणिज्यिक पैकेज हैं: gPROMS, एस्पेन कस्टम मॉडेलर, और (यदि आपके मॉडल में स्थानिक डोमेन के साथ वितरित घटनाएं शामिल नहीं हैं) तो मॉडलिका-आधारित सॉफ़्टवेयर पैकेज हैं, जैसे कि डिमोला।

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

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

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

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

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

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

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


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


2

मैं निम्नलिखित को फेंक दूंगा:

  1. यहां एक प्रोग्रामर है। पेंच की राजनीति। वे अपना व्यापार जानते हैं। तुझे पता है। उस क्षेत्र को चिह्नित करें, भले ही आपको उस पर पेशाब करना पड़े। वे वैज्ञानिक हैं। वे इस तरह की बात का सम्मान कर सकते हैं या उन्हें तब से लगातार बहुत कुछ करना चाहिए। जो कुछ भी आप कर सकते हैं उसके माध्यम से, अब सीमाओं को चिह्नित करें। यह मैं ठीक करूँगा। यही वह है जिसके लिए मैं जिम्मेदार नहीं हो सकता।

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

  3. यदि आप कर सकते हैं तो प्रथम श्रेणी के कार्यों के साथ एक घटना-संचालित-अनुकूल भाषा का उपयोग करें। जब कोई अन्य घटना विफल हो जाती है, तो एक घटना को ट्रिगर करना या एक इंटरफ़ेस और राज्य तंत्र के साथ किसी वस्तु को कॉलबैक को टॉस करना जो वास्तव में समझ में आता है, जब आप कोड में घुटने से गहरा होते हैं, तो यह बहुत बड़ा समय-बचाने वाला हो सकता है जो कोई खूनी समझ नहीं बनाता है और संभवतः कभी नहीं मर्जी। वैज्ञानिकों को पाइथन पसंद है। उसके साथ निचले स्तर के गणित-गहन सी सामान को गोंद करना मुश्किल नहीं है। मैं तो बस कह रहा हूं'

  4. किसी ऐसे व्यक्ति की तलाश करें जिसने इसे या इसी तरह की समस्या को हल किया है। शोध करने के लिए कुछ गंभीर समय बिताएं। इन लोगों ने किसी से G2 के बारे में सुना।

  5. डिजाइन पैटर्न्स। एडेप्टर। इनका उपयोग करें। इस तरह की स्थितियों में 'उन्हें बहुत उपयोग करें।

  6. जानें कि आप विज्ञान के बारे में क्या कर सकते हैं। जितना अधिक आप जानते हैं, उतना बेहतर होगा कि आप कोड में इरादा निर्धारित कर सकते हैं।


13
कभी वैज्ञानिकों के साथ सिर पर हाथ फेरते हैं। कभी नहीं । वे आपके जीवन को एक जीवित नरक बना देंगे। :)
जाइल

2

विश्लेषण पहले करो।

मुझे क्या करना है, यह तय करने से पहले मैं कुछ विश्लेषण करूँगा। पता लगाएँ कि सबसे बड़ा दर्द बिंदु कहाँ है। उन प्रथाओं का उपयोग करने के लिए जो ऊपर जाने के लिए प्राथमिकता दें।

एक समय में केवल कुछ बदलावों का परिचय दें (इसी तरह की स्थिति में मैंने हर 2 सप्ताह में 2-3 अभ्यास किए)

मैं SDLC की प्रोग्रामिंग शैली में परिवर्तन के स्तर के आधार पर प्रथाओं को ~ 3 तक सीमित करूंगा; जब तक वे उनके साथ सहज होना शुरू नहीं करते हैं (मैं हर ~ 1-2 सप्ताह में 1 नया बदलाव लाने पर जोर दूंगा क्योंकि वे नए दृष्टिकोण सीखने के विचार के साथ अधिक सहज हो जाते हैं)। यह पहचानना भी एक अच्छा विचार है कि सफलता का मापदंड क्या है। अभ्यास क्या पूरा करना चाहिए (भले ही यह टीम मनोबल की तरह एक नरम लक्ष्य हो)। इस तरह से आप यह दिखा सकते हैं कि यह प्रभावी है या नहीं।

  • परिवर्तनों की संख्या को सीमित क्यों करें?

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

एक साप्ताहिक रैप-अप बैठक में चर्चा करें कि प्रथाओं ने उन्हें कैसे प्रभावित किया।

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

कुछ अभ्यास पूर्वता लेते हैं।

एक संस्करण नियंत्रण प्रणाली (IMO) का समुचित उपयोग बाकी सब को प्रभावित करता है। पीछे मोड्यूलराइजेशन, कपलिंग / कोशिशन और फीचर / बग टिकट ट्रैकिंग के पाठ हैं।

उन प्रथाओं को निकालें जो काम नहीं करती हैं।

उन प्रथाओं से छुटकारा पाने के लिए डरो मत जो काम नहीं करती हैं। यदि कोई उच्च लागत और कोई लाभ नहीं है, तो अभ्यास को हटा दें।

सुधार एक प्रक्रिया है।

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


0

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

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

उदाहरण के लिए, दो डेवलपर्स की अलग-अलग प्रतियां थीं और एक हाइब्रिड अनटाइटेड रिलीज़ -> संस्करण नियंत्रण, ब्रांचिंग और परीक्षण का परिचय देते हुए समाप्त हुई।

किसी ने कोड की कुछ पंक्तियों को हटा दिया जो उन्हें समझ नहीं आया और एक आउटेज का कारण बना -> DDD परिचय।

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


0

स्रोत कोड नियंत्रण चरण # 1 है जैसा कि पहले ही कई बार कहा जा चुका है। जबकि आप जिन लोगों के साथ काम करते हैं वे पेशेवर डेवलपर नहीं हो सकते हैं और वे बहुत सारे उद्यम या फुर्तीले मुंबो जंबो का जवाब नहीं देंगे। वे निचले स्तर के कोड बंदर भी नहीं हैं और उन्हें इस तरह से व्यवहार करने की कोशिश कर रहे हैं कि उन्हें चीजों को करने के लिए मजबूर करने से 'आपका रास्ता' उड़ नहीं जाएगा।

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

जब आप ऐसा कर रहे हों, तो अन्य कम लटके फलों को खोजें और उन समस्याओं को ठीक करें।

इन सबसे ऊपर, उनकी स्थिति को सुधारने के लिए उन्हें क्या कहना और काम करना है, यह सुनिए। वे क्या करते हैं पर अपनी मुहर लगाने की कोशिश करने के बारे में चिंता न करें।

सौभाग्य!

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