Complaint-Driven Development

If I haven’t blogged much in the last year, it’s because we’ve been busy building that civilized discourse construction kit thing I talked about.


(Yes, that’s actually the name of the company. This is what happens when you put me in charge of naming things. Pinball machines, people, what’s the difference? I’ve apologized to Bill Budge already.)

So if you, like my investors, are wondering why this process took a whole entire year, I should explain how I build things, or at least, how we built Stack Overflow and Stack Exchange and now Discourse

Read more at the source

The Road to VR

A month after I wrote about John Carmack, he left id Software to become the CTO of Oculus. This was big news for two reasons:

Carmack founded id in the early 90s. An id Software without Carmack is like an Apple without Woz and Jobs. You wouldn’t leave the prestigious company you founded unless you had some pretty compelling new dreams to pursue.

Oculus is the company many are betting will break VR headsets into the mainstream. And even if they don’t manage to pull that off, they are now the most credible contender to make serious headway towards consumer VR the industry has ever seen….

Read more at the source

Why Does Windows Have Terrible Battery Life?

I’ve become a huge fan of touch computing. I believe that most things we think of as “computers” will be de-facto tablets, either in our pocket, in our hands, possibly even mounted on our wrists or forearms.

I can’t wait for the iPad 5 this week (I’ll be ordering three), and my Surface Pro 2 should arrive this week too. Because it is a blazingly fast, modern Intel machine, I like to use the Surface Pro to predict where tablet performance ought to be for everyone in 2 to 3 years. I think of it as an iPad 7.

My main complaint with the Surface Pro is the incredibly lackluster battery life. Granted, this is a classic Intel x86 box we’re talking about, not some efficient ARM system-on-a-chip designed to run on a tiny battery. Still, I was hopeful that the first Surface Pro with Haswell inside would produce giant gains in battery life as Intel promised. Then I saw this graph:

Web browsing battery life, Surface Pro vs Surface Pro 2

So WiFi web browsing battery life, arguably the most common user activity there is on a computer these days, goes from 4.7 hours on the Surface Pro to 6.7 hours on the Surface Pro 2, a 42% increase. That’s a decent increase, I suppose, but I was hoping for something more like 8 hours, something closer to doubling of battery life – to bring the Surface Pro in line with other tablets.

Nearly 7 whole hours of WiFi web browsing for a real computer in tablet form factor … that’s not bad, right? Let’s see how the 2013 MacBook Air does, which spec-wise is about as close as we can get to the Surface Pro 2. The screen is somewhat lower resolution and not touch capable, of course, but under the hood, the i5-4200u CPU and LPDDR3 RAM are nearly the same. It’s a real computer, too, using the latest Intel technology.


The Surface Pro 2 has a 42 Wh battery, which puts it closer to the 11 inch Air in capacity. Still, over 11 hours of battery life browsing the web on WiFi? That means the Air is somehow producing nearly two times the battery efficiency of the best hardware and software combination Microsoft can muster, for what I consider to be the most common usage pattern on a computer today. That’s shocking. Scandalous, even.

UPDATE: Turns out the Surface 2 Pro was shipped with bad firmware. Once updated, the WiFi adapter enters lower idle power states and this helps a lot, going from 6.6 hours of browsing time to 8.3 hours, a 25% improvement! That puts it much more in line with the rest of the field, at least, even if it doesn’t achieve Mac like runtime.

It’s not exactly news that Windows historically doesn’t do as well as OS X on battery life. Way back in 2009, AnandTech tested a MacBook Pro with multiple operating systems:

2009 15-inch MacBook Pro (73WHr battery) OS X 10.5.7 Windows Vista x64 SP1 Windows 7 RC1
Wireless Web Browsing (No Flash) Battery Life 8.13 hours 6.02 hours 5.48 hours

That’s fine, I knew about this discrepancy, but here’s what really bothers me:

  1. The Windows light usage battery life situation has not improved at all since 2009. If anything the disparity between OS X and Windows light usage battery life has gotten worse.

  2. Microsoft positions Windows 8 as an operating system that’s great for tablets, which are designed for casual web browsing and light app use – but how can that possibly be true when Windows idle power management is so much worse than the competition’s desktop operating system in OS X – much less their tablet and phone operating system, iOS?

(It’s true that Bay Trail, Intel’s new lower power CPU from the Atom family, achieves 8.6 hours of WiFi web browsing. That’s solidly in the middle of the tablet pack for battery life. But all the evidence tells me that the very same hardware would do a lot better in OS X, or even iOS. At least Intel has finally produced something that’s reasonably competitive with the latest ARM chips.)

Perhaps most damning of all, if you take the latest and greatest 13″ MacBook Air, and install Windows 8 on it, guess what happens to battery life?

One of the best things about the standard 2013 MacBook Air 13″ is that it has record-breaking battery life of 14 hrs 25 min (with the screen brightness at 100 cd/m², headphones plugged in and the Wi-Fi, Bluetooth and keyboard backlighting turned off). Under Windows 8 the results are more mixed [..] in the same conditions it lasts only 7 hrs 40 min. That’s still very high—it’s better than the Asus Zenbook Prime UX31A’s 6 hours and the Samsung Series 7 Ultra’s 5 hours—but it’s only half the astronomical 14 hours + that the 13″ MacBook Air is capable of.

Instead of the 26% less battery life in Windows that Anand measured in 2009, we’re now seeing 50% less battery life. This is an enormous gap between Windows and OS X in what is arguably the most common form of computer usage today, basic WiFi web browsing. That’s shameful. Embarrassing, even.

I had a brief Twitter conversation with Anand Shimpi of Anandtech about this, and he was as perplexed as I was. Nobody could explain the technical basis for this vast difference in idle power management on the same hardware. None of the PC vendors he spoke to could justify it, or produce a Windows box that managed similar battery life to OS X. And that battery life gap is worse today – even when using Microsoft’s own hardware, designed in Microsoft’s labs, running Microsoft’s latest operating system released this week. Microsoft can no longer hand wave this vast difference away based on vague references to “poorly optimized third party drivers”.

Apple is clearly doing a great job here. Kudos. If you want a device that delivers maximum battery life for light web browsing, there’s no question that you should get something with an Apple logo on it. I just wish somebody could explain to me and Anand why Windows is so awful at managing idle power. We’re at a loss to understand why Windows’ terrible – and worsening! – idle battery life performance isn’t the source of far more industry outrage.

[advertisement] How are you showing off your awesome? Create a Stack Overflow Careers profile and show off all of your hard work from Stack Overflow, Github, and virtually every other coding site. Who knows, you might even get recruited for a great new position!
Read more at the source

You Don’t Need Millions of Dollars

Masters of Doom is the story of John Carmack and John Romero creating the seminal games Wolfenstein 3D, Doom, and Quake.


It’s an amazing work on so many levels – but primarily because of the exhaustive research the author undertook to tell this story.

To re-create the story of the Two Johns, I conducted hundreds of interviews over six years, often with each person on multiple occasions. After moving to Dallas in the fall of 2000 for research, I became known in offices, barbecue joints, and bars around town as “the guy writing the Book.” John Romero and John Carmack each spent dozens of hours in person answering my most picayune questions: how they were feeling, what they were thinking, what they were saying, hearing, seeing, playing. What they and others couldn’t recall, I unearthed from websites, newsgroups, e-mails, chat transcripts, and magazines (though I drew from some of these articles, I made a point of getting the gamers’ own versions of what happened as well). I also played a delirious amount of games: at home, online, and at a couple tournaments (yeah, I lost).

I spent six months transcribing all my taped interviews. From this material, I assembled a narrative of dialogue and description that re-creates the events as faithfully and accurately as possible. As often as appropriate, I told the story from each person’s point of view to give readers the different perspectives.

It’s unusual to find a book about a contentious, complex friendship and business relationship that both parties sign off on – and even a decade later, regularly recommend to people interested in their personal back stories. But it is a testament to just how right Kushner got this story that both Romero and Carmack do. This is exactly the sort of meticulously researched, multiple viewpoint biography that you’d want to read about important people in your industry. In that sense, it’s kind of the opposite of the Jobs biography, which I liked well enough, but it presented one viewpoint, and often in a very incomplete, sloppily researched way. I would kill to read a book this good about Jobs.

In a way, I grew up with these guys. I am almost exactly the same age they are. I missed the Wolfenstein 3D release because I was still in college, but come December 1993, there I was, bursting with anticipation waiting for the release of Doom along with every other early PC gamer. And who gave Doom its name? Oddly enough, Tom Cruise did.

I’ve had a lifelong love affair with first person shooters since encountering Wolf3D and Doom. I played about every Doom engine game there was to death. I even had a brief encounter with Romero himself on the modem based multiplayer hub DWANGO where I proverbially “sucked it down”. And after the Internet hit around ’95, I continued to follow Quake development obsessively online, poring over every .plan file update, and living the drama of the inevitable breakup, the emergence of GLQuake and 3D accelerators, and the road to Quake 3.

It is also an incredibly inspiring story. Here’s a stereotypical group of geeky programmers from sketchy home backgrounds who went on to … basically create an entire industry from scratch on their own terms.

Shareware. Romero was familiar with the concept. It dated back to a guy named Andrew Fluegelman, founding editor of PC World magazine. In 1980, Fluegelman wrote a program called PC-Talk and released it online with a note saying that anyone who liked the wares should feel free to send him some “appreciation” money. Soon enough he had to hire a staff to count all the checks. Fluegelman called the practice “shareware,” “an experiment in economics.” Over the eighties other hackers picked up the ball, making their programs for Apples, PCs, and other computers available in the same honor code: Try it, if you like it, pay me. The payment would entitle the customer to receive technical support and updates.

The Association of Shareware Professionals put the business, largely domestic, between $10 and $20 million annually—even with only an estimated 10 percent of customers paying to register a shareware title. Forbes magazine marveled at the trend, writing in 1988 that “if this doesn’t sound like a very sound way to build a business, think again.” Shareware, it argued, relied not on expensive advertising but on word of mouth or, as one practitioner put it, “word of disk.” Robert Wallace, a top programmer at Microsoft, turned a shareware program of his called PC-Write into a multimillion-dollar empire. Most authors, however, were happy to break six figures and often made little more than $25,000 per year. Selling a thousand copies of a title in one year was a great success. Shareware was still a radical conceit, one that, furthermore, had been used only for utility programs, like check-balancing programs and word-processing wares. [Shareware] had never been exploited for games.

Does anyone even remember what shareware is? What is the equivalent to shareware today? Distributing software yourself on the Internet? Sort of. I’d say it’s more analogous to the various app stores: Google Play, Apple App Store, Windows Store. Going directly to the users. But they found shareware games didn’t work, at least initially:

When it came time to distribute the games, Scott took a long, hard look at the shareware market. He liked what he saw: the fact that he could run everything himself without having to deal with retailers or publishers. So he followed suit, putting out two text-based games in their entirety and waiting for the cash to roll in. But the cash didn’t roll; it didn’t even trickle. Gamers, he realized, might be a different breed from those consumers who actually paid for utility shareware. They were more apt simply to take what they could get for free. Scott did some research and realized he wasn’t alone; other programmers who had released games in their entirety as shareware were broke too. People may be honest, he thought, but they’re also generally lazy. They need an incentive.

Then he got an idea. Instead of giving away the entire game, why not give out only the first portion, then make the player buy the rest of the game directly from him? No one had tried it before, but there was no reason it couldn’t work. The games Scott was making were perfectly suited to such a plan because they were broken up into short episodes or “levels” of play. He could simply put out, say, fifteen levels of a game, then tell players that if they sent him a check he would send them the remaining thirty.

You know how game companies spent the last 5 years figuring out that free games with 100% in-app purchases are the optimum (and maybe, only) business model for games today? The guys at id had figured that all out twenty seven years ago. Those sounds you hear in the distance are a little bit of history repeating.

Id Software was more than a unique business model that gave almost all the power to the programmers. It was the explosive combination of shareware delivery with a particular genius programmer inventing new techniques for PC games that nobody had seen before: John Carmack. It may sound prosaic and banal now, but smooth scrolling platforming, texture mapped walls, lighting models, and high speed software 3D rendering on a PC were all virtually unheard of at the time Carmack created the engines that made them commonplace.


Carmack, like Abrash, is a legend in programming circles, and for good reason. The stories in this book about him are, frankly, a little scary. His devotion to the machine borders on fanatical; he regularly worked 80 hour weeks and he’d take “vacations” where it was just him and a computer alone in a hotel room for a whole week – just for fun, to relax. His output is herculean. But he also realizes that all his hard work is made possible by a long line of other programmers who came before him.

Al had never seen a side scrolling like this for the PC. “Wow,” he told Carmack, “you should patent this technology.

Carmack turned red. “If you ever ask me to patent anything,” he snapped, “I’ll quit.” Al assumed Carmack was trying to protect his own financial interests, but in reality he had struck what was growing into an increasingly raw nerve for the young, idealistic programmer. It was one of the few things that could truly make him angry. It was ingrained in his bones since his first reading of the Hacker Ethic. All of science and technology and culture and learning and academics is built upon using the work that others have done before, Carmack thought. But to take a patenting approach and say it’s like, well, this idea is my idea, you cannot extend this idea in any way, because I own this idea—it just seems so fundamentally wrong. Patents were jeopardizing the very thing that was central to his life: writing code to solve problems. If the world became a place in which he couldn’t solve a problem without infringing on someone’s patents, he would be very unhappy living there.

In that spirit, Carmack regularly releases his old engines under GPL for other programmers to learn from. Don’t miss Fabien Sanglard’s epic deconstruction of the Doom 3 codebase, for example. That’s only one iteration behind the current id engine which was used for Rage and (apparently) will be used for the upcoming Doom 4.

One of my very favorite quotes of all time comes at the end of the book.

Carmack disdained talk of highfalutin things like legacies but when pressed would allow at least one thought on his own. “In the information age, the barriers just aren’t there,” he said. “The barriers are self-imposed. If you want to set off and go develop some grand new thing, you don’t need millions of dollars of capitalization. You need enough pizza and Diet Coke to stick in your refrigerator, a cheap PC to work on, and the dedication to go through with it. We slept on floors. We waded across rivers.”

And indeed they did, as the book will attest. Both @ID_AA_Carmack and @romero are still lifelong, influential, inspiring members of the game and programming communities. They are here for the long haul because they love this stuff and always have.

The ultimate point of Masters of Doom is that today you no longer need to be as brilliant as John Carmack to achieve success, and John Carmack himself will be the first to tell you that. Where John was sitting in a cubicle by himself in Mesquite, Texas for 80 hours a week painstakingly inventing all this stuff from first principles, on hardware that was barely capable, you have a supercomputer in your pocket, another supercomputer on your desk, and two dozen open source frameworks and libraries that can do 90% of the work for you. You have GitHub, Wikipedia, Stack Overflow, and the whole of the Internet.

All you have to do is get off your butt and use them.

[advertisement] Hiring developers? Post your open positions with Stack Overflow Careers and reach over 20MM awesome devs already on Stack Overflow. Create your satisfaction-guaranteed job listing today!
Read more at the source

The 2013 HTPC Build

I no longer own any laptops. Everything in our house is a tablet: multiple Nexus 7s, multiple iPad 4s, and a Surface Pro. In fact, the only traditional computers I own are my triple-monitor desktop home office beast, and the small Home Theater PC (HTPC) that drives all our home entertainment in the living room.


It’s a Mini-ITX case with compact, console-like 3.8″ × 8.7″ × 12.9″ dimensions. It is a class act, totally at home in any civilized home theater environment.

I love that little HTPC to death. It is such a versatile, flexible, always-on box. The longer I work on my HTPC project, the more I believe the evolution of the HTPC is a nice metaphor for the overall future direction of the PC. In summary:

2005 ~$1000 512 MB RAM, single core CPU 80 watts idle
2008 ~$520 2 GB RAM, dual core CPU 45 watts idle
2011 ~$420 4 GB RAM, dual core CPU + GPU 22 watts idle
2013 ~$300* 8 GB RAM, dual core CPU + GPU×2 15 watts idle

15 watts at idle! Incredible, isn’t it? But you probably also noticed how some of these stats aren’t improving so much. Basically, they don’t need to – we’ve reached such an absurd overabundance of computing power that slathering more on top no longer gets us much. It’s been about 2½ years since my last HTPC build, and (*) all I did this year is swap out the motherboard, CPU, and RAM:

I started by removing the overhead drive tray, then pulling out the motherboard and anything attached to it. Notice there’s a ton of room in the front of the case where the old power supply used to be. No need for it. We’re using a more efficient and way smaller PicoPSU. That space is now available for an extra 2TB 2.5″ drive, sitting there on some mildly sticky sheets of sorbothane. Once you factor in the PicoPSU, it’s a roomy build despite the compact dimensions.


Then I mounted the motherboard, attached the front USB and eSATA headers, the power/reset switches, and the aforementioned PicoPSU, which you can see sticking out of the motherboard’s power header near the hard drive. Note that everything not directly attached to the motherboard is driven off a single power connector, so there are two SATA splitters in use. This particular PicoPSU and power brick are rated to 60 watts which is enough for what we’re doing.


The top drive tray slides in with 3 screws. There’s also a place just underneath the two drives above for a slimline Blu-ray or DVD drive, but I found I have virtually no use for optical media any more, so I’ve skipped it.


The main motivation for this upgrade is the lower power usage and better GPU performance of the Haswell CPU, versus the Sandy Bridge CPU that was in there. Everything else remains the same, though I have been selectively upgrading bits and pieces since 2011:

Yes, that’s right, 4.5 terra-friggin-bytes of storage. What can I say? I like me some media, man. The 512GB boot SSD is a little excessive, I’ll grant you that, so feel free to replace the drives with something more modest in your build. I’m just addicted to SSD speed and didn’t want to compromise too much on total storage.

You may wonder why I bothered upgrading memory, since the trusty DDR3-1333 RAM in the old HTPC works fine in the new motherboard. Fair question. Normally, RAM speeds are little more than a curiosity on modern computers, as minor improvements in memory speed have long since ceased to produce meaningful differences in benchmarks. But we are using Haswell’s on-die GPU, and it relies on main memory as graphics memory. Even a low-end video card will have 1GB of ram on it these days, and games certainly expect GPUs with at least 256MB or 512MB of dedicated, extremely high speed graphics memory. This is the rare case where you do care about memory performance. Consider these AnandTech game benchmark results:

IGP Results_575px

It’s a bit difficult to read, but think of it as “percent better than vanilla DDR3-1333″, since that’s the baseline zero value here. The sweet spot is DDR3-1866 CL9 (light blue bar). That grade of memory is only nominally more expensive, and gets you reasonably near the top of each graph, but this motherboard doesn’t support anything higher than 1600. DDR3-2133 CL9 (dark purple bar) is also out there.

Other than lower power consumption, and a modest bump in CPU power, the really big improvement is GPU performance. It’s kind of a complicated matrix, but the i3-4130T chip has an Intel HD 4400 GPU, compared to the HD 2000 GPU that was in the i3-2100T I upgraded from. For example, Dirt 3 on medium detail at 1024×768 shows a gain from 21.4 fps to 44.6 fps for these specific GPUs – more than double the GPU performance, at the same 35 watt TDP!

That’s the other reason I was excited about this upgrade: Steam’s Big Picture mode. With that doubling of GPU power, this 15 watt idle HTPC we just built … is now a credible gaming machine!


You will need an Xbox 360 Wireless kit for PC, which works perfectly with Steam Big Picture mode. Just plug and play, provided you stick to the 190 Steam games with full controller support. You’ll still have to tinker a bit sometimes to get things to work, and you won’t be running Battlefield 4 in hi-def at 60fps or anything, but overall it’s quite promising and bodes well for a console-like future. I’ve had solid results with slightly older games in 720p using medium and occasionally high detail levels, depending on the game.

So what exactly do we get for our upgrade troubles, 2½ years on?

  • A 32% drop in idle power, from 22 watts to 15 watts. And an overall reduction in power consumption when the machine does happen to be doing something. 17 watts when in an active torrent, for example, up to around 50 watts when playing GRID 2.
  • A credible gaming box for the first time, thanks to 2× the GPU power. It also coincides nicely with the maturing of Steam’s Big Picture mode. When Gabe Newell talks about Linux as the future of gaming, this is the sort of machine he’s referring to.

I’m not sure how much lower we can go on power, but I’m absolutely certain that Intel’s on-die GPUs will continue to roughly double in power each generation for the forseeable future. This little HTPC box just keeps getting more versatile over time, while costing me less (in power consumption, at least) every year. It’s the funnest build ever. HTPC, I love you, man!

[advertisement] Hiring developers? Post your open positions with Stack Overflow Careers and reach over 20MM awesome devs already on Stack Overflow. Create your satisfaction-guaranteed job listing today!
Read more at the source

The CODE Keyboard

What would you do, if you could do anything?

I don’t mean in a fantasy superhero way, but in terms of resources. If someone told you that you now had the resources to attempt to make one thing happen in the world, one real thing, what would that be?

If you’re Elon Musk, the patron saint of Hacker News, then you create an electric car and rocket ships. And then propose a hyperloop. Not bad. Not bad at all.

My dream is more modest. I decided to create a keyboard.

The CODE Keyboard, front image with backlight

I’ve talked about keyboards here for years, but The CODE Keyboard is the only simple, clean, beautiful backlit mechanical keyboard I’ve ever found. Because we built it that way.

The name is of course a homage to one of my favorite books.

Code, by Charles Petzold

That’s what I’ve always loved about programming, the thrill of discovering that communicating with other human beings in their code is the true secret to success in writing code for computers. It’s all just … code.

A system of words, letters, figures, or other symbols used to represent others

The projects I’ve worked on for the last eight years are first and foremost systems for efficiently communicating with other human beings, not computers. Both Stack Exchange and Discourse are deeply concerned with people and words and the code they use to talk to each other. The only way those words arrive on your screen is because someone, somewhere typed them. Now, I’ve grown to begrudgingly accept the fact that touchscreen keyboards are here to stay, largely because the average person just doesn’t need to produce much written communication in a given day. So the on-screen keyboard, along with a generous dollop of autocomplete and autofix, suffices.

But I’m not an average person. You aren’t an average person. We aren’t average people. We know how to use the most powerful tool on the webwords. Strip away the images and gradients and vectors from even the fanciest web page, and you’ll find that the web is mostly words. If you believe, as I do, in the power of words, then keyboards have to be one of the most amazing tools mankind has ever created. Nothing lets you get your thoughts out of your brain and into words faster and more efficiently than a well made keyboard. It’s the most subversive thing we’ve invented since the pen and the printing press, and probably will remain so until we perfect direct brain interfaces.

I was indoctrinated into the keyboard cult when I bought my first computer. But I didn’t appreciate it. Few do. The world is awash in terrible, crappy, no name how-cheap-can-we-make-it keyboards. There are a few dozen better mechanical keyboard options out there. I’ve owned and used at least six different expensive mechanical keyboards, but I wasn’t satisfied with any of them, either: they didn’t have backlighting, were ugly, had terrible design, or were missing basic functions like media keys.

WASD Keyboards

That’s why I originally contacted Weyman Kwong of WASD Keyboards way back in early 2012.* I told him that the state of keyboards was unacceptable to me as a geek, and I proposed a partnership wherein I was willing to work with him to do whatever it takes to produce a truly great mechanical keyboard. Weyman is a hard core keyboard nut who absolutely knows his stuff – I mean, he runs a whole company that sells custom high end mechanical keyboards – but I don’t think he had ever met anyone like me before, a guy who was willing to do a no strings attached deal just for the love of an idealized keyboard. At one point over a lunch meeting, he paused, thought a bit, and said:

So … you’re like … some kind of geek humanitarian?

I don’t know about that.

But I’m not here to sell you a keyboard. Buy, don’t buy. It doesn’t matter. I’m just happy to live in a world where the first truly great mechanical keyboard finally exists now, in exactly the form it needed to, with every detail just so, and I can type this very post on it. As glorious as that may be, I’m here to sell you on something much more dangerous: the power of words. So whether you decide to use the CODE Keyboard, or any keyboard at all, I’m glad you’re thinking about writing words with us.

* Yep, we software guys are spoiled – hardware takes forever.

[advertisement] How are you showing off your awesome? Create a Stack Overflow Careers profile and show off all of your hard work from Stack Overflow, Github, and virtually every other coding site. Who knows, you might even get recruited for a great new position!
Read more at the source

The Rule of Three

Every programmer ever born thinks whatever idea just popped out of their head into their editor is the most generalized, most flexible, most one-size-fits all solution that has ever been conceived. We think we’ve built software that is a general purpose solution to some set of problems, but we are almost always wrong. We have the delusion of reuse. Don’t feel bad. It’s an endemic disease among software developers. An occupational hazard, really.

If I have learned anything in my programming career, it is this: building reusable software, truly reusable software, is an incredibly hard problem – right up there with naming things and cache invalidation. My ideas on this crystallized in 2004 when I read Facts and Fallacies of Software Engineering for the first time. It’s kind of a hit-or-miss book overall, but there are a few gems in it, like fact #18:

There are two “rules of three” in [software] reuse…

Read more at the source