Houjun Liu

software dev starter pack

Here’s a bit of a guide to start in software development. It is mostly links to other resources that would help.

Introductory Remarks

Nobody “learns” software development. Even in job interviews, people expect you to have “worked” in software development. The industry, as a whole, drives via “learn-by-doing”, so its best to start thinking about what you want to achieve with software dev in terms of projects, then look specifically for resources to help you achieve those. Once you Google enough, et viola! You will have the skills needed to tackle another project.

Common Tooling

There are some common tooling that is standard across all of software development.

Google

Google it! 99.98% of programming skills center around google-fu. Learn to Google unknown terms and get a better sense of the picture. The same rule applies through this guide as well.

StackExchange

A group of very mean people put together a very helpful family of websites which are essentially vicious forum boards. They are the StackExchange family of boards.

The most famous of which, and the one focused on programming, is called StackOverflow. StackOverflow (“SO”) is an extremely helpful resource for browsing any question you may have. For instance, if your code crashes with a stack trace, Googling the error and set site:stackoverflow.com will get you pretty far.

If you ask a question, though, be prepared to get yelled at though, the likely reason is that your question is already answered.

macOS

For the quick-start type of hardware fitting for this guide: get a macBook. Even the cheapest one.

Development on Windows is like cooking on campfire. Doable, useful for specific things, but not great overall. If you have a PC, I would (and recommend! its great for advanced users especially) to put Debian/Ubuntu/some easy to use Linux on it. Windows is just terrible.

I should add that Microsoft started doing Windows Subsystem for Linux: https://docs.microsoft.com/en-us/windows/wsl/install, which apparently have been pretty good. So worth taking a shot if you are stuck on Windows.

*nix Terminal

BSD/UNIX terminal is a tool that essentially skips the fancy user interface (UI) which your operating system draws and directly runs things “organically.” If you see something in a guide that says like:

“please execute”

python3 test.py

or perhaps

wget https://wandb.ai/jemoka >> test

they are probably asking you to type it (“execute it”) into the Terminal and hit enter.

Read this guide put together by the Ubuntu people, it’s very good. To open the terminal on your macOS device, open an app called Terminal.app. On Ubuntu, I believe its also an app called terminal.

IDE

An “IDE” is an Integrated Development Environment. It is where code is written. Fortunately, this is an easy one: use VSCode. There is literally no better tool out there for beginners and advanced users; no wonder it has 70% market share.

Sidenote: But Jack? What do you use? I use something called emacs for very specific reasons. Please don’t unless you really want misery and to learn a whole language to configure it.

Computer Language Architecture

This is how an idea turns into “stuff” on your screen.

Human programming languages (“Python”), are a very readable sort of code. No computers can actually read it. Usually, code you write goes through a three-step process before its able to be ran.

First, the language you write gets converted by a “compiler” or “interpreter”, specialized pieces of code that takes human programming languages into a more machine-readable form of code named “assembly” or “byte code” respectively, called the “intermediate”.

For now, think of the difference between compilers and interpreters as translating code either all-at-once (compilers) or line-by-line (interpreters). Because the former has a grander view of the whole, languages that use a compiler (“compiled languages”) are faster. Although, many programmers find languages that use in interpreter (“interpreted language”) easier because they can spot problems line by line.

But wait! There’s more. Assembly and byte-code (what compilers and interpreters generate) are not actually runnable by a computer. Yet another piece of software called a “runtime” takes the reasonably-machine-readable code and actually performs the required operations.

Some runtimes for languages like C++ uses the raw x86 CPU, which is the stereotypical “binary” zeros-and-ones. Some other languages, say Java, uses horribly complex runtimes that amounts to a whole virtual machine.

Here’s a bit of a table.

LanguageC/ICompiler/InterpreterIntermediateRuntime
PythonIpythonpython bytecodepython
JavaCjavacjava objectjava VM
JavaScriptIV8 (literally)js bytecodeweb browser!
C/C++Cgcc/clangx86 asmx86 cpu

Wonder what the runtimes for languages like Java are built in? C/C++. Eventually it all becomes x86 cpu instructions but its like a layer cake. This is why Python and friends are called a “higher level language”.

git

Git is where all the code is!

Git is a decentralized “version-control” system. It is basically a timestamp-backup system of code with messages and branching.

GitHub is a website where people like to back up their code. Here’s my profile on GitHub.

Managing Git is pretty… Involved. It, for instance, assumes familiarity with the Terminal as described above. I suggest learning it, though. Here are some good resources:

Industry-Specific Skills

What you start with doesn’t matter, but start with something

Its easiest to learn programming if you have a project in mind. So, find a project in mind—what it is, though, doesn’t matter. The concepts across programming are highly transferable, but the actual skill is easiest to learn if you are learning w.r.t. a project.

Data science, prototyping, and machine learning

Python would be your friend for all things of programming where the act of programming is a means to an end. That is: if you are writing code to do something that’s not inherently software (data science, machine learning, heck, also manipulating quantum qubits), Python is your friend.

Its a language that’s designed to be easy to write: is a very do-as-I-say language that sacrifices efficiency and elegance for getting crap done. This is how I started programming. This is the book I started with. It teaches Python through programming a series of small projects that are mostly Terminal games.

To learn data science, Nueva’s very own data science course give very good conceptual framework. A typical first project is to recognize pictures of handwritten digits, for which there is a good guide. I also started something called AIBridge with AIFS, so if we ever publish the recordings I will put them here.

Google also: pip, ipython, Jupyter.

Backend engineering

Backend engineering is the science of dealing with databases and writing API (application programming interfaces). I don’t suggest starting with this, but if you are particularly interested in databases, you could!

To master backend engineering, first learn a database manipulation language. For 99.98% of the industry, this means mysql. The link directs to a pretty good guide.

Furthermore, the language with which backend is written is Java. I hate to say it, but despite Java’s terribleness (don’t worry about it ;)) its very dependable. Here’s a book on Java. In general, I really like all of the books from no starch press.

Frontend and Web engineering

Do you like making stuff move? Do you like drawing buttons? Front end maybe for you. The most basic type of front-end engineering is making websites.

Start by making a “vanilla website”: HTML (what’s on the page), CSS (what colours and sizes), JavaScript (how it moves) is the standard trio of languages to start. freeCodeCamp (a great Medium blog, check their stuff out) has a good guide on the matter.

However, as you progress in your journey, you will find these tools woefully inadequate. Hence, most people writing web front end move on to something called a “JavaScript Framework”, a tool to generate a “vanilla” website from some more easily manipulable JS (changing the text on the page moves from a four line operation (indexing, selecting, grabbing, changing) to a one-liner (state.text=new text)).

A popular JS framework is ReactJS. Check them out.

Fullstack Engineering

Frontend + Backend.

Game development

Game development is honestly one of the most horribly complicated and richly science-y part of CS. I am not super experience in game development but learning C++ and mastering Unity, the game engine. Oh, right, game dev is the only, and I repeat only (with invisible footnotes and qualifications) reason why you should be writing code on Windows.

A friend is good at game dev, I can make an intro if needed.

Good Luck!

Remember: Google-fu and project-based curiosity is your friend. Let me know if you have questions.