My Journey Banner - san francisco golden gate bridge

My life's path and worldview differ from those of the people around me. As I cannot find what I need in my surroundings, I have had to seek out the necessary resources and teach myself. I therefore think it would be worthwhile to document how I acquired my knowledge of computer science and programming. I have included the open resources that I used to learn in the hope that they will provide you with some useful information.

Let's start from the beginning.

1. Document and Open Course

There's a lot of reading involved in getting my degree, and I have to read a paper almost every week. The amount of reading was stressful. However, getting through it has made it easier for me to start reading any document that interests me.

After my final exam, I started looking for something to do and found a simple document on w3schools.com about the HTML standard. This allowed me to create interactive elements on screen immediately, giving me the confidence and motivation I needed to get started. In the engineering world, it is assumed that all components and processes conform to the standard, enabling them to work together.

Yes, you can open your Notepad now and type in <button>Button</button>, save it as 'index.html' (or any other name ending in '.html'), and open it in a browser.

I read through the document and create the simplest possible website using HTML and CSS. So, I decided to delve a little deeper, and that was the turning point for me. I was looking for a tutorial, but I found that some of the world's most famous universities have made their courses available online for free. As I mentioned, if you can understand English, you have access to the best courses in the world.

The first piece of the puzzle is MIT OpenCourseWare's 6.00 Introduction To Computer Science And Programming. This course introduces you to the fundamental principles of computer science and programming. It provides you with the knowledge and confidence needed to implement algorithms and create programs. It still refreshes my mind if I watch it today. If you're still finding it hard to follow, there's a Crash Course with animation that provides an overview of the subject and its most important concept: the "add one more level of abstraction".

Once I have those concepts in mind, I start looking for something to implement. I chose data visualisation because it is an intersection between design and programming. During the process I find this inspiring, and you can just appreciate the aesthetics of her work.

The first complete project was the The Wealth & Health of Nations. It took me about ten weeknights to finish it. I used D3.js, JavaScript and CSS to implement the project. When I ported the project to this website, it only took me half hour to implement it in Svelte. Once we have mastered something, we often forget how difficult it was to learn it for the first time. So take your time to understand it; there's no hurry. It was at this point that I realised the ability to read a document and determine the correct way to implement a feature is an essential skill for a developer.

2. Project

Now, I have to put my engineering hat back on. I have a basic understanding of variables, functions, control flow and algorithms. While I can write code to complete a task, the software or an application is more than just code. You also need to know how to organise your code and design a system that can solve problems. So I need found a real-word problem to practice. I'm lucky enough to do some of it in my full-time job, starting with page layout and simple components, and moving on to fetching data from the server and managing the components' lifecycle. If you don't have any ideas, you could create a to-do list app like all the frameworks did at that time.

It's tedious to create the user interface using just vanilla JavaScript and HTML. Lukly I found the React framework, which is most popular at that time. It let me feel the joy of programming again. There are different patterns for writing applications with a user interface. React makes the interface code a mapping from states to interface elements, managing the real updates for you. I started taking on projects from scratch and developing them by myself. I also started doing some backend work with Next.js.

3. Dive in

The software engineer sitting next to me advised me to learn networking. I started searching and found the CS144 course, which I will benefit from a lot in future work. The computer network demonstrates another concept: encapsulation. It splits the system into layers, each with its own responsibilities, allowing engineers to work independently on each layer.

I was also recommended to read the book Computer Systems: A Programmer's Perspective. If I could start again now, I would begin with this book. Although it is quite challenging, some computer science students may not even finish it. I have now completed the first cycle of moving from concept to theory to practice and implementation. As with any learning process, this is an iterative and recursive process.

All of my work is done in JavaScript. It's a weakly typed language, which means the type can change at runtime. This makes things simpler for beginners, but to understand how the computer works, I want to learn a strongly typed language.

If you want to know why types are exist, you could look into how information is represented in binary, starting with Two's Complement.

This intersected with my desire to develop for iOS devices, as I had an iPod Touch in high school. Modern iOS development is done in Swift . The tutorials I found are Stanford CS193p which is updated periodically time and books from ObjC.io which are great reading material. Another thing that encourages me is the introduction of SwiftUI, a declarative framework for building user interfaces that is similar to React.

My first app is called Procedural and is a simple tool to helps you manage your best practices. It's simply an implementation of the checklist guide concept. This has given me the confidence to start building more complex apps.

The web application is runing on a browser, which is a software that running on an operating system. The operating system is a software that manages the hardware and hides the complexity of the hardware from the application. So think there must be a line between the hardware and the software. My journey let me bump into the the next piece of the puzzle, which is the Building an 8-bit breadboard computer!

It starts with generating a clock signal using electronic components, and then introduces the computer architecture, including the program counter, ALU, registers, memory and instruction set, as well as the bridge that connects everything together. I want to buy a breadboard and start building my own computer right away. However, cutting wires and soldering components is not for me. I wonder if I can simulate this process using software.

My goal is to understand how computers work from a software perspective. To this end, I have stripped away the physical aspect and started with the four most commonly used gates (AND, OR, NOT and XOR), enabling users to build their own computers with these. While experimenting, I found a way to add and link gates on a touchscreen, as well as model the physical gate in code. I created a product based on my ideas!

I received feedback from users who said that they had used the book But How Does It Know? to help their friends learn the basics of computer science and build their first CPU. I love the feeling I get from helping people and doing something that has a positive impact on others. I applied what I had learnt in my job to the project by adding a Discover Boards feature. This required a server to handle sharing requests, save files to storage, enter information into the database, and verify and authorise downloads of boards.

4. Keep Learning

I truly began my career as a software engineer at a start-up, working alongside a team of engineers in San Francisco. I progressed from working on individual projects to working on team projects. This gave me experience of collaborating with other engineers in areas such as technical design, project management, and code review. If I pursue a career in software engineering, this is the path I want to take. However, my goal is to build something I can be proud of. It's not just the technology behind the product that I need to learn, though. I also need to learn how to run a business.

I'm grateful that computers have had such a positive impact on my life. Other subjects, such as information theory, have also changed my worldview. So the journey continues.

Last Update: May, 2025