Modern Operating Systems
Andrew Tanenbaum and Herbert Bos
4.3 on Amazon
5 HN comments
The Bitcoin Standard: The Decentralized Alternative to Central Banking
Saifedean Ammous, James Fouhey, et al.
4.7 on Amazon
5 HN comments
Thinking in Systems: A Primer
Donella H. Meadows and Diana Wright
4.6 on Amazon
5 HN comments
A World Without Email: Reimagining Work in an Age of Communication Overload
Cal Newport, Kevin R. Free, et al.
4.5 on Amazon
5 HN comments
Software Design for Flexibility: How to Avoid Programming Yourself into a Corner
Chris Hanson and Gerald Jay Sussman
4.3 on Amazon
4 HN comments
Domain-Driven Design: Tackling Complexity in the Heart of Software
Eric Evans
4.6 on Amazon
4 HN comments
This Is How They Tell Me the World Ends: The Cyberweapons Arms Race
Nicole Perlroth
4.6 on Amazon
4 HN comments
Software Engineering
Ian Sommerville
4.3 on Amazon
4 HN comments
Fluent Python: Clear, Concise, and Effective Programming
Luciano Ramalho
4.6 on Amazon
4 HN comments
Test Driven Development: By Example
Kent Beck
4.4 on Amazon
4 HN comments
Compilers: Principles, Techniques, and Tools
Alfred Aho, Monica Lam, et al.
4.1 on Amazon
4 HN comments
The Everything Store: Jeff Bezos and the Age of Amazon
Brad Stone, Pete Larkin, et al.
4.6 on Amazon
3 HN comments
Bitcoin: Hard Money You Can't F*ck With: Why Bitcoin Will Be the Next Global Reserve Currency
Jason A. Williams and Jessica Walker
4.8 on Amazon
3 HN comments
Sandworm: A New Era of Cyberwar and the Hunt for the Kremlin's Most Dangerous Hackers
Andy Greenberg, Mark Bramhall, et al.
4.7 on Amazon
3 HN comments
Programming: Principles and Practice Using C++ (2nd Edition)
Bjarne Stroustrup
4.5 on Amazon
3 HN comments
mark_l_watsononApr 14, 2021
mindcrimeonMar 20, 2021
bmitconJuly 4, 2021
Untyped languages make it very easy to write programs while the stronger the type system, the harder it gets to write the program in the first place.
I think balance is in order and this is one reason why we haven’t seen fancy type systems become mainstream except for niche domains. If I’m writing a program in F#, I have a balance between a type system constraining me but a language that allows me, the programmer, to do what I want to do for the most part. The stronger and fancier type systems means I now have to somehow teach the type system things that I already now how to do and are safe.
Fancy type systems simply try to say that you should write down a specification of your program. But in the real world, this is an enormously difficult if not impossible task. It makes the programming process and program rigid and brittle and not robust, which is not necessarily properties of software you want.
There’s a reason why certain language ecosystems like Erlang/Elixir say errors, unexpected input, and more pathological events will happen (i.e., they can’t be reasoned out of the system) and so you need a way to explicitly deal with them. This is also a big theme in the recent book Software Design for Flexibility in terms of expanding programs, getting them to handle things they couldn’t before.
While fancy type systems are neat, like those in Idris, I think the most useful idea is to have mixed type systems and programming paradigms in a program, which seems to be relatively unexplored right now.
dgb23onJuly 19, 2021
- Coders at Work (Seibel)
- Working in Public (Eghbal)
The first one is very entertaining. Read it a couple years ago and found it gives some valuable perspective. The second one is on my reading list, it was recommended around these boards.
Related to software design, there are many. The two that are on my recent list are:
- Software Design for Flexibility (Sussman, Hanson)
- A Philosophy of Software Design (Ousterhout)
I can't comment personally on their content yet, still have to work through those two, but I have zero doubts to learn something valuable. Certainly consider them.