विकास म्हणजे वारंवार काहीतरी नवीन आणि उपयुक्त निर्माण करणे.
आपण जेव्हा "विकास" हा शब्द ऐकतो, तेव्हा नवीन उत्पादनाचा विकास अनेकदा मनात येतो. हे वैयक्तिक उत्पादनांच्या निर्मितीपेक्षा वेगळे आहे; याचा अर्थ उत्पादनाचे आराखडे किंवा साचे तयार करणे, असे म्हणता येईल.
म्हणून, नवीन उत्पादनाच्या विकासामधून तयार झालेले डिझाइन आणि साचे कारखान्यांमध्ये वारंवार वापरले जातात, ज्यामुळे समान उत्पादनांची मोठ्या प्रमाणावर निर्मिती होते.
"विकास" शब्दाचे इतर उपयोग देखील आहेत, जसे की वैयक्तिक क्षमतांचा विकास करणे, किंवा समाज आणि राष्ट्राचा विकास करणे. याचा अर्थ केवळ असलेल्या गोष्टींमध्ये वाढ होणे नव्हे, तर विकसित क्षमतांचा वारंवार उपयोग करून लाभ मिळवणे.
व्यक्ती आणि समाजाची आर्थिक शक्ती आर्थिक परिस्थितीनुसार कमी-जास्त होऊ शकते, परंतु विकसित क्षमता साधारणपणे स्थायी असतात.
त्या कमी झाल्या तरी, ती आर्थिक समृद्धीसारखी चढ-उतार नसून एक अवनती मानली जाते.
याव्यतिरिक्त, तंत्रज्ञान आणि ज्ञानाचा विकास देखील असतो. व्यक्ती किंवा विशिष्ट समाजाच्या क्षमतांपेक्षा वेगळे, यांची सहजपणे देवाणघेवाण केली जाऊ शकते हे त्यांचे वैशिष्ट्य आहे.
आणि या विकासाच्या परिणामांमधून — उत्पादने, क्षमता, ज्ञान आणि तंत्रज्ञान — काही गोष्टी पुढील विकासासाठी उपयुक्त ठरू शकतात.
अशा उपयुक्त परिणामांचा विकास केल्याने, विकासाची व्याप्ती वाढते आणि कार्यक्षमता व गुणवत्ता देखील सुधारते.
एआय-प्रेरित सॉफ्टवेअर विकास
सर्वसाधारणपणे, विकासासाठी बराच वेळ आणि खूप प्रयत्न लागत असत. विशेषतः, जसजसा समाज प्रगती करतो आणि विविध गोष्टी अधिक अत्याधुनिक होतात, तसतसे नवीन गोष्टी निर्माण करणे अधिक कठीण होते.
तथापि, जनरेटिव्ह एआयच्या आगमनाने ही परिस्थिती बदलत आहे. सध्या, जनरेटिव्ह एआयच्या उच्च प्रोग्रामिंग क्षमतेमुळे सॉफ्टवेअर विकासामध्ये मोठे बदल होत आहेत.
जनरेटिव्ह एआयवर आधारित स्वायत्त एजंट सॉफ्टवेअर अभियंते म्हणून सॉफ्टवेअर विकासाच्या केंद्रस्थानी येतील अशी भविष्यातील कल्पना आता प्रत्यक्षात येत आहे.
आपण सध्या संक्रमणाच्या काळात आहोत. आपण विकासाची पूर्ण जबाबदारी जनरेटिव्ह एआयवर सोपवू शकत नसलो तरी, जनरेटिव्ह एआयचा कौशल्याने वापर केल्यास सॉफ्टवेअर विकास प्रभावीपणे पुढे नेला जाऊ शकतो.
याला एआय-प्रेरित सॉफ्टवेअर विकास असे म्हटले जाते.
विकास-प्रेरित विकास
जेव्हा जनरेटिव्ह एआय सॉफ्टवेअर विकास सुव्यवस्थित करते, तेव्हा ते केवळ अंतिम लक्ष्य सॉफ्टवेअरचा विकास अधिक कार्यक्षम करत नाही, तर विकासाला मदत करणाऱ्या सॉफ्टवेअरचा विकास देखील अधिक कार्यक्षम करते.
आधी सांगितल्याप्रमाणे, विकासाला मदत करणारी परिणामे विकासाची व्याप्ती वाढवतात आणि कार्यक्षमता व गुणवत्ता वाढवण्यासाठी योगदान देतात. शिवाय, जर ती प्रभावीपणे तयार केली गेली, तर त्यांचा इतर विकास प्रकल्पांमध्ये पुन्हा वापर केला जाऊ शकतो.
म्हणून, सॉफ्टवेअर विकासाच्या दरम्यान उपयुक्त सॉफ्टवेअर विकसित केल्याने, एकूण कार्यक्षमता वाढवता येते आणि भविष्यातील विकासासाठी ही मालमत्ता वापरली जाऊ शकते.
परंपरेनुसार, अशा विकासाला मदत करणाऱ्या सॉफ्टवेअरचा विकास करणे या क्षेत्रात एक सामान्य प्रथा होती, परंतु त्यासाठी स्वतःचा विकास वेळ आणि प्रयत्न लागत असे, त्यामुळे काळजीपूर्वक मूल्यांकन आणि लक्ष्यित अंमलबजावणी आवश्यक होती.
जनरेटिव्ह एआयचा वापर करून, लहान, तात्पुरती कार्ये स्वयंचलित करण्यासाठी साधे सॉफ्टवेअर त्वरीत तयार केले जाऊ शकते. स्पष्ट प्रक्रिया असलेल्या कार्यांसाठी, जनरेटिव्ह एआय जवळपास चुकांशिवाय अचूक प्रोग्राम तयार करू शकते.
यामुळे सॉफ्टवेअर विकासादरम्यान विकासाला मदत करणारे सॉफ्टवेअर विकसित करणे पूर्वीपेक्षा सोपे झाले आहे.
आणि सखोल विचार केल्यावर, विकासाची एक अशी शैली उदयास येते जिथे विकास प्रक्रियेदरम्यान उपयुक्त साधने सतत विकसित केली जातात, ज्यामुळे विकासाची पद्धतच बदलून जाते.
याला आपण विकास-प्रेरित विकास असे म्हणू.
विकास-प्रेरित विकास करण्यासाठी, स्वतःच्या सॉफ्टवेअर विकासाचे वस्तुनिष्ठपणे निरीक्षण करण्याची सवय असणे आवश्यक आहे, ज्यात सॉफ्टवेअरला कोणते भाग सोपवले जाऊ शकतात आणि कोणते भाग फक्त मानवच करू शकतात याचा विचार करणे, तसेच असे विकासाला मदत करणारे सॉफ्टवेअर विकसित करण्याचे कौशल्य असणे आवश्यक आहे.
याव्यतिरिक्त, जनरेटिव्ह एआयला या सॉफ्टवेअर साधनांमध्ये समाकलित केले जाऊ शकते. सॉफ्टवेअरमध्ये एम्बेड केल्याने, एकट्या जनरेटिव्ह एआय एजंटच्या विपरीत, प्रक्रियेची व्याप्ती काही प्रमाणात मर्यादित केली जाऊ शकते आणि एक स्पष्ट मार्ग परिभाषित केला जाऊ शकतो.
एआय एजंट प्रॉम्प्टिंगद्वारे समान परिणाम मिळवू शकतात, परंतु जनरेटिव्ह एआय समाकलित करणारे सॉफ्टवेअर प्रोग्राम आणि प्रॉम्प्ट दोन्ही एकत्र करून अचूकता अधिक सहजपणे वाढवू शकते.
जर विकास-प्रेरित विकास पद्धतशीरपणे वापरला गेला, तर पहिल्या प्रकल्पाच्या तुलनेत दुसऱ्या प्रकल्पाच्या गुणवत्ता आणि खर्चात सुधारणा दिसून येईल. शिवाय, प्रत्येक त्यानंतरच्या प्रकल्पाबरोबर — तिसऱ्या, चौथ्या, आणि पुढे — सुधारणा होतच राहतील.
हे केवळ जनरेटिव्ह एआय वापरून सॉफ्टवेअर विकसित करण्यापेक्षा पूर्णपणे वेगळे आहे. जनरेटिव्ह एआय साधनांवर प्रभुत्व मिळवणाऱ्या संघांमध्ये आणि विकास-प्रेरित विकास करणाऱ्या संघांमध्ये कालांतराने मोठी दरी निर्माण होईल.
रिफॅक्टरिंग-प्रेरित चाचणी
टेस्ट-ड्रिव्हन डेव्हलपमेंट (TDD) नावाची एक संकल्पना आहे, ज्यात प्रथम वैशिष्ट्यांवर आधारित चाचण्या (tests) डिझाइन केल्या जातात आणि नंतर त्या चाचण्या यशस्वी होतील असे सॉफ्टवेअर विकसित केले जाते.
सुरुवातीला, मी देखील असे मानले होते की जनरेटिव्ह एआय स्वयंचलित चाचणीसाठी चाचणी प्रोग्राम विकसित करणे सोपे करत असल्याने, टेस्ट-ड्रिव्हन डेव्हलपमेंट व्यवहार्य ठरू शकते.
तथापि, मी विकास-प्रेरित विकास पद्धतीचा सराव करण्यास सुरुवात केल्यावर, माझ्या असे लक्षात आले की अंमलबजावणीपूर्वी चाचण्या डिझाइन करण्याचा दृष्टिकोन नेहमीच योग्य नाही.
विशेषतः वेब ऍप्लिकेशन्ससारख्या सॉफ्टवेअरसाठी, ज्यात वापरकर्ता अनुभव (usability) आणि व्हिज्युअल डिझाइनसारख्या व्यक्तिनिष्ठ पैलूंचा समावेश असतो, ज्यांचा वापरकर्ता प्रत्यक्ष संवाद साधून अनुभव घेऊ शकतो, तेव्हा मला जाणवले की प्रत्यक्ष सॉफ्टवेअर चालवून आणि त्याच्याशी संवाद साधणे हे सखोल चाचणीपेक्षा जास्त महत्त्वाचे आहे.
कारण, जर वापरकर्त्याच्या संवादानंतर UI/UX स्तरावर महत्त्वपूर्ण असंतोष निर्माण झाला, तर फ्रेमवर्क, मूलभूत आर्किटेक्चर, डेटा मॉडेल किंवा वापर-केसेस (use cases) यांसारख्या मूलभूत भागांमध्ये बदल करण्याची शक्यता असते.
माझ्या सध्याच्या वैयक्तिक सॉफ्टवेअर विकास प्रकल्पात, मला कार्यात्मक लवचिकता (functional flexibility) आणि कार्यक्षमतेच्या (performance) समस्या देखील आढळल्या, ज्यामुळे मला दोन फ्रेमवर्क बदलून भिन्न फ्रेमवर्क वापरावे लागले.
मेमरी वापराच्या कार्यक्षमतेमध्ये (memory usage efficiency) समस्या असलेला एक भाग देखील होता, ज्यासाठी प्रक्रियेची पूर्णपणे फेररचना करावी लागली.
या रिफॅक्टरिंगच्या टप्प्यावरच चाचणीची जाणीव प्रथम होते.
जर हे विकासाच्या सुरुवातीच्या टप्प्यात असेल, किंवा वैशिष्ट्ये आणि तपशील लक्षणीयरीत्या बदलणार असतील, तर चाचण्यांची आवश्यकता नसू शकते.
तथापि, जर विकास आधीच चांगल्या प्रकारे पुढे सरकला असेल आणि तपासण्यासाठी अनेक गोष्टी असतील, तर कार्यात्मक उणिवा किंवा कमतरता नाहीत याची खात्री करण्यासाठी रिफॅक्टरिंग दरम्यान चाचण्यांची आवश्यकता असेल.
म्हणून, जेव्हा विकास एका विशिष्ट मर्यादेपर्यंत पोहोचतो आणि रिफॅक्टरिंग आवश्यक बनते, तेव्हा चाचणी प्रोग्राम तयार करण्याची कल्पना वाईट नाही.
या टप्प्यावर, सर्व कोडसाठी चाचण्या तयार करण्याऐवजी, भविष्यात फारसा बदल होण्याची शक्यता नसलेल्या स्थिर भागांवर लक्ष केंद्रित करणे महत्त्वाचे आहे, आणि अजूनही अस्थिर असलेल्या भागांना स्वयंचलित चाचण्यांशिवाय ठेवणे महत्त्वाचे आहे.
याला रिफॅक्टरिंग-प्रेरित चाचणी असे म्हटले जाऊ शकते.
निष्कर्ष
जनरेटिव्ह एआय सॉफ्टवेअर विकासात नाट्यमय बदल घडवून आणत आहे.
माझ्या मागील लेखांमध्ये, मी एक ओम्निडायरेक्शनल अभियंता बनण्याचे महत्त्व लिहिले होते, जो पारंपरिक फुल-स्टॅक अभियंत्याच्या भूमिकेच्या पलीकडे जाऊन विविध डोमेन, इन्फ्रास्ट्रक्चर आणि अंमलबजावणी वातावरण एकत्र करणाऱ्या ओम्निडायरेक्शनल सिस्टिम्स विकसित करू शकतो.
मी असाही एक लेख लिहिला होता की आपण अनुभव आणि वर्तन-प्रेरित विकासाच्या युगात प्रवेश करत आहोत, जो वैशिष्ट्ये अंमलबजावणीशी जुळवून घेण्याच्या पारंपरिक सॉफ्टवेअर विकास दृष्टिकोनाऐवजी, सॉफ्टवेअरच्या वर्तनाद्वारे वापरकर्त्याचा अनुभव वाढवण्यावर लक्ष केंद्रित करतो.
विकास-प्रेरित विकास आणि रिफॅक्टरिंग-प्रेरित चाचणी हेच असे दृष्टिकोन आहेत जे आपल्याला सॉफ्टवेअर विकासातील या नवीन क्षितिजांकडे घेऊन जातील.