<story><title>My Most Important Project Was a Bytecode Interpreter</title><url>http://gpfault.net/posts/most-important-project.txt.html</url></story><parent_chain><item><author>sillysaurus3</author><text>Also: a software rasterizer.&lt;p&gt;Most people refuse to write one because it&amp;#x27;s so easy not to. Why bother?&lt;p&gt;It will make you a better coder for the rest of your life.&lt;p&gt;Let&amp;#x27;s make a list of &amp;quot;power projects&amp;quot; like this. A bytecode interpreter, a software rasterizer... What else?</text></item></parent_chain><comment><author>Jasper_</author><text>Tracks I&amp;#x27;ve done and suggested to friends and colleagues as learning experiences:&lt;p&gt;* Compression (lossless, lossy, image, audio, texture, video)&lt;p&gt;* Languages (bytecode interpreter, AST interpreter, parser&amp;#x2F;lexer for a simple language, simple JIT, understanding instruction scheduling)&lt;p&gt;* DSP programming (writing programs for fast, branchless math)&lt;p&gt;* Comfort with binary and binary formats (start with packfiles .zip&amp;#x2F;.tar, move onto reverse engineering simple formats for e.g. games)&lt;p&gt;* Understanding the difference between RAM and address spaces (e.g. understanding virtual memory, mmap, memory-mapped IO, dynamic linking, the VDSO, page faulting, shared memory)&lt;p&gt;* Device drivers (easier on Linux, understanding userspace&amp;#x2F;kernel interaction, ioctls, how hardware and registers work, how to read spec sheets and hardware manuals)&lt;p&gt;* Graphics (modern software rasterizer that&amp;#x27;s not scanline-based, understanding 3D and projective transforms, GPU programming and shaders, basic lighting (reflection and illumination) models, what &amp;quot;GPU memory&amp;quot; is, what scanout is, how full scenes are accumulated all along the stack)&lt;p&gt;I could go heavily into depth for any one of these. Ask me questions if you&amp;#x27;re interested! They&amp;#x27;re all fun and I always have more to learn.&lt;p&gt;Also, the longer you get into any given track, the more you realize they all connect in the end.</text></comment>
<story><title>My Most Important Project Was a Bytecode Interpreter</title><url>http://gpfault.net/posts/most-important-project.txt.html</url></story><parent_chain><item><author>sillysaurus3</author><text>Also: a software rasterizer.&lt;p&gt;Most people refuse to write one because it&amp;#x27;s so easy not to. Why bother?&lt;p&gt;It will make you a better coder for the rest of your life.&lt;p&gt;Let&amp;#x27;s make a list of &amp;quot;power projects&amp;quot; like this. A bytecode interpreter, a software rasterizer... What else?</text></item></parent_chain><comment><author>shermanyo</author><text>A basic game engine! I was exposed to so many concepts over time, building on a code base I understood from the ground up.  
It was the first time my code (c++ no less!) felt completely deterministic, that I understood every piece of data down to the byte level, heap&amp;#x2F;stack&amp;#x2F;gpu locality at any point of execution, and especially the lifecycle and memory management.&lt;p&gt;If anyone is interested in creating an indie&amp;#x2F;hobby game engine, I&amp;#x27;d recommend the following:&lt;p&gt;- game loop with independent render FPS and a constant simulation tick delta (otherwise it runs non-deterministic due to floating point)  
- &amp;quot;entities, components, systems&amp;quot; architecture (ECS)  
- data-driven content (load level and game object data from JSON or similar, and programmatically build your scene)  
- basic event or messaging system&lt;p&gt;Honestly, I can&amp;#x27;t think of a field that covers as wide a range of CS topics at the depth I&amp;#x27;ve seen in lower level game development.&lt;p&gt;If you focus on understanding and implementing the popular patterns and algorithms recommended by the indie community, its not the most daunting of projects. There&amp;#x27;s so much great information, and a few good books that break down and walk through a working implementation you can build on once you understand it from the ground up.</text></comment>