I absolutely loved these two. I'd be very grateful if someone recommended similar books, that is, books that guide you through implementing a complex project from scratch (something besides compilers/interpreters and ray tracers).
These types of books are my favorite style. I typically use whatever language I'm trying to learn and get more practice with (usually F#, Elixir, or Racket) instead of whatever the book suggests, if it does suggest one (usually Python or some OOP language). But sometimes the language used in the book is fun, like Logo or Prolog.
* Mazes for Programmers (by the same author of The Ray Tracer Challenge but is not as language agnostic)
* The Elements of Computing Systems: Building a Modern Computer from First Principles
* Programming Machine Learning: From Coding to Deep Learning
* Writing an Interpreter in Go and Writing a Compiler in Go (both by the same author)
* Introducing Blockchain with Lisp: Implement and Extend Blockchains with the Racket Language
* Exploring Language with Logo
* Visual Modeling with Logo
* Turtle Geometry: The Computer as a Medium for Exploring
* Thinking as Computation: A First Course (uses Prolog to solve various problems in small projects)
* Functional Web Development with Elixir, OTP, and Phoenix: Rethink the Modern Web App
I would second the recommendation of Mazes for Programmers. The author used Ruby, but I used Python and that was actually good, because it forced me to really understand the algorithms, rather than just giving up and copying the Ruby code.
Nice. I have the book but haven't gone through it yet. I still need to finish up my F# and Racket ray tracers from his ray tracer book (a decent way in but was refactoring last).
I actually could stand to learn Ruby but I'd probably still do it at least in F# or Racket. I found out about the book from an F# implementation that was posted on Reddit.
The Elements of Computing Systems is the book from the Nand2Tetris course.
I can absolutely recommend it, 100%. I think it's the best course I've ever done, ever. Including all of my courses in University and Graduate school let alone Coursera.
Build a Blockchain from scratch in Go [0] - don’t own it, haven’t read, looks interesting.
Distributed Services with Go [1] - build a logging service, get it on the network, modify for distributed access, make deployable. Loaded with tests. Have read most of it, haven’t completed, very impressed. Fun.
Build an Orchestrator in Go [2] - own it, started it, haven’t completed. Like it so far. Early access, so not finalized yet.
Would also second both Crafting Interpreters and Write an Interpreter in Go.
Distributed services with go was incredible. Really made me think any software abstractions more. Also I kept getting motivated to dive into things deeper like RAFT consensus, etc
Not particularly hip anymore, but "Higher Order Perl" was great fun and has a bit of that style both in the incremental construction and also a little bit in the writing style. But it's been over a decade since I last picked it up.
How did Perl "lose"? It's such a great tool, super powerful and concise. One of the best languages out there, but doesn't seem to have much adoption these days.
1. Nature of Code- simulating and modeling many things in nature.
2. Data Science from Scratch- building a Data Science library from scratch.
3. Deep Learning from Scratch- building a Deep Learning library from scratch.
4. Realm of Racket and 5. Land of Lisp- developing games with Racket and Lisp.
6. The Little Schemer- not only teaches you to think recursively, but also how to implement basic functions like addition, multiplication, list-related function from using Scheme for Scheme.
7. Genetic Algorithms in Elixir
8. Genetic Algorithms and Machine Learning for Programmers
"Understanding Computation: From Simple Machines to Impossible Programs". I knew many of topics and enjoyed it nonetheless. Highlights:
+ Very insightful chapter on different flavours of language semantics, and specs vs implementation.
+ The standard CS automata/ grammars stuff, but with working code.
+ Fun chapter on FizzBuzz in lambda calculus (it's also the free sample+video). Whats vool there is not just showing you _can_ compute everything (of vourse you can) but that you can build high-level constructs so the resulting code is todally clear.
+ A bit of the standard CS computability stuff, but then gets into esoterically minimalistic yet turning-complete stuff like 1D cellular automata.
+ Type checking as a form of partial evaluation, and some other "symbolic" stuff you can do with partially-evaluting interpreter. Some overlap with dependent types - but a more pragmatic less type-theoretic angle.
Author uses a carefully selected subset of ruby, introduced in a short intro - big props for being thoughtful about that.
P.S.
+1 to Mazes book too (which is not as conscious about its ruby use, fun anyway)
500 Lines or less [1,2] might be of interest: it doesn't build up a single complex project from scratch, but it several show the core implementation of various complex types of software.
The struct and interpretation of classical mechanics is a good one.
The only thing I'd say is that complexity in this styles of projects is not in the code. Unless you start a new compiler from scratch I'd say something like 70% of my time not thinking about language semantics are spent thinking about target semantics, not anything you'd see in a book. Any I almost literally do mean anything.
One slightly left field approach is that although Leslie Lamport has a very math-first writing style he actually typically does build up to the analysis of more and more practical systems when he writes about TLA+.
Knuth sort of does this with the caveat that you have to be very good at reading through the lines if you want a tutorial-esque experience.
"Practical Django Projects" by James Bennett was very good, but was released back for Django 1.1 and I don't know how much it's been updated since. Walks the reader through creating the prototypical Django application: a blog. Still maybe worth a read, as the core concepts haven't changed all that much.
Keep an eye on their twitter, pragprog occasionally has coupons, usually on holidays. Manning always had coupons and deals.
Both pragprog and Manning blew past O’Reilly in terms of quality of content years ago. In both cases you’re paying for non-DRM’d media: mobi, pdf, epub. O’Reily’s Safari service is okay, but last I checked you’re stuck reading online (not bad, but not ideal), or using their reader app (not great). Huge selection though, and I think some manning, pragprog, and no starch books are included.
If the book is good, ebook or physical, I generally won’t blink at $30.
Appel [1] is fairly good for learning compilers. He leaves a lot of the material to the exercises, which are somewhat frustrating,but if you fight through them you'll definitely be rewarded.
I tried codecrafter but it has too much of a jump without providing any guidance or anything for a person who might not have much knowledge about building complex projects.
I really love the idea of building small projects where you conquer one problem at a time.
As an idea there could be nothing better than codecrafter but i would like some additional reading material / guidance in terms of moving forward when you are stuck.
If i am doing something wrong let me know, would love to know how can i tackle these kinda problems.
* Mazes for Programmers (by the same author of The Ray Tracer Challenge but is not as language agnostic)
* The Elements of Computing Systems: Building a Modern Computer from First Principles
* Programming Machine Learning: From Coding to Deep Learning
* Writing an Interpreter in Go and Writing a Compiler in Go (both by the same author)
* Introducing Blockchain with Lisp: Implement and Extend Blockchains with the Racket Language
* Exploring Language with Logo
* Visual Modeling with Logo
* Turtle Geometry: The Computer as a Medium for Exploring
* Thinking as Computation: A First Course (uses Prolog to solve various problems in small projects)
* Functional Web Development with Elixir, OTP, and Phoenix: Rethink the Modern Web App