Learning Computer Science Basics
Published:
Cypherpunks write code (A Cypherpunk’s Manifesto - Eric Hughes, 1993). Therefore, I want to work through the various problems from Project Euler and Cryptopals. However, I can’t code proficiently in any language.
The past
In the past, I have dabbled into 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 on 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 |
Python3 | 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 Python and C programming skills by
- solving the exercises from Project Euler and Cryptopals;
- contributing to Open Source projects, especially SageMath;
- creating programming projects related to my thesis
However, there are many more programming languages to choose from. For example, 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 participate in Capture The Flag (CTF) competitions like CrytoHack, TryHackMe and HackTheBox (Kali Linux).