Cameron Watters Software Engineer and Leader in Phoenix and Seattle

First-Year Reading List

The software industry is constantly evolving, and you must actively pursue skill and knowledge growth in order to stay relevant. Some small amount of growth will occur as a a natural side effect of your daily work, but that isn’t enough. The best engineers I have worked with over the past 20 years are constantly reading1 and aggressively developing their skills.

In recent years, I increasingly encounter engineers who are unfamiliar with some subject that comes up in a discussion, or, more commonly (and tragically), their knowledge of the subject is very narrow or, at times, cargo cultish.

In response, I’ve created a reading list for software engineers2 that covers a number of concepts that I increasingly consider fundamental. The list, of course, reflects my biases. I work primarily with web technologies in enterprise or enterprise-like contexts. Most of the list should be applicable to any moderately complex system, particularly those that involve communication between applications over the internet3.


One book a month seems more than reasonable and I expect that many people could finish this list in half that time or faster. The recommended books are listed in the order I recommend reading them.

  1. Integrity: The Courage to Meet the Demands of Reality
  2. The Unwritten Laws of Engineering
  3. The Pragmatic Programmer: From Journeyman to Master
  4. The Art of Unix Programming
  5. The Mythical Man-Month: Essays on Software Engineering
  6. Web Operations: Keeping the Data on Time
  7. Head First Design Patterns
  8. Lean Enterprise: How High Performance Organizations Innovate at Scale
  9. Building Microservices
  10. Release It!: Design and Deploy Production-Ready Software
  11. Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation
  12. Patterns of Enterprise Application Architecture

Articles, Blog Posts and RFCs

  1. Be Kind
  2. Thou Shalt Not Commit Logical Fallacies
  3. Anscombe’s quartet
  4. The Emperor’s New Clothes (and the associated Wikipedia article)
  5. Falsehoods Programmers Believe About Time, Names, Addresses, Networks, etc
  6. Choose Boring Technology
  7. OWASP Top 10
  8. Steve Yegge’s Google Platforms Rant
  9. HTTP Protocol: HTTP/1.1, HTTP/2
  10. Latency Exists, Cope!
  11. Fallacies of Distributed Computing
  12. You Can’t Sacrifice Partition Tolerance
  13. Notes on Distributed Systems for Young Bloods
  14. Jepsen: On the Perils of Network Partitions [VIDEO]
  15. Six Myths of Product Development
  16. Amazon is a Technology Company; They Just Happen To Do Retail
  17. How Complex Systems Fail
  18. Harmful GOTOs, Premature Optimizations, and Programming Myths Are the Root of All Evil
  19. The Wrong Abstraction

This seems like a reasonable minimum set of reading for the first year in addition to whatever language or platform-specific stuff you have to learn to actually perform your job.

  1. I focus on reading because it is my preferred medium for information acquisition and there is a plethora of good material. If you’re into audio or video, and you’re able to find enough good, relevant content, excellent. 

  2. The primary target audience is software engineers in their first year on the job. In many cases, this isn’t just their first year working on a given team, it is also their first full-time software job. 

  3. The proper capitalization of “internet” is not universally agreed upon. More info here, here and here. I choose not to capitalize it. 

Yet Another Reason Why I Avoid Microsoft Technology Like The Plague

Today I called Microsoft to order some Windows 2000 Terminal Services CALs.

Once I get over just how foreign it is to have to call a company to acquire a license in order to let someone access the server in a slightly different fashion (e.g. via Terminal Services), it seems like the mechanics should be simple enough. In fact, they even appear to make it easy for you. Launch the Terminal Services Licensing application and select the menu item that says “Add Client Access Licenses” or something like that. It gives you a phone number and some crazy long License Server ID to give the nice Hyderabadi on the other end of the line. This is where it gets interesting…

Dial the number. “Welcome to the Windows XP Activation Service.” Huh? Keep listening. “…and I can also help you with Windows Terminal Services Licensing.” Finally. What, Microsoft can’t afford to dedicate an 800 number to this thing? O.K., step through 2 levels of voice tree only to be placed on hold. Wait time was short enough; so far, so good.

“Hello, my name is [unintelligible]. How can I help you today?”

“Yes, I’d like to obtain some Windows Terminal Services CALs.”

“Please read me the license key.”

“You mean the License Server ID?”

“You’re wanting to install Terminal Server CALs, correct?”

“Yes, but I don’t have the license key yet. That’s why I’m calling. I need to obtain them first. It says to call this number to do that.”

“Oh, o.k. read me the License Server ID.”

“[read really long alphanumeric string over the phone]”

“What is your volume licensing program id?”

“Huh? What’s that? We don’t use volume licensing.”

“O.K., you need to contact the Microsoft Reseller.”

“Which Microsoft Reseller? The product says to obtain the licenses from this phone number.”

“Oh, please tell me your product ID.”

“You mean the Product ID for Windows 2000? I don’t have it with me. Shouldn’t the License Server ID cover that? I mean, isn’t that why you require Terminal Server activation and all that?”

“It should be on the product packaging.”

“Right. I don’t usually keep the product packaging handy for a product I originally purchased 4 years ago. I’m really going to have to dig that out of wherever to do this?”


“Great. Thanks a million.”

“Thank you for calling Microsoft. Have a great day.”

So, now to go dig up the product key and then repeat the process. I’m still confused as to how this model of software constitutes a greater value to small businesses than Free Software. Knowing Microsoft, I’ll call back only to be told that Windows 2000 is an EOL product, so I can only buy additional CALs if I spend hundreds of dollars to upgrade to Windows 2003 Server or Windows Server 2003. All so that I can let one additional computer interact with the server.

On Brand Naming

The word "brand" has so many meanings now, some more whacked-out than others, that using it has ceased to be useful. — Hugh Macleod

Some marketers wrongly believe that the quality and effectiveness of a brand is a singular function of the evocative name they assign it and the nifty messaging they supply alongside it. Unfortunately (for them), this isn’t the case. Marketers may be able to pick the name, but nothing influences a brand more than the execution behind it. No amount of messaging will convince people that Microsoft is tops when it comes to security. And Microsoft is certainly not pushing the idea that the Zune is a clunky turd, but that’s the word on the street. No amount of messaging or naming can overcome poor execution.

Additionally, the names associated with the brand need not be spectacular. Sure, occasionally, someone comes up with a truly great name, and it certainly helps. And, of course, there are truly terrible names — names that are hard to remember, hard to pronounce or just plain confusing.

If you’re really lucky, your customers will help to choose your name for you (FedEx). if they do, embrace it. Or, if you give your customers multiple potential names to associate with your products and services (say, a product name AND a corporate name) and one of them is the clear winner in the marketplace, adopt the one they embrace and consider leaving the other(s) behind (as Oracle, Motorola, and Xerox did).

A less-than-perfect name, backed by stellar execution, is dramatically more valuable than a clever name and average or weak execution. Instead of arguing endlessly about naming strategies, adopt a name customers understand (assuming it’s not derogatory) and then focus your energies on executing the hell out of your products.

Links for December 2006

Richard Stacy, on brand social media

…just having a corporate blog, a MySpace page, a podcast, posting stuff on YouTube does not, of itself, make you a socialised brand…

the hughtrain

It’s no longer just enough for people to believe that your product does what it says on the label. They want to believe in you and what you do. And they’ll go elsewhere if they don’t.

Geek Marketing 101

Successful technology marketing must translate the creations of the uncommunicative into the needs of the untechnical. Spin is not good marketing. Lucid two-way communication is.

Pamela Slim, on work

You often claim to not know what you want to do, but in fact censor yourself from what you know you want for fear of appearing ridiculous.

Joel Spolsky, on workplace frills

When you are the founder of a company, you want to skimp on frills; they seem like a waste of money to you. That’s fine. But don’t think that candidates interviewing at your company will have the same emotional attachment; they won’t. They are looking for a nice place to work.

Links for November 2006

Joel Spolsky, on software company leadership

…[I]f you want to be successful in the software business, you have to have a management team that thoroughly understands and loves programming, but they have to understand and love business, too. Finding a leader with strong aptitude in both dimensions is difficult, but it’s the only way to avoid making one of those fatal mistakes…

It’s an old article, but it fits with the theme of stuff I’ve been thinking about lately.

Dave Winer, on the role of “business” people in tech

I’ve heard it said many times that the march of progress means that business people take over from the pioneers, but I’ve observed the opposite. When the boom is finished, the technology will still be here, and while progress may have suffered during the euphoria (the money is rarely used to fund new ideas), the ball never really stops rolling while everyone is focused on the money-obsessed. When the boom is over, we’ll still be here, pushing new ideas forward.

Philip Greenspun, on complaining

It struck me that someone who complains constantly should be marked down as remarkably optimistic. The complainer believes that people actually might care.

I liked this quote, but I’m not sure I entirely agree with the rest of his sentiment, which is that the most pessimistic people are the non-complainers. I imagine a large group of the non-complainers are pessimists, but there’s a sizable group of non-complainers that are just unaware that something is wrong. A smaller group of non-complainers is also made up of discouraged former complainers (but still optimists at heart), bitter and jaded that nobody ever listens.

Seth Godin, on customer service

Either you’re going to make someone happy or you’re not. Doing the ‘right’ thing is irrelevant.

At least if it means not making them happy, anyway. As far as they’re concerned, the ‘right’ thing is to make them happy.

Paul Graham, on the income gap

When we say that one kind of work is overpaid and another underpaid, what are we really saying? In a free market, prices are determined by what buyers want. People like baseball more than poetry, so baseball players make more than poets. To say that a certain kind of work is underpaid is thus identical with saying that people want the wrong things.

The principles from this essay can readily be extrapolated to other related topics, including the relative value of employees to an organization.

Seth Godin

Before you embrace your wonderful solution to the marketplace’s problem, first decide how many of consumers are choosing to listen to messages like yours. Are they listening in a medium you can afford?

Kathy Sierra, on managing trouble-makers

…too many managers appear too threatened to figure out whether their trouble-maker is the one person who can really push things forward, or the one who simply thrives on being disruptive.

I wonder if it’s possible for the answer to be some of both.

Joel Spolsky, on choices

This highlights a style of software design shared by Microsoft and the open source movement, in both cases driven by a desire for consensus and for “Making Everybody Happy,” but it’s based on the misconceived notion that lots of choices make people happy, which we really need to rethink.

J Allard, on changing the world

“The only way to change the world is to imagine it different than the way it is today,” he says. “Apply too much of the wisdom and knowledge that got us here, and you end up right where you started. Take a fresh look from a new perspective, and get a new result.”

The Cluetrain Manifesto, on sedition

The Internet is inherently seditious. It undermines unthinking respect for centralized authority, whether that “authority” is the neatly homogenized voice of broadcast advertising or the smarmy rhetoric of the corporate annual report.

No, this isn’t new. And no, it isn’t the first time I’ve read it. But I’m reading it again, and this sentence (again) resonated with me as I read it.

Business Casual Dress Code Considered Harmful

Dressing For Success

I’m not sure who comes up with these jewels, but it’s probably the same crowd that thinks vacuous motivational posters and their platitudes are actually effective. This argument suggests that dressing up will positively affect our performance. Notice, I didn’t say “reflect”, I said “affect”. These people actually believe that employee productivity is directly proportional to the “professionalism” of their attire. This may be true for a few people, but it isn’t universally true because it is wholly dependent on the unspoken assumption that everyone associates “well-dressed” with “successful”. I’m not talking about interaction with the public or customers here. I’m talking about how people feel about themselves. The degree to which someone associates “well-dressed” with “successful” is largely a function of their cultural upbringing. A person that grew up in the Midwestern United States in the 50s and 60s is going to feel very differently about this than someone raised on the West Coast during the 80s and 90s. It turns out that this argument is little more than the cultural preference of regional and generational subgroups masquerading as a universal principle. In many cases, this approach to dress also reflects cultural socio-economic prejudices. In past decades, particularly east of the Rocky Mountains, jeans and t-shirts were the traditional garb of the working class.

“But”, they say, “people will take you more seriously if you dress up more!” Maybe. That probably says a lot more about them than it does about anyone else. If you’re dealing face-to-face with the public or your customers, great, dress up. I understand that. At that point, how you dress becomes a part of the public-facing corporate image—the brand. What one wears while sitting at a desk, far, far away from customers does not.

This argument is especially difficult to swallow if one is also forced to sit at second-rate desks held up by stacks of books. How can what the employees wear possibly matter when the office equipment and furniture are the shabbiest thing around the office? The quality of the tools and equipment speak volumes more about the nature of the company than employees’ clothing choices.

Your Attire Reflects Your Character?

This argument probably pains me more than any other. It is ultimately a classist, socio-economically prejudiced position. This suggests that people well-schooled in “proper” attire and fashion are somehow of greater character and/or discipline than those who have not been similarly schooled. Putting shoulder pads and a helmet on Miss America wouldn’t make her a football player any more than putting a nice dress, makeup and a wig on Tom Brady would make him a beautiful woman. In order to make character judgments about people based on their attire, we must assume that the associations between various types of attire and character are well-understood and agreed upon by both the wearer and those evaluating his dress. Again, these assumptions derive not from a single, well-established, objective source, but instead from the culture (or sub-culture) in which each person was raised. Those cultural inputs are both regional and socio-economic. Neither one’s region or socio-economic status of origin are a legitimate primary basis for character evaluation. Additionally, it is both lazy and ignorant to place the bulk of the burden for bridging the potential expectation gap on the shoulders of the wearer, since neither person is objectively correct.

This view is particularly destructive because many (most?) people are more comfortable in the attire that comes naturally to them. Of course, there are limits and there is a legitimate baseline for cleanliness and hygiene, but needlessly forcing someone who grew up in a cultural environment where jeans were a wardrobe staple to wear slacks/khakis all the time is no less obnoxious than needlessly requiring someone to wear jeans every day if they grew up believing that a good suit or is the hallmark of the wearer.

Uniform Dress Is More Equitable?

This is an argument I’ve heard more of recently, and, while less distressing than the first two, is equally flawed. This argument is predicated on the idea that sameness and equality are the same thing. Deconstructing that bit of nonsense requires a post unto itself, but suffice it to say that while the principle seems to be popular among equality activists, it’s a pretty significant fallacy.

In the workplace, such thinking leads to all kinds of bad decisions. For instance, it would suggest that everyone should work in the same physical environment and be provided the same equipment as well. That’s ridiculous. Different jobs require different environments and different tools. People who travel frequently need notebook computers; people who don’t may not. People who are on-call should have company-funded cell phones; for people who aren’t, they are optional. People who need quiet and the ability to focus on complex problems (programmers, for instance) benefit greatly from private (or at least shared/semi-private) offices; call center workers and administrative staff may not. People who interact face-to-face with customers should dress accordingly during those interactions; people who aren’t interacting face-to-face with customers shouldn’t be required to dress as if they were.

It’s easy to address the cries of “Unfair! Unfair! Why do programmers get to wear jeans and t-shirts?” Let everybody wear jeans and t-shirts if their job doesn’t involve face-to-face contact with customers. Heck, even if it does, let them dress as they like on days when they’re not meeting with customers.

Impact on Recruiting and Culture

Depending on your location, dress code may also be a factor in your recruiting efforts. If all of the software companies around you allow jeans and t-shirts, then it’s probably going to hurt recruiting if you don’t allow them.

I guess for me it all comes back to the idea that the dress code, and the corporate culture overall, should be focused on creating the environment that is most conducive to employee productivity. If you’re a software company, that means programmer productivity. If you’re a software company that doesn’t recognize that your company’s success is directly proportional to the quality of your software (and therefore, the quality and productivity of your programmers), you probably have deeper problems than your dress code.

If people are more comfortable in jeans and t-shirts, let them wear jeans and t-shirts.