Advice For The Aspiring Software Person
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.
Introduction
Here’s an undirected I’ve arranged it in a certain way but, in reality, you could traverse the graph anyhow you want; until you achieve your goals. graph:
.
Learn To Solve Problems With Code
|
|
|
|
Side Projects + Open Source + TDD
|
|
/ \
/ \
/ \
/ \
Algorithms Product Engineering
+ +
Data Structures Systems Design
+ +
Concurrency DevOps
\ /
Computer Science Impelementation
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 watch out for typos; don’t say I didn’t warn you ;) 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.
Languages: Python, JavaScript, HTML, CSS, Markdown.
Tools: VSCode, Git, GitHub, Live Server, Terminal.
Links: ↴
- freecodecamp: Responsive Web Design Certification
- freecodecamp: JavaScript Algorithms and Data Structures 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.
I’ll also advise that if you’re following a tutorial you should stray from the pre-defined path: if Python is used in the tutorial — use another programming language instead choose 1 from the languages section of this phase, if the tutor uses a certain JavaScript framework — pick a different library.
Learn a systems programming language; soemthing that’ll teach you about; pointers, stack vs heap, memory management. You dont want to go too far in your career without learning this stuff…the looner the better in my opinion.
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", "Rust", "C",
]))'
Tools: Docker/Docker-Compose, Shell Scripts, Make, Google, Stack Overflow, Github Issues, Reddit.
Links: ↴
- freecodecamp: Take Home Projects
- Coding Train
- Design of Computer Programs
- https://github.com/norvig/pytudes
- https://git-rebase.io/
- 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!
Languages: Python
Links: ↴
- educative: Grokking the Coding Interview
- educative: Grokking Dynamic Programming
- Elements Of Programming Interviews in Python
- Little Book fof Semaphores
- Essential Algorithms - Rod Stephens
- Algorithms - Robert Sedgewick & Kevin Wayne
- educative: Python Concurrency for Interviews
- You Don’t Know JS: Async and Performance
- https://leetcode.com/subscribe/
- https://binarysearch.com/learn
- https://algoexpert.io
- https://interviewcake.com
- https://interviewing.io/
- https://teamblind.com/
- https://www.levels.fyi/
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… I plan to write something that fills this gap, someday.
DSLs: SQL, YAML lol…but seriously, you’ll be writing a considerable amount of YAML, Cloudformation, Terraform, GitHub Actions
Concepts: AWS, GCP, IaC, DevOps, BDD, NoSQL vs SQL, APIs, Observability, Architecture
Links: ↴
- Principles of Computer Systems Design https://ocw.mit.edu/resources/res-6-004-principles-of-computer-system-design-an-introduction-spring-2009/online-textbook/part_ii_open_5_0.pdf
- 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
- systeminterview
- educative: Grokking the System Design Interview
- educative: Web Application Software Architecture
- Martin Fowler: everything here except “UML Distilled”
Computer Science Implementation
Summary: Taking computer science courses with a focus on writing code you can put on github, and having fun!
Compilers
Excericise: Build a compiler and interpreter for a single programming language
Writing An Interpreter in Go Writing A Compiler in Go Crafting Interpreters udacity ud168 Compilers udacity cs262 Interpreters - https://www.udacity.com/course/programming-languages—cs262 you’re going to build interpreters for javascript and html (this is why the course is called building a browser) Dragon Book after reading any of the books higher up in the list you’ll be less intimidated by the dragon book MLIR https://arxiv.org/pdf/2002.11054.pdf *cutting edge
Data Systems
Exercise: Build a distributed database
DDIA chapter 3 to be specific Database Internals Cassandra Internals Kafka Internals Dynamo paper BigTable paper Spanner paper Algorithms and Data Structures for Massive Datasets https://www.manning.com/books/algorithms-and-data-structures-for-massive-datasets Timely Dataflow paper cutting edge? https://dl.acm.org/doi/pdf/10.1145/2517349.2522738 https://github.com/TimelyDataflow/timely-dataflow
CS186Berkeley https://www.youtube.com/user/CS186Berkeley/playlists?view=1&sort=lad&flow=grid
Operating Systems
Exercise: Build an Operating System
Project Oberon http://www.projectoberon.com/ https://people.inf.ethz.ch/wirth/ https://people.inf.ethz.ch/wirth/ProjectOberon/index.html https://people.inf.ethz.ch/wirth/ProjectOberon/PO.System.pdf https://people.inf.ethz.ch/wirth/ProjectOberon/PO.Applications.pdf https://people.inf.ethz.ch/wirth/ProjectOberon/PO.Computer.pdf
OSTEP
xv6 course and book https://github.com/mit-pdos/xv6-riscv-fall19 https://pdos.csail.mit.edu/6.828/2020/overview.html
udacity ud923
udacity ud189
Theoretical Computer Science
Understanding Computation New Turing Omnibus udacity ud061 Introduction to Automata Theory, Languages, and Computation
Math
Exercise
Programmer’s Introduction to Math https://gumroad.com/j2kun?recommended_by=search#ykRBH The Little Prover Discrete Mathematics Lov´asz Mathematics for Computer Science https://www.youtube.com/playlist?list=PLB7540DEDD482705B Essence of Linear Algebra https://www.youtube.com/playlist?list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab
Hardware
Exercise: Complete the NAND 2 TETRIS exercises
Nand to Tetris
Bilkent Online Courses - Computer Organization https://www.youtube.com/watch?v=CDO28Esqmcg&list=PLhwVAYxlh5dvB1MkZrcRZy6x_a2yORNAu *very impressed by the teacher; he’s very energetic and entertaining. book is Computer Organization and Design; the hardware software interface
Computer Systems; A Programmer’s Perspective - O’Hallaron
Hardware Software Interface https://www.youtube.com/playlist?list=PL0oekSefhQVJdk0hSRu6sZ2teWM740NtL
https://www.udacity.com/course/embedded-systems—ud169
udacity high performance computer architecture - https://www.udacity.com/course/high-performance-computer-architecture—ud007
Great Ideas in Computer Architecture https://inst.eecs.berkeley.edu//~cs61c/sp15/
https://www.amazon.com/Digital-Design-Computer-Architecture-Harris/dp/0123944244
Distributed Systems
- Raft paper
- MIT Distributed Systems https://www.youtube.com/playlist?list=PLrw6a1wE39_tb2fErI4-WkMbsvGQk9_UB
- Leslie Lamport TLA+ https://www.youtube.com/playlist?list=PLWAv2Etpa7AOAwkreYImYt0gIpOdWQevD
- Specifying Systems
- Practical TLA+
- Distributed Algorithms Wan Fokkink
AI
PAIP https://github.com/norvig/paip-lisp Programming Colelctive Intelligence AIMA Deep Learning - Ian Goodfellow Grokking Machine Learning Grokking AI Algorithms Grokking Deep Learning
Graphics
Foundations of 3D Computer Graphics The Ray Tracer Challenge https://www.manning.com/books/math-for-programmers
Revisions
- January 03, 2021: Published.
- 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.