This is my first ever open letter, an article I wrote for my younger brother who’s still attending secondary school in Czech Republic. I gave an online talk targeting his comtemporaries in Hong Kong this week, coincidently right after that web seminar he asked my advice on how to get started with programming.
So I decided to rewrite this guide on how to learn computer science in my perspective, last time I wrote such topic was around 10 years ago, long overdue to update regarding to how tech industry changed these days. Here’s my open letter.
We’re living in an era of technologies rapidly evolving and things rapidly changing. In spite of numerous ground breaking technologies we had developed in last two decades, the nature of information technology had never changed.
So the reason I want to discuss about this so-called old-fashioned way learning is because if you really want to dive into the world of computer science, it’s really important to know something not even related to computer science itself first.
Understand the nature of things
Very few who works in IT industry understand what people invented computer and Internet for, and how it evolved to what we have today. Lack of understanding things we learn leads to be a follower in these fields always. Be ambitious about what you really fond of, if it is computer science you find passion about, be a leader in this field, not a follower. It requires lots more to become a leader, get to know its history and understand its nature is first step.
Technologies are meant to be built for a better world, and in real world we face problems beyond data structure and algorithm. Programs are being used in scientific calculation, military, business, entertainment and many more fields. Ton of skillsets and directions can be explored in terms of computer science and it’s up to you to pick which interest you most. Take your time to understand this world better and observe how people use technology to solve problems in old times and now, learn what people think of future via sci-fi movies and games.
There are over 20 mainstream programming languages nowadays, the very first question is always ask yourself why. You will find different programming language is like different screw driver in a tool kit. Some of them serve entirely different purposes, some of them are good competitors but in different fields.
Colleges around the world find it troublesome to follow up latest tech in educating system even that tech had been widely using for years. Unlike other mainstream majors, computer science is for people who have strong ability in self teaching, not for those who just follow trends.
So think about the nature of things and ask why a lot, it will help you understand how things happen in various ways and surely it’s a basic skill in programming.
What to look into from scratch
For generation Z like you, Internet, smart phones and optical network are like the air you breathe everyday. It’s so natural that most of young generation think it’s actually simple to build an app or deploy a website, the truth is, it’s not.
Engineers from big cooperations like Apple, Google and Microsoft have needs to make it easy for seasoned developers from third-party companies to build apps based on their platform or we say ecosystem, and that’s a business oriented act in most cases.
My first advice in learning programming is to learn what operating system really is first, to understand the relationship between hardware and software. Most end users think operating system is just a GUI(Graphical User Interface) program. Obviously Mac OS, Windows and Linux have entirely different GUI but is that it? What’s the real difference between these operating systems? Why I just can’t run games I play in Windows on Mac or Linux?
Operating system is an utterly complicated program used for managing hardware resources to support apps to run in harmony with each other based on it. Linux is so far the best OS to start with since it’s open source and popular, you can figure out a clear hierarchy of operating system and get help whenever you have question from its large user-based community online.
Beside Ubuntu you mentioned earlier which is really user friendly to general users, I strongly recommend to try out Linux From Scratch(LFS), to compile the whole operating system by yourself on your box with fully customization, you will be proud of yourself to make it work for the first time and have a basic understanding with regard to the role of
- operating system kernel
- hardware driver
- file system and partition
- initial services
- and many more
If you are unfamiliar with basic shell commands or some very basic concepts, checkout the book UNIX and Linux System Administration Handbook first, you don’t have to learn every chapter from this book, just make sure you understand some basic concepts and shell commands, that will be enough for beginning.
LFS is definitely not for those who are really new to Linux, if you find it really difficult to understand what its documentation is talking about, try Gentoo or ArchLinux instead, these two are my favorite Linux distributions and they can serve same purpose which is to understand the hierarchy of a computer system first.
You should try these experiments on compiling an operating system from scratch in a virtual machine if you have only one PC to play with, then try using Gentoo or ArchLinux as your host environment when you have enough confidence.
Which language to start anyway?
There is one very simple answer to this newbie question we see everyday, it’s Python. The reason most people including me recommend Python is because it’s easy to start with and really practical in various fields. With modern designs, Python has ton of libraries prepared for beginners to implement different functions to solve some real world problem. You will get positive feedbacks instantly and constantly while learning interpreted programming language like Python.
Programming == Data Structure + Algorithm. It doesn’t matter which language you use at the beginning actually, what matters most is to train your logical thinking. Intelligence is a word we define as an ability to solve complicated problems and programming is all about how to solve problems step by step and how to make your solution efficient and robust.
It’s easy to build an app and website nowadays, but I also mentioned the truth is not. What does that mean? Say we use a famous web dev framework called Django which based on Python to develop a website for your personal blog. You will find lots of libraries supporting Django for developers to implent a function called album. With those libraries you can easily use them and have your own photo upload and management function implemented in your website. But did you know how it works and customize it in the way you want? Absolutely not, for beginning in programming, we need to avoid those shortcuts when possible. We are not about being a library user from the very beginning, we’re about being an engineer, a true engineer need to know how things work and be creative, that’s a very big difference right there.
Python has a well-written tutorial on its official website, check it out first and watch how people teach Python on YouTube in their own ways will help a lot.
What kind of project you can start with?
In my opinion, anything fun like personal blog or games will be a good start. Be creative.
With libraries and frameworks you can use immediately based on Python, one can write a blog system without breaking a sweat, what you really should learn during this process is to understand how different components work together in a program. For example, to implement a rich text editor in blog system, you will find many open source solutions out there already, whether they are written in Python or not, you can always learn how people think differently regarding to a simple task. It will inspire you a lot and shape your own coding style after learning from masters.
What’s the old-fashioned way really?
If you find it interesting to dig into how operating system really works, you can start from C alternatively. You will establish a really solid foundation in understanding computer science after you finish reading the book Computer Systems: A Programmer’s Perspective. I finished it when I was in high school and I think it could be too early for you to read it right now but to establish a solid foundation in understanding computer system is what my point really about.
There are many terms in this article you may find hard to understand, feel free to Google or ask me. Train your self-teaching ability, do critical thinking often and keep curious all the time. Enjoy your time in the world of 1 and 0.
- Learn what a hacker spirit is: How to become a hacker
- Learn the history of free software and open source software: Revolution OS
- Virtualization: Virtualbox
- Get help on Python: r/learnpython
- Get serious help: StackOverflow
- Learn Version Control with Git: Git Handbook
- Code Hosting: Github
Questions to take away
- Why we need an operating system? Can we just run programs directly?
- What’s the difference between client and server?
- What is the advantage of cloud computing?
- What’s the difference between free software and open source software?
- Why software companies like Microsoft choose to open source their program?
- Beside Artificial Intelligence, what are some other popular cutting-edge techniques today?
513 total views, 3 views today