हमें कब काम बंद करना चाहिए और उपकरण बनाना चाहिए?


25

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

हालांकि, यह वास्तव में एक व्यापार बंद है क्योंकि उपकरण बनाने के लिए भी समय और ऊर्जा की आवश्यकता होती है। यह उत्पादकता को तुरंत बढ़ावा नहीं देता है। इसलिए, आप कैसे न्याय करते हैं कि क्या यह काम रोकने और अपने भविष्य के दर्द को कम करने के लिए कुछ उपकरण बनाने का समय है?



1
हो सकता है कि एक उपकरण की ओर
रिफ्लेक्टर

1
@MichaelT इसके अलावा इस: geeksaresexy.net/2012/01/05/geeks-vs-non-geeks-pic
alroc

1
यह XKCD एक चीज को छोड़कर बहुत अधिक नाखून रखता है: क्या उपकरण द्वारा बचाया गया समय सिर्फ आपका है, या क्या यह आपके संगठन में या उससे परे एक बड़े उपयोगकर्ता आधार द्वारा गुणा किया जाता है।
कज़

जवाबों:


27

जब मैं इनमें से एक सच होता हूं तो मैं "टूल बनाता हूं":

  1. कार्य मुझे परेशान कर रहा है
  2. कार्य में मानवीय त्रुटि का जोखिम बहुत बड़ा है

2 वें विकल्प के लिए "जोखिम" बहुत बड़ा नहीं है - एक छोटे उपकरण के निर्माण की लागत आमतौर पर छोटी होती है, इसलिए यदि आप सभी को बचाते हैं तो सप्ताह में एक बार 10 मिनट का निर्माण फिर से चलाने का जोखिम है, यह आमतौर पर होगा बहुत तेजी से खुद को चुकाना।

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

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


2
त्रुटियों से बचने के लिए +1 क्योंकि यह निष्पादित होने पर सहेजे गए समय बनाम सामान्य समय से अधिक है।
kbb

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

9

अनुभव के साथ मैंने पाया है कि सिर्फ कठिन काम पर जोर देना आमतौर पर सबसे अधिक कुशल होता है। एक उपकरण बनाना अक्सर लुभावना होता है। मैं तब हार मानता हूँ जब:

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

3
"टूल का एक से अधिक उद्देश्य है" जब तक वे वास्तव में एक ही उद्देश्य दो अलग-अलग तरीकों से लागू होते हैं, मेरे अनुभव में यह सिर्फ दो टूल के लिए बेहतर है।
AJMansfield

5

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

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

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

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

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

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


4

मुझे यह याद आया:

xkcd - क्या यह समय के लायक है?

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

तो मेरा जवाब है कि यह वास्तव में स्थिति पर निर्भर करता है और आप सभी स्थितियों के लिए कोई "सही" उत्तर प्राप्त करने की उम्मीद नहीं कर सकते। अगर हम सब कुछ के लिए रसोई की किताब होती तो सारा जीवन उबाऊ होता।


1
अच्छा है! :-) लेकिन समय की बचत अन्य कार्यों पर भी हो सकती है - या तो चूंकि टूल का उपयोग एक से अधिक उद्देश्यों के लिए किया जा सकता है, या टूल लिखते समय आपके द्वारा प्राप्त ज्ञान के कारण।
हंस-पीटर स्टॉरर

3

मेरे अनुभव में यह एक बड़ी समस्या है। टूल बिल्डिंग को आमतौर पर एक प्रेरित डेवलपर को छोड़ दिया जाता है जो टूल बनाने के लिए काम करना बंद कर देता है। यह अक्सर मूल्य प्रदान करने पर भी विकास में हस्तक्षेप करता है। टूल बिल्डिंग को विकास "प्रक्रिया" के एक एकीकृत भाग के रूप में देखा जाना चाहिए।

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

पूरी टीम को समय-समय पर रुकने और यह देखने की जरूरत है कि उपकरण निर्माण द्वारा स्वचालित प्रयासों को कहां से मैनुअल किया जा सकता है।


2

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

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

हो सकता है कि आप किसी रिक्त स्क्रीन को नहीं देख रहे हों, लेकिन इसके बजाय आपको किसी बड़े कार्य में हो रही प्रगति को देखने में परेशानी हो रही हो। उस स्थिति में कुछ मूर्त से छेड़छाड़ करना आपको यह महसूस करने से रोक सकता है कि आप कहीं नहीं जा रहे हैं।

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


1

यह इस बात पर निर्भर करता है कि आप उपकरण बनाने के बारे में क्या सोचते हैं। संभवतः मैं उन तरीकों से उनका भार उठाता हूं जो अन्य देवता तुच्छ समझेंगे ... क्योंकि मैं उन्हें सबसे बुनियादी फाइल सिस्टम कमांड को छोड़कर हर चीज के बारे में बताता हूं ।

मैं समर्थन करने के लिए 2 युक्तियों का उपयोग करता हूं।

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

कभी-कभी वे बड़े टूल में विकसित होते हैं और इंटरैक्टिव फ़ंक्शंस प्राप्त करते हैं, लेकिन अगर वे नहीं करते हैं, तब भी उनके पास रिकॉर्ड के रूप में मूल्य है।

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