SICP: क्या यह दो बार पढ़ने लायक इकलौती Computer Science किताब है? (2010)
(simondobson.org)- एक छात्र को गर्मियों में पढ़ने के लिए उधार दी गई किताब के बहाने Simon Dobson फिर से पुष्टि करते हैं कि SICP वह computer science किताब है जिसने उनके करियर और research interests पर सबसे गहरा असर डाला
- Pascal-केंद्रित शुरुआती शिक्षा के विपरीत, यह किताब values, names, binding और control से शुरू करके दिखाती है कि programming क्या-क्या हो सकती है
- lambda abstraction, higher-order computation, streams, lazy evaluation, interpreters और compilers, garbage collection, virtual memory, machine language, और domain-specific languages तक—सबको Scheme के भीतर जोड़ती है
- इसका सबसे बड़ा प्रभाव complex systems को भाषाओं की कई परतों में गढ़ने वाले layered design और computer science को “क्या है” से ज्यादा “कैसे करना है” का विषय मानने वाले नजरिए में है
- 1988 में खरीदी गई किताब 2010 में भी practical रूप से दोबारा पढ़ने लायक थी, और SICP computer science की लंबे समय तक टिकने वाली foundational book बनी हुई है
SICP से पहली मुलाकात
- Simon Dobson ने एक छात्र को गर्मियों में पढ़ने के लिए Structure and Interpretation of Computer Programs उधार दी, और फिर उन्हें याद आया कि यह किताब उनके लिए पूरी computer science में सबसे बुनियादी रचनाओं में से एक के सबसे करीब है
- इसका औपचारिक शीर्षक Hal Abelson और Jerry Sussman की Structure and Interpretation of Computer Programs है, जिसे MIT Press ने 1984 में प्रकाशित किया था और जिसे SICP भी कहा जाता है
- किताब अब भी प्रकाशित हो रही है, और पूरी किताब online उपलब्ध है
- Dobson ने Newcastle upon Tyne में अपनी पहली degree के दूसरे साल में अपना पहला programming course पूरा करने के बाद इसे recommended textbook के रूप में जाना
- उस समय computer science में अपना रास्ता तलाश रहे Dobson के लिए SICP, Pascal से पहचानी जाने वाली “उस दौर की programming” नहीं, बल्कि programming के संभावित रूपों को दिखाने वाली किताब थी
Scheme के भीतर गढ़े गए concepts
- SICP programming के basic elements—values, names, binding और control—से शुरू होकर विषयों की एक विस्तृत range तक फैलती है
- lambda abstraction और higher-order computation
- ऐसे complex data structures जिनमें computation शामिल हो
- modularity, mutability
- streams
- lazy evaluation
- interpreters और compilers बनाना
- storage management, garbage collection, virtual memory
- machine language
- domain-specific languages
- इसका scope हैरान कर देने जितना व्यापक है, लेकिन authors की writing और structure की वजह से इसमें consistency बनी रहती है
- खास बात यह है कि सभी concepts को Scheme नाम के एक ही language framework के भीतर समझाया गया है, और पहले सीखी चीजों के आधार पर अगले concepts की परतें चढ़ाई जाती हैं
Language design के रूप में program design
- SICP की दूसरी बड़ी प्रभावशाली विशेषता यह है कि Hal Abelson और Jerry Sussman हर चीज को language design की practice के रूप में देखते हैं
- किताब complex systems को कई स्तरों की languages से बनाने वाले layered design पर जोर देती है
- हर स्तर उन components को जोड़कर बनता है जिन्हें उस स्तर पर primitive माना जाता है
- एक स्तर पर बनाए गए components अगले स्तर के primitive elements के रूप में इस्तेमाल होते हैं
- हर स्तर की language में उस detail level के हिसाब से primitive elements, combination के तरीके और abstraction के तरीके होते हैं
- hierarchical abstraction अपने-आप में computer scientists के लिए परिचित है, लेकिन यहां अहम फर्क यह नजरिया है कि हर layer programmable होनी चाहिए
- इस दृष्टिकोण में layers सिर्फ जानकारी छिपाने का तरीका नहीं हैं, बल्कि computation और transformation से निपटने का साधन हैं
- mainstream programming languages में ऐसी layering को language के अपने विस्तार में बदलना मुश्किल होता है
- Java ऊपर से नीचे तक Java ही है; classes और libraries तो हैं, लेकिन नए control structures नहीं
- किसी खास domain में dedicated language constructs उपयोगी हों, तब भी उन्हें language के भीतर आसानी से जोड़ना मुश्किल है
- उल्टा, अगर किसी domain में कोई खास construct इस्तेमाल होने से रोकना चाहें, तो language के भीतर उसे हटाना भी संभव नहीं
- Java-ME ने छोटे devices पर चलने के लिए कुछ features हटाए, लेकिन यह compiler दोबारा लिखे बिना संभव होने वाला तरीका नहीं था
“क्या है” से ज्यादा “कैसे करना है”
- तीसरा अहम प्रभाव यह है कि SICP computer science वास्तव में किस चीज से जुड़ी है, इस पर कैसा नजरिया देती है
- SICP computer revolution को सोचने के तरीके और विचारों को व्यक्त करने के तरीके की revolution के रूप में देखती है
- किताब इसे procedural epistemology के रूप में समझाती है
- अगर classical mathematics “क्या है” को precise ढंग से संभालने का framework देती है
- तो computation “कैसे करना है” को precise ढंग से संभालने का framework देता है
- Dobson ने यह नजरिया अपनाया है कि computer एक नए microscope जैसा है, जो मौजूदा approaches में मदद करने के साथ-साथ नई science के दरवाजे खोलता है
- computer science का “कैसे करना है” वाला पहलू कई क्षेत्रों में फिर से दिखाई देता है
- deployed phenomena को लगातार reflect करते हुए adapt कर सकने वाले sensor networks के behaviour का description
- पूरे web से mined और combined बड़े पैमाने के data की interpretation
- scientific methods और processes को automate करने के लिए उन्हें capture करना
- ऐसे क्षेत्रों की richness packaged software की बजाय programming languages के जरिए integration को बढ़ावा देती है, और R जैसी languages से interfaces और structures को flexible और experimentation-friendly बनाए रखने में मदद करती है
पुरानी किताब अब भी क्यों पढ़ी जाती है
- Dobson की किताब के अंदर September 1988 की purchase date लिखी थी, और 2010 के हिसाब से लगभग 22 साल पुरानी यह किताब अब भी relevant बनी हुई थी
- वे मानते हैं कि SICP अपने उस दौर की लगभग इकलौती computer science किताब है जिसे सिर्फ historical interest के लिए नहीं, बल्कि usefully दोबारा पढ़ा जा सकता है
- mathematics की किताबों में लंबे समय तक टिकने वाली सामग्री असामान्य नहीं है, लेकिन computer science में—जहां ideas तेजी से बदलते हैं और कई topics क्षणिक होते हैं—यह दुर्लभ बात है
- SICP की सामग्री का लगभग पुराना न पड़ना दिखाता है कि इस किताब ने computer science के core concepts को अच्छी तरह पकड़ा है
- इसी वजह से SICP उन गिनी-चुनी computer science किताबों में है जिन्हें दो या उससे ज्यादा बार पढ़ना worthwhile है, और physics में Feynman की Lectures on Physics की तरह इसे ऐसी किताब माना जाता है जिसने अपने क्षेत्र के सार को accessible रूप में distilled किया और समय की कसौटी पर खरी उतरी
- 27 January 2024 के update में बताया गया है कि यह किताब Structure and interpretation of computer programs entry के रूप में annotated Lisp bibliography में भी शामिल है
1 टिप्पणियां
Hacker News की राय
SICP जैसी “classic” किताबें program design की बात करती हैं, लेकिन आजकल system design कहीं ज़्यादा महत्वपूर्ण skill लगती है
distributed systems “computer science” में आते हैं या नहीं, पता नहीं, लेकिन असल में ये वे समस्याएँ हैं जिन्हें ज़्यादा बार हल करना पड़ता है
systems को जितना हो सके सरल बनाता हूँ, observability tools से design की कमी वाली जगहें ढूँढता हूँ, और ज़रूरत पड़ने पर data structures या “computer science जैसे” समाधान निकालता हूँ
ज़्यादातर मामलों में Big-O notation और runtime complexity महत्वपूर्ण नहीं होते, और arrays व तेज़ CPU से कई समस्याएँ हल हो जाती हैं
performance problem आने पर भी पहले profiling से bottleneck ढूँढना चाहिए
computer science यह अच्छी तरह नहीं सिखाती कि CPU का memory cache कैसे काम करता है
कोई शानदार graph algorithm runtime complexity में बेहतर हो सकता है, लेकिन CPU cache को बिगाड़कर अच्छे cache utilization वाले array से धीमा हो सकता है
असल में ज़्यादा आम समस्याएँ fault tolerance, distributed locks और queues की correctness, और system scalability से जुड़ी होती हैं
मेरा computer/electrical engineering background है, इसलिए bias हो सकता है
CPU memory cache मैंने 30 साल पहले CS undergrad के पहले semester में Hennessy और Patterson की किताब से सीखा था, और जहाँ तक मुझे पता है वह आज भी इस्तेमाल होती है
fault tolerance, distributed locks और queues की correctness, system scalability भी undergrad CS में पढ़ाए गए थे, और कोई खास computer engineering/electrical engineering background नहीं था
अभी भी frameworks, database engines, version control tools बनाने का काम है, और ऐसे काम रोज़ गहरी CS knowledge जैसे algorithms और data structures मांगते हैं
लेकिन ऐसी jobs पहले से कम हो गई हैं, और apps के लिए खुद DB engine implement करने के बजाय लोग अक्सर Postgres इस्तेमाल करते हैं
ज़्यादातर काम business logic implementation है, और database internally कैसे काम करता है यह जानने से बेहतर परिणाम मिलते हैं, लेकिन indexes disk पर कैसे store होते हैं यह जाने बिना भी बहुत सा working software बनाया जा सकता है
कई CS graduates यह भ्रम रखते हैं कि उनका काम framework लिखना है, जबकि असल में उन्हें existing frameworks इस्तेमाल करने और business logic implement करने के साथ अपने CS background से उन frameworks को गहराई से समझना होता है
data disk पर “pages” के रूप में होता है, और RAM में fixed number of “page slots” होते हैं
disk और RAM के बीच pages move करना धीमा होता है, इसलिए इसे जितना हो सके कम करना पड़ता है
इसलिए मामूली दिखने वाली problems भी interesting हो जाती हैं। classic computer science में “join” नाम की अलग concept नहीं है, क्योंकि वह इतना complex नहीं कि उसे नाम दिया जाए
algorithm research को किसी pure essence की तरह सोचना आसान है, लेकिन algorithm efficiency का मतलब केवल खास data और hardware context में ही माना जा सकता है
इसलिए काम interesting हो जाता है, और हर जगह सिर्फ libraries या cookbook-style solutions लगा देना काफी नहीं होता, इसलिए algorithm expertise अब भी useful है
अभी मैं एक छोटे change के लिए जिस component पर काम कर रहा हूँ, उससे परेशान हूँ; उसमें अनावश्यक रूप से बहुत state है और वह दो abstractions को एक साथ संभालता है
files process करते हुए वह state storage के लिए file system और database दोनों इस्तेमाल करता है, और design इतना messy है कि हैरानी हुई
पुराने तरीके की तरह और जोड़कर इसे और मुश्किल बनाने से बचने में मैंने कई दिन लगाए
pull request culture ऐसा लगता है जैसे actual code पर गहराई से सोचने का समय दिए बिना कोई भी कचरा approve करा देता है
चाहता हूँ कि in-person code reviews वापस आएँ
2021 में आई किताब
लेख की मुफ़्त कॉपी का लिंक टूटा हुआ है
https://mitp-content-server.mit.edu/books/content/sectbyfn/b...
https://web.mit.edu/6.001/6.037/sicp.pdf
आज तक मैंने आधिकारिक PDF वर्शन नहीं देखा था
2001 के आसपास सिर्फ़ HTML वर्शन मुफ़्त था, और किसी ने उसे TeXinfo में कन्वर्ट किया था: https://www.neilvandyke.org/sicp-texi/
अगर आप अभी SICP के साथ चलना चाहते हैं, तो MIT Scheme या DrRacket में कोड चला सकते हैं: https://www.neilvandyke.org/racket/sicp/
मौजूदा रिलीज़ (v12.1) Intel CPU वाले Sequoia चला रहे Mac पर, या Rosetta के ज़रिए Apple silicon पर चलती है
हालांकि native code compiler थोड़ा टूटा हुआ है, और SICP के लिए शायद उसकी ज़रूरत नहीं पड़ेगी
Monterey से पहले वाले macOS पर यह काम करता था, ऐसा लगता है, इसलिए हो सकता है Apple द्वारा दी जाने वाली dependency बदली हो, लेकिन मैंने इसे track नहीं किया
अगर MIT Scheme अनिवार्य नहीं है और आप compilation की झंझट नहीं चाहते, तो Racket बेहतर विकल्प हो सकता है
मेरी जानकारी में इसमें एक explicit SICP mode है
मैंने GNU Guile के साथ किया था, लेकिन Guile और MIT Scheme के बीच छोटी-मोटी syntax differences थीं, जिससे काफ़ी झंझट हुई
MIT original से formatting बेहतर है: https://sarabander.github.io/sicp/
पहले एक package था, लेकिन करीब 20 साल से उसका maintenance बंद पड़ा है
वहीं DrRacket में उन problems को हल करने के लिए dedicated package मौजूद है
Abelson और Sussman को इस किताब की सामग्री पढ़ाते हुए 1986 की recorded lectures देख सकते हैं
कई layers में abstraction बनाने और उन्हें बांधने के तरीके की उनकी व्याख्या आज भी मेरे लिए निजी तौर पर और mentoring में उपयोगी है
वीडियो में यह lesson 3A, 1:07:55 पर है
https://m.youtube.com/playlist?list=PLE18841CABEA24090
The Elements of Programming Style तीन बार पढ़ने लायक है, और मैंने उससे कहीं ज़्यादा बार पढ़कर लाभ लिया है
अगर रुचि हो तो 2010 में लिखा मेरा review है: https://reprog.wordpress.com/2010/03/06/programming-books-pa...
https://elementsofprogramming.com/
SICP में मेरी सबसे पसंदीदा और कई सालों से याद रहने वाली बात wishful programming का विचार है
यानी ऊपर से नीचे की ओर कुछ बनाना, यह मानकर कि low-level routines पहले से मौजूद हैं
फिर वास्तव में उन low-level routines को बनाते हुए नीचे तक जाना
मेरे हिसाब से यह सोच test-driven development के साथ बहुत अच्छी तरह फिट बैठती है
जिस functionality की इच्छा है, उसके लिए पहले tests लिखना, और फिर उस इच्छा को पूरा करने जाना
ज़्यादातर developers नीचे से ऊपर बनाते हैं, और अंत में उनके पास कुछ ऐसा आ जाता है जिसे कोई चाहता ही नहीं था
आप गलती से किसी ऐसी चीज़ की इच्छा कर सकते हैं जिसकी असली प्रकृति आपको अभी पता नहीं है, और फिर नींव में एक नाज़ुक गड़बड़झाला बन जाता है
आम तौर पर ऐसा ही होता है, क्योंकि चीज़ों की algorithmic प्रकृति शायद ही कभी intuitive होती है
नीचे से शुरू करना “काश जादू मौजूद होता” से शुरू करने के बजाय उन quarks से शुरू करने जैसा है जो आपके पास वास्तव में हैं
जादू नहीं होता, और जब आप नीचे पहुंचते हैं तो जादुई कणों की जगह quarks मिलते हैं, और इस प्रक्रिया में आप वे context clues भी खो देते हैं जो दो physics के बीच translate करने में मदद करते
दोनों approaches उपयोगी हैं। गहरे problems हल करने के लिए कभी-कभी साहस के साथ इच्छा करनी पड़ती है
लेकिन व्यक्तिगत रूप से मैं magic को top-level के ठीक नीचे वाली layer में रखना पसंद करता हूं
यानी नीचे से ऊपर बनाकर, business logic से ठीक पहले business language में और उससे बाहर translate करने वाली convenience magic layer बनाना
इससे उसे adjust किया जा सकता है, और नीचे तक उलझी हुई गड़बड़ी नहीं बनती
पहले उचित लगने वाला formatting/tagging तरीका लिखा, फिर markup के लिए उचित programming तरीका—इसलिए macros—सोचा, और फिर implementation में गए
OpenSCAD में G-code को model करने वाली library बनाने के मेरे काम में भी मैं मिलता-जुलता तरीका आज़मा रहा हूं
हाल ही में उसे “pure” OpenPythonSCAD में फिर से लिखा है, उम्मीद है कि यह उपयोगी बन पाएगा
Pharo आज़माना चाहिए
SICP कंप्यूटर साइंस पढ़ते समय पहली किताब के रूप में पढ़ने के लिए सबसे अच्छी किताब है
कई वर्षों तक शौकिया तौर पर प्रोग्रामिंग करने, structured programming की किताबों और Pascal से Common LISP तक कई भाषाओं से परिचय के बाद, undergraduate कंप्यूटर साइंस कोर्स में Abelson & Sussman का इस्तेमाल किया, और सचमुच आंखें खुल गईं
Scheme की सरलता, सुंदरता और इंटरैक्टिवनेस दिखाते हुए यह सिखाती है कि कंप्यूटर साइंस कई तरह के abstractions को परत-दर-परत खड़ा करने का काम है
procedural abstraction और data abstraction से शुरू करके, खुद domain-specific language परिभाषित करने और उसका compiler implement करने तक, और फिर software के भीतर नया hardware परिभाषित करने तक जाती है
सब कुछ इतना स्वाभाविक लगता है, और केवल सच्चा उस्ताद ही उसे ऐसा दिखा सकता है
हालांकि 1st edition या ज्यादा नई edition नहीं, बल्कि 2nd edition खरीदनी चाहिए
नई edition में Scheme की जगह Python इस्तेमाल हुआ है, और वह खास नहीं है
मैं सचमुच SICP को पसंद करना चाहता था, लेकिन Lisp आड़े आ गया
Haskell और Standard ML मुझे पसंद हैं
जानना चाहता हूं कि किसी और का भी ऐसा अनुभव रहा है या नहीं
अगर SICP जैसी ही भावना वाली, लेकिन किसी दूसरी भाषा को माध्यम बनाकर लिखी किताब हो तो दिलचस्प होगा
JavaScript में SICP करना नहीं चाहता
लेखक Scheme के विकल्प के रूप में KRC या Miranda इस्तेमाल करने की बात करता है
KRC के बारे में ज्यादा नहीं जानता, लेकिन Miranda एक statically typed functional programming language है जिसने Haskell को प्रभावित किया
Scheme या Lisp का इस्तेमाल किए बिना SICP जैसी कोई किताब, SICP से बिल्कुल अलग होगी, या कम से कम वही चीजें नहीं सिखा पाएगी
मेरे अनुभव में Haskell और ML, Scheme से कहीं ज्यादा समझने में कठिन थे, इसलिए जानना चाहूंगा कि कौन-सी बात कठिन लगी
पिछले महीने पढ़ना शुरू किया, लेकिन लगा कि यह बहुत ज्यादा फैलाव में जाती है
कई दिलचस्प mathematical principles को बहुत तेजी से छूती है, और जैसे ही चीजें रोचक होने लगती हैं, अगले विषय पर चली जाती है
दूसरे शब्दों में, यह बहुत सतही लगती है
पीछे मुड़कर देखूं तो SICP से निकले lectures या documents मैं पहले ही काफी देख चुका था, इसलिए हर विषय के आते ही “फिर वही” लगना भी मददगार नहीं था
फिर भी किसी तरह अंत तक किया, और Lisp संभालने लायक smart न होने के कारण उल्टे मैंने बहुत ज्यादा सीखा
code पढ़ने में इतना समय लगा कि लगता है, अगर कोई परिचित भाषा होती तो उससे जितना सीखता, उससे ज्यादा सीखा
SICP का Python version भी है
मैंने खुद उसे अंत तक नहीं किया, बस सरसरी तौर पर देखा है, इसलिए recommendation नहीं है, लेकिन इसके मौजूद होने के सबूत के तौर पर link छोड़ रहा हूं
https://wizardforcel.gitbooks.io/sicp-in-python/content/0.ht...
मेरी bookshelf में भी दोनों किताबें साथ-साथ रखी हैं, और यह निश्चित रूप से पढ़ने लायक है
दूसरी बार पढ़ते समय मैंने footnotes और references में गहराई से झांका, और वहां भी एक सुंदर बड़ा संसार था
अगर मेरी याद सही है, तो Sussman और उनकी team का एक paper है जिसमें उन्होंने celestial bodies की properties, यानी trajectories की गणना के लिए custom programmable processor design किया था
हमेशा की तरह, दिमाग चकरा देने वाली सामग्री है
SICP ने मुझे शुरुआती दौर में ही यह समझा दिया कि programming models कई तरह के होते हैं, जबकि undergraduate में मैंने सीमित संख्या के models ही सीखे थे
यह उन किताबों में से एक थी जिसने यह एहसास दिया कि किसी भी language, library, या framework documentation को पढ़ते समय मैं दिशा पकड़ सकता हूं
SICP के साथ मैं पूरी The Little * series को भी ऐसी सामग्री मानता हूं जिसे दो या उससे अधिक बार पढ़ना चाहिए
Types and Programming Languages भी अच्छी है
मेरे काम के लिए यह लागू की जा सकने वाली कंप्यूटर साइंस है, लेकिन सिर्फ पढ़ने से काम नहीं चलेगा, implement भी करना होगा
दोहराए बिना कुछ हिस्सा भूल जाता हूं
व्यक्तिगत रूप से शायद इसलिए भी कि मैं उस व्यक्ति को जानता और सम्मान करता था, लेकिन Dijkstra की किताबें और papers मैं काफी बार दोबारा पढ़ता हूं
अब उन्हें सीधे लागू करना मुश्किल है, लेकिन दिमाग के लिए अच्छा है, और मेरी नजर में वे बेहतरीन लेखक थे