Writing software is hard. If it were easy, you wouldn't be bothering to read this book and we'd all be enslaved by machines by now, so thank your blessings that it's not a trivial task.
But why should software development be hard? It requires no purchase of paint or canvas, and it binds you by few physical constraints. It should be the ultimate blank slate, yet one of your biggest impediments is that of logically painting yourself into a corner. In essence, your very own mind is one of your biggest enemies.
Another constraint is time. Although few things are technically beyond your means, you are mortal and cannot possibly physically create something as powerful and flexible as the entirety of the GNU/Linux operating system in just two weeks.
And for whom is this software written? Yourself? Your friends? A rather common scenario is writing custom software for a client. The fantasy client used as an example in this chapter is called "Widget World." The type of scenario it presents is very common, because the majority of software is not written for consumers but rather to meet the specifications of businesses, governments, and other groups.
The rest of this chapter assumes that you're an average developer, working on an average project at an average company with average clients. For simplicity's sake, however, we've given this example project some perhaps uncommon traits:
You are developing a new product. (A much more common scenario would be to modify a currently existing system.)
You are working alone because you are reading this text alone. (In the real world, you would most likely be working closely with or interfacing with other developers.)