Personal Software Developer Growth Plan
- Introduction
- Fundamentals of a full stack web developer
- Fundamentals of software craftsmanship
- Fundamentals of computer science
- Healthy reminders and inspiration
Introduction
Knowing every framework, tool, language and library is not possible, nor is it the goal of a software engineer. This is a continually improving personal plan to help me grow as an engineer capable of solving meaningful problems.
Resources
- Software Engineering Roadmaps
- Timeless Career Advice For Engineers
- The Coding Career Handbook
- Mentor Cruise
- ADP List
Problem solving practise
Learning platforms
Practice
- Build, build, build, then get feedback
- Build independent projects
- Read the source code
- Peek under the hood
Fundamentals of a full stack web developer
The goal is to be able to create and deploy an end to end web application from scratch; as well as contribute effectively to an established project.
How the web works
Intro
- Freecodecamp - How The Web Works
- Freecodecamp - HTTP Networking course
- Kevin Powell - Responsive Design Bootcamp
Deeper
- Freecodecamp - API Integration Patterns
- GoRails - Build a Multithreaded HTTP Server From Scratch
- Freecodecamp - REST API
- Production Ready GraphQL (Book)
Full stack web development
Intro
- ZTM - Complete Web Developer
- ZTM - Junior to Senior Web Developer
- You Might Not Need JS
- Chris Ferdinandi - Lean Web Club
Deeper
Web relevant programming languages
Ruby
- Ruby Koans
- Zed Shaw - Learn Ruby The Hard Way
- David Black - The Well-Grounded Rubyist
- Build Your Own Programming Language
Javascript
- Execute Program - Typescrypt and Javascript Courses
- ZTM - Node.js
- ZTM - Advanced Javascript
- Kyle Simpson - You Don’t Know JS Yet
Battle-tested web framework (rails)
Intro
- Pragmatic Studio - Rails 7
- Pragmatic Studio - Rails Hotwire
- Chad Pytel - Rails Antipatterns
Deeper
- Marc-Andre Courmoyer - Owning Rails
- Refactoring Rails
- Noah Gibbs - Rebuilding Rails
- Destroy All Software - Web Framework From Scratch
- Paul Dix - Service-Oriented Design with Ruby and Rails
- Arkency - Domain Driven Rails
Front-end library (react)
Intro
Deeper
- Rebuilding React
- Ilya Grigorik - High Performance Browser Networking
- Michailia Verou - CSS Secrets
Databases and datastructures
Intro
Deeper
- Botros & Tinley - High Performance MySQL
- Build a DB from scratch
Core tools
Git
- Git Immersion
- Freecodecamp - Beginner Git
- Freecodecamp - Intermediate Git
- Freecodecamp - Advanced Git
- Git Reference Manual
Terminal
- Zed Shaw - Learn Unix The Hard Way
- Cameron Newham - Learning The Bash Shell
- Freecodecamp - Command Line For Beginners
- ZTM - Bash Scripting
Text Editor
Browser dev tools
Developer experience tools
- Offline documentation browser:
- API development: Bruno
- Database GUI: Table plus
- General productivity: Raycast
According to the Pragmatic Programmer book, aim to do the following actions using only the keyboard with your text editor of choice
Fundamentals of software craftsmanship
General craft
Object Oriented Programming
- Sandi Metz - Practical Object Oriented Design In Ruby
- Avdi Grimm - Mastering The Object-Oriented Mindset In Ruby And Rails
- Rebecca Wirfs-Brock, Wilkerson, Wiener - Designing Object-Oriented Software (also see this PDF)
- Matt Weisfeld, The Object-Oriented Thought Process
- Freeman and Pryce - Growing Object-Oriented Software, Guided by Tests (GOOS) #goos-bookclub
- Eric Evans - Domain Driven Design
- Vaughn Vernon - Implementing Domain Driven Design
- David West - Object Thinking
Design and software architecture
- Robert Martin - Clean Code
- Robert Martin - Clean Architecture
- Russ Olsen - Design Patterns In Ruby
- Gang of Four - Design Patterns
- Freeman, Baters, Sierra - Head First Design Patterns
- Martin Fowler - Domain Driven Design
- Martin Kleppmann - Designing Data-Intensive Applications
- Roberto Vitillo - Understanding Distributed Systems
- Ford, Richards, Sadalage, Dehghani - Software Architecture: The Hard Parts
- Robert C. Martin - Clean Architecture
Refactoring
- Martin Fowler - Refactoring
- Jay Fields - Refactoring Ruby
- Joshua Kerievsky - Refactoring To Patterns
Testing
- Thoutbot: Testing Rails
- GoRails: Testing Series
- Micheal Feathers - Working Effectively With Existing Code
- Gerard Meszaros - XUnit Test Patterns: Refactoring Test Code
Security
Intro
Deeper
- Lewandowski, Adkins, Beyer, et al - Building Secure and Reliable Systems
- Gilam & Barth - Zero Trust Networks
- Cliff Stoll - The Cuckoo’s Egg: Tracking a Spy Through the Maze of Computer Espionage
- Michael Zalewski - Tangled Web: A Guide to Securing Modern Web Applications
- Yaworski - Real-World Bug Hunting
- Stuttard & Pinto - The Web Application Hacker’s Handbook
- Sandworm: A New Era of Cyberwar and the Hunt for the Kremlin’s Most Dangerous Hackers
Performance
DevOps
- Site Reliability Engineering: How Google Runs Production Systems
- Murphy, Rensin, Kawahara, Throne, Beyer - The Site Reliability Workbook: Practical Ways to Implement SRE
- Brendan Gregg - Systems Performance: Enterprise and the Cloud
- Stevens & Rago - Advanced Programming in Unix Environment
- Kim, Debois, Willis, Humber - The DevOps Handbook
- Michael Nygard - Release It!: Design and Deploy Production-Ready Software
Fundamentals of computer science
This is the lifelong journey of learning the computer science foundations that will stand the test of time.
Resources
Low-level programming
Recommendations from co-workers on low-level programming resources.
- Igor Zhirkovlow - Low-level programming
- Thorsten Ball - Writing An Interpreter In Go
- Thorsten Ball - Writing A Compiler In Go (Book)
- Zero To Production With Rust
- A Gentle Introduction To Rust
Healthy reminders and inspiration
Peak under the magic
- Start to peek underneath the “magic”
- Re-build the tools, read the source code instead of the docs, and contribute to the open source project
- Look for courses that teach how to build the tools from scratch in addition to courses that teach how to use them
- Play around with the source code and see what breaks
There is no rush
- It’s a marathon, not a sprint
- Software development is a craft, not an academic study
- The only way to get better is to learn by doing, building, and getting feedback on your work
- No one can learn everything there is to know in software
- Don’t try to memorize things
- It’s okay to take weeks to months-long breaks from learning if it’s becoming too much or the season of life is too full
- Make sure to protect the fun
The place of books
- Books are collections of learnings that authors have gained over time by actually doing things and making the mistakes
- Books are not a primary way of learning craft-based skill sets
- Books are there to refine a craft using knowledge, mistakes, and learnings from those that have gone before
- You do not learn to ride a bike by reading about it
- Improve the consumption of books by stopping just before the author implements the solution and first really trying to implement it yourself. Then compare to see how the author did it
The place of courses
- Courses are also not the primary way of learning craft-based skill sets
- Courses are there to get you started or introduce a new concept or tool
- Can improve the consumption of course by building along with the instructor
- The goal is that after the course you then build independently
- Improve the consumption of courses by stopping just before the instructor implements the solution and first really trying to implement it yourself. Then compare to see how the author did it