हर प्रोग्रामर को जिन प्रोजेक्ट्स को आज़माना चाहिए (2019)
(austinhenley.com)- अगर side project चुनना मुश्किल हो, तो text editor, 2D game, compiler, mini operating system जैसे प्रोजेक्ट अच्छी शुरुआत बनते हैं—इन्हें बार-बार बनाने पर सीखने का दायरा बढ़ता जाता है
- text editor में document storage structure, cursor behavior, undo/redo और line wrapping को खुद implement करते हुए data structures और abstraction सीखे जाते हैं
- Space Invaders जैसा सरल 2D game भी screen drawing, input handling, game loop, object state management, enemy AI, sound, shaders और networking तक game programming की बुनियादी संरचना सामने लाता है
- Tiny BASIC compiler और mini operating system क्रमशः lexing·parsing·semantic analysis·code generation, cross compile·bootloading·memory management·scheduling जैसे low-level concepts से सीधे काम कराते हैं
- spreadsheet और console emulator पिछले प्रोजेक्ट्स की कठिनाइयों को जोड़ते हैं, और वास्तविक व्यवहार की नकल करने वाली virtual machine बनाने के स्तर तक विस्तार करते हैं
ऐसे प्रोजेक्ट्स जिन्हें बार-बार बनाया जा सकता है
- जब side project चाहिए हो या नई programming language·framework सीखनी हो, तो एक ही project कई बार बनाने पर भी हर बार कुछ अलग सीखा जा सकता है
- सुझाए गए प्रोजेक्ट्स की कठिनाई और सीखने के क्षेत्र अलग-अलग हैं
- text editor: data structures, cursor behavior, undo/redo, screen representation
- 2D game: screen drawing, input handling, game loop, objects और state management
- compiler: lexing, parsing, semantic analysis, code generation
- mini operating system: booting, memory management, scheduling, file system
- spreadsheet और console emulator: पिछले प्रोजेक्ट्स के concepts को बड़े structure में जोड़ना
Text editor
- text editor रोज़ इस्तेमाल होने वाला tool है, लेकिन basic textbox component के बिना खुद implement करने पर cursor movement, selection, insertion और deletion की बारीकियों से निपटना पड़ता है
- सबसे बड़ी चुनौती text document को memory में store करने का तरीका है
- simple array में document के end के अलावा किसी और जगह text insert करने पर performance खराब होती है
- तुलना के लिए array, rope, gap buffer, piece table जैसे structures हैं
- cursor सिर्फ ऊपर-नीचे ही नहीं चलता
- छोटी line पर जाने पर वह उपलब्ध position पर जाता है, और बाद में पर्याप्त लंबी line आने पर मूल column पर लौटने की कोशिश करता है—इसे column memory behavior कहा जा सकता है
- basic editor के बाद undo/redo और line wrapping जोड़े जा सकते हैं
- संदर्भ सामग्री
2D game - Space Invaders
- सरल game भी अपने data structures और design patterns मांगता है
- बड़े game engine के बजाय SDL, SFML, PyGame जैसी basic 2D graphics libraries इस्तेमाल करने पर दिलचस्प हिस्से छिपते नहीं हैं
- game screen को clear करके हर element को तेज़ी से फिर draw करता है, जिससे objects के हिलने का effect बनता है
- असल flow game loop के अंदर drawing, user input लेना और game logic process करना दोहराने वाली structure है
- input handling में key या mouse button के first press, pressed state, release, double-click जैसी बारीकियों का ध्यान रखना पड़ता है
- अगर केवल input ही लगातार check करते रहें, तो game का बाकी हिस्सा रुका रह जाएगा
- game objects और state management को भी खुद संभालना पड़ता है
- dynamically बढ़ते enemies बनाने में factory pattern मददगार होता है
- enemy AI में state machine apply की जा सकती है
- basic game के बाद title menu, game over screen, अलग-अलग computers पर भी समान speed से चलाने की handling, और ज्यादा रोचक enemy AI जोड़े जा सकते हैं
- और विस्तार करने पर shader effects, sound और online multiplayer तक implement किया जा सकता है
- संदर्भ सामग्री
Compiler - Tiny BASIC
- compiler ऐसा project है जिसमें आप ऐसा tool बनाते हैं जिससे दूसरे लोग और ज्यादा चीज़ें बना सकें
- छोटी BASIC-family language Tiny BASIC को target बनाकर, किसी परिचित दूसरी language में output देने वाला compiler scratch से लिखा जा सकता है
- उदाहरण के लिए Python में Tiny BASIC compiler बनाकर C# code output किया जा सकता है
- अगर assembly या C output न करें, तो compiler itself पर ज्यादा focus किया जा सकता है
- implementation flow language processing की प्रक्रिया को step by step follow करता है
- input code को tokens में बांटने वाला lexical analysis
- input structure check करके tree representation बनाने वाला syntactic analysis
- recursive descent parsing
- abstract syntax tree
- code semantically सही है और type rules follow करता है या नहीं, यह check करने वाला semantic analysis
- optimization passes
- code generation
- simple compiler कुछ दिनों में पूरा किया जा सकता है, और बाद में standard library, optimization passes, error messages में सुधार जोड़े जा सकते हैं
- PeayBASIC में standard library के रूप में सरल 2D graphics features जोड़े गए हैं
- संदर्भ सामग्री
Mini operating system
- operating system के algorithms और data structures classroom में abstract या बेकार लग सकते हैं, लेकिन game या human behavior prediction model जैसे कई क्षेत्रों में भी apply हो सकते हैं
- खुद implement करने पर operating system के अंदर क्या होता है, इसकी गहरी समझ मिलती है
- hardware dependency की वजह से शुरुआत की बाधा और learning curve है, लेकिन books या tutorials follow करने पर ऐसा bootable OS बनाया जा सकता है जो आपके बनाए programs चला सके
- सीखने की चीज़ें ये हैं
- Cross compiling
- Bootloading
- BIOS interrupts
- x86 modes
- memory management और paging
- Scheduling: उदाहरण के लिए round robin
- File systems: उदाहरण के लिए FAT
- संदर्भ सामग्री
ज्यादा कठिन project: spreadsheet और console emulator
- Excel जैसी spreadsheet application text editor की चुनौतियों और compiler की चुनौतियों को जोड़ती है
- cell contents को memory में represent करना पड़ता है
- formulas में इस्तेमाल होने वाली programming language के लिए interpreter implement करना पड़ता है
- spreadsheet संदर्भ सामग्री
- video game console emulator ऐसा project है जो compiler, operating system और game engine implementation की कठिनाइयों को एक में मिला देता है
- वास्तविक console को emulate करने के लिए CPU और दूसरे hardware components जैसा behave करने वाली virtual machine लिखनी पड़ती है
- इस virtual machine में उस console के लिए बने games चलाए जा सकते हैं
- शुरुआत के लिए real console से सरल virtual console CHIP-8 emulation की सलाह दी जाती है
- NES, SNES, Gameboy, Gameboy Advance को भी emulate किया जा सकता है और इनके लिए काफी documentation और open-source emulators मौजूद हैं, लेकिन हर console में दिलचस्प quirks होते हैं
- कोई specific game किसी specific hardware के undocumented bug या feature पर निर्भर हो सकता है
- PICO-8 एक profitable “fantasy” console बन गया
- emulator संदर्भ सामग्री
अतिरिक्त सुझाए गए प्रोजेक्ट्स
- Hacker News, Reddit, Twitter और email से अतिरिक्त project ideas इकट्ठा हुए
- scratch से database बनाना
- ray tracer
- MS Paint clone
- vector graphics editor
- image decoder
- chat room web app
- pi के digits calculator
- grep जैसी सामान्य terminal utility
- FTP client और server
1 टिप्पणियां
Hacker News की राय
टेक्स्ट एडिटर, compiler, operating system, ray tracer बनाने से आप बेहतर programmer बन सकते हैं, लेकिन ज़रूरी नहीं कि बेहतर software engineer बनें
उल्टा, विनाशकारी “Not Invented Here” सिद्धांत को अपना लेने से software engineering में आप और खराब भी हो सकते हैं
hackers Big O, data structures, HoTT जैसी high theory पर अटक जाते हैं, लेकिन असली engineering के लिए ज़रूरी चीज़ें—“खुद क्या बनाना है और library कब इस्तेमाल करनी है इसका फैसला”, “अच्छी libraries और frameworks पहचानना”, “कहाँ optimization वाकई लायक है यह तय करना”, “ऐसा code लिखना जो कई साल बाद भी पढ़ा जा सके”, “project को software और non-software dependencies समेत बड़े complex system की तरह देखना”—इन पर लगभग चर्चा या अभ्यास नहीं होता
इसलिए वैकल्पिक assignment के तौर पर web search engine का सुझाव है। string matching algorithms जैसी चीज़ें दूसरे लोग पहले ही कर चुके हैं, इसलिए उनकी चिंता न करें; शुरुआत में भले ही web के एक हिस्से और सिर्फ 1 concurrent user को support करें, बस एक सच में काम करने वाला search engine और crawler “यूँ ही” बनाकर देखें
text editor, compiler, operating system, ray tracer भी वही सारी activities train करा सकते हैं
कई feature films में इस्तेमाल हुए ray tracer पर काम कर चुके व्यक्ति के तौर पर, ऊपर बताई गई सभी बातें उस project पर भी लागू हुई थीं
आखिर फर्क शायद इस बात का है कि कुछ छोटा और मज़ेदार करेंगे, या कंपनी में पैसे लेकर किए जाने वाले आत्मा चूस लेने वाले constraints को वैसे ही लागू करके मज़ा खत्म कर देंगे
पहली बात, तैयार blocks आम तौर पर बहुत बार घटिया होते हैं, और नतीजे में software भी उसी घटियापन को दिखाता है; जिंदगी software इस्तेमाल करने में नहीं, बल्कि उन घटिया चीज़ों को maintain करने और मनाने में बीतती है
दूसरी बात, blocks की quality अच्छी भी हो तो वे उस तरह के software को सीमित कर देते हैं जिसे बनाया जा सकता है। आदर्श रूप से, जो behavior चाहिए उसकी कल्पना करनी चाहिए, उसे कराने के लिए software लिखना चाहिए, और इस process में blocks बनाने चाहिए
सिर्फ तैयार blocks इस्तेमाल करने से बहुत-सा शानदार software बन ही नहीं सकता, और मुझे लगता है कि हमारे आसपास शानदार software ज्यादा न होने की वजह भी यही है
अगर “हमेशा दिखने वाले software से लगभग मिलता-जुलता software” बना रहे हैं, तो दूसरी समस्या कम लागू होती है, और पहली भी शायद manageable रहती है क्योंकि mostly happy path ही इस्तेमाल होता है। लेकिन ऐसा software जल्द ही इंसान नहीं, बल्कि AI इस्तेमाल करेगा
वे skills भी अहम हैं, लेकिन किसी point पर बुनियादी क्षमता बनानी ही पड़ती है, और बेहतर programmer बनना ऊपर listed skills के पूरे दायरे में साफ तौर पर मदद करता है
व्यक्तिगत रूप से software engineering मेरे लिए bills भरने का काम है, और programming वह चीज़ है जिसे मैंने मज़े के लिए शुरू किया था
इस लेख के projects ऐसे हैं जिन्हें समय हो तो मज़े के लिए आज़माना चाहूँगा
UI/Web वाले नजरिए से देखें तो, data flow systems समझने में बेहद उपयोगी spreadsheet के अलावा मैं ये चीज़ें recommend करूँगा
Unity या Unreal से एक simple video game बनाकर देखें; 30–60fps महत्वपूर्ण होने वाले games में performance constraints समझ आते हैं, और web समेत दूसरी जगहों पर भी तेज़ interfaces बनाने में मदद मिलती है
React जैसा एक simple JavaScript framework बनाने से data flow और event handling समझने में मदद मिलती है
XMLHTTPRequest को wrap करने वाली HTTP library खुद बनाने से, आज fetch मौजूद होने के बावजूद, HTTP requests भेजने और पढ़ने का तरीका scratch से समझ आता है, जो बाद में CORS issues या OPTIONS requests जैसी debugging में मदद करता है
उस समय भी चर्चा हुई थी
Challenging projects every programmer should try - https://news.ycombinator.com/item?id=21790779 - Dec 2019 (297 comments)
इससे जुड़ा एक लेख भी है
More challenging projects every programmer should try - https://news.ycombinator.com/item?id=25489879 - Dec 2020 (223 comments)
mini operating system के लिए +1
application developers memory management, filesystem जैसी कई operating system features पर निर्भर होते हैं, और आखिर में पूछते हैं, “पीछे ये चीज़ें चलती कैसे हैं?”
इसलिए खाली समय में xv6(https://github.com/mit-pdos/xv6-public) के साथ छेड़छाड़ की
textbook में कई process scheduling algorithms सीखना और उन्हें खुद implement करना बिल्कुल अलग चीज़ें हैं, और मैंने बहुत कुछ सीखा
mobile app developer के तौर पर इस knowledge का काम से संबंधित होने की संभावना लगभग 0 है, लेकिन यह निश्चित रूप से मज़ेदार है
बिना engine के 2D game development करके देखना मेरे लिए सबसे विनम्र बना देने वाला अनुभव था, जिसने एहसास कराया कि computer कितने अविश्वसनीय रूप से तेज़ हो गए हैं
जो काम आपको यकीन हो कि बहुत धीमा होगा, वह भी कर दें तो Game Boy पर भी प्रति सेकंड दस लाख operations होते हैं, इसलिए वह बस चल जाता है। दस लाख संख्या असल में जितनी सोची थी उससे कहीं बड़ी निकली
“रुको, हर बार सारे sprites ढूंढकर draw कर रहे हो? कौन-सी चीज़ें बदलनी हैं यह जानने वाला कोई smart differential calculation नहीं, और पिछले frame को refer करके काम कम करने वाला दूसरा buffer भी नहीं?” ऐसा सोचते हैं, और फिर जब कहीं ज़्यादा जटिल games में ये techniques सचमुच इस्तेमाल होते देखते हैं तो और भी हैरानी होती है
उदाहरण के लिए sprite atlas ऐसा data structure इस्तेमाल करने का classic तरीका है। आम तौर पर predictable तरीके से render होने वाले कई sprites को हर बार upload करने की वजह नहीं होती, इसलिए एक बड़ी image upload करके उसके हिस्से sample कर लेने होते हैं
आज के हिसाब से यह सही है। entry-level commercial hardware पर, यहां तक कि gaming PC न हो तब भी, करीब 15 साल पहले की लगभग हर चीज़ scene को draw और फिर redraw करने वाले brute-force rendering से संभाली जा सकती है
सिर्फ pure hardware और assembly थे, इसलिए graphics, sound, input, memory management आदि सब कुछ manual करना पड़ता था
अगर कोई simplified environment हो जिसमें beginner programmer ये सारी चीज़ें संभालकर 2D game बना सके, लेकिन उसे चलाने के लिए ज़रूरत से ज़्यादा बोझ न हो, तो वह आदर्श शुरुआत लगती है
अगर आपको लगता है कि Space Invaders बनाने के लिए factory pattern चाहिए, तो कुछ गड़बड़ है
मुझे नहीं लगता कि original में ऐसे design concepts रहे होंगे
दिमाग उसमें संक्रमित हो जाए तो वह infection फैलाने के तरीके ढूंढने लगता है
क्या हमने अलग-अलग लेख पढ़े हैं?
robots, autopilot drones, और programmable GNC parameters वाले spacecraft की flight dynamics की precise simulation जैसी कहीं ज़्यादा physical चीज़ें आज़माना चाहता हूं
मेरे पास Bate, Mueller आदि की “Fundamentals of Astrodynamics” है, और इस holiday season में कुछ करके देखना चाहता हूं
बाकी चीज़ें महंगी लगेंगी, इसलिए simulation की बात कर रहा हूं। robots के GNC पहलू में सचमुच बहुत दिलचस्पी है, और अच्छे resources की सिफारिश मिले तो अच्छा होगा
मतलब Segway जैसी कोई चीज़ जो गिरने या table से उड़कर बाहर जाने के बजाय एक जगह खड़ी रह सके
microcontroller, IMU, stepper motor controller, motors, LEGO wheels, और शायद लकड़ी का एक टुकड़ा चाहिए होगा
मैंने खुद नहीं किया है, इसलिए अनुमान काफ़ी गलत हो सकते हैं
किताब में क्या है और किस तरह के projects आज़माए जा सकते हैं, इस बारे में और सुनना चाहूंगा
पूरे दिन software से निपटने के बाद किसी physical object की ओर काम करना सच में अच्छा लगता है
एक छोटा toy ray tracer भी आज़माने लायक शानदार challenge है
spheres और कुछ light sources, diffuse और specular reflection संभालकर bitmap graphics output करने तक ही रहे तो काफी है
अगर बहुत ज़्यादा बड़ा न बना दें, तो यह relatively well-scoped project हो सकता है
graphics render करने की कोशिश करने पर geometry और data structures को कितना खींचा जा सकता है, यह सच में बहुत सीखने को मिलता है
https://austinhenley.com/blog/morechallengingprojects.html
https://raytracing.github.io/
https://raytracing-iow.shuttleapp.rs
दिलचस्प list है, और personal inclination और situation पर निर्भर करेगा, लेकिन ideas ढूंढ रहे हों तो अच्छा starting point है
यह नहीं कहूंगा कि हर programmer को क्या करना ही चाहिए; बस वे चीज़ें लिख रहा हूं जिन्हें मैंने personally चुना था
Sinclair ZX Spectrum पर मैंने music staff editor और tracker बहुत ही crude तरीके से बनाए थे, और 2D game के रूप में सिर्फ एक invader वाला Space Invaders बनाया था
वह computer मेरा भी नहीं था। मेरे पहले computer 386 पर मैंने Huffman compressor, DBase/Clipper से तेज़ B-Tree index, object-oriented form generator, और कई DOS background programs बनाए; उनमें से एक बाद में एक बड़ी company के installation process में इस्तेमाल हुआ
कुछ साल बाद मैंने dial-up के लिए email checker, syntax highlighting के लिए manual parser, spreadsheet जैसी चीज़ भी बनाई, और आज भी वही कर रहा हूं। पक्का कुछ चीज़ें छूट गई होंगी
अच्छी सूची है। अच्छा होगा अगर इसे समय के साथ मिलकर विकसित किया जा सके, इसलिए इसे एक जीवित सूची के रूप में रखा जाए
मैं दो चीज़ें जोड़ना चाहूंगा
एक lightweight memcached बनाना बुनियादी algorithms और अच्छे system design practices के मिश्रण की मांग करता है। यह “सरल” समस्या है, लेकिन invalidation, concurrency, memory management आदि कई पहलुओं से अच्छी तरह सोचना पड़ता है
अपना खुद का Docker बनाना भी अच्छा रहेगा। यह सुनने में जितना जटिल लगता है उतना नहीं है, और आजकल इंजीनियर अपने रोज़मर्रा के काम में बहुत ज़्यादा इस्तेमाल न करने वाली operating system programming की बुनियादी बातें समझने का मौका देता है