- Julia Evans के Strange Loop keynote में यह बताया गया है कि DNS, Bash, HTTP, SQL जैसी चीज़ें, जो “बेसिक” लगती हैं, सीखने में इतना समय क्यों लेती हैं, और सीखने की बाधा को कैसे कम किया जाए
- Bash की मुश्किल यह है कि इसमें
set -eका||condition के अंदर function call में निष्क्रिय हो जाना जैसी छोटी exceptions और pitfalls बहुत हैं, और ज़्यादातर लोग Bash को कभी-कभार ही इस्तेमाल करते हैं, इसलिए चीज़ें ठीक-ठीक याद रखना मुश्किल होता है - HTTP और SQL की सतह भले सरल लगे, लेकिन उसके पीछे ब्राउज़र का 2 करोड़ lines का implementation, बहुत सारे headers और flags, और SQL में लिखने के क्रम व execution क्रम का अंतर छिपा होता है, जिससे सीखने का बोझ बढ़ता है
- DNS में libraries, cache, और authoritative nameserver के साथ होने वाला communication उपयोगकर्ता को साफ़ दिखाई नहीं देता, और
digका output भी जटिल होता है, इसलिए छिपे हुए व्यवहार को दिखाने वाले tools और demos महत्वपूर्ण हैं - अच्छी learning support का मतलब है tools और references साझा करना, बड़ी lists को असल में इस्तेमाल होने वाली छोटी lists तक सीमित करना, कंप्यूटर क्या करता है इसे समयक्रम में समझाना, और failures व bugs के रिकॉर्ड भी साझा करना
“बेसिक” लगने वाली तकनीकों में इतना समय क्यों लगता है
- Strange Loop keynote Making Hard Things Easy इस बात पर है कि कठिन तकनीकों को सीखना कैसे आसान बनाया जाए
- शुरुआत DNS से हुई
- domain name का IP address ढूँढना सुनने में सरल लगता है, लेकिन वक्ता ने कहा कि DNS सीखने के 7 साल बाद भी वेबसाइट सेटअप करते समय उन्हें दिक्कतें हुईं, और कुल मिलाकर इसे समझने में लगभग 10 साल लगे
- उनके दोस्त भी बार-बार वही समस्याएँ झेलते रहे, और कई लोग इसे ऐसे लेते रहे मानो “यह तो अब तक समझ आ जाना चाहिए था”, यानी जैसे यह उनकी व्यक्तिगत कमी हो
- वक्ता ने ऐसे विषयों को आसान भाषा में समझाने के लिए Wizard Zines नाम की एक छोटी publishing company शुरू की, और Bash, HTTP, SQL, DNS को उदाहरण बनाया
Bash: याद रखना मुश्किल exceptions tools को संभालनी चाहिए
- Bash एक programming language है, लेकिन वक्ता के अनुसार यह उन भाषाओं में से है जिनमें अजीब behavior काफ़ी ज़्यादा है
- उदाहरण script में अगर
mv ./*.txt /tmmppfail हो जाए, तब भी Bash default रूप से रुकता नहीं औरecho "success!"चला देता हैset -eइस्तेमाल करने पर fail होने पर script रुक सकती है- लेकिन अगर function को
f || echo "failed!"की तरह||condition के अंदर call किया जाए, तो function के अंदरset -eglobally निष्क्रिय हो जाता है और फिर सेsuccessprint हो सकता है - यह Bash bug नहीं, बल्कि documented behavior है
- Bash के कठिन होने का एक कारण यह भी है कि बहुत से लोग Bash scripts हर 6 महीने में एक बार जैसी कम frequency पर लिखते हैं और फिर उन्हें दोबारा नहीं देखते
- अगर कोई system कम इस्तेमाल हो, लेकिन उसमें बहुत सारा trivia और pitfalls भरा हो, तो उसे सही तरह से इस्तेमाल करना मुश्किल हो जाता है
- “Bash कोई नहीं चला सकता” जैसी प्रतिक्रिया पूरी तरह सही नहीं है
- बहुत से लोग Bash इस्तेमाल करते हैं, और भले पूरी तरह perfect न हों, काम अक्सर हो ही जाता है
- लक्ष्य यह है कि जो व्यक्ति भारी-भरकम pitfalls के ढेर के सामने खड़ा है, उसे “ज़्यादातर सही तरीके से इस्तेमाल कर सकने” की स्थिति तक पहुँचाया जाए
- ShellCheck ऐसा tool है जो Bash की वे pitfalls याद रखता है जिन्हें इंसान के लिए याद रखना मुश्किल है, और warning देता है
shellcheck -o all bad-again.shSC2310warning दिखाता है कि||condition में call किया गया functionset -eको निष्क्रिय कर देता है- यह check
-o allके साथ ही दिखाई देता है - ऐसे tools trivia को कंप्यूटर के ज़िम्मे देकर cognitive load कम करते हैं
असफलता की कहानियाँ “best practices” से ज़्यादा मददगार होती हैं
- भले आप tool खुद न बनाएँ, लेकिन जो उपयोगी tools आप पहले से इस्तेमाल कर रहे हैं उन्हें दोस्तों या सहकर्मियों को बताना महत्वपूर्ण है
- वक्ता ने भी कहा कि उन्हें ShellCheck के बारे में बहुत देर से पता चला, और इस बात पर खीझ हुई कि तब तक वे सब कुछ दिमाग़ में याद रखने की कोशिश करते रहे जबकि उसकी ज़रूरत नहीं थी
- pitfalls और failure stories साझा करना लगभग community service जैसा है
- Bash में
set -eके निष्क्रिय होने का उदाहरण उन्होंने कुछ हफ्ते पहले अपने दोस्त Jesse से सुना था - जब आप दूसरे लोगों की असफलताओं के बारे में जानते हैं, तो वही समस्या खुद झेले बिना भी उससे बच सकते हैं
- Bash में
- “किसी को Bash इस्तेमाल नहीं करना चाहिए” जैसी कठोर राय से ज़्यादा उपयोगी यह है कि Bash ने असल में कौन सी समस्या पैदा की
- एक ही कहानी सुनकर कोई व्यक्ति ShellCheck का इस्तेमाल करते हुए simple Bash scripts रखना तय कर सकता है
- कोई दूसरा तय कर सकता है कि वह Bash बिल्कुल नहीं इस्तेमाल करना चाहता
- एक ही उदाहरण पर अलग-अलग प्रतिक्रियाएँ होना ठीक है
HTTP: इसे समझने के लिए 2 करोड़ lines वाले browser को मानकर चलना पड़ता है
- HTTP response state code, headers और body जैसी सरल संरचना वाला लग सकता है
- लेकिन “header क्यों सेट करना पड़ता है?” जैसे सवाल जल्दी ही browser behavior तक पहुँच जाते हैं
- Firefox लगभग 2 करोड़ lines के code से बना है
- browser 1990s से विकसित होते आए हैं, और उनका security model भी web पर होने वाले attacks और बदलावों के साथ लगातार बदलता रहा है
- यह समझने के लिए कि कोई विषय कठिन क्यों है, यह देखना ज़रूरी हो सकता है कि उसके पीछे बहुत बड़ा codebase है या नहीं
- इसमें सिर्फ HTTP नहीं बल्कि CSS, JS जैसी चीज़ें भी शामिल हैं, लेकिन modern browser की complexity HTTP की learning barrier समझाने में मदद करती है
- बड़ी lists को छोटी lists में बदलना चाहिए ताकि चीज़ें समझना आसान हो
- HTTP request headers की list 43 से ज़्यादा items की है, और unofficial headers भी हैं
- वक्ता ने HTTP request headers comic में उन 15 headers पर बात की है जिन्हें वे जानती हैं और इस्तेमाल करती हैं
- “सबसे महत्वपूर्ण headers” कोई objective list नहीं, बल्कि अपनी जानकारी और usage पर आधारित subjective list है
- उदाहरण के लिए, इतना जानना कि
Accept-Encodingकोgzipपर सेट करने से compressed response मिल सकता है, आमतौर पर काफ़ी होता है
- command-line tools को भी इसी तरह अपनाया जा सकता है
grepके man page में बहुत सारे flags हैं, लेकिन वक्ता ने 20 सालgrepइस्तेमाल करने के बाद भी सब नहीं सीखे- अगर कोई अनुभवी व्यक्ति कहे “मैं इस system में सिर्फ 7 चीज़ें जानता हूँ, और वे ये हैं”, तो यह शुरुआती लोगों के लिए मददगार होता है
- कोई दूसरा अनुभवी व्यक्ति अलग 7 चीज़ें जानता हो सकता है
Reference वही साझा करें जो आप वास्तव में इस्तेमाल करते हैं
- जो जानकारी इंसानी दिमाग़ में नहीं समा सकती, उसके लिए अच्छे references ज़रूरी हैं
- वक्ता ने कहा कि CSS को 20 साल तक बीच-बीच में सीखने के बावजूद उन्हें CSS-Tricks का पता हाल के लगभग 2 सालों में ही चला, और अगर पहले पता होता तो मदद मिलती
- CSS-Tricks में acquisition के बाद अप्रैल से नए लेख आना बंद दिखते हैं, लेकिन पुराने लेख अब भी उपयोगी माने गए
- HTTP के लिए वे Mozilla Developer Network का बहुत इस्तेमाल करती हैं
- HTTP के official references के रूप में 2022 में लिखे गए RFC 9110, 9111, 9112, 9113, 9114 हैं
- इनमें
Connectionheader के exact behavior जैसी details देखी जा सकती हैं - वक्ता का मुख्य reference आमतौर पर MDN है, लेकिन वे यह भी मानती हैं कि official RFCs अच्छी तरह व्यवस्थित हैं
- इनमें
- references साझा करते समय यह अलग करना ज़रूरी है कि आप कुछ सिर्फ इसलिए साझा कर रहे हैं क्योंकि वह प्रभावशाली दिखता है, या इसलिए क्योंकि आप सच में उसे काम में लेते हैं
- भले आप असल में w3schools जैसे “कम cool” reference का इस्तेमाल करते हों, यह ईमानदारी से बताना ज़्यादा महत्वपूर्ण है
SQL: कंप्यूटर क्या करता है, यह समयक्रम में बताइए
- SQL में query लिखने का क्रम और उसकी conceptual execution का क्रम अलग होता है, इसलिए नए सीखने वालों को भ्रम हो सकता है
- वक्ता का SQL mental model इस क्रम पर आधारित है
FROMWHEREGROUP BYHAVINGSELECTORDER BYLIMIT
- वास्तविक databases में optimization की वजह से चीज़ें और जटिल होती हैं, लेकिन यह time-order model ज़्यादातर स्थितियों में उपयोगी है
- यह query में लिखे क्रम से लगभग मिलता-जुलता है, बस
SELECTपाँचवें स्थान पर आता है
- यह query में लिखे क्रम से लगभग मिलता-जुलता है, बस
- “कंप्यूटर पहले वास्तव में क्या करता है?” यह सवाल दूसरे विषयों पर भी लागू किया जा सकता है
- CORS में browser और server के बीच होने वाले पूरे communication को समयक्रम में लिखकर समझा जा सकता है
- वक्ता ने CORS comic को इस तरीके का उदाहरण बताया
- समयक्रम में समझाना सरल दिखता है, लेकिन असल में कठिन काम है, इसलिए यह collaboration में उपयोगी होता है
- Behind Hello World on Linux Linux में “hello world” चलने पर क्या होता है, इस पर है
- वक्ता ने 10 साल पहले भी ऐसा ही एक लेख लिखा था, लेकिन 2023 वाला लेख लगभग 6 गुना लंबा था
- उनकी राय में Linux ज़्यादा complex नहीं हुआ, बल्कि 2013 में उन्हें समयक्रम में होने वाली चीज़ें कम समझ में आती थीं
- टीम के भीतर भी अगर API endpoint पर request आने के बाद क्या होता है, इसकी timeline साथ मिलकर बनाई जाए, तो हर व्यक्ति अपनी जानकारी जोड़ सकता है
DNS: छिपे हुए systems को दिखाना ज़रूरी है ताकि intuition बने
- DNS एक ऐसा ढांचा है जिसमें browser, DNS requests भेजने वाली library functions, cache, और authoritative nameserver साथ काम करते हैं
- समस्या यह है कि इनमें से बहुत कुछ उपयोगकर्ता से छिपा हुआ रहता है
- कौन सा library code DNS request भेज रहा है, यह जानना आसान नहीं है
- cache के अंदर stored data को आसानी से inspect नहीं किया जा सकता और उपयोगकर्ता उस पर नियंत्रण भी नहीं रखता
- cache और authoritative nameserver के बीच का communication भी दिखाई नहीं देता
- वक्ता ने अपनी दोस्त Marie के साथ Mess With DNS नाम का एक छोटा DNS server बनाया
- उपयोगकर्ता domain में DNS records बना सकता है
- resolver से request आने पर कौन सा message आया, यह दिखाया जाता है
- Strange Loop demo में
strangeloopनाम के लिएorange.jvns.caकी ओर इशारा करने वाला CNAME record बनाया गया था, और browser द्वारा इस्तेमाल किया जा रहा Canadian DNS resolver A और AAAA records माँग रहा था, यह देखा गया
- छिपी हुई चीज़ों को दिखाने का एक और उदाहरण float.exposed है
- इसमें 32-bit floating-point number में significand और exponent बदलकर अगला floating-point number और spacing का बदलाव देखा जा सकता है
- DNS के कठिन होने का एक और कारण यह है कि यह एक विशाल distributed system है
- वक्ता ने कहा कि इसमें “50 लाख से ज़्यादा computers शामिल हो सकते हैं”, जिनमें से अधिकांश पर उपयोगकर्ता का नियंत्रण नहीं होता और कुछ उम्मीद के मुताबिक काम भी नहीं करते
जब dig output जैसा tool खुद learning barrier बन जाए
- DNS tools का output भी भ्रम बढ़ा सकता है
digमें+norecurseflag होता है- इससे resolver से कहा जा सकता है कि वह सिर्फ वही result लौटाए जो उसके cache में पहले से मौजूद है
dig +norecurse jvns.caका इस्तेमाल यह देखने के लिए किया जा सकता है कि resolver ने उस domain को पिछले 5 मिनट में cache किया है या नहीं
digका output शुरुआती उपयोगकर्ताओं को यह महसूस करा सकता है कि DNS वास्तव में उससे भी ज़्यादा जटिल है- वक्ता के अनुसार यह ज़्यादा उस अपेक्षाकृत मनमाने output format का नतीजा है जो 1990s में तय हुआ और लंबे समय तक बना रहा
- “eraser eyes” का मतलब है जटिल output में से सिर्फ वही हिस्सा देखना जो वास्तव में ज़रूरी है, और बाकी को जैसे मिटा देना
- उदाहरण में सिर्फ
SERVFAILresponse code पर ध्यान दिया गया - वक्ता की समझ के अनुसार इस संदर्भ में
SERVFAILका मतलब लगभग “cache में नहीं है” जैसा है
- उदाहरण में सिर्फ
- जब tools का demo दें, तो यह बताना सीखने में मदद करता है कि output या UI में क्या देखना है और क्या नज़रअंदाज़ करना है
digका output भले खुरदुरा हो, लेकिन उसके फ़ायदे हैं: बहुत functionality,+norecursesupport, हर जगह उपलब्धता, और लंबे समय से न बदलने की स्थिरता
चीज़ों को साथ मिलकर आसान बनाने की भूमिकाएँ
- तकनीक को आसान बनाना ऐसा काम है जो blog के बिना भी अपने आसपास के लोगों के साथ किया जा सकता है
- वक्ता ने जिन तरीकों का सार बताया, वे ये हैं
- उपयोगी tools साझा करना
- वे references साझा करना जिन्हें आप सच में इस्तेमाल करते हैं
- कंप्यूटर में होने वाली चीज़ों को समयक्रम में बताना
- बड़ी lists को उन छोटी lists तक सीमित करना जिन्हें आप वास्तव में इस्तेमाल करते हैं
- छिपे हुए behavior को दिखाना
- उलझाने वाले tools का demo देना और बताना कि किस हिस्से पर ध्यान देना है
- मदद करने वाले लोगों के प्रकार भी अलग-अलग हो सकते हैं
- “शिकायती पुराने user” बताते हैं कि पहले क्या गलत हुआ था, जिससे दूसरों की परेशानी कम होती है
- “शोर मचाने वाले beginner” पूछते हैं “यह कैसे काम करता है?”, जिससे दूसरे लोगों को भी राहत मिलती है
- जब कोई senior developer सार्वजनिक रूप से अपनी अनजान बात पूछता है, तो वे लोग भी साथ सीख सकते हैं जो इस डर से चुप रहते हैं कि कहीं उन्हें अज्ञानी न समझ लिया जाए
- “bug record करने वाले” लिखते हैं कि क्या हुआ था ताकि वही bug फिर न दोहराया जाए
- “tool बनाने वाले” बार-बार समझाने की जगह code लिखकर समस्या को स्थायी रूप से आसान बना देते हैं
- “आज क्या सीखा साझा करने वाले” नए tools, झेले गए bugs, और libraries की नई features साझा करते हैं
- “700 tabs खोलकर रखने वाले” अक्सर पहले से जानते हैं कि जानकारी कहाँ मिलेगी
- “सवालों का जवाब देने वाले” और “बाद में खोजने लायक लिखकर रखने वाले” लोग भी ज़रूरी हैं
- जो चीज़ें बेसिक लगती हैं, उन्हें कठिन पाना सिर्फ किसी एक व्यक्ति की समस्या नहीं है
- बहुत से लोग उन्हीं कारणों से उन्हीं जगहों पर अटकते हैं
- अगर मुश्किल की वजह समझ में आ जाए, तो उसे कंप्यूटर program के bug की तरह बेहतर तरीके से ठीक किया जा सकता है
- मुश्किल पैदा करने वाले कारणों में विशाल trivia और pitfalls, 2 करोड़ lines का code, छिपे हुए systems, और ऐसे उलझाऊ tool outputs शामिल हैं जिन्हें अभी बेहतर नहीं बनाया गया
- वक्ता ने कहा कि Git कठिन क्यों है, यह वे अब भी पूरी तरह नहीं समझ पाई हैं, लेकिन यह ऐसा विषय है जिस पर वे आगे भी सोचती और समझने की कोशिश करती रहना चाहती हैं
1 टिप्पणियां
Hacker News की राय
सबसे ज़्यादा असर करने वाली बात थी: जो आम तौर पर छिपा रहता है, उसे दिखाओ
ऐसे tools लगभग तुरंत ही स्थिति को ज़्यादा साफ़ कर देते हैं। वेब ब्राउज़र के developer tools के बारे में सोचें; उन “अंधेरे दिनों” में जब ये नहीं थे, क्या हो रहा है यह देख नहीं पाते थे और अंदाज़ा लगाना पड़ता था—वह बहुत खराब था
Wireshark जैसे tools, जो accessible network packets के bytes दिखाते हैं और उनकी structure भी parse करते हैं, सिर्फ network debugging के लिए ही नहीं बल्कि network concepts सिखाने के लिए भी बहुत उपयोगी हैं, क्योंकि वे कुछ भी छिपाते नहीं
इसी वजह से open source software भी पसंद है। bug की वजह समझने, documentation से छूटे knowledge gaps भरने, या programming concepts और सीखने के लिए source देख सकते हैं, इसलिए कुछ भी छिपा नहीं रहता
उदाहरण के लिए, Ethernet preamble कभी नहीं दिखाता, Ethernet frame checksum कभी-कभी ही दिखाता है, और Ethernet protocol का अनिवार्य हिस्सा inter-frame gap भी कभी नहीं दिखाता
यह काफ़ी करीब पहुँचता है, लेकिन दिखाता है कि कहीं न कहीं हमेशा और details छिपी रहती हैं
हम पहले से ही अपने दिमाग में visualize करते हैं, और computing की कोई भी explanation अंततः diagram में बदल जाती है। लेकिन coding करते समय diagrams बिल्कुल नहीं होते
बस सारे code को dynamically instrument करके GUI को messages भेजने होंगे
जिन experts के पास वह knowledge था और जो उसे सिखा सकते थे, वे भी अब organizations के अंदर नहीं, बल्कि उन्हीं tool companies में इकट्ठा हो गए हैं
इसलिए command line पर स्वाभाविक रूप से जाने पर भी आप तुरंत familiar होकर सीधे इस्तेमाल कर सकते हैं
Julia tech industry के सबसे पसंद आने वाले लोगों में से एक लगती हैं
उनके लेख पढ़ते समय हर बार बचपन में छोटे-छोटे experiments से reality के secrets खोलना शुरू करने वाली उत्साहित भावना फिर जाग जाती है। सच में बहुत प्यारी लगती हैं
खुशी की बात है कि हाल में ऐसे profile में fit होने वाले और लोग मिल रहे हैं
लेकिन Julia के सारे लेख वही ऊपर वाली उत्साहित feeling दिलाते हैं
“जब कोई junior कहता है ‘यह मुश्किल है’, तो experienced व्यक्ति कहता है ‘हाँ, bash usable नहीं है। किसी को भी यह ठीक से नहीं आता’” — मुझे नहीं लगता इसे शाब्दिक रूप से लेना चाहिए
इसका मतलब कुछ ऐसा है: “हमने जो bash code लिखा है, उसकी समझ या untested situations में उसके expected तरीके से चलने का confidence बहुत मजबूत नहीं है”
मतलब, अगर ज़रा भी कुछ unusual हुआ तो कुछ fail होगा, और bash के बारे में नई सीखी किसी बात से आप सिहर उठेंगे या पास की चीज़ों को इतना ज़ोर से मारेंगे कि वे damaged हो जाएँ—ऐसी कुछ उम्मीद रहती है
Bash एक complex language है, और ज़्यादातर programmers की रोज़ इस्तेमाल होने वाली अन्य languages से बिल्कुल अलग है। अधिकतर companies में कहीं production में थोड़ा-बहुत bash होता है, लेकिन अक्सर ऐसा कोई व्यक्ति नहीं होता जिसने उसे इतना अधिक इस्तेमाल किया हो कि वह उसे अच्छी तरह जानता हो
build tools, CI tools और cloud orchestration tools का shell scripting की ज़रूरत घटाने की दिशा में evolve करना कोई संयोग नहीं लगता
एक thought experiment के तौर पर, क्या bash में बेहतर assignment statement नहीं जोड़ा जा सकता? उदाहरण के लिए
set --goodassजैसे mode में अगरa = string1 + '.' + string2जैसा लिखा जा सके, तो shell quoting handling का बड़ा हिस्सा काटा जा सकता हैmakeजैसे tools को भी फायदा होगा। अगरmakeपर 6 महीने लगाकर usable variables, paths और filenames manipulate करने के साफ़ तरीके, और अधिक उपयोगी targets बनाए जाएँ, तो यह 6 महीने तक complex Makefile बनाने से बेहतर हो सकता हैखासकर “अधिकतर programmers के लिए bash उनकी रोज़मर्रा की किसी भी language से अलग है” वाली समझ beginner ज़रूरी नहीं कि infer कर पाए। क्योंकि “uncommon” और “बेहद cryptic” के बीच का फर्क जानने के लिए experience चाहिए
संबंधित बात यह है कि ज़्यादातर software over-engineered है
मुझे लगता है इसका एक कारण industry का centralization भी है। कुछ tools को control करने वाले कुछ लोगों के फायदे के लिए सभी को उन्हीं tools की ओर धकेला जाता है, और नतीजे में कई tools “हर चीज़ का tool” बन जाते हैं, जो अपने actual use cases से कहीं ज़्यादा cover करने लगते हैं
companies चाहती हैं कि developers सभी वही tools जानें। इससे वे projects और companies के बीच आसानी से replaceable रहते हैं, और industry में उनकी bargaining power कमज़ोर होती है
इसलिए software में सिर्फ एक mainstream धारा बचती है और alternative approaches jobs के बिना बाहर धकेल दी जाती हैं। industry स्वाभाविक रूप से distributed होना चाहती है, फिर भी ऐसा नहीं हो पा रहा
सकारात्मक रूप से देखें तो कभी न कभी कहीं बेहतर non-mainstream approaches उभरेंगी और mainstream approach को काटेंगी। technology mathematics नहीं है और science से भी अलग है; यह एक ही problem को कई तरीकों से हल करने वाली कई branches को आराम से support कर सकती है
तब browser wars ने हमें busy रखा था, लेकिन अब browsers काफ़ी हद तक compatible हैं, फिर भी हमने web apps के लिए frontend complexity का ढेर बना लिया है, जिसकी अक्सर ज़रूरत नहीं होती
DNS, IP, HTTPS जैसी चीज़ें fundamental technologies हैं जिनमें backward compatibility और political factors जुड़े हैं, इसलिए यह unavoidable है
फिर भी मुझे लगता है कि इन्हें अच्छी तरह सीखना frameworks सीखने से बेहतर investment है। और बोलूँ तो बात innovation tokens तक पहुँच जाएगी
मुश्किल चीज़ों को आसान बनाने के लिए सही abstraction ढूँढनी पड़ती है। कठिन विषय का कुछ हिस्सा और अक्सर इस्तेमाल होने वाली details ही दिमाग में रखी जाती हैं, बाकी ज़रूरत पड़ने पर खोज लिया जाता है
समस्या यह है कि लोग किसी बड़े topic के लिए cognitive compression तब तक बनाने की ज़हमत नहीं उठाते जब तक सच में ज़रूरत न पड़ जाए। वे पहले से ही दूसरे बड़े cognitive burden ढो रहे होते हैं, इसलिए नया burden जोड़ने का विरोध करते हैं
अगर किसी topic X को अच्छी तरह जानने वाले किसी और व्यक्ति पर निर्भर रहा जा सकता है, तो लोग बस वही करते हैं, और X को पर्याप्त रूप से समझने की कोशिश नहीं करते। X को अच्छी तरह जानने वाले व्यक्ति के लिए मदद की requests कम करने का सबसे अच्छा तरीका यह है कि वह दूसरों को X की न्यूनतम समझ हासिल करने में मदद करे
set -eटूटा हुआ है, हर चीज़ को quotes में लपेटने की ज़रूरत भी टूटी हुई है, और globbing ऐसी feature होनी चाहिए जिसे explicit रूप से माँगा जाए। command line पर यह झंझट भरा होगा, लेकिन scripts में बात अलग है; अभी अगर globally globbing बंद कर दें, तो जहाँ चाहिए वहाँ globbing करना मुश्किल हो जाता हैऐसे खराब defaults सिर्फ Bash में नहीं, बल्कि Ksh और Bourne shell lineage के shells में आम तौर पर हैं
SQL में भी बहुत से लोग clauses का order बदलना चाहते हैं। ऐसा न कर पाने की कोई वजह नहीं है, और मौजूदा SQL parser को दूसरे order में clauses allow करने के लिए यह शायद अपेक्षाकृत छोटा बदलाव होगा
हालांकि निजी तौर पर मुझे यह cognitive समस्या नहीं होती, शायद इसलिए कि मैं जानता हूँ कि पहले table source देखना है
set -eका टूटा होना, हर चीज़ को quotes में लपेटना पड़ना, और globbing का explicit होना—इन तीनों pitfalls को OSH ठीक कर देता है, जबकि वह existing shell scripts भी चला सकता हैscript के सबसे ऊपर
shopt --set ysh:upgradeजोड़ दें, तो ये तीनों समस्याएँ गायब हो जाती हैंअगर आप project में मदद करना चाहते हैं, तो tarball डाउनलोड करके इस दावे को verify करें और एक blog post लिखें
details https://www.oilshell.org/release/latest/doc/error-handling.h... और https://www.oilshell.org/release/latest/doc/simple-word-eval... में हैं
documentation comprehensive है, लेकिन ज़्यादातर लोग इतनी detail नहीं चाहते; इसलिए कोई test करके संक्षेप में लिख दे, तो मदद मिलेगी
कुछ समय तक Oils को actively push न करने की वजह इसका Python dependency होना था, लेकिन अब यह pure C++ है और इस हफ्ते तक कुछ compute-heavy benchmarks में bash से आगे निकल रहा है
I/O-heavy scripts की speed हमेशा वैसी ही रही है, जैसे ज़्यादातर shell scripts में होती है। documentation में Oil को अभी YSH में बदलना बाकी है, इसलिए कुछ समय तक confusion रह सकता है: https://www.oilshell.org/blog/2023/03/rename.html
set -eजैसी गुप्त जानकारी याद करने में समय बर्बाद नहीं करना चाहिए। फिर भी अब search engines तो हैंprojectintroduce किया जाए, जोselectकी तरह काम करे लेकिन सही जगह पर रखा जा सकेमेरी superpower मेरी भयानक memory है। इसलिए अगर मुझे याद रखना है, तो समझना ज़रूरी है—यानी cognitive compression चाहिए। मैं सामान्य लोगों की तरह बस सीख नहीं सकता
आज की सीख:
&&या||सूची में चलाए गए commands में से आख़िरी&&या||के बाद वाले command को छोड़कर, अगर कोई command fail हो भी जाए तो shell exit नहीं होतासंदर्भ: https://www.gnu.org/software/bash/manual/bash.html#index-set
/bin/falseसिर्फ़ 1 return करता है। क्या वह failure है? नहीं। उसे ऐसा ही behave करने के लिए design किया गया है और वह सचमुच उसी उद्देश्य वाला tool हैमैंने सैकड़ों shell scripts लिखी हैं, और उनमें से कई commands अपना काम करने के लिए—जैसे यह जांचना कि string किसी खास pattern से match करती है या नहीं—बिल्कुल सामान्य रूप से non-zero value return करती हैं
program किसी भी स्थिति में अपनी पसंद का exit code return कर सकता है, और convention के अनुसार success 0 है, failure non-zero value है। लेकिन shell language को सिर्फ़ इस बात से मतलब है कि 0 “true” और non-zero value “false” के रूप में evaluate होती है
अगर कोई भी program हर बार non-zero value return करे और shell exit हो जाए, तो
ifstatements और loops असंभव हो जाएंगे और यह बहुत असुविधाजनक होगाअगर किसी script के लिए किसी खास program का return code महत्वपूर्ण है, तो उसे explicitly check और handle करना चाहिए। जैसा कि link में है, ऐसे options हैं जिनसे internal command के non-zero value return करने पर shell exit हो जाता है, और कई beginner/intermediate shell script लेखक dogmatically कहते हैं कि हर script में उनका उपयोग करना चाहिए
लेकिन complex scripts में मुझे लगता है कि इसके कई edge cases कुछ hacky और संभालने में मुश्किल हैं। अगर हर बार ऐसे options की ज़रूरत पड़ती है, तो शायद Makefile इस्तेमाल करना बेहतर हो
&&और||अक्सर conditionals की तरह इस्तेमाल होते हैं[ -e README ] && cat READMEREADME file न होने पर error से बचाता है, और[ -e README ] || echo "You should write a README!"उल्टा काम करता हैज़्यादा subtle issue यह है कि
set -eमान लेने पर भी pipelines में अगर आख़िरी command fail नहीं होता, तो shell exit नहीं होताgrep foo README | sortREADME न होने पर भी fail नहीं होगा, जब तक किset -o pipefailभी इस्तेमाल न किया जाएयहां तक कि function के अंदर explicitly
set -eset करने पर भी यह override हो जाता हैमैंने पहले एक example दिया था: https://news.ycombinator.com/item?id=22213830
यह लेख उन चीज़ों का अच्छा वर्णन करता है जो दिखने में मुश्किल नहीं लगनी चाहिए, लेकिन असल में उनमें बहुत complexity होती है
हालांकि SQL वाला हिस्सा रहस्य खोलने के बजाय conceptual failure को और आगे बढ़ाता हुआ लगता है
query की logic declarative होती है और output define करती है। execution order या procedural nature वाली चीज़ query plan है। इसे पहले सीखना चाहिए
फिर dependent subqueries जैसे ambiguous areas सीखे जा सकते हैं। अगर आप देख सकें कि
not existsऔर anti-join equivalent हैं, तो आप समझ और reason कर सकते हैंलिखी हुई query को procedurally समझने जैसी analogy सिर्फ़ problem को पीछे धकेलती है, और जब आप किसी अधिक complex चीज़ में अटकते हैं तो उस well-intentioned lie को खोलने का तरीका नहीं बचता
शानदार presentation था। यह बात सही है कि Bash “traps” और trivia से भरा है और सब कुछ याद रखना मुश्किल है, लेकिन मुझे लगता है कि कुछ trivia याद रखना भी अच्छा है
उदाहरण के लिए, मैं अक्सर
findcommand arguments का order भूल जाता था, और जब ऐसे machine के सामने होता था जहां internet तुरंत available नहीं होता, तो syntax याद करने में समय गंवा देता थाइसलिए मैंने सबसे आम command-line tools और उनके कुछ traps सीखने और याद करने का फैसला किया, और Anki तथा कुछ mnemonics इस्तेमाल किए। मुझे लगता है investment पर return काफ़ी worthwhile था
वास्तव में, jvns.ca की book recommendation देखकर मैंने Michael W. Lucas की Networking for System Administrators पढ़ी, और technical knowledge तथा अच्छी-खासी system administrator wisdom को Anki cards में निकाला
अब transport layer problems debug करते समय मुझे तुरंत याद रहता है कि netcat और tcpdump जैसे tools कैसे इस्तेमाल करने हैं, इसलिए यह मेरे पढ़े हुए books में investment पर सबसे ज़्यादा return देने वाली किताबों में से एक हो सकती है
मैंने last run command को इस file में add करने का shortcut और इस file में search करने का shortcut भी बनाया है
bash man page बहुत बड़ा और complex है, लेकिन comprehensive है। अगर आप main sections और text के visual shape से familiar हैं, तो जल्दी-जल्दी scroll करके ज़रूरी exact information ढूंढ सकते हैं, और यह काफ़ी उपयोगी रहा है
कई बार यह तरीका internet search engine इस्तेमाल करने से भी तेज़ होता है
जैसे पुराने man pages को text editor-friendly format में convert करना, या tldr, Dash जैसे बेहतर tools इस्तेमाल करना। क्योंकि ऐसा सिर्फ़
findके साथ नहीं हैपता नहीं क्यों, मैं इस लेख को नापसंद करना चाहता था। शायद jvns HN पर बहुत ज़्यादा दिख रही थीं, या मेरा मूड खराब था
लेकिन यह सच में बहुत अच्छा लेख है, और 20 साल के development experience वाले व्यक्ति के तौर पर मुझे लगता है कि programming पर meta-level चर्चा में यह काफी हद तक सच के करीब है
चयनात्मक दृष्टि वाली बात
digऔरmanpages दोनों पर सचमुच लागू होती है। अनगिनत बार ऐसा हुआ है किmanखोलते ही अंतहीन config options और command-line flags देखकर मैं overwhelm हो गयाmanमें मेरी tip Vim-style search feature/इस्तेमाल करने की है। जैसे, अगर grep में हर match का line number print करने का तरीका ढूंढना हो और याद न हो, तोman grepखोलें, फिर/lineटाइप करें और Enter दबाकर man page में “line” के occurrences search करें। अगला match बस/से मिलता हैStrange Loop के खत्म होने की खबर भी थोड़ी दुखद है। मुझे इसके बारे में पिछले साल के आसपास ही पता चला था, लेकिन कई talks असाधारण रूप से high quality लगती थीं
इसके खत्म होने का दुख है, लेकिन यह काफी convincing तरीके से दिखाती है कि कभी-कभी किसी चीज़ का खत्म होना भी अच्छा होता है। पूरी talk देखने पर समझ आएगा
और मैंने https://github.com/kristopolous/mansnip भी बनाया है
nभी दबा सकते हैंbash पर दिए गए नजरिए से मैं कड़े तौर पर असहमत हूं। सबसे अच्छा समाधान bash के ऊपर tools चढ़ाना या उसकी quirks याद करना नहीं, बल्कि bash का इस्तेमाल न करना है
pitfalls से बचने का यही एकमात्र तरीका है
सबसे आम विकल्प हैं 1) Oil shell [0] जैसा नया shell इस्तेमाल करना, या 2) Python, JavaScript, PHP जैसी programming language इस्तेमाल करना
नए shell की समस्या यह है कि जहां-जहां script चलानी हो, वहां वह shell install करना पड़ेगा। इसके उलट bash हर जगह मौजूद है। अगर script सिर्फ आप अकेले maintain नहीं कर रहे, तो आप दूसरों से भी वह shell सीखकर maintain करने की अपेक्षा कर रहे होते हैं
दूसरी programming languages की समस्या यह है कि bash जिस काम में अच्छा है—commands को जोड़ना और command input/output व files संभालना—उसकी usability असाधारण रूप से अच्छी है
किसी दूसरी language में वही करने की कोशिश करें तो अचानक सब बहुत ज्यादा complex हो जाता है, या कम-से-कम ज्यादा verbose
इसलिए मैं अब भी bash इस्तेमाल करता हूं, लेकिन यह मानते हुए कि इसकी ताकत दूसरे commands चलाने और I/O संभालने में है। ऐसी चीज़ों से असंबंधित complex logic हो तो उसे दूसरी language में भेज देता हूं। कभी-कभी इसका मतलब bash से पूरी तरह बचना नहीं, बल्कि bash से Python script call करना भर होता है
अगर कोई दूसरा approach आपके लिए बेहतर रहा हो तो share करें
[0] https://www.oilshell.org
उस नए tool के पास bash ने जिन दशकों की debugging झेली है, वह भी नहीं होगी। समस्या खुद bash में है
हम usability को कम आंकते हैं और “cleverness” को ज्यादा महत्व देते हैं
इसका classic उदाहरण Git है। यह बेहद clever tool है, लेकिन usability भयानक है। फिर भी इसे Linus ने बनाया है और Linus clever हैं, तो लगता है समस्या हममें ही है
हमें वही मिलता है जिसे हम value करते हैं। हमें usability को ज्यादा value देना चाहिए
सबसे अच्छा उपाय बस इससे दूर रहना है। सच में रुकना होगा। macho बनने की कोशिश नहीं करनी चाहिए
language का पूरा model बुनियादी तौर पर टूटा हुआ है। string-centric types, global mode switches, basic comparison operators के लिए single-letter flags, जगह-जगह errors को default रूप से ignore करने वाला behavior, और खासकर functions तक
ऐसी एक quirk भी किसी language को reject करने के लिए काफी होती, लेकिन bash में ये सब हैं और उससे भी ज्यादा
set -xका||और&&के expected behavior को तोड़ सकनाआखिर ऐसी कौन-सी language है जिसमें function के false return करने पर clash हो जाए? कुछ languages exceptions throw करती हैं, लेकिन “false” तो return करने लायक valid value नहीं है क्या
Makefile में भी यही चीज़ दिखती है। लोग समझते नहीं कि वे क्या कर रहे हैं, और build systems के बारे में गहराई से कभी सोचा नहीं होता, इसलिए वे उम्मीद करते हैं कि यह किसी खास तरीके से behave करे
उदाहरण के लिए Make की recursive assignment लगभग सभी को फंसा देती है
FLAGS=-b,COMPILE=compile $(FLAGS),$(info compile command=$(COMPILE)),FLAGS=-a,myfile:,echo $(COMPILE) $? -o $@में पहली info outputcompile -bदिखाती है, लेकिन actual executioncompile -a -o myfileहोता हैलेकिन अगर दूसरी programming languages से match कराने के लिए सभी assignments को immediately evaluated बना दें, तो आप एक बहुत useful tool छीन लेंगे। ऐसे tools को जितना ज्यादा समझते हैं, उतना बेहतर पता चलता है कि उन्हें कहां इस्तेमाल करना है और कितनी मेहनत लगानी है
फिर भी broadly सहमत हूं। थोड़ा भी complex कुछ हो तो उसे कम quirky language में लिखी script को सौंपने की कोशिश करता हूं
ऐसे में bash में बचने वाले आखिरी 5% में गलतियों से बचाने वाले tools बहुत उपयोगी होते हैं