GITR: Resources
Instead of running my mouth out the gate, I want to start by pointing to what other people have said, and resources that have undoubtedly influenced me. The bulk of this will be in book form, because that’s the type of media I prefer to learn from, but I’ll do my best to include websites, courses, and videos where I can.
I probably won’t put everything here at once. Instead, my intent is to have this post be one I can return to as time goes by, adding to the list and updating my views on what’s helpful and what isn’t.
Websites#
Missing Semester of CS - Along with Effective Computation in Physics, this is probably the most closely allied presentation to what I’m trying to do with Growing into the Role. I don’t know if it fits better here or under courses, but I haven’t actually gone through it as a course (discovered it a bit too late for it to help me much), but it’s a nice place to glance over effectively a syllabus for a course like this and get a sense of if it applies to where you are.
Books#
Effective Computation in Physics - Despite the title, this is really about fundamental software engineering skills for anyone in a STEM field that overlaps with computing, whether it comes via simulations, sophisticated/custom numerical calculations, or data analysis. I found it toward the end of grad school and I wish I’d had it years earlier. Even if you aren’t in science, most of what it covers on topics like testing, version control, and workflow automation are likely still applicable.
The Pragmatic Programmer - Arguably the first and best-known entry in the field attempting to bridge the gap between new programmer (or college grad) and solid professional dev. Looking back, some parts definitely feel a bit dated, and it’s a shame that some of the most interesting sections (e.g. on writing code to write code) don’t have more concrete illustrations, but probably worth a read for a surprisingly rich vein of good advice in between fluffier consultant-speak.
Code Complete - This one is a little bit of a weird recommendation as it’s getting pretty old at this point. All the same, it’s probably the most comprehensive walk through the nitty gritty of software development I’m aware of. It focuses on a level of development that often gets overlooked in favor of more “fundamental” algorithms and CS concepts on one hand, or else shuffled under the rug as “details” during higher-level design on the other, but it’s this kind of moment-to-moment construction and decision making that ultimately makes or breaks the actual product, and it deserves more attention. The book delves deep into topics like antipatterns, code smells, code organization, solid naming, and lots more. Every topic covered is illustrated with numerous examples, and the “Coding Horror” sections teach almost as much as the main text simply by showing what not to do. It’s a doorstop, but there’s no need to read it cover-to-cover, and if you can find a copy for a reasonable price used, I’d recommend it as one to flip through when you’re zoning out during a Zoom meeting.
Writing Solid Code - Same author as Code Complete but significantly shorter. Something of a condensation of the topics in CC. Again, some parts are fairly dated, but much of the advice applies independently of era or language. If I had my way, at least one of The Pragmatic Programmer, Code Complete, or Writing Solid Code would be issued to every junior engineer alongside their offer letter.
Unix Power Tools - Also a bit of a blast from the past, since it hails from back when Tim O’Reilly did more than just suck down royalties from the book series bearing his name. Despite that, most of the tips and tricks described in it remain useful on Unix and Linux systems, and you can find some really neat ideas buried in odd corners. Another doorstop, but not bad for technical bathroom reading.
Courses#
Teach Yourself Computer Science - Also a website, but definitely intended as a course of study. It’s not for the faint of heart, but especially if you’re coming from outside a traditional CS degree, it will massively shore up your skills. It’s focused on the typical big-ticket topics in CS rather than the gnarly details we’re considering here, but if you follow along with it you’ll write tons of code, and writing a lot of code is the best way to both practice and see the benefit of the kinds of things we’ll talk about in GITR.
Advanced Programming in the UNIX Environment - If you want to get involved with systems programming in Unix or Linux, APUE is the canonical reference and this is a course based on the book as presented by an excellent lecturer. While it doesn’t cover the same material as GITR, you’ll learn a lot about C hygiene while working through it and you’ll get a much better picture of what’s actually going on between application code and the operating system.
Nand2Tetris - Arguably the best next step if you want to learn about how CPUs work and how to write a compiler. It’s very focused on project-based learning, and writing all that code will reinforce the lessons of GITR. You’ll also have a deep appreciation for testing from the way the projects use an auto-grader harness to provide feedback.
Videos#
Jason Turner on C++ - I’m mostly including this link as a soapbox to say that whatever language you use in your day-to-day work, you should find high quality resources and good teachers to help you really come to terms with its ins and outs, as well as the continually evolving practice and standards of the community. Official conferences are good for this as well, once you’ve learned enough to be able to follow along with some of the presentations.