Learning Computer Science Basics
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 level | Programming language | IDE/Editor (Operating System) |
---|---|---|
Primary school (classes I to IV) | Logo | MSWLogo (Windows 98) |
Middle school (classes V to VIII) | Small Basic | Microsoft Small Basic (Windows XP SP3) |
High school (classes IX to XII) | Swing (Java)/SQL | NetBeans/MySQL (Windows 7) |
Undergraduate school | C++ | 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.
Topic | Textbook | Complementary Material | Supplementary Material |
---|---|---|---|
Programming | How 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 resources | Structure 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 |
Algorithms | Introduction 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 Manber | Algorithm 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 |
Systems | The Elements of Computing Systems by Nisan and Schocken (2nd edition) | Nand2Tetris; Object-Oriented Programming with Java or Python | Computer 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 |
Networking | Computer Networks: A Systems Approach by Peterson and Davie (5th edition) | HTML edition; C Programming: A Modern Approach by King (2nd edition) (my notes); Mininet | Computer Networking: A Top-Down Approach by Kurose and Ross (videos and Wireshark labs); Stanford CS 144 lecture notes |
Security | Computer Security: Principles and Practice by Stallings and Brown (4th edition) | Network Security: Private Communication in a Public World by Kaufman, Perlman and Speciner; SEEDLabs | Security 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:
Language | Programming Paradigm | GitHub |
---|---|---|
C | Procedural | Software Router and TLS VPN |
Racket | Functional | Beginning Student Language |
Python | Object-Oriented | Jack 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
- using Python to solve the exercises from Project Euler, id0-rsa, Cryptopals, CrytoHack, and other CTFs;
- using C++ to solve competitive programming problems from Advent of Code and popular online judges (eg. UVa, Kattis, Codeforces, Sphere, AtCoder, Timus, DMOJ, …);
- contributing to Open Source projects, especially SageMath;
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.