Advice For The Aspiring Software Person
January 03, 2021
8 min read
Yesterday marked the third time someone had reached out to me; asking for advice on how to get started in software. After two ad-hoc attempts at trying to pass on what I've learned, I thought it best to sit down and try to crystallize my thoughts into a blog post. This way, in the unlikely event that I get any more requests, I'll be able to refer future inquirers to this.
Here's an undirected 0 graph:
Learn To Solve Problems With Code | | | | Side Projects + Open Source + TDD | | / \ / \ / \ / \ Algorithms Product Engineering + + Data Structures Systems Design + + Concurrency DevOps \ / Deeper Knowledge | | | Invention
Learn To Solve Problems With Code#
Summary: This phase is about getting comfortable writing code and learning to write code that doesn't suck by keeping things simple.
The Number 1 Rule at this stage is ABC: Always Be Coding. Simply following this rule should tilt the probability of success in your favor.
Rule Number 2 should probably be Focus. Software is a frustratingly large field; when starting out you need to get good at following instructions carefully 1 and not straying from the pre-defined path. If you stray from the pre-defined path too early you'll get stuck. Don't get stuck at this phase.
Rule Number 3 is to keep all the code you write in version control. I've included 2 beginner-friendly Git courses in the list of links.
- freecodecamp: Responsive Web Design Certification
- freecodecamp: Scientific Computing with Python Certification
- SuperHi: Tutorials & YouTube Channel
- udacity: How to Use Git and GitHub
- udacity: Version Control with Git
- freecodecamp: Front End Libraries Projects
- freecodecamp: APIs and Microservices Projects
- freecodecamp: Quality Assurance Projects
- Stuff Everybody Knows Except You pt. 1
- Stuff Everybody Knows Except You pt. 2
- Stuff Everybody Knows Except You Redux
- Learn Python The Hard Way
- Grokking Simplicity
- Composing Software
Side Projects + Open Source + TDD#
Summary: At this phase you'll start building non-trivial projects, stuff that you can put on your resume when applying for an entry-level job.
You will get stuck at this stage and you'll have to learn how to get unstuck i.e. debugging. In the last phase, you were supposed to make sure you did not get stuck. In this phase, you will inevitably get stuck because you'll be dealing with more sophisticated concepts. You'll find that communication starts to breakdown now and then because the ideas are harder to communicate; usually, the author is assuming that you have prior knowledge that you do not.
This phase is hallmarked by struggle. The toughest part of being a professional developer is being able to struggle effectively i.e. being productive even though there's a lot you don't know and have to learn.
Lastly, at this phase, you should write tests for all code you publish.
Languages: Paste the code below into your terminal, press Enter, and learn whatever language gets printed to the screen;
python -c 'import random; print(random.choice([ "Cpp", "Golang", "Kotlin", "Rust", "Swift", "C", "Nim" ]))'
Tools: Docker/Docker-Compose, Shell Scripts, Make, Google, Stack Overflow, Github Issues, Reddit.
- freecodecamp: Take Home Projects
- Coding Train
- Design of Computer Programs
- Architecture Patterns with Python
- destroyallsoftware: From Scratch
- 500 Lines or Less
- Architecture of Open Source vol. I
- Learn More Python The Hard Way
- Learn C The Hard Way
Algorithms + Data Structures + Concurrency#
Summary: If you want to land a job at a big tech company you'll have to master the art of solving leetcode-style coding problems.
I'm currently writing something on this!
- educative: Grokking the Coding Interview
- educative: Grokking Dynamic Programming
- Elements Of Programming Interviews in Python
- Essential Algorithms - Rod Stephens
- Algorithms - Robert Sedgewick & Kevin Wayne
- educative: Python Concurrency for Interviews
- You Don't Know JS: Async and Performance
Product Engineering + Systems Design + DevOps#
Summary: If you're interested in being able to take a project from idea to production, this is the phase for you.
Unfortunately, I'm not 100% satisfied with any of the links in this phase; they're all lacking in one area or the other.
If one covers BDD, it doesn't cover IaC/AWS. If one covers IaC/AWS, it doesn't cover payments. If one covers payments, it doesn't cover REST APIs... 7
DSLs: SQL, YAML 3, Cloudformation, Terraform, GitHub Actions
Concepts: AWS, GCP, IaC, DevOps, BDD, NoSQL vs SQL, APIs, Observability, Architecture
- Production-ready Serverless
- Flask Mega Tutorial
- DynamoDB Book
- Build A SaaS App With Flask
- REST APIs with Flask and Python
- Advanced REST APIs with Flask and Python
- Testdriven Laravel
- udacity: Web Application Engineering
- educative: Grokking the System Design Interview
- educative: Web Application Software Architecture
- Martin Fowler: everything here except "UML Distilled"
Summary: You'll start learning about stuff that doesn't show up in most; job descriptions, blog posts or forums.
You get the sudden urge to write your own programming language.
You feel compelled to actually start reading open source code.
You want to learn how Regular Expression Engines are implemented.
You decide you need to learn real Math.
You pick up Formal Methods.
You want to read the specs for web protocols.
You'd like to build your own Text Editor.
You want to build a distributed Database.
You decide to actually learn how browsers really work.
You actually try to understand SVG.
You want to implement the theories presented in some research papers.
You wonder how one goes about writing a static analysis tool.
You want to write a Web Framework.
You want to build an Operating System.
You wonder what it would take to build a Web Browser.
You think to yourself "VLC is open source, right?".
You decide you have to learn Prolog.
You ask; "Does anyone actually understand the Actor model?".
You decide to actually read SICP (and learn LISP...).
Oh, and of course, you're going to build a Ray Tracer...
No one expects you to have done any of the things above, but chances are you're destined 4 to end up doing some of them. You just can't help yourself.
- You're going to have to do this one on your own, for now...sorry.
- I plan on crossing some of these off my bucket list someday. So maybe sometime in the future I'll have more for you.
Summary: Wild speculation that should probably be ignored.
In the process of gaining Deeper Knowledge you discover that you could improve the state-of-the-art in some way.
You write some code. Or, a whitepaper. Or both.
You upload it to github. Or arxiv. Or both.
And, you smile with glee as your fellow software people on the orange website shower you with compliments and money.
- January 03, 2021: Published upon request from my mother (believe it or not, lol)
- January 20, 2021: Added Martin Fowler. How could I forget Martin Fowler...
- January 23, 2021: Linked to https://cosmicpython.com. Replaced pseudo-code with Python. Added "Deeper Knowledge" section. Added "Invention" section.
- I've arranged it in a certain way but, in reality, you could traverse the graph anyhow you want; until you achieve your goals.↩
- watch out for typos; don't say I didn't warn you ;)↩
- choose 1 from the languages section of this phase↩
- I plan to write something that fills this gap, someday.↩
- lol...but seriously, you'll be writing a considerable amount of YAML↩
- cursed ?↩
- Make sure you read the Comment Section!↩