Learning Computer Science Basics

4 minute read

Published:

Cypherpunks write code (A Cypherpunk’s Manifesto - Eric Hughes, 1993). Therefore, I want to work through various problems from Project Euler and Cryptopals. However, currently, I can’t code proficiently in any language.

The past

In the past, I have dabbled in programming using different languages:

Education levelProgramming languageIDE/Editor (Operating System)
Primary school (classes I to IV)LogoMSWLogo (Windows 98)
Middle school (classes V to VIII)Small BasicMicrosoft Small Basic (Windows XP SP3)
High school (classes IX to XII)Swing (Java)/SQLNetBeans/MySQL (Windows 7)
Undergraduate schoolC++Code::Blocks (Ubuntu 14.04)

Unfortunately, I never spent time honing my programming skills. Therefore, at the beginning of my graduate school, I thought of properly learning programming in Python. However, most of the study materials I found were more about “writing code to solve data science problems” rather than “learning to solve problems using programming.”

The present

I spent one year learning the basics of computer science following the advice from UArizona Computer Science department students and professors. None of the textbooks were read cover to cover.

TopicTextbookComplementary MaterialSupplementary Material
ProgrammingHow to Design Programs by Felleisen, Findler, Flatt, and Krishnamurthi (2nd edition)HTML edition; Racket; Northeastern CS 2500 lecture notes and videos; Program by Design resources; UBC CPSC 110 resourcesStructure and Interpretation of Computer Programs by Abelson, Sussman, and Sussman (Wizard book, PDF edition, Brian Harvey’s lecture notes and videos); Harvard CS 50; UC Berkeley CS 61A lecture notes
AlgorithmsIntroduction to Algorithms by Cormen, Leiserson, Rivest, and Stein (3rd edition)Online Resources; Problem Solving with Algorithms and Data Structures using Python by Miller and Ranum (HTML edition); Introduction to Algorithms by ManberAlgorithm Design by Kleinberg, and Tardos (slides); Algorithms by Sedgewick and Wayne; Algorithms Illuminated by Tim Roughgarden (Omnibus Edition); Algorithms by Jeff Erickson (PDF edition); Stanford CS 161 lecture videos; UC Berkeley CS 61B lecture notes
SystemsThe Elements of Computing Systems by Nisan and Schocken (2nd edition)Nand2Tetris; Object-Oriented Programming with Java or PythonComputer Systems: A Programmer’s Perspective by Bryant and O’Hallaron (online resources); Computer Organization and Design by Patterson and Hennessy; Operating Systems: Three Easy Pieces by Arpaci-Dusseau and Arpaci-Dusseau (PDF edition and Vutukuru’s lectures); Operating System Concepts by Silberschatz, Galvin, and Gagne (Dinosaur book); Basics of Compiler Design by Mogensen (PDF edition); Modern Compiler Implementation in ML by Appel (Tiger book); Compilers: Principles, Techniques, and Tools by Aho, Lam, Sethi and Ullman (Dragon book); Crafting Interpreters by Nystrom (HTML edition); Engineering a Compiler by Cooper and Torczon (2nd edition); UC Berkeley CS 61C lecture notes and videos
NetworkingComputer Networks: A Systems Approach by Peterson and Davie (5th edition)HTML edition; C Programming: A Modern Approach by King (2nd edition) (my notes); MininetComputer Networking: A Top-Down Approach by Kurose and Ross (videos and Wireshark labs); Stanford CS 144 lecture notes
SecurityComputer Security: Principles and Practice by Stallings and Brown (4th edition)Network Security: Private Communication in a Public World by Kaufman, Perlman and Speciner; SEEDLabsSecurity in Computing by Pfleeger and Pfleeger; Security Engineering by Anderson (drafts); UC Berkeley CS 161 lecture notes

During this one-year journey, I got the opportunity to practice programming in different languages:

LanguageProgramming ParadigmGitHub
CProceduralSoftware Router and TLS VPN
RacketFunctionalBeginning Student Language
PythonObject-OrientedJack VM

I also learned regular expression usage in AWK (Frequency Analysis) and Python (Lexical Analysis).

The future

Next, I would like to improve my programming skills by

However, there are many more programming languages to choose from. For example, the following are some of the main programming languages developed before the Internet age (source: Programming Languages - Principles and Practice, by Louden & Lambert, 3rd ed)

Eventually, I would also like to learn Rust and contribute to modern computer security projects.