- डेवलपर टूल बनाना इसलिए अधिक कठिन है क्योंकि इसमें सिर्फ वह logic डिज़ाइन नहीं करना होता जिसे कंप्यूटर चलाएगा, बल्कि वह mental model भी बनाना होता है जिसे दूसरे लोग समझें और इस्तेमाल करें
- तेज़ onboarding कोई अतिरिक्त सुविधा नहीं, बल्कि लगभग खुद product है; setup, API token, और पहली run की friction इतनी कम होनी चाहिए कि उपयोगकर्ता कुछ ही मिनटों में अपने laptop पर इसे आज़मा सके
- उपयोगकर्ता लंबे core concepts विवरणों से ज़्यादा काम करने वाले examples बदलकर pattern सीखते हैं, और जितने अधिक problem के क़रीब starting points होंगे, सफलता की संभावना उतनी बढ़ेगी
- error messages, concepts की संख्या, naming, configuration का तरीका, defaults, magic, और syntax sugar — ये सब उपयोगकर्ता की सफलता की राह बदलते हैं, इसलिए पढ़ने में आसान और customize किए जा सकने वाले design की ज़रूरत होती है
- अच्छा developer experience सिर्फ features कम करना नहीं है, बल्कि जो बनाया जा सकता है उसकी सीमा बनाए रखते हुए समझने लायक complexity को बहुत कम करना है
इंसानों के लिए लिखा गया कोड mental model तक संभालता है
- कंप्यूटर के लिए कोड लिखना बड़े business goals को logical statements में तोड़ना है ताकि कंप्यूटर उनका पालन कर सके
- framework, library, API, SDK, DSL, embedded DSL, और programming language जैसे code, जिन्हें इंसान सीधे इस्तेमाल करते हैं, उनके लिए सिर्फ executable होना काफ़ी नहीं है
- ऐसे code को कंप्यूटर को निर्देश देने के साथ-साथ यह भी संभालना पड़ता है कि उपयोगकर्ता उसे कैसे पढ़ेंगे और समझेंगे
- developer tools का design करने में सिर्फ computer science नहीं, बल्कि उपयोगकर्ता कैसे तर्क करते हैं इसकी मनोवैज्ञानिक समझ भी चाहिए
शुरुआती अनुभव ही product है
- developer tools पर feedback आमतौर पर उन power users से ज़्यादा मिलता है जो product को बार-बार इस्तेमाल करते हैं
- जो उपयोगकर्ता शुरुआत में ही अटक जाते हैं, वे feedback नहीं छोड़ते, इसलिए survivorship bias पैदा होता है
- जैसे consumer products onboarding funnel को optimize करते हैं, वैसे ही developer tools को भी first run तक पहुँचने की प्रक्रिया को product का core मानना चाहिए
- तेज़ onboarding के लिए product की संरचना बदलना भी उचित हो सकता है
- ज़रूरी configuration हटाना
- API token setup को बेहद आसान बनाना
- शुरुआती friction कम करना
- उपयोगकर्ता को कुछ ही मिनटों में अपने laptop पर product चलाकर देखने देना
- ऐसे माहौल में जहाँ developer tools बहुत ज़्यादा हो गए हैं, उपयोगकर्ताओं के पास किसी खास LRU cache NPM package के फ़र्क को गहराई से समझने की न ऊर्जा होती है, न धैर्य
examples, core concepts से तेज़ सिखाते हैं
- इंसान, कंप्यूटर की तरह सख़्त निर्देशों का पालन करने के बजाय, pattern matching में मज़बूत होते हैं
- कई developer tool docs पहले core data model, relations, atomic concepts, configuration, और execution समझाते हैं, लेकिन इंसान काम करता हुआ example बदलकर और नतीजा देखकर बेहतर सीखते हैं
- 5,000 शब्दों वाली “core concepts” व्याख्या से कई examples ज़्यादा उपयोगी हो सकते हैं
- उपयोगकर्ता examples देखकर tool का व्यवहार समझते हैं
- जिनके पास हल करने के लिए कोई समस्या है, वे काफ़ी क़रीब का starting point ढूँढ़ सकते हैं
- जितने ज़्यादा starting points होंगे, उतनी ही संभावना होगी कि उन्हें अपनी ज़रूरत के क़रीब example मिल जाए
उपयोगकर्ता को सफलता के गड्ढे में धकेलना
- programming की default अवस्था अक्सर किसी न किसी तरह की errors ठीक करते रहना ही होती है
- उपयोगकर्ता tool के साथ अपना ज़्यादातर समय यह समझने में बिता सकते हैं कि “क्या काम नहीं कर रहा”
- जब developers जल्दी सफल होते हैं तो वे tool को पसंद करते हैं, लेकिन अगर वे लगातार errors में फँसे रहें तो tool को दोष देते हैं
- हर error उपयोगकर्ता को happy path पर वापस लाने का एक मौका है
- exception message में code snippet देना
- जब उपयोगकर्ता कुछ अजीब करने वाले हों तब उपयोगी warnings दिखाना
- उपयोगकर्ता को सफल होने के लिए ज़रूरी actions देना
concept overload कम करना
- tool इस्तेमाल करने से पहले समझने पड़ने वाले हर नए concept एक friction point बन जाता है
- 2–3 concepts स्वीकार्य हो सकते हैं, लेकिन 8 नए concepts सीखने के लिए तैयार उपयोगकर्ता बहुत कम होंगे
- Kubernetes में शुरुआत में हर concept की ज़रूरत नहीं होती, लेकिन जैसे-जैसे नए concepts बढ़ते हैं, बोझ भी बढ़ता है
- ऐसे frameworks में एक तरह की सुंदरता होती है जो शक्तिशाली हों, फिर भी सिर्फ 3–5 concepts रखते हों
- React को पहली बार इस्तेमाल करते समय, एक-दो घंटे बाद conceptual पहाड़ी पार करने पर यह एहसास हो सकता है कि कुछ सरल building blocks से बड़े structures बनाए जा सकते हैं
- लक्ष्य सिर्फ concepts की संख्या घटाना नहीं, बल्कि क्या बनाया जा सकता है उसकी सीमा बनाए रखते हुए उपयोगकर्ता को समझने पड़ने वाले concepts कम करना है
- बेहतरीन tools complexity को 90% तक कम करके भी capability को बरकरार रख सकते हैं
- ऐसा tool भी बुरा नहीं जो complexity को 90% कम करे और capability को सिर्फ 10% घटाए
conceptual duck principle
- अगर framework में कोई ऐसा element है जो values लेकर नई value निकालता है, तो उसे “compute node”, “valuator”, या “frobniscator” कहने के बजाय function कहना बेहतर है
- अगर कोई चीज़ बत्तख की तरह चलती है और बत्तख की तरह आवाज़ करती है, तो उसके बत्तख होने की संभावना ज़्यादा है — यह सिद्धांत concept design पर भी लागू हो सकता है
- भले ही उसमें कुछ सूक्ष्म अंतर हों या values cache होती हों, अगर वह function के काफ़ी क़रीब है तो उसे function कहा जा सकता है
- मौजूदा terminology इस्तेमाल करने से उपयोगकर्ता के पास पहले से मौजूद mental model से जुड़ना आसान होता है और समझाने की ज़रूरत बहुत कम हो जाती है
इसे programmable बनाइए
- उपयोगकर्ता codebase के साथ अनपेक्षित काम करते हैं, और framework elements को for-loop, function, या दूसरी structures के भीतर रख सकते हैं
- इसलिए framework की लगभग हर चीज़ programmable होनी चाहिए
- इससे जुड़ी design directions एक-दूसरे से जुड़ी हुई हैं
- CLI से गुज़रे बिना code से सीधे call कर पाना
- configuration files कम करके उन्हें SDK या API से बदलना
- सिर्फ एक चीज़ बनाने तक सीमित न रखना, बल्कि parameterize करके n चीज़ें बनाने देना
- ऐसा design उपयोगकर्ताओं को नए use cases खोजने में मदद कर सकता है
- framework के ऊपर “hack” करने की इच्छा का उपयोग करने से थोड़ी उलझन ज़रूर हो सकती है, लेकिन इससे अप्रत्याशित खोजें भी हो सकती हैं
magic, defaults, और syntax sugar में सावधानी चाहिए
- मान लीजिए cloud में Jupyter notebook चलाने के लिए
run_notebookfunction है, और उपयोगकर्ता को यह बताना है कि कौन-सी container image इस्तेमाल करनी है - कई विकल्प संभव हैं
image=...argument को हमेशा required रखना- एक default image देना जिसमें ज़्यादातर data science libraries installed हों, और उपयोगकर्ता उसे override कर सके
- cell के code को inspect करके ज़रूरी dependencies के आधार पर “magic” तरीके से image चुनना
- magic तरीके के साथ-साथ उपयोगकर्ता को किसी खास image को चुनने की अनुमति देना
- input कम करने और सबसे व्यापक use cases को support करने के लिए आख़िरी विकल्प अच्छा लग सकता है
- लेकिन पहले विकल्प को छोड़कर बाकी में समस्याएँ रहती हैं
- magic कुछ स्थितियों में टूटता है
- defaults पर निर्भर code पढ़ने वाला उपयोगकर्ता शायद यह न समझ पाए कि customization संभव है
- जब तक defaults 97% से ज़्यादा मामलों में सही न बैठें और magic 99% से ज़्यादा बार सही न हो, बहुत सावधान रहना चाहिए
- coding golf नहीं है, और tool provider का काम सिर्फ यह नहीं कि उपयोगकर्ता को कम से कम code लिखना पड़े
- Perl ने छोटे code के लिए बहुत optimization किया, लेकिन programs special characters की कतार जैसे लग सकते थे; Python में code 50% लंबा होने पर भी वह पढ़ने और समझने में आसान था
- लोग code लिखने से 10 गुना ज़्यादा उसे पढ़ते हैं, इसलिए readability बहुत महत्वपूर्ण है
- syntax sugar को भी इसी कसौटी पर परखना चाहिए
- आम use cases के लिए special syntax डालने का मन हो सकता है
- लेकिन इससे consistency कमज़ोर हो सकती है और customization का तरीका कम स्पष्ट हो सकता है
- अगर syntax sugar 99% से ज़्यादा मामलों में लागू नहीं होता, तो शायद उसे जोड़ना ही नहीं चाहिए
पहली बार इस्तेमाल करने वालों के लिए design principles
- इंसानों के लिए code लिखने में अभी भी कई design समस्याएँ बची हुई हैं
- ज़्यादातर चीज़ें immutable होनी चाहिए, लेकिन सब कुछ नहीं
- scaffolding, यानी code generation, से बचना
- feedback loop को बेहद तेज़ बनाना
- उपयोगकर्ता को deprecated features से आसानी से निपटने देना
- docs और examples के code snippets पर automated tests चलाना
- पहली user experience को design करना pop song बनाने जैसा है
- producer भले ही गाना हज़ार बार सुन चुका हो, उसे 999वीं बार भी यह कल्पना करनी पड़ती है कि पहली बार सुनने वाले को यह कैसा लगेगा
- developer tools में भी, जो व्यक्ति चीज़ को बार-बार बना चुका है, उसके लिए पहली बार इस्तेमाल करने वाले उपयोगकर्ता के अनुभव की कल्पना करना बहुत कठिन होता है
1 टिप्पणियां
Hacker News राय
हर व्यक्ति का सीखने का तरीका अलग होता है। मुझे examples में जाने से पहले पहले मुख्य concepts चाहिए होते हैं। अगर मुख्य concepts बहुत सरल न हों, तो यह और भी ज़रूरी हो जाता है
कई tutorials हाथ पकड़कर Lego जोड़ने जैसे होते हैं। अंदाज़ कुछ ऐसा होता है: “यहाँ Lego का टुकड़ा है, मैं एक toy project बनाता हूँ, तुम follow करो, और दिन खत्म होते-होते तुम्हें Lego करना आ जाएगा”
यह तरीका मेरे लिए ठीक से काम नहीं करता। मैं जानना चाहता हूँ कि फैसले कैसे और क्यों लिए जाते हैं, और लेखक के नजरिए से देखना चाहता हूँ। मैं समझना चाहता हूँ कि Lego के हर टुकड़े का स्वभाव क्या है, वे आपस में कैसे जुड़ते हैं, और किसी खास design तक कैसे पहुँचा जाता है
न्यूनतम high-level concept explanation के बिना tutorial follow करना ऐसा लगता है जैसे किसी ऐसी चीज़ की reverse engineering कर रहा हूँ जिसकी जरूरत नहीं होनी चाहिए। जब मैं कोई नई library या framework देखता हूँ, तो intro article पढ़ता हूँ और “getting started” code examples छोड़ देता हूँ। आम तौर पर “advanced” section में concepts पर ज्यादा चर्चा होती है, इसलिए वहीं से शुरू करता हूँ; फिर API reference देखकर महत्वपूर्ण interfaces समझता हूँ; और आखिर में tutorial की शुरुआत वाले basic code examples पर लौटता हूँ
आजकल मैं कहीं ज्यादा बार सीधे कूदकर examples पर काम शुरू कर देता हूँ, और मुझे लगता है कि मेरी productivity भी ज्यादा है। कुछ हद तक यह भरोसे का मामला है। भरोसा कि quality software बनाने वालों ने common use cases में internals को गहराई से खोदे बिना interface को समझने लायक बनाने के लिए पर्याप्त सोच-विचार किया होगा
बेशक, अक्सर ऐसे blockers मिलते हैं जहाँ और गहराई में जाना पड़ता है। लेकिन ऐसी स्थिति इसलिए आती है क्योंकि सतही impression के आधार पर ही मैं 10 दूसरी चीजें सफलतापूर्वक पार कर चुका होता हूँ। इसलिए जब सच में गहराई में जाना पड़ता है, तब भी आम तौर पर उसे समय की बर्बादी नहीं मानता
ऐसे tools एक खास folder structure, template files और पहले से configured tools बना देते हैं। अगर generated files क्या करती हैं और उन्हें वैसा क्यों बनाया गया है, इसका high-level समझ तुरंत न हो, तो बहुत ज्यादा अनसमझ magic होने की वजह से असहजता होती है
जब भी कोई नई चीज़ आती है, मुझे एक high-level introduction चाहिए जो उसका उद्देश्य उन concepts से जोड़कर समझाए जिन्हें मैं पहले से जानता हूँ। कम से कम उस black box के मुख्य interface की मोटी समझ होने से पहले मैं किसी जादुई black box से निपटने में सहज नहीं होता। उदाहरण के लिए, अगर मैं शुरू से create-react-app सीखता, तो तुरंत Babel या ESLint जैसे उन tools के उद्देश्य की छानबीन शुरू कर देता जिन्हें वह configure करता है
कई साल बाद, जब मैंने बहुत सारे अच्छे practical examples देखे, तब जाकर समझ आया कि concepts क्या कह रहे हैं। उस अहसास के बाद मैंने अपना सीखने का तरीका सुधारा
पहले मुख्य concepts को सरसरी तौर पर देखता हूँ, फिर कई examples आज़माता हूँ जब तक यह समझ न आ जाए कि वे concepts क्यों जरूरी हैं, और फिर naive examples में छूटे edge cases हटाने के लिए मुख्य concepts को ध्यान से पढ़ता हूँ
हालांकि मुझे लगता है कि examples से शुरू करना अच्छे API design में मदद कर सकता है। अगर API को “मुख्य concepts पहले” के हिसाब से design किया जाए, तो अंत में अक्सर ऐसी API बनती है जिसे मुख्य concepts समझने के बाद ही इस्तेमाल किया जा सके, और यह कभी-कभार इस्तेमाल करने वाले users के लिए अच्छा नहीं होता
hacker-style में कोई citation नहीं था। मैंने शिक्षा-शास्त्र थोड़ा ही देखा है, लेकिन यह एक विशाल और परिपक्व field है जो Dewey और Piaget की experiential psychology से आधुनिक principles खींचती है। इसमें कहने को इतना कुछ है जो एक blog post तो क्या, किसी blog post के एक section में भी समा नहीं सकता
जैसा बताया गया, सबसे बड़ी समस्या यह है कि लोग अलग-अलग होते हैं। अगली बड़ी समस्या यह है कि हमें पक्का यह भी नहीं पता कि ये फर्क क्यों पैदा होते हैं, या समय के साथ कितने स्थिर रहते हैं। लेख खुद अच्छा लिखा गया है और किसी खास teaching strategy की व्यावहारिकता को अच्छे से खंगालता है, लेकिन इसमें थोड़ी और humility होती तो अच्छा होता
दो हफ्ते भी नहीं हुए थे कि ऐसा ही एक लेख था: https://news.ycombinator.com/item?id=41566097
इंसानों के लिए लिखना आखिरकार दो skills में सिमटता है: empathy और writing
थोड़ा-बहुत code लिखने और कोई application या product लिखने के बीच बड़ा फर्क है। यह लेख भी कम खुलकर सही, आखिर वही बात कर रहा है। empathy इसलिए अहम है क्योंकि वही self-centeredness और बाहरी नजरिए का फर्क बनाती है
self-centered developer ज्यादातर आसानी, सुविधा, code vanity, और दूसरे subjective criteria में रुचि रखता है। आखिर में वह सिर्फ अपनी delivery effort को देखता है। बाहरी-उन्मुख developer मुख्यतः architecture और documentation में रुचि रखता है, क्योंकि वह सफलता को इस बात पर निर्भर मानता है कि दूसरे लोग उसके output को कैसे ग्रहण करते हैं
simplicity, ease से ज्यादा महत्वपूर्ण है। क्योंकि बाहरी-उन्मुख developer दूसरों का मन नहीं पढ़ सकता और यह नहीं जान सकता कि उन्हें क्या आसान लगेगा, लेकिन वह steps की संख्या घटाना और code को छोटा रखना जानता है
पूरे product के नजरिए से application लिखना, दिमाग के भीतर, essay, article या book लिखने से अलग नहीं है। मूल बात organization और function है। code बाद में आता है, जैसे page पर शब्द। जो लोग सिर्फ code snippets लिखते हैं, वे वह higher-level organizational skill विकसित नहीं कर पाते जो सब कुछ एक साथ जोड़ती है
इसलिए मुझे frameworks से बहुत नफरत है। frameworks developers से वह practice छीन लेते हैं जो original software लिखने के लिए चाहिए, और नतीजतन वे organizational skills नहीं बढ़ा पाते। संबंधित व्यक्ति को यह दिखता नहीं, लेकिन जिसे दिखता है उसके लिए यह एक बहुत बड़ा और साफ gap है
लेकिन अब दूसरों को उनकी abstractions सीखनी पड़ती हैं, और वे underlying concepts से उतने ही दूर हो जाते हैं। तब framework से आगे जाने के लिए जरूरी core skills सीखना और मुश्किल हो सकता है। Rails सीखते समय मुझे ऐसा ही लगा था, और आखिर में यह समझकर कि वह बहुत कुछ छिपा देता है, मैंने उसे छोड़ दिया और शुरुआत से करके देखा
यह समझना कि यह पूरी तरह अलग skill है, आंखें खोल देने वाला अहसास है। कहें तो अब यह known unknown बन गया है
जब boss गला दबा रहा हो, या रात 2 बजे कोई operations issue ठीक कर रहा हो, तब यह code उसे कैसा दिखेगा? उस जवाब की असल जरूरत पड़ने तक आपको उसकी कीमत पता नहीं चलती। और जिस क्षण जरूरत पड़ती है, उस जवाब के लिए आपको भारी कीमत चुकानी पड़ती है। बशर्ते आप ऐसा कर सकने वाला कोई व्यक्ति ढूंढ पाएं। ऐसे लोग दुर्लभ होते हैं
“इंसान core concepts से नहीं, examples से सीखते हैं” इस बात से मैं सहमत नहीं हूं। यह शायद nitpick हो, लेकिन सभी इंसान ऐसे काम नहीं करते
जो लोग general से specific की दिशा पसंद करते हैं, उन्हें primary और secondary education में पहले ही बड़े पैमाने पर नजरअंदाज किया जाता है, और higher education में जाकर ही शायद चीजें उनके लिए ठीक बैठनी शुरू होती हैं। वे पहले ही काफी अलग-थलग किए जा चुके हैं, इसलिए उनके अस्तित्व को ही नकारने की जरूरत नहीं है
मुझे यह nuance समझ नहीं आ रहा था कि कब क्या करना है, कौन-सी चीजें पूरी तरह साथ-साथ करनी हैं और कौन-सी तुरंत बाद करनी हैं। तभी girlfriend के पिता ने संक्षेप में समझाया कि clutch असल में क्या करता है, और wheels व engine का connection दोनों तरफ क्या असर डालता है
उसी क्षण मुझे समझ आ गया, और किसी खास situation में क्या करना है, इसके निर्देश सुनने की जरूरत भी नहीं रही। करीब 20 मिनट बाद मैं manual transmission की सबसे मुश्किल चीजों में से एक कर पा रहा था: पीछे की ओर ढलान वाली चढ़ाई पर handbrake से start करके car चलाना। कुछ लोगों के लिए first principles से यह समझना कि चीजें कैसे काम करती हैं, कहीं ज्यादा उपयोगी होता है, और मेरा मानना है कि software engineers में ऐसे “कुछ लोग” काफी हैं
अगर example में कोई चौंकाने वाली बात हो, तो इसका मतलब है कि मेरा model अभी पूरा नहीं है। या फिर example गलत है
“हम जो हासिल करना चाहते हैं वह यह है, यह ऐसे काम करता है, और हम इसे ऐसे करते हैं” के बजाय, practitioner को हमेशा सिर्फ “हम इसे ऐसे करते हैं” ही दिखता है। जरा-सा भी अंतर आ जाए तो reason करके adjust करना और समस्या हल करना मुश्किल हो जाता है
जो काम अक्सर किए जाते हैं उनके लिए कुछ documentation तो है, लेकिन वह आम तौर पर पुरानी या अधूरी होती है। यह wiki नहीं है, इसलिए कोई भी कभी भी उसे ठीक नहीं कर सकता, और docs ठीक करने के लिए झुंझलाहट भरी प्रक्रिया से गुजरना पड़ता है, इसलिए वे आखिर update नहीं होतीं। सोचता हूं तो यह सेना में बिताए समय से काफी मिलता-जुलता है
अभी भी Drizzle ORM सीखने के लिए समय निकालते हुए यही हो रहा है। सबसे पहले मिले सारे resources “छह query examples” थे, और मैं इस बात से परेशान हो गया कि वह syntax क्यों इस्तेमाल किया जाता है, दूसरे options क्या हैं। ऐसे resources बंद करके, docs के हर page को पढ़ने के बाद कुछ करना—मेरा अपना तरीका—मुझे कहीं ज्यादा comfortable लगता है
अब भी मुझे नहीं पता कि मैं यह real time में कर सकता हूं या नहीं। यह तरीका काफी thinking cycles लेता है, इसलिए अभी मुझे text पढ़ना या video रोककर process करना ज्यादा सही pace लगता है
कई बार मुझे उन लोगों को मौके पर ही सिखाना पड़ा जो अभी समझ नहीं पाए थे। अगर आपके पास system के बारे में theory हो, तो आप ऐसे सवालों के भी जवाब दे सकते हैं जिनका जवाब सिर्फ rote memorization से थोड़ा आगे बढ़े classmates नहीं दे पाते
यह Code Complete की पंक्ति है: “Programming के काम का छोटा हिस्सा ऐसे program लिखना है जिन्हें computer पढ़ सके, और बड़ा हिस्सा ऐसे लिखना है जिन्हें दूसरे इंसान पढ़ सकें।” पेज 733
लगभग 20 साल से याद में है
यह Abelson और Sussman की Structure and Interpretation of Computer Programs के पहले संस्करण की भूमिका में कही गई बात है, और Code Complete से 10 साल पहले की है
यह वह कहावत है जिसका मैं पालन करने की कोशिश करता हूँ, लेकिन employers अजीब तरह से हमेशा उस हिस्से पर जोर देते दिखते हैं जिसे computer execute करता है
थोड़ा विषयांतर है, लेकिन कुछ दिन पहले Unity गेम बनाते हुए मुझे लगा कि IDE पिछले 10–20 सालों में शायद सचमुच बहुत ज़्यादा आगे नहीं बढ़े हैं
बेसिक IntelliSense निश्चित रूप से काफ़ी बेहतर हुआ है, लेकिन उसके अलावा कुछ छोटी-मोटी बातों को छोड़ दें तो coding की पूरी अवधारणा पहले जैसी ही लगती है
सबसे बड़ा सकारात्मक बदलाव editor के बाहर है। libraries और documentation तक पहुंच अब कहीं ज़्यादा आसान है, users के सवाल-जवाब बेहद ज़्यादा हो गए हैं, और कभी-कभी उन जवाबों को इकट्ठा करके ठीक-ठाक जवाब देने वाले ChatGPT जैसे नए tools भी आ गए हैं
लेकिन कुल मिलाकर code लिखने की क्रिया ठहरी हुई लगती है। इसलिए अभी मैंने game पर काम थोड़ी देर के लिए रोककर कुछ experiments शुरू किए हैं। मैं नई language बनाना नहीं चाहता; बस जितने भी छोटे-मोटे झंझट हैं, उन्हें computer को देकर creation पर focus करना चाहता हूं
पहली बार test करना चाहता हूं ऐसी तीन चीज़ें ये हैं। brackets या terminators जैसे छोटे language details की चिंता मैं क्यों करूं, tool उन्हें autocomplete क्यों नहीं कर सकता। private-public access chains या unsafe जैसे modifiers के लिए भी tool सबसे efficient set अपने-आप तय क्यों नहीं कर सकता। जब मैं आपस में interact करने वाले करीब 5 methods पर focus कर रहा हूं, तो कई windows खोलकर VS के horizontal/vertical sliders से जूझे बिना उन सबको एक ही screen पर देखना चाहता हूं। अगर मैंने HashSet बनाया और फिर उसे Dictionary या Tuple में बदलना पड़े, तो वह बस बदल दे, और जहां judgment की जरूरत हो केवल वही दिखाए ताकि मैं approve कर सकूं या खुद ठीक कर सकूं। Unity में ऐसा भी हो सके कि किसी method या data set पर click करके उसे Burst Job और उससे जुड़े NativeData set में बदलने का निर्देश दे सकूं
लेकिन आखिर में सब abstraction ही है, और हम बस एक बेहद बेवकूफ machine को data compute करने के लिए instructions लिख रहे हैं
आपने कहा कि brackets या terminators tool autocomplete कर दे तो क्या दिक्कत है, लेकिन computer सच में बहुत सरल चीज़ है और programming language हमारे मन के विचारों को पहुंचाने का माध्यम है। ऐसे delimiters language keywords जितने ही महत्वपूर्ण हैं, क्योंकि वे rules का हिस्सा हैं। उन्हें autocomplete करने के लिए और rules और और delimiters चाहिए होंगे
अगर आप आपस में interact करने वाले कई methods को एक screen पर देखना चाहते हैं, तो Vim और Emacs, या Pharo जैसी Smalltalk IDE मौजूद हैं
data transformations Vim और Emacs macros से किए जा सकते हैं। लेकिन सच्चाई यह है कि data encoding बहुत महत्वपूर्ण है। computer के लिए सब bits हैं; हम ही उन bits को अर्थ देते हैं और उस अर्थ के अनुसार manipulate करने के rules बनाते हैं। rules के एक set से दूसरे set में shape बदलने के लिए और rules चाहिए होते हैं
live programming environment आज़माने की सलाह दूंगा। जैसे Common Lisp का SLIME, Smalltalk का Pharo, JavaScript का web inspector। यह जमीन पर नाव रखकर sailing कैसी होगी कल्पना करने के बजाय समुद्र के बीच खड़ी नाव पर काम करने जैसा है
programming का सबसे कठिन हिस्सा सोचना और सीखना है। तेज़ typing से बहुत बड़ी मदद नहीं मिलती
उदाहरण के लिए C program लिखते समय “f” को “for (=; <=; ++) {;}” या अपनी पसंद की indentation शैली में expand कराया जा सकता था
आधुनिक programming editors में भी ऐसी user settings support करने वाले बहुत हैं, लेकिन दुर्भाग्य से कई मामलों में प्रक्रिया बहुत पुराने समय की तुलना में अधिक जटिल है
अगर programming language की syntax verbose है, तो editor में कम-से-कम keystrokes से किसी भी program structure को जल्दी लिखने के लिए templates define करने में समय लगाना जरूरी लगता है
HashSet, Dictionary, Tuple में से क्या इस्तेमाल करना है, इसमें performance impact होता है, और abstract रूप से हमेशा साफ़ नहीं होता कि किसे इस्तेमाल करना चाहिए। Java जैसी explicit languages, और शायद C# में भी, method calls को refactor किया जा सकता है ताकि वे दूसरा type लें। तब एक method बदलकर उसके सभी calls refactor किए जा सकते हैं
मैंने Gemini pro और ChatGPT o1 के साथ experiment किया, और दोनों Python और JavaScript coding में सच में बहुत खराब हैं। वे buggy code लिखते हैं, और एक bug ठीक करते-करते अक्सर दूसरा bug डाल देते हैं। दोनों requirements पर सोचने के बजाय जवाब देने की जल्दी में लगते हैं। हमारे चाहने के तरीके से “दिमाग पढ़ने” या क्या महत्वपूर्ण है और क्या नहीं, यह समझने वाले tools तक पहुंचने में अभी कुछ दूरी है
इससे भी बुरी बात training data हो सकती है। ज्यादातर code below-average और average coders बनाते हैं, इसलिए ऐसे tools average coder के thinking patterns अपना लेते हैं। अगर उन्हें सिर्फ सबसे उच्च quality code पर train किया जाए, तब भी यह साफ़ नहीं कि ज्यादातर coders सही prompt दे पाएंगे या नहीं। इसलिए अगर आप 10–20 साल से coding कर रहे हैं, तो instant magic की उम्मीद रखने वाले किसी tool से हमेशा कुछ निराश होने की संभावना काफी है
फिर भी non-AI static analysis tools बहुत समय से शानदार रहे हैं और आगे और बेहतर होंगे। उनमें AI जोड़ने से और सुधार हो सकता है। अगर tool को specification फेंककर ठीक-ठाक result पाने वाले artist की तरह नहीं, बल्कि मुझे artist बनने में मदद करने वाली चीज़ की तरह सोचें, तो अच्छा experience मिल सकता है
editor से आप जो काम और कराना चाहते हैं, वह AI को बताकर settings में मदद मांगने का experiment भी मज़ेदार हो सकता है। plugins में बहुत सारे non-AI tools हैं। आपकी lifestyle के अनुसार plugins चुनने के लिए large language model का इस्तेमाल करना शायद सबसे efficient हो सकता है
https://haystackeditor.com/
मैंने खुद इस्तेमाल नहीं किया है, लेकिन आज़माने का सोच रहा हूं
लेख का title विवादित हो सकता है। क्योंकि code केवल humans के लिए लिखा जाता है। computer को “code” की जरूरत नहीं होती, खासकर high-level code की तो बिल्कुल नहीं। computer के लिए machine-language instructions ही पर्याप्त हैं
हम code इसलिए लिखते हैं क्योंकि machine-language instructions इंसानों के लिए लिखना बहुत कठिन है, और पढ़ना उससे भी कठिन
code को computer के साथ interact करने के तरीके के रूप में नहीं सोचना चाहिए। code वह तरीका है जिससे humans अपने विचारों को formalize करते हैं, ताकि वे इतने unambiguous हों कि machine भी उनका पालन कर सके
पिछले हफ्ते लिखे और शेयर किए गए ब्लॉग पोस्ट को परोपकारी ढंग से प्रमोट कर रहा हूँ
Move Fast & Document Things [1]
इरादा कोई दार्शनिक लेख लिखने का नहीं था, बल्कि असली tips शेयर करने का था कि हमारी छोटी टीम [2] automation या AI से नहीं, बल्कि गहरी और कठिन review के ज़रिए अपने लिए और एक-दूसरे के लिए code writing culture कैसे enforce करती है
दूसरे संगठनों में engineering leaders के रूप में काम करने वाले मेरे निजी दोस्तों ने कहा, “हम भी बिल्कुल यही करते हैं, लेकिन तुमने इसे सचमुच लिख दिया।” अगर आपको इसमें value लगी हो तो recommend करने की गुज़ारिश है
[1] https://olshansky.substack.com/p/move-fast-and-document-thin...
[2] https://github.com/pokt-network/poktroll/graphs/contributors
“बहुत सारी programming किताबें और tutorials ‘चलो शुरुआत से एक-एक ईंट जोड़कर घर बनाते हैं’ जैसे होते हैं, जबकि मुझे चाहिए ‘यहाँ एक चलने वाला घर है, चलो कुछ बदलकर देखते हैं कि क्या होता है’”
मैंने programming खुद इसी तरीके से सीखी। कई साल छोटे, सरल और थोड़े घटिया programs को अच्छे से इस्तेमाल करने में बिताए
बाद में पता चला कि मैं बेहतर software development नौकरियों के लिए उपयुक्त नहीं था। वजह यह थी कि software design, programming languages और computers की बुनियादी समझ बिल्कुल नहीं थी। चूँकि मैंने उबाऊ तरीके से नहीं सीखा था, interview room से निकलते समय यह समझना कि मुझे कितना कुछ नहीं पता, बहुत विनम्र बना देने वाला अनुभव था
हमेशा पूरी manual पढ़नी चाहिए, और हमेशा fundamentals सीखने चाहिए
मेरा सारा code इंसानों के लिए लिखा जाता है
चाहे वह इंसान मैं ही क्यों न होऊँ, या कुछ साल बाद मेरी मंशा समझने की कोशिश करता कोई बेचारा व्यक्ति हो
मेरे हिसाब से code लिखना अपने आप में मुश्किल नहीं है। असली प्रतिभा उन हिस्सों में दिखती है जहाँ समस्या पर व्यापक रूप से reasoning करनी होती है, दूसरे stakeholders के साथ collaborate करके सबसे अच्छा रास्ता ढूँढना और उन्हें lead करना होता है, नई mathematics या industry conventions जैसी specialized skills सीखनी होती हैं, efficient algorithms बनाने होते हैं, और program की structure व patterns को साफ़ और elegant boundaries के साथ communicate करना होता है
आखिरकार बहुत कुछ communication और clarity पर निर्भर करता है
इस लेख का बड़ा हिस्सा documentation के बारे में है, और अगर इसमें 4doc model का संदर्भ दिया गया होता तो बहुत मदद मिलती: https://docs.divio.com/documentation-system/
मूल बात यह है कि सिर्फ reference docs न दें, usage docs भी दें। और चूँकि आम तौर पर users पूरे documentation में सबसे पहले वही हिस्सा देखना चाहते हैं, इसलिए उसे आगे रखें
बेशक यह सामान्य तौर पर कहा जा रहा है; मैं खुद अक्सर सीधे reference material पर जाता हूँ, लेकिन हमेशा नहीं
इसका मतलब यह नहीं कि 4doc कोई सर्व-समाधान या प्रकृति का नियम है। Hillel Wayne ने यहाँ इसकी समस्याओं पर भी अच्छी तरह बात की है: https://www.hillelwayne.com/post/problems-with-the-4doc-mode...