3 ms·
I've found this very true, as I've moved over the years from very "high-level" programming (client/server apps, database-driven web sites) to "mid-level" progra
by mbrubeck 13y ago
I've found this very true, as I've moved over the years from very "high-level" programming (client/server apps, database-driven web sites) to "mid-level" programming (working on the Firefox browser) and then toward systems programming (working on Rust and Servo). The desire to stop dealing with masses of fragile dependencies keeps driving me lower in the stack. I really need to practice more assembly coding so I can continue in this direction...
You get some similar benefits if you are working on code where you have some control over the levels above or below, or if your project has any form of self-hosting. For example, Firefox, where most of the UI is rendered by Gecko and some of it even runs within a browser tab. If you're a web developer and you run into a rendering engine bug, you report it and then ship a workaround for three years as you wait for enough people to update. If you're a Firefox front-end developer, you can just fix the Gecko bug and ship the fix along with your feature.
- opendais 13y agoIf you run into a bug specific to Windows XP in a software application, you fix it for Windows XP with a workaround specific to WinXP, then you continue supporting it forever? I'm not seeing the difference other than you probably run into that kind of breakage more frequently with the web.
- mbrubeck 13y agoExactly - as in the original blog post by Yossi Kreinin, I'm talking about a difference in degree only, depending on just how many levels of dependencies and abstractions you're building on top of. Your comment brings up a good point that writing portable code (cross-browser, cross-OS, across compilers, across processors, etc.) adds to the difficulty level because it requires you to target a higher-level abstraction (web standards, POSIX, ANSI C...) rather than a concrete implementation, while still dealing with implementation-specific bugs that leak through that abstraction.
- crudman 13y agoQuick question, I've been stuck doing CRUD for way too long but have always had an interest in low level programming. Unfortunately the few times I have tried to give it a shot I always come back defeated to my CRUD world, it all seems very alien to me. What do you think is the best way for your typical CRUD/Web developer with no background in low level programming whatsoever to dive in to low level stuff? Any tips or links to resources you may have are very much welcome :)
- eshyong 13y agoHi, I'm interested in learning low level programming too! I've been taking classes, reading tutorials about programming, and starting projects on my own. It really depends on what kind of projects you want to work on. Some of the major types of projects include compilers, OS-level projects (drivers, kernel, etc.), networking (server/client), and graphics. You'll probably want to learn C and/or Assembly, probably x86 but I've found ARM to be fun. (and Raspberry Pi is built on it!) - Compilers: I'm taking the Stanford course on Coursera right now. It just started two weeks ago so you can still catch up. Here's the link: https://class.coursera.org/compilers-004 https://class.coursera.org/compilers-004 Here's some literature on compilers/interpreters/JIT (Just In Time compilation): http://www.stephendiehl.com/llvm/ http://www.stephendiehl.com/llvm/ (I've heard good things about LLVM!) http://blog.reverberate.org/2012/12/hello-jit-world-joy-of-simple-jits.html http://blog.reverberate.org/2012/12/hello-jit-world-joy-of-s... (Just saw this today) Tutorial on building a Lisp in C, from two days ago: http://www.buildyourownlisp.com/ http://www.buildyourownlisp.com/ - Operating Systems: Definitely check out MIT's open courseware on xv6! It's an implementation of Unix version 6. The course includes a git project that you can clone and play with yourself, as well as some labs. Here's the link: http://pdos.csail.mit.edu/6.828/2012/index.html http://pdos.csail.mit.edu/6.828/2012/index.html OSDev wiki had some resources too: wiki.osdev.org If you have a Raspberry Pi or are patient enough to try to emulate the hardware, here are some tutorials on ARM assembly for RasPi: https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/ https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/ - Networking: Here, you'll probably want to look for tutorials on socket programming and the TCP/UDP protocol. People recommend Beej's tutorials, which are quite comprehensive and a good source of information, but I found some of his server code confusing and convoluted (deeply nested loops and if statements). Here's a link to his site: http://beej.us/guide/bgnet/ http://beej.us/guide/bgnet/ Here's a easy to learn server/client tutorial: http://www.thegeekstuff.com/2011/12/c-socket-programming/ http://www.thegeekstuff.com/2011/12/c-socket-programming/ - Graphics: I have the least amount of exposure to this, but a good resource is at the website open.gl. Basically you'll want to learn about shader languages and how the graphics pipeline works. Hope this helps!