7 पॉइंट द्वारा GN⁺ 2023-12-27 | 1 टिप्पणियां | WhatsApp पर शेयर करें

टेक्स्ट एडिटर

  • टेक्स्ट एडिटर हम रोज़ इस्तेमाल करते हैं, लेकिन क्या आप जानते हैं कि यह वास्तव में कैसे काम करता है? शुरुआत बुनियादी फीचर्स को implement करने से करें।
  • टेक्स्ट दस्तावेज़ को memory में कैसे store किया जाए, यही सबसे बड़ी चुनौती है। array का उपयोग performance समस्याएँ पैदा कर सकता है, और इसे हल करने के लिए अलग-अलग data structures सीखने की ज़रूरत होती है।
  • टेक्स्ट cursor कैसे काम करता है यह सीखें, और बेसिक एडिटर implement करने के बाद undo/redo और word wrap फीचर implement करने की चुनौती लें।

2D गेम - Space Invaders

  • एक सरल गेम के लिए भी खास data structures और design patterns की ज़रूरत होती है। गेम design और art पर ध्यान देने के बजाय, गेम के overall implementation पर फोकस करें।
  • स्क्रीन draw करना, game loop, user input handle करना, dynamic objects बनाना और manage करना, और game logic लागू करना जैसी चीज़ें सीखें।
  • बेसिक गेम implement करने के बाद title screen menu, game over screen जोड़ना, अलग-अलग computers पर एक जैसी speed बनाए रखना, और AI लागू करना जैसी दिशाओं में इसे बढ़ाया जा सकता है।

कंपाइलर - Tiny BASIC

  • कंपाइलर implement करना ऐसा प्रोजेक्ट है जो programming की गहरी समझ मांगता है। Tiny BASIC जैसी सरल भाषा से compiler लिखना शुरू करें।
  • code को tokenize करने का तरीका (lexical analysis), parsing (structure की जाँच और tree बनाना), semantic analysis, और code generation जैसी प्रक्रियाएँ सीखें।
  • बेसिक compiler implement करने के बाद standard library जोड़ना, optimization stage जोड़ना, और error messages बेहतर बनाना जैसी दिशाओं में इसे बढ़ाया जा सकता है।

मिनी ऑपरेटिंग सिस्टम

  • operating system की बुनियादी अवधारणाएँ कई क्षेत्रों में लागू की जा सकती हैं। operating system implement करके hardware के बारे में समझ बढ़ाई जा सकती है।
  • hardware पर निर्भर learning curve ज़रूर है, लेकिन किताबों या tutorials का पालन करें तो एक bootable OS बनाया जा सकता है।

स्प्रेडशीट

  • spreadsheet application, text editor और compiler दोनों की चुनौतियों को जोड़ता है। इसमें cells की सामग्री को memory में represent करने का तरीका और formulas के लिए programming language का interpreter implement करना सीखते हैं।

वीडियो गेम कंसोल emulator

  • emulator लिखना compiler, operating system, और compiler writing जैसी चुनौतियों को एक साथ जोड़ देता है। emulator पर असली गेम खेलना अपने-आप में बहुत संतोषजनक अनुभव है।
  • किसी वास्तविक video game console को emulate करने का मतलब है एक ऐसी virtual machine लिखना जो उस CPU और दूसरे hardware components की तरह काम करे।

GN⁺ की राय

  • programming की बुनियाद मज़बूत करने में text editor या सरल गेम implement करना, हमारे रोज़ इस्तेमाल होने वाले software के अंदरूनी काम करने के तरीके को समझने में बहुत मदद करता है।
  • compiler या operating system जैसे जटिल प्रोजेक्ट, programming languages और computer architecture की गहरी समझ मांगते हैं, और यही advanced software engineering skills विकसित करने के लिए ज़रूरी है।
  • ऐसे प्रोजेक्ट programmers को नई language या framework सीखने, या अपने मौजूदा ज्ञान को और गहरा करने के लिए रोचक और चुनौतीपूर्ण अनुभव देते हैं।

1 टिप्पणियां

 
GN⁺ 2023-12-27
Hacker News राय
  • टेक्स्ट एडिटर, compiler, operating system, raytracer जैसे प्रोजेक्ट बनाना programming skills को बेहतर कर सकता है, लेकिन इससे software engineering क्षमता ज़रूरी नहीं कि बेहतर हो। वास्तव में, ऐसे प्रोजेक्ट अक्सर "Not Invented Here" जैसे विनाशकारी सिद्धांत को साथ लेकर आते हैं, इसलिए software engineering के लिहाज़ से इनका उल्टा असर भी हो सकता है.

    • यह तय करने की क्षमता कि कोई चीज़ library से लेनी है या खुद लिखनी है
    • प्रोजेक्ट की requirements के हिसाब से high-quality libraries और frameworks पहचानने की क्षमता
    • यह तय करने की क्षमता कि optimization कहाँ मूल्यवान है और कहाँ नहीं
    • ऐसा code लिखने की क्षमता जो कई साल बाद भी पढ़ने योग्य रहे
    • प्रोजेक्ट को बड़े और जटिल system की तरह सोचते हुए software और non-software dependencies पर विचार करने की क्षमता
    • एक वैकल्पिक चुनौती के रूप में web search engine बनाने का सुझाव। string matching algorithm जैसी समस्याएँ पहले ही दूसरे लोग हल कर चुके हैं, इसलिए लक्ष्य एक ऐसा search engine (और crawler) बनाना है जो वास्तव में काम करे.
  • UI/web-आधारित प्रोजेक्ट्स के लिए निम्नलिखित की सिफारिश की गई है:

    • Unity या Unreal का उपयोग करके एक सरल video game (क्योंकि game में 30-60fps महत्वपूर्ण होता है, इसलिए इससे दूसरी जगहों पर भी performant interfaces बनाने में मदद मिलती है)
    • React जैसा एक सरल JavaScript framework (data flow और event handling को समझने में मदद मिलती है)
    • XMLHTTPRequest के आसपास एक http library wrapper (fetch मौजूद है, लेकिन HTTP requests को शुरुआत से कैसे भेजा और पढ़ा जाता है, यह समझना CORS issues, OPTIONS requests आदि को debug करते समय मददगार होता है)
  • mini operating system के बारे में सकारात्मक राय। एक application developer के रूप में आप operating system की सुविधाओं (memory management, file system आदि) पर निर्भर रहते हैं, और स्वाभाविक है कि यह जानने की जिज्ञासा हो कि ये चीज़ें पर्दे के पीछे कैसे काम करती हैं। अपने खाली समय में xv6 का उपयोग करके विभिन्न process scheduling algorithms सीखना और लागू करना बहुत उपयोगी और मज़ेदार अनुभव हो सकता है.

  • कुछ भौतिक चीज़ों पर काम करने की इच्छा, जैसे robot या autopilot वाले drone, या programmable GNC parameters वाले spacecraft की flight dynamics का सटीक simulation। "Fundamentals of Astrodynamics" नाम की किताब है और इस छुट्टी के मौसम में उसका उपयोग करना चाहते हैं। GNC (guidance, navigation and control) के बारे में अच्छी जानकारी पाना चाहते हैं.

  • यह व्यक्तिगत पसंद और परिस्थितियों पर निर्भर करता है, लेकिन अगर ideas ढूँढ़ रहे हैं तो यह एक अच्छी शुरुआती सूची हो सकती है। Sinclair ZX Spectrum पर music staff editor और tracker, 2D game (Space Invaders) आदि बनाए थे। पहले computer (386) पर Huffman compressor, B-Tree index, OOP form generator, dial-up के लिए email checker, manual parser आदि बनाए थे.

  • टेक्स्ट एडिटर पर चर्चा: टेक्स्ट दस्तावेज़ को memory में कैसे store किया जाए, यही सबसे बड़ी चुनौती है। array का उपयोग करना पहला विचार था, लेकिन दस्तावेज़ के अंत के अलावा किसी और जगह text insert करने पर performance बहुत खराब हो जाती है। लेकिन JavaScript strings का उपयोग किया और 2 साल से अधिक समय तक editor इस्तेमाल करने के दौरान कोई performance problem नहीं हुई। बेशक, कई दूसरी समस्याएँ थीं; उदाहरण के लिए लंबी horizontal lines render करना समस्या बन गया, क्योंकि optimization approach में यह मान लिया गया था कि single-line rendering सस्ती होगी.

  • एक सरल toy raytracer आज़माना भी अच्छा विचार है। bitmap graphics में spheres और diffuse तथा reflective reflections करने वाला raytracer बनाना, जब तक प्रोजेक्ट को बहुत जटिल न किया जाए, एक अपेक्षाकृत सीमित प्रोजेक्ट हो सकता है.

  • अगर आपको लगता है कि Space Invaders लिखने के लिए "factory pattern" की ज़रूरत है, तो कुछ गड़बड़ है। पूरा भरोसा नहीं कि मूल game में ऐसे design concepts इस्तेमाल किए गए थे.

  • data structure के रूप में array का उपयोग करने वाले टेक्स्ट एडिटर पर राय। typing के दौरान तेज़ गति चाहिए होती है, और केवल एक line बदलती है। नई line दर्ज करते समय, Enter दबाने के बाद array को फिर से व्यवस्थित करने के लिए जो अतिरिक्त देरी चाहिए, वह लाखों lines के मामले में भी ध्यान देने योग्य नहीं होती। टेक्स्ट एडिटर का ज़्यादा चुनौतीपूर्ण हिस्सा यह सुनिश्चित करना है कि केवल वही render हो जो user देख रहा है.