Computer Science
A computer science curriculum spanning architecture, systems, databases, networks and security, game development, and unconventional models of computation.
On this page
Talks
Currently Doing
- Great Ideas in Theoretical Computer Science
- CS Bottom Up
- Practice on Codewars
- Programming Languages
- Study Dev Plan C++
- GD 50
Theoretical Computer Science
Computer Architecture
Computer Systems
Programming Languages
- Theory
- C++
- Test Driven Development
Databases
Network & Security
- Core 5G and Beyond
- Learn more about DNS
- Introduction to Internet and videos
- Jim Kurose, 8th Ed.
- High Performance Browser Networking
- Computer Networks: A Systems Approach
- Packet Pushers Podcasts
- Beej's Guide to Network Programming
- Secure Hardware Design
- Open Security Training
- Reverse Engineering
- Cyber Security Base | mooc.fi
- Computer and Network Security | Stanford
- CS 161 | UC Berkeley
- Computer Systems Security | MIT and 2024
- Web Security | CS 253 and assignments
- Practice on pwn.college
Game Development
- GD 50 Harvard
- Game Programming C++ | Dave Churchill
- Intro to AI | Dave
- Learn game dev in browser
Soon
- Learn Operating Systems
- How to Think Like a Computer Scientist (exercises)
- The Missing Semester of Your CS Education
- 8-Bit Computer
- The Art of Computer Programming
- Cognitive Robotics
- IOT
- eater.net
Journals
- AI Review, Springer
- Natural Computing, Springer
- IJUC
- BioSystems
- Swarm Intelligence
- Evolutionary Computation, MIT
Beyond Classical Computing
Traditional Computation Theory (Foundation)
- "Computational Complexity" – Christos H. Papadimitriou. A classic text that explores the theory of computational complexity, including P vs NP and beyond.
- "Models of Computation: An Introduction to Computability Theory" – John E. Savage. Gives a broad overview of different computational models beyond just Turing machines.
- "Automata and Computability" – Dexter C. Kozen. Introduces automata theory, formal languages, and basic computation models.
Beyond Turing Machines
- "Super Recursive Algorithms" – Mark Burgin. Explores computational models that go beyond the standard Church-Turing thesis, including inductive Turing machines.
- "The Infinite Book" – John Barrow. Discusses infinite computing and hypercomputation ideas.
- "The Universal Computer: The Road from Leibniz to Turing" – Martin Davis. A historical perspective on computation and its limits.
Unconventional Computing
- "Natural Computing: DNA, Quantum Bits, and the Future of Smart Machines" – Dennis Shasha & Cathy Lazere. Explores non-traditional computing paradigms, including DNA computing and neural networks.
- "Unconventional Computing: A Volume in the Encyclopedia of Complexity and Systems Science" – Andrew Adamatzky. A more advanced and specialized book covering bio-computing, reaction-diffusion computers, and more.
- "Physics of Computation" – Tommaso Toffoli & Norman Margolus. Explores how physical laws affect computation, covering quantum computing and thermodynamic limits of computation.
Quantum & Physical Computation
- "Quantum Computation and Quantum Information" – Michael A. Nielsen & Isaac L. Chuang. The standard reference for quantum computing.
- "The Nature of Computation" – Cristopher Moore & Stephan Mertens. Blends physics, mathematics, and computing to explore computational limits in nature.
- "Quantum Computing Since Democritus" – Scott Aaronson. A more philosophical yet rigorous look at computation from a quantum perspective.
Advanced Topics and Research-Oriented Books
- "Hypercomputation: Computing Beyond the Church-Turing Barrier" – Apostolos Syropoulos. A deep dive into hypercomputational models.
- "Morphogenesis of Data" – Andrew Adamatzky. Discusses bio-inspired and amorphous computing approaches.
- "Computing with Cells and Atoms" – Ehud Shapiro. A look at how biological systems and chemical reactions can be used for computation.
Functional Programming
Programming is inherently an communicative act.
Function Programming is an improvement on our ability to communicate as programmers.
- Good Programming should be Descriptive, Modular and Maintainable.
Imperative Programming
- Imperative -> Non-functional
- Computation by modifying computer's state
- x := 2
- x + x
Functional Programming
- Computation by reduction of expressions to values
- 2 + 2
- Functional Programming avoids modification of state.
- Def. -> A function is pure if it doesn't have any observable side effects, and always returns the same outputs, given the same inputs.
- Like math functions, ex. Sin(pi)
- Functional programming can be characterized by 3 theses
- Recursive Problems, Recursive Solutions
- Programmatic Thinking is Mathematical Thinking
- Types guide Structure
- We can reason about our code in mathematical way, like time complexity, parallel complexity or program correctness.
- It places great emphasis on types, which serve the documenting the purpose of code, and restricting the range of behaviors that program is allowed to exhibit.
Standard ML(Meta Language)
Mantra: In Standard ML, computation is evaluation.
Types, Expression and Values are building blocks.
Expression -> is the building block of a SML program. These may or may not evaluate to value
A Value is a final answer, that can't be simplified further.
Ex. (2+3)*4 => 5*4 => 20 , 2 steps, called computation trace
- => is single step
- =>* any number of steps
- Not all computations lead to value
A Type is a specification of the behavior of a piece of code. It predicts what a program is allowed to do.
Declarations:
- fun double( n: int ) : int = n + n
- val favNum : int = 30
Programming Languages
Theory
Verilog - VHDL
- getting started with FPGAs
Assembly
-
ASM Adventures
-
Jim Keller
-
Write GUI
-
Rust, Haskell, Typescript, Mojo, OCaml
"I'm currently implementing the [component] of the Lox interpreter.
Given the languages I'm using (Rust, Haskell, TypeScript, Mojo, [maybe OCaml]), how would each language's paradigm, memory model, type system, and idioms influence the design and implementation of this component?
-
What's the most idiomatic or natural way to build it in each language?
-
What are the tradeoffs in performance, safety, simplicity, and readability?
-
How does the language encourage or resist certain design patterns here?
-
Are there features (e.g. monads, pattern matching, ownership, macros, tagged unions) that make this easier or harder in that language?
-
What fundamental compiler or interpreter concept am I actually learning here (e.g., lexical analysis, recursive descent, environment modeling, memory layout)?
-
How do these ideas manifest differently across paradigms (imperative vs functional vs systems)?
-
If I had to explain why this language is great (or poor) for building interpreters, how would this component serve as an example?"
Python
Writing high quality code
- Code Clarity
- Code Flexibility
- Code test-ability
Testing
I plan on using Property based testing. Hypotheses lib in python. First diagnose the problems and then refactor
Mocks
Creating Python Package
Few things to think about before publishing your code
- Does it make sense to package that piece of code?
- Add supporting material for your package. Docs
- Software licence
- How am I gonna handle versions?
- Use project classifiers
- With setup tools
python setup.py bdist_wheel sdisttwine check dist/**twine upload -r testpypi dist/*