Since February 2020, I committed to learn programming. This is a recap of all of the things I’ve worked on during the year.
I spent most of this month investigating about how to learn programming. My most important findings are listed here.
Having seen it recommended on many occasions, I settled on the How to think like a Computer Scientist course to start my path. It was a great way of learning the fundamentals using Python. I wrote a post reviewing this course.
To complement my efforts in learning, I started investigating about studying methods. Besides the Pomodoro technique, I read about the Wildly Important Goals.
After getting to know the basics of Python, I started solving problems on Project Euler. It was a great way of getting more comfortable with Python. Solving a few of the challenging Project Euler problems, got me quite used to handling lists and dictionaries. I have a post where I talk about the benefits of Project Euler.
Having finished the How to think like a Computer Scientist course, I jumped into the MIT 6.00.1x course on edX. It was a great way of getting into more advanced applications of Python. The former course really helped me as the MITx course is fast-paced.
The MITx recommended codewars to practice problem-solving. I got into it as well as a complement to Project Euler’s math-oriented problems. Joining the MITx clan on codewars was also a good incentive to progress.
At the end of March, I started studying the intimidating Structure and Interpretation of Computer Programs. Not only did I find it recommended on many sites, but it was also recommended by my favorite online curriculum: Teach Yourself Computer Science.
I kept working on MIT 6.00.1x, solving Project Euler problems, and studying SICP. It was during this month that I solved the most Project Euler problems.
During this month, I finished MIT 6.00.1x and I started the follow-up: MIT 6.00.2x. The second course was more oriented towards data science (using Python like the first course).
Additionally, I spend some time learning to use Emacs and getting more comfortable with Ubuntu. I’d read about the importance of learning how to use a Unix-like OS.
To get more comfortable with Ubuntu, I started the Linux Journey. It explains very well the basics in the first modules, but the latter ones are outdated. A great complement that covers very well the basics is the Linux introduction by Eli the Computer Guy, which I also watched that month.
For the rest of the month, I kept studying SICP and MIT6.00.2x. Additionally, I started investigating how to set up a website. I had the intention of creating a blog (this one!), following advice I found online.
At this point, the blog was already online. You can check the first post here. While I continued studying SICP, I did some research about web management stuff such as SEO. I also kept learning about Linux. Things such as SSH, file permissions and using the command line.
Somewhere in this month, I finished the MIT 6.00.2x course. It was definitely a valuable course, but I’d recommend it only for people that are interested in data science and Python applied to that area. MIT 6.00.1x gives the fundamentals in regards to programming with Python. All the way up to an introduction to classes and object-oriented programming.
I kept working on the usual material: SICP, Project Euler, and a bit of Linux. Besides that, I started learning about version control (git). I’m sure you can find great material online to learn it, but I followed an Udemy course. While the course is a bit outdated, it was well structured and had more than enough material to get started with git. In that sense, I was satisfied with it.
At around mid-July, I started some capture the flag challenges. I did it on the site Over The Wire. It was very fun and also a great way to learn about security and getting more comfortable with the Linux command line. In the following months, I completed the Bandit game and went all the way up to half the Natas track. I haven’t played since, but it would be nice doing it again.
In order to complete some of the OTW challenges, I learned a bit of bash and PHP. I also got a bit familiar with tools such as Curl.
During this month, I did a bit of game development. I had the intention of creating a Tic-ta-toe game with a GUI, so I got familiar with pygame. In order to learn the basics, I followed the first lessons of the KCC tutorial. I can’t compare it with other tutorials since I haven’t watched other ones, but I found the KCC videos to be very clear. It shows you how to start building cool stuff from the very beginning. You can also check their blog.
After getting the basics of pygame, I started working on the tic-tac-toe game. You can check the final product here. I tried creating an unbeatable AI, but then I found out at least one way to beat it.
For the rest of the month, I also kept studying SICP and started reading some papers. I didn’t finish reading all of them and sometimes it was hard understanding them due to my lack of background. Regardless, reading them was helpful to get familiar with some computer science concepts. SICP also provided me with a good basis to understand some of the papers (like with functional programming).
After several months of hard work, I was able to finish SICP this month (but I confess I skipped the exercises of the last half of chapter 5). You can read my review here.
After having finished SICP, I wanted to continue with the next book recommended by the Teach Yourself CS guide: Computer Systems: A programmer’s Perspective. I was about to start with it when I read in its preface that knowledge in either C or Java is required. To fulfill that requirement, I started reading the book they recommended for it. The classic The C programming language by Kernighan and Ritchie. A great book. You can read my (partial) review here.
After finishing the K&R book, I was about to start reading CS:APP. Just before that, a friend of mine with whom I had been collaborating proposed me to work on the development of a website using React. The deadline for the project had been advanced and they needed extra help. I was very happy to collaborate, this was like my first job with programming and it was very generous of my friend to invite me despite my lack of experience.
In order to get familiar with React, I followed the Code with Mosh‘s tutorial. Very quickly, it gave me enough knowledge to start working on the project. For the UI, we used Material-UI. I ended up handling most of the front-end development, which was a great learning experience.
The final part of the project involved doing a bit of testing, which we did mostly with Jest and the testing-library. At the very end, I had to give the site the appearance proposed by a designer using CSS. While I don’t like the designing part very much, I enjoyed applying another person’s design on the site. I grabbed the basics of CSS from the first modules of this MDN guide, which I found to be a great resource.
And finally, I could start reading CS:APP. I dedicated most of my time to it. I was able to finish the first three chapters of the book during this month. The second chapter gave me a good idea of how numbers are represented using bits (you can check my
int and vice-versa converters here and here). The third chapter introduced x86 assembly code, which in turn is helpful to understand how the computer executes programs.
New year: 2021
While I’m very eager to continue reading the CS:APP book, I might be taking a break from it as I’m starting a self-directed on-line bootcamp at the Recurse Center!
I’m feeling a bit nervous since English is my second language and I haven’t worked with other programmers before, but I’m very grateful for having the opportunity to be at RC with people from different backgrounds. I will post updates of my work there in the following weeks.
I wish the best to all people reading this starting the year 2021.
Also, feel free to contact me in the comments below or directly by email to onestepcode.web.at.gmail.com if you would like to.
wow, good stuff man I’m impressed! I’ve been at it for about three months now … can’t believe how focused you’ve been
it is really something.
Thank you for your comment, Kai. Something that helps me is to set weekly goals. It’s easier to say “I’ll code for 5 days” than to say “I’ll code for 300 days”.