Favorite Reading
I like to read when I want to deeply understand a new concept, find a solution to a personal or existential problem, or just jog my imagination and creativity. I’ve found some of my favorite books by looking at someone else’s reading list, so here are my favorites in the hope that you may like some of them too. You can find a more complete list on my Goodreads. Also, I’ve been motivated to read more after a friend introduced me to “You Must Read At Least One Book To Ride”, so I’m sharing that here as well.

A Philosophy of Software Design, John Ousterhout
This book addresses the topic of software design: how to decompose complex software systems into modules that can be implemented relatively independently. The book first introduces the fundamental problem in software design, which is managing complexity. It then discusses philosophical issues about how to approach the software design process and it presents a collection of design principles to apply during software design. You can apply the ideas in this book to minimize the complexity of large software systems, so that you can write software more quickly and cheaply.

The Metamorphosis of Prime Intellect, Roger Williams
In a time not far from our own, Lawrence sets out simply to build an artificial intelligence that can pass as human, and finds himself instead with one that can pass as a god. Taking the Three Laws of Robotics literally, Prime Intellect makes every human immortal and provides instantly for every stated human desire. At turns shocking and humorous, Prime Intellect looks unflinchingly at extremes of human behavior that might emerge when all limits are removed.

Coding Styles That Kill, Clifford E. Cummings
One of the most misunderstood constructs in the Verilog language is the nonblocking assignment. Even very experienced Verilog designers do not fully understand how nonblocking assignments are scheduled in an IEEE compliant Verilog simulator and do not understand when and why nonblocking assignments should be used. This paper details how Verilog blocking and nonblocking assignments are scheduled, gives important coding guidelines to infer correct synthesizable logic and details coding styles to avoid Verilog simulation race conditions.

Blindsight, Peter Watts
Who do you send to force introductions on an alien intelligence with motives unknown, maybe unknowable? You send a linguist with her brain surgically partitioned into separate processing cores. You send a biologist so radically interfaced with machinery that he sees X-rays and tastes ultrasound. You send a pacifist warrior in the faint hope she won’t be needed. You send a monster to command them all, a “vampire,” recalled from the grave with the voodoo of recombinant genetics and the blood of sociopaths. And you send a synthesist – an informational topologist with half his mind gone – as an interface between here and there. You send them all to the edge of interstellar space, praying you can trust such freaks and retrofits with the fate of a world. You fear they may be more alien than the thing they’ve been sent to find.