DANIEL OKEY - OKORO

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:

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

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:

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:

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

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.

A Newsletter

Subscribe for (free) access to subscriber-only content.

Table of Contents