Private Tutoring
Thank you for your interest in private tutoring with me. I offer guided instruction to help you understand how to interface with the computer directly via Unix commands and C programming. The program I offer below assumes that you already have enough knowledge to write decent programs in a high-level language like Python or JavaScript, but that you don't understand how those languages work and you want to increase your knowledge and confidence. If you are not at that level, I can still help you, but some initial classes will be required to cover some of the basics.
Assuming you have that knowledge, by the end of my first two six-week courses, you will be confident writing code in C, including some complex data structures like trees, managing memory, and manipulating pointers. If you attend any courses beyond that point with me, I can take you on an advanced exploration of network programming, high-level language design, graphics, including frontend programming, and at some point, even building a Turing machine or VM.
My Teaching Style
I learned programming without a lot of bells and whistles. From the beginning, I have generally written code in the command line, using either Emacs or Vim. I am fluent in most basic shell operations, and I'm even learning sed and awk so that I don't even have to open a file to edit it! Writing code using time-tested Unix tools teaches a way of thinking that is uncluttered, and allows you to grasp underlying principles without the distractions of over-complicated tools.
When you write code with me, I won't be forcing you to use any particular tools, but I will be strongly encouraging you to use the command line and learn Vim, as massive productivity enhancements. The use of any gen-AI based tools is not permitted in class. You can use those whenever you want, but you will shortcut learning. There's no point coming to one of my classes just to vibe-code the answers to my exercises.
Once you learn Vim keybindings, you can use plugins to add them to your favourite IDE and even to your web browser, as the shortcuts really do make text navigation faster. If you don't already have a typing speed of at least 60wpm, I will also be encouraging you to work on that. I have some links if you need them. If you work at a computer every day, it is your responsibility to yourself to be good at it.
We will also be writing in C, for the entirety of the first six-week course, and the second one if you are with me for that. You will learn valuable lessons about how the computer works, and the pitfalls of a language with no guardrails, that will then illustrate to you the benefits of specific higher-level languages. The syntax looks weird at first, and you have to learn a lot of concepts that seem tedious when a high-level language does it so much faster, but there is no other way to access the computer at such a low level and understand so clearly why high-level languages have been designed the way they are. This will enhance your understanding of those higher-level languages, making you more effective.
If C is challenging to understand at first, I am able to pause the flow of instruction in C and illustrate some concepts in Python, JavaScript, Java, or Go, depending on what you are most comfortable with. What I can show you in those languages will make C more comprehensible, as well as giving you a bunch of tips for how to use those languages more effectively.
My teaching style is very hands on. I will be sharing my screen and coding in the terminal for you to see, live. I will expect you to follow along, typing some code, offering solutions to problems, hypothesising about your expectations, and taking notes of what you learn. I will hand out enough homework to keep you busy outside of classes. It will be important for you to complete some minimal homework to reinforce the understanding of syntax and program design. I will offer additional optional homework where desired, to allow you to deepen your understanding.
Courses
Tutoring will be offered in six week segments. Some flexilibity on topics covered and exercises performed will be possible, depending on your prior experience, and your comfort with the exercises. The first two courses are prerequisites. If you are interested in further tutoring past that point, you are free to choose which courses are of interest to you.
My first two courses will teach you in a hands-on way about how the computer works. You will gain the confidence to analyse higher-level code. If you stick around for the following courses, you could become a very capable full-stack developer, able to reason about any system you touch.
In general, the topics will be as follows.
Course One
From string manipulation in C, through to the beginnings of a parser. This course follows some of the classic exercises taught in the famous K&R's C Programming Language, to teach you how to parse user input.
You will learn common I/O operations in C, how to make your own headers and libraries, and how to implement common string operations, like finding the length of a string, converting case, wrapping lines of text, stripping out comments, all the way to detecting malformed input with mismatched parentheses or missing semi-colons. You will learn how to implement common command line utilities like cat, echo, and grep.
All this work takes place on the stack. You will learn about how to manage data in C without allocating any memory. You will learn about the limitations of this, along with lots of interesting ways to make your program blow up in your face. By the end of this course you will have a good understanding of how to use automatic memory allocation to your advantage.
By the end of the course, you will have written a basic C linter, with the option of extending it as far as you wish. This will teach you the fundamentals of string manipulation, along with the logical tools required to start thinking about algorithms which allow you to tackle harder and harder problems.
Course Two
This course takes you through memory allocation. In the previous course, you were able to build up program complexity without allocating a single byte on the heap. Now you will go a layer deeper and learn how to control memory yourself.
Once you introduce memory allocation, you inevitably have to learn about ownership. This is where learning C pays off. You will encounter so many null pointer errors that you will long for a language that makes it all intelligible (hint: that's where Rust comes in, but that's for another time. This course helps you understand why you need a borrow checker).
In this course we will expand on the previous work with strings to start creating more complex data structures. We will begin with implementing the functions to split strings of input into arrays of strings, and to join arrays of strings into a single string. This involves more fiddly manipulation than you would expect.
By the end of that project, you will be ready to start implementing linked lists and trees in C. Depending on your progress, we will start doing that in this course, or you can use the descriptions on Wikipedia to figure it out on your own (it's not as daunting as it seems, once you have the foundations).
With this knowledge, you will be ready to start understanding the B+trees used as the foundations for safe and persistent data storage in databases, the trie trees used for URL routing in server frameworks, and the trees used for file systems, search engines, auto-completion and much more.
Networking Course
For anyone who is interested specifically in networking, here are some of the topics I can cover with you:
- Socket programming in C (or a safer language like Go or Rust). We will accept curl requests, parse them into request line, headers, body, and send back a properly constructed response. This will make you familiar with the format of HTTP messages, help you understand input buffering and string parsing, and build your skills of error handling with malformed input.
- Building backend servers in Flask and with Go's Net/HTTP library, or optionally with NodeJS's Net library, which will force you to learn callbacks and promises and asynchronous code handling. We will set up some APIs, learn about path variables and queries, handling request bodies, use database ORMs to update a database, and construct server side templates to reduce the weight of pages sent to the user with dynamic data.
- Deploy one of these programs on Docker with environment variables and separate container. This will teach you some Docker best practices, how to deploy to containers, a bit about container registries and CI/CD best practices, container networking, and more.
- Use Docker Compose to deploy a load balancer that you create, with a primitive version of NAT. You'll learn about NAT, load balancing principles and algorithms, security concerns, performance testing, and the details of configuration with Docker Compose, which prepares you for understanding Kubernetes, and container networking in more detail.
- Deploy an application on Kubernetes. This will teach you the basics of cloud networking and container orchestration, maintenance of state, load balancing, auto scaling, and the other concerns of distributed computing at scale.
- I can also teach frontend programming with JavaScript, HTML, CSS, and a frontend framework like React, as well as the basics of browser implementation and graphics programming, though this is all part of a much larger scope, so it's up to you whether we discuss any of this.
- Some more network troubleshooting, using Unix tools, browser inspection, etc. We can also cover some of the concepts of subnets, security through TLS and other measures, and the details of network protocols like TCP and UDP.
Note that we may need more than six weeks to get through all these projects, depending on your current level of understanding. Once you have a foundation in request and response handling, and container orchestration, you will be well ahead of most developers.
Other courses
My other offerings are still quite flexible. Here's an overview of the sort of topics I am prepared to offer:
- The semantics of programming languages - what is a function, a class, an environment, a callback, a data structure? We dive into the details of parsing, assembly, and scope resolution, learning about how the syntax you see in your high level language gets translated into something the computer can understand. Your ability to read source code will significantly improve after this.
- Socket programming and web frameworks - we will start with a socket-based webserver in C, which listens on a socket, parses messages according to the HTTP protocol, and constructs a response. You will get deeply familiar with the HTTP RFC, memory allocation, string parsing, and some of the pain of low-level I/O programming. From there you will learn how to use the high-level primitives made available by frameworks like ExpressJS, Python Flask, and the net/http library of Go. We will build a simple web page in all three, with some basic styling, giving you the confidence to make simple websites of your own, and never be intimidated by a web framework again, not even Django or Spring Boot.
- Graphics programming - we will start with creating a window in Python's tKinter library, the foundation of creating desktop programs. From there we will use Pygame to create a controllable sprite. I will illustrate how physics programming is used to start encoding video game logic. We will learn how we could use these basic building blocks to create a digital art program such as MS Paint. From there we will learn the same concepts in Go, with Ebitengine. This will reinforce the lesson that graphics programming centres around a very simple loop: update the position of objects based on user input, then draw those objects to the screen. The rest is network calls, database queries, and other external logic, which influences the game. Finally, we will see how this programming is used to create a web browser. We will create some HTML pages with CSS styling, to understand how this code creates page design. We will peek just far enough under the covers to understand how the browser parses a tree structure to render all of this. You will gain the sort of understanding that will enable you to work with complex frontend frameworks such as React, Svelte, or Vue, or to write your own HTML and CSS directly to create old-school websites with an absolute minimum of JavaScript.
Price and Contact Details
If you want to book classes with me one at a time, my price is $300 per hour. But you can get a full six-week course for $1500 (AUD). I am available for a consultation call beforehand to understand your experience and expectations, and to discuss whether this program is suitable for you.
I will need to establish a regular time of week for classes with you, and I expect classes to be booked no less than three days in advance, to enable me to manage my schedule. Cancellations or rescheduling will only be permitted up to 24 hours before the class.
If you are interested, please send me an email at daliasblog@proton.me or message me on LinkedIn