DANIEL

OKEY

-

OKORO

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.

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 2, if the tutor uses a certain JavaScript framework pick a different library.

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.

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... 7

DSLs: SQL, YAML 3, Cloudformation, Terraform, GitHub Actions

Concepts: AWS, GCP, IaC, DevOps, BDD, NoSQL vs SQL, APIs, Observability, Architecture

Links:

Deeper Knowledge#

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.

Links:

  • 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.

Invention#

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.

Links:

  • wikihow: How to Handle Fame (with Pictures) 5 6

Revisions#

  • 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.

  1. I've arranged it in a certain way but, in reality, you could traverse the graph anyhow you want; until you achieve your goals.
  2. watch out for typos; don't say I didn't warn you ;)
  3. choose 1 from the languages section of this phase
  4. I plan to write something that fills this gap, someday.
  5. lol...but seriously, you'll be writing a considerable amount of YAML
  6. cursed ?
  7. Make sure you read the Comment Section!
  8. lol