- Honeywell Cambridge के Multics फाइल सिस्टम को नए सिरे से तैयार करने की प्रक्रिया में André Bensoussan ने मुख्य subsystem, VTOC manager, की जिम्मेदारी ली और design से लेकर testing तक किया
- इस module को file description जानकारी को disk और memory के बीच ले जाना था, साथ ही buffer pool और disk space भी manage करना था, इसलिए यह असल में छोटे virtual memory manager जैसा था
- André ने terminal के सामने सीधे coding करने के बजाय pencil से diagrams और code को refine किया, और state information को समेटते हुए भी symmetric design बनाने की कोशिश की
- final manuscript input करने के बाद पहले compile में आई समस्याएं सिर्फ 3 typos थीं, और system में bind करके चलाने पर भी यह पहली कोशिश में सफल रहा
- बाद में मिला bug सिर्फ एक था, जो Tom Van Vleck द्वारा error handling procedure के call order को गलत बताने से पैदा हुआ था, इसलिए program की अपनी completeness बहुत ऊंची थी
Multics VTOC manager पर काम
- André Bensoussan ने Tom Van Vleck के साथ Honeywell Cambridge में Multics operating system पर काम किया
- file system में बड़े बदलाव के लिए VTOC manager नाम का subsystem चाहिए था
- file description जानकारी को disk और memory के बीच move करना
- shared memory buffer pool manage करना
- file information के लिए disk space manage करना
- इन roles की वजह से VTOC manager को छोटे virtual memory manager की तरह काम करना पड़ता था
- André ने इस module का design, implementation और testing संभाला
pencil से पूरा किया गया program
- André पहले desk पर बैठकर कई diagrams बनाते थे
- वे ऐसा रूप चाहते थे जो सारी state information समेटे और साथ ही देखने में अच्छा और symmetric हो
- schedule की वजह से code लिखने में देरी को लेकर आसपास के लोग चिंतित होने लगे थे
- coding भी terminal पर नहीं, बल्कि pencil से की गई
- typing में मदद लेने से मना किया
- कुछ हिस्से फिर से लिखे, नकल करके उतारे, मिटाए और सुधारकर final manuscript बनाया
- final pencil manuscript को terminal में पूरा input करने के बाद पहला compile fail हुआ, लेकिन 3 typos ठीक करने के बाद compile सफल हो गया
- system में bind करके चलाने पर यह पहली कोशिश में काम करने लगा, और बाद में VTOC manager लगातार perfectly काम करता रहा
- मिला हुआ इकलौता bug इस वजह से था कि André ने error handling procedure के call order के बारे में पूछा था और Tom Van Vleck ने check किए बिना अंदाजा लगाकर बता दिया
- पहली बार उस error path पर जाने पर crash हुआ
- इसके अलावा program में कोई समस्या नहीं थी
1 टिप्पणियां
Hacker News की राय
मुझे लगता है कि वह ऐसा मुख्य रूप से इसलिए कर पाए क्योंकि requirements बहुत स्पष्ट रूप से define किए गए थे
आज software के buggy और slow होने की बड़ी वजह यह है कि असल में क्या बनाया जा रहा है, यह किसी को पता नहीं होता, या पता भी हो तो “agile” की वजह से वह लगातार बदलता रहता है
developer को स्पष्ट API और अच्छी तरह define किए गए criteria दे दें, तो ज़्यादातर लोग बहुत अच्छी तरह चलने वाला code लिखते हैं
requirements का मतलब list और tickets को Kanban board पर सजाना नहीं, बल्कि जिस चीज़ को बनाना है उसके domain को सच में सीखना है
जिस क्षेत्र को आप समझते नहीं, उसमें भी कुछ बनाया जा सकता है, लेकिन outcome अक्सर कचरा बनने की संभावना रखता है; और अगर उस कचरे को लिखने की प्रक्रिया को domain problem और संभावित solutions सीखने के draft के रूप में लिया जाए, तो ठीक है
quality के लिए कोई shortcut नहीं होता
अगर आप stakeholder हैं, तो application बनाने वाले व्यक्ति तक आपकी पहुंच होनी चाहिए, और आपको यह verify करना चाहिए कि वे domain समझते हैं। यह उन्हें लगातार परेशान किए बिना भी किया जा सकता है
buzzwords उछालने वाले bluffers से सावधान रहना चाहिए
अगर आप designer और programmer हैं, तो यह सुनिश्चित करना चाहिए कि stakeholders और domain experts सक्रिय और engaged हैं। वरना requirements और understanding निकालना दांत खींचने जितना मुश्किल हो जाता है
कुछ stakeholders problem solve करना चाहते ही नहीं हो सकते, या वे पूरी तरह अलग दिशा चाहते थे, या political वजहों से खफा हो सकते हैं। आलसी या उदासीन stakeholder जितना project को डुबोता है, उतना शायद ही कुछ और
stakeholders को खुद नहीं पता होता कि वे क्या चाहते हैं, फिर भी वे random तरीके से extra features या बड़े changes मांगते हैं
इस tool से जो काम नहीं होने चाहिए, उन्हें भी जबरन कराने की वजह से ढेरों exception handling की ज़रूरत पड़ती है
designers अक्सर ऐसा design बना देते हैं जो needed features, existing system behavior, और stakeholders की demands से टकराता है, और system के अलग-अलग हिस्से बनाने वाली teams ठीक से communication किए बिना silos में बनाती हैं
खराब तरीके से design किया गया “agile” process संदिग्ध point estimation के आधार पर हर चीज़ को एक तय अवधि में ठूंसने की कोशिश करता है
आखिर में ये समस्याएं system को intended तरीके से काम न करने देतीं या उसे bugs का ढेर बना देती हैं
अगर ऐसा environment बनाया जाए जहां requirements स्पष्ट हों और बदलें नहीं, project members अच्छी तरह communicate करें और process पर पूरा control हो, तो चीज़ें ठीक चलती हैं। मूल लेख का मामला भी ऐसा ही दिखता है
मैं ज़्यादातर large companies में काम करता हूं, और आने वाले काम का 90–99% average case होता है
लेकिन अनगिनत unicorn जैसे special cases होते हैं जो तीन साल में एक बार होते हैं, वह भी तब जब lunar eclipse और solar eclipse साथ हो रहे हों और जंगल में witches मंत्र पढ़ रही हों
ऐसे cases को manual तरीके से handle करने के बजाय code में implement करना पड़ता है, इसलिए bugs आते हैं और review व maintenance के लिए code बहुत बढ़ जाता है
maintenance की बात शुरू भी न करें। वह दर्दनाक हिस्सा है
requirements हमेशा बदलती हैं। यह प्रकृति की शक्ति जैसा है, और ऐसा कोई world नहीं है जहां सबको शुरू से पता हो कि क्या बनाना है, पूरी तरह specified API मिल जाए और फिर cave में जाकर सिर्फ implementation करनी हो
reality कभी ऐसे काम नहीं करती, और अगर आपको ऐसी conditions चाहिए, तो software engineering आपके लिए सही पेशा नहीं है
अगर users न हों, तो मेरा software perfect होता ;)
मैंने Soviet Union से defect करके आए एक व्यक्ति के साथ काम किया था। उनका कहना था कि Soviet programmers इतने अच्छे इसलिए थे क्योंकि computers तक access बहुत सीमित था
अगर आपको pencil और paper से programming करनी पड़े, तो आप चाहेंगे कि program पहली run में ही काम करे
संयोग से, हम Honeywell में काम कर रहे थे
तो क्या यह अच्छी education method थी, या कम motivated लोगों को छांटने वाला अच्छा filter?
school में class के दौरान computers use नहीं कर सकते थे, इसलिए paper पर programming और यहां तक कि debugging करने की आदत थी
घर पहुंचकर मैंने इसे type किया और run किया, और सोचा कि क्या पहले पढ़े गए Multics anecdote को recreate कर पाऊंगा
पहला compile fail हुआ, लेकिन एक variable name ठीक करने के बाद यह perfect काम करने लगा
कुछ सालों तक मुझे याद है कि edit→compile→print loop में terminal की तुलना में listing output कहीं बेहतर था। क्योंकि code को efficiently देखना, navigate करना और modify करना मुश्किल था
बेहतर visual editors, बड़े terminals, और तेज compile व execution आने के बाद आखिरकार सुधार हुआ
analogy के तौर पर यह early firearms जैसा है। गीला gunpowder, unstable flintlock ignition, और barrel में सब कुछ ठूंसने की जरूरत के कारण longbow से transition का दौर inefficient था
इस लेख के पिछले HN thread में André के साथ काम कर चुके jrd259 account का अच्छा comment है: https://news.ycombinator.com/item?id=18415231
यह चौड़ी desk और notifications से मुक्त private workspace की अहमियत से जुड़ा है
मेरी ज़िंदगी में दो बार कागज़ पर programming करने की याद आती है
पहली बार तब था जब मैं करीब 10–12 साल का था। मैं अपने दादा-दादी के घर गया था, जहाँ न computer था न smartphone, लेकिन एक mechanical typewriter था जिसमें switch से काला और लाल रंग बदलकर टाइप किया जा सकता था
उस समय मेरा मुख्य शौक Turbo Pascal था, इसलिए मैंने typewriter पर एक Pascal program लिखा, जिसे बाद में घर लौटकर PC में डालकर run करना था
दादा-दादी के घर मैं एक हफ्ते रहा, इसलिए सोचने, हाथ से debugging करने और गलत हिस्सों को फिर से type करने के लिए काफी समय था
दूसरी बात मेरी बनाई हुई esoteric programming language Ziim(https://esolangs.org/wiki/Ziim) और उस page के binary addition function से जुड़ी है
वह function बहुत बड़ा और complex था, और उसमें bug था। interpreter में run करके मुझे पता था कि bug है, लेकिन समस्या कहाँ है और उसे कैसे ठीक करना है, यह नहीं पता था
तभी मुझे लगभग 6 घंटे की लंबी bus यात्रा करनी पड़ी, और यह debugging के लिए perfect मौका था
मैंने Ziim addition function को pencil से graph paper पर उतारा और bus में उसे step-by-step हाथ से execute किया। मैं bug ढूँढकर ठीक कर पाया, और function की layout पूरी तरह फिर से करनी पड़ी
इससे शायद यह सबक मिलता है कि आसान तरीके से काम करने की अपनी क्षमता को जानबूझकर सीमित करना कभी-कभी अच्छी तरह सोचे-समझे code तक पहुँचा सकता है
फिर भी मैं आम तौर पर ऐसा नहीं करता। मैं झटपट snippet लिखकर iterate करता हूँ, या debugger में line-by-line चलाने लगता हूँ। शायद इस पर फिर से सोचना चाहिए
लेकिन अगर हर काम कागज़ पर किया जाए, तो अंत में वह computer पर सीधे करने से बहुत अलग नहीं रह जाता। आप सब कुछ लिखने लगते हैं, और वह abstraction और सावधानी खो देते हैं
जब मैंने शुरुआत की थी, वह “बड़े computers” वाले दौर का आखिरी समय था
पुराने समय में “programmer” अक्सर data entry clerk जैसा होता था, और कई बार महिलाएँ होती थीं
software लिखने वाले लोग cigarette के धुएँ से भरे offices में कागज़ पर programs लिख रहे होते थे
computing time महँगा और दुर्लभ था। run करते समय bug आ जाए, तो उसे ठीक करने का मौका तब तक नहीं मिलता था जब तक फिर से data entry time और CPU execution time न मिल जाए
इसलिए दो बार नापो, एक बार काटो वाला approach बढ़ावा पाता था
उस समय का ज़्यादातर software, आज जिन चीज़ों को हम सामान्य मानते हैं, उनकी तुलना में काफी सरल था, इसलिए ऐसा करना आसान था। साथ ही software का input/output बेहद सीमित था, UI शब्द तक नहीं था, और peripheral device जोड़ना बड़ा काम था
आजकल software लिखते समय अक्सर “दीवार पर फेंको और देखो क्या चिपकता है” जैसा तरीका अपनाया जाता है। आधा-अधूरा code लिखकर IDE में debug करना ज़्यादा आसान है
मेरा software development काफ़ी iterative है, और मैंने यहाँ इसके बारे में लिखा है: https://littlegreenviper.com/miscellany/evolutionary-design-...
मुझे याद है कि university assignment में एक छोटा operating system kernel लिखना था
मुझे C भी ठीक से नहीं आती थी और kernel क्या करता है, यह भी theory से आगे नहीं मालूम था, लेकिन task management के लिए C code की कुछ सौ lines लिखनी थीं
मुझे लगा कि अगर यह program नहीं चला तो parallel code होने की वजह से debug करने का लगभग कोई तरीका नहीं होगा, और bugs अज्ञात race conditions के रूप में सामने आएँगे
मैंने पूरे system के बारे में reasoning की, और कई दिनों तक छोटे-छोटे independent functions पर बहुत सोचकर उन्हें लिखा
फिर compile करके run किया, और स्वाभाविक “semicolon missing” compile error ठीक करने के बाद यह पहले run में ही काम कर गया
जब भी कोई प्रभावशाली उपलब्धि post होती है, comments ज़्यादातर उसमें कमी निकालते हैं। अब बस भी करें
वे किसी नए operating system के लिए virtual memory manager design करने वाले लोग नहीं, बल्कि बच्चों और बुज़ुर्गों को ads दिखाने के लिए SQL queries को HTML में बदलने वाली machine के छोटे gears भर हैं
cynic और bitter होना स्वाभाविक है
असल में ऐसा नहीं करना चाहिए। discussion का मतलब ही यही होना चाहिए
कुछ हद तक यह सही है, लेकिन इसे सकारात्मक दिशा में मोड़ने वाला बेहतर सवाल यह है: आज के company environment में हम वैसी ही उपलब्धि संभव होने की स्थिति तक कैसे पहुँच सकते हैं?
ऐसी प्रतिक्रिया देखने पर आम तौर पर यही होता है। user moderation वाली छन्नी को बेहतर comments ऊपर लाने में बस थोड़ा समय लगता है
अगर इस व्यक्ति ने मेरी जैसी challenge का सामना किया होता, तो वह वहीं ढह जाता
उस समय software बहुत छोटा होता था
आजकल toy program से थोड़ा भी बड़ा होते ही ज़्यादातर project megabyte scale के हो जाते हैं, और उन्हें एक single file में “लिखते चले जाना” संभव नहीं है
यह आज ज्यादातर लोग जिस पर काम करते हैं, उससे बड़ा और ज़्यादा जटिल है। आज का बहुत-सा काम CRUD/REST जैसी चीज़ों को जोड़ने वाला बढ़ा-चढ़ाकर बनाया गया glue code ही है
यह पूरे project की code lines से छोटा हो सकता है, लेकिन लोग जिस unit से निपटते हैं उससे बड़ा है। ऊपर से यह भी पूरे operating system code का सिर्फ़ एक हिस्सा है
यह “file description information manage करने वाले manager” का पूरा हिस्सा है। इसे file information को disk और memory के बीच ले जाना था, shared memory buffer pool manage करना था, और उस information के लिए disk space भी manage करनी थी
आज के ज़्यादातर programmers से कहकर देखें कि वे अपनी चुनी हुई language में आज ही वही requirements और semantics वाली चीज़ लिखें
ज़्यादातर लोग उसे कल्पना करने के स्तर पर ही रास्ता भटक जाएंगे। कागज़ पर लिखकर type करना और चलाना तो और भी कठिन है
उसका एक छोटा हिस्सा electronic component URLs है, लेकिन करीब 90% सिर्फ़ English text है। और 10% दूसरे लोगों के लेखों, webpages, manufacturer application notes, किताबों आदि से quotes हैं
यह single file है, और शायद इस साल के बाकी समय तक ही नहीं, आगे भी single file ही रहेगा। इसी गति से चला तो 12 megabyte हो जाएगा। यह बिल्कुल असंभव नहीं है
रुचि हो तो git clone http://canonical.org/~kragen/sw/leatherdrink.git कर सकते हैं
अभी avr toolchain commit किया हुआ है, इसलिए यह लगभग 200 megabyte है, और इसमें photos, videos, schematics जैसी चीज़ें भी हैं
programming language होती तो monthly byte growth कम होती, लेकिन शायद पाँच गुना तक का फर्क हो सकता है
André Bensoussan ने जो code लिखा था, वह यहाँ है: https://multicians.org/vtoc_man.html
काम शुरू करने के लिए desk पर बैठकर वह टालता आ रहा काम खत्म करने ही वाला था कि जाहिर है, मन भटक गया और reddit या HN पर news देखने की इच्छा हुई
HN खोला तो पहला title यही था
“कर सकते हो”
motivation मिली
P.S.: हाँ, article भी पढ़ा :)
“André ने pencil के अलावा किसी tool के बिना यह कैसे किया होगा?”
14 साल की उम्र में जब मैं high school गया, programming class में ज़्यादातर code कागज़ पर लिखा जाता था
मैं एक गरीब देश का गरीब बच्चा था, और घर में PC होना तो दूर, school computer lab के कुछ “computers” भी उस समय इस्तेमाल हो रही programming language Turbo Pascal चला नहीं पाते थे; वे ZX Spectrum clones थे