Computer Systems A Programmer’s Perspective - Bryant & O’Hallaron


‘Computer Systems A Programmer’s Perspective’ (CSAPP) is a very practical book about computer architecture. Most books on computer architecture focus on particular areas, such as: compilers, processor architecture, and programming language principles.

This book strives to envelope a good part of everything, to give readers a big picture. The authors tailor to the needs of most developers who want to write performing and reliable code. And they achieved the goal precisely.

It took me a month to finish studying it, mostly b/c it’s level of abstraction is very low. However I’ve never regretted this time investment. Though it’s subtle whether this helps my day-to-day work directly, I optimistically predict I will come back to this book more and more. As my understanding of computer systems deepen.

Caching and the memory mountain

‘Because of the cache hierarchy, the effective rate that a program can access memory locations is not characterized by a single number. Rather, it is a wildly varying function of program locality (what we have dubbed the memory mountain) that can vary by orders of magnitude.’ - Chapter 6.

The efficiency of memory access is graphed as a mountain, with ‘ridges’ of temporal locality, and ‘slopes’ of spacial locality.

  • Temporal locality: the same data objects are likely to be reused multiple times. Once a data object has been copied into the cache on the first miss, we can expect a number of subsequent hits on that object.
  • Spatial locality: blocks usually contain multiple data objects. Be- cause of spatial locality, we can expect that the cost of copying a block after a miss will be amortized by subsequent references to other objects within that block.
Share Comments

The Mythical Man-month - Fredrick P. Brooks

‘The mythical man month’ is the most known classic in software engineering. Raised a lot of important notions, including the famous ‘no silver bullet’ assert.

No silver bullet

“There is no single development, in either technology or management technique, which by itself promises even one order of magnitude improvement within a decade in productivity, in reliability, in simplicity.”

The speed of software productivity improvements cannot match the speed of hardware updates in any forseeable way. This is limited by both the capacity of human communications, mainly because the number of bilateral communications increases as power of the number of people involved. Also, the constraints of communication and organization affects the division of labor in software engineering.

Efficiency of software tools

Another issue brought up is software tools enhancements. In recent years the explosion of networking and mobile technologies has made every single developer much more productive. However this still doesn’t meet the much more rapidly growing demand for quality software. Therefore the labor market responded with more and more software engineers in the industry.

Share Comments

Thinking in Java - Bruce Eckel


The first book I’ve read about Java, one of the first books I’ve read about computer science.

This book provides a very good introduction about object-oriented programming (OOP). The title ‘thinking’ really means to make you follow Java’s class/object model of code organization. As a ‘pure’ and successful OOP language, Java is explained to great depth through various OOP concepts.

Where it shines

The most memorable part is the discussion about inner class. Leading from an issue about multiple inheritance, the author presented the dilemma between clean code organization and convenient reuse. Author then compares the benefits and downsides of multiple inheritance in the C++ way (from a modern view, one can also include mixin/trait). The book presented the Java design decision very well in this topic that continued to be helpful until I meet various other OO concepts and solutions.

A essential book if you’re starting to learn Java, it can also be useful if you are looking for object-oriented programming alone.

Share Comments

Code Complete - Steve McConnell


‘Code Complete’ is the very first book I’ve read about software engineering topic. This is a huge book of 900 pages!. From the 35 chapters, the most meaningful point I’ve discovered is the analogy between software engineering and construction engineering, where a piece of useful software is generated much of the same way as a physical building is completed.

Plan, Design, Implementation, Monitoring, Testing, Delivery. Although software is most of a creative product, it still needs a good amount of tedious routine work to become a useful product. Much like a modern skyscraper, maintenance is a major part of software cost and must be considered at the very first step of software planning and requirement specification.


Although new organization ideas are getting invented all the time, ‘Code complete’ is a must-read classics. It also has huge influence in academia as well, recommended to any software professional.

Share Comments

Operating System Concepts -- Silberschatz, Gagne, Galvin

As a widely used textbook for introductory OS classes (Dragon Book), it tries to explain every crucial OS notion as clearly as possible. Many times very lengthy. Therefore it gets the benefit of being never ambiguous. However in real-world examples, this book is not very helpful. As I’m coming from a non-CS education, often times I find various OS notions hard to grasp, at least not transparent. This book fills my blanks very well.

Process and Memory managements are where this book shines. Various virtual memory models have existed, iterated and implemented in the discussions. It also provides many clear illustration about system layout and inter-process communications (IPC).

Share Comments

Programming Pearls - Jon Bentley


A guide on entry-level algorithms. Topics covered in this book have a very practical focus. Author delivers important concepts from a problem-solving perspective, and really drives the formulation of process.

In my opinion this is exactly how this book come to life from a series of column articles and remains a classics until now.

Though examples are quite outdated (consider the book is done in the 80s!), program design principles have not changed much. Readers need to be aware the deficiencies described in the book does not align with today’s compilers and hardware stack.

Share Comments

Starting in Silicon Valley

Life is a journey, my current stop is Silicon Valley.

A whole new chapter of my Software endeavors since graduate school. My previous SWOT analysis needs updating; my luggage needs unpacking; and I really miss home.

Hope this is the right decision for the future, love to my darling.

Share Comments

Practical Vim - Drew Neil


After I’m forced to mostly server-side coding, I decided to switch to vim as my primary editing environment. This book is by far the most rewarding and concentrated vim guide I’ve met.

Instead of trying to get you starting on .vimrc or installing plugins, the author nicely attempts to give you the philosophy behind the design principles of vim. Customizing vim configs is crucial, however not ‘the most crucial’. The far more important thing is to change the mentality of editing text.

Painter’s brush

The analogy of painter to programmer is awesome, that made total sense to me about the vim modes (normal/visual/insert/cmd):

Think of all of the things that painters do besides paint. They study their subject, adjust the lighting, and mix paints into new hues. And when it comes to applying paint to the canvas, who says they have to use brushes? A painter might switch to a palette knife to achieve a different texture or use a cotton swab to touch up the paint that’s already been applied.

Normal state actually is the most natural:

The painter does not rest with a brush on the canvas. And so it is with Vim. Normal mode is the natural resting state. The clue is in the name, really.

Good luck on everyone who took the journey of practicing the vim way. :)

Share Comments

Programming Contest Challenge

Yet another programming contest textbook. I’ve seen a good part of all the techniques. Still worth going through it for various applications to Peking Univ online judge and Google Codejam problems.

The techniques mentioned here are very much tailored to the needs of programming contests. Some of which require quite a bit of background and may not sounds useful for most developers. The true value of these are actually expand the horizon of Computer Science knowledge. It’s not necessary to implement all of those, however very helpful to understand the process of problem solving.

This book is very suitable for medium level programmers. More, authors use C++ as default language which helps one to get familiar with a lot of the language quirks.

Share Comments

Advanced Programming in the UNIX Environment


A very good introduction to UNIX system fundamentals, a classic system engineer textbook. Providing a lot of background with easy hands-on code examples.

Best part, the book is extremely practical, while also explaining many variations among unix, linux and macos.

Recommended in here:

Finished the book with various chapters in the second half skipped. They are mostly about highly specific system level features which I don’t think urgent to learn.

Share Comments