{"id":77,"date":"2008-01-24T22:32:20","date_gmt":"2008-01-25T05:32:20","guid":{"rendered":"http:\/\/thesmithfam.org\/blog\/2008\/01\/24\/the-truth-about-software-requirements\/"},"modified":"2019-08-12T07:16:11","modified_gmt":"2019-08-12T13:16:11","slug":"the-truth-about-software-requirements","status":"publish","type":"post","link":"https:\/\/thesmithfam.org\/blog\/2008\/01\/24\/the-truth-about-software-requirements\/","title":{"rendered":"The Truth About Software Requirements"},"content":{"rendered":"<p>I am a computer programmer by profession. In my personal time, however, I am a computer programmer. The difference between the two: <b>requirements<\/b> (or the absence thereof).<\/p>\n<p>In my industry, software requirements are considered a big deal by nearly all of my users, especially the paying kind. In the 5 years I&#8217;ve been working in this industry, I&#8217;ve learned five lessons that I&#8217;d like to share with my readership (yes, all 3 of you, not counting family).<\/p>\n<p><b>Lesson 1: Requirements Change<\/b><\/p>\n<p>Duh. Everyone knows this. If you&#8217;re a great computer programmer, you cope with it by writing flexible code and having a positive attitude. What people don&#8217;t know is that changing requirements are really just a symptom of a deeper problem, which I&#8217;ll cover later. The lesson here is that you <b>must<\/b> be flexible, but you already knew that. So, on to&#8230;<\/p>\n<p><b>Lesson 2: Requirements are a Front<\/b><\/p>\n<p>Software requirements exist for one reason: People are sick of crappy software. Several years ago, some <a href=\"http:\/\/www.sei.cmu.edu\/cmmi\/\">well intending but misguided people<\/a> set about to solve the &#8220;crappy software problem&#8221; by creating a process to control software development more closely with carefully crafted and well managed requirements. Who can blame them? If users knew how to write good software, they would do it themselves. They certainly wouldn&#8217;t pay some &#8220;socially awkward&#8221; person who yammers about closures and list comprehensions. But since they don&#8217;t know how to write software, they have to manage those who do. I&#8217;m referring here to &#8220;the paying kind&#8221; of users I mentioned before. I should point out that I&#8217;m not talking about <a href=\"http:\/\/www.joelonsoftware.com\/articles\/FiveWorlds.html\">shrinkwrap software<\/a> here, but rather custom development projects with big price tags.<\/p>\n<p>So what&#8217;s the front? The front is that the customer knows what he wants, and he desperately wants to communicate that to you, but he only has this crippled 1200 baud modem of a language called &#8220;requirements.&#8221; This puts you, the programmer, in interpreter mode. Your job is to find out what he <b>really wants<\/b> and translate that into a usable product. This leads me to&#8230;<\/p>\n<p><b>Lesson 3: You, The Programmer, Must Control the Requirements<\/b><\/p>\n<p>Because great programmers recognize their role as an interpreter, translating requirements into what the customer really wants, and translating <b>that<\/b> into code, <b>you<\/b> have to be in charge of the requirements. This means that once in a while, you have to go out on a limb and say things like, &#8220;Mighty customer, sir, your requirements document says <b>A<\/b>, but I think you might like <b>B<\/b> better.&#8221; Sometimes you might even have to implement and demonstrate the feature to him <b>first<\/b>. This is a risky place to be, but it&#8217;s where you <b>have<\/b> to go if your software project is to be successful. This means you actually have to <b>think<\/b> about what the customer is asking for. Yes, great programmers don&#8217;t just translate requirements into code, they go <b>behind the requirements<\/b> and they <b>control the requirements<\/b> by gently nudging them in the direction that the customer really needs.<\/p>\n<p>This means you&#8217;ll be wrong sometimes. That&#8217;s the price you pay to have a successful software project. If you find that you are wrong too often, you probably don&#8217;t understand your customer well enough, and some homework is in order. Stop controlling the requirements until you <b>understand your customer fully<\/b>.<\/p>\n<p>By the way, very few programmers can do this right all the time. I only know a few, and I&#8217;m not one of them yet. Most programmers will simply translate requirements into code, and then get very upset when their product is thrown away or rejected by the customer (even if it &#8220;satisfies&#8221; the requirements&#8221;). This is all too often the case because the requirements were bogus in the first place. Truly great programmers, on the other hand, will not only satisfy their customers, but will exceed expectations by delivering a product that gives the customer something they didn&#8217;t even know they needed (pay attention managers: that means more revenue), but now can&#8217;t live without.<\/p>\n<p>Let&#8217;s take an example from the shrinkwrap world: A couple years ago, no one would have thought they <b>needed<\/b> a <a href=\"http:\/\/www.apple.com\/iphone\/\">$500 cell phone<\/a>, but now millions of people just have to have one. Why? Because Apple figured out what people really wanted, before people even asked for it. Do you think some Apple customer handed Steve Jobs a requirements document to build the iPhone? Yeah right.<\/p>\n<p><b>Lesson 4: The Only Real Requirement<\/b><\/p>\n<p>In the end, there is only one real requirement, and it&#8217;s quite simple: The customer should get what he wants, and also what he needs. Sometimes you, the programmer, have to help the customer realize that what he wants is not what he really needs, or that what he needs is above and beyond what he wants. This takes people skills. Some customers even <b>want<\/b> something that is totally at odds with what they <b>need<\/b>. These people are rare in my experience. You may have noticed that I used the word &#8220;gentle&#8221; above. That is for these customers.<\/p>\n<p>You have to go <b>behind the requirements<\/b> to figure out the real needs of your customer. If you don&#8217;t, you will fail, even if you follow the requirements to the letter. I should say: <b>Especially<\/b> if you follow the requirements to the letter. In my experience, implementing the requirements is about 30% of the total effort on a software project. The other 70% is spent discovering and implementing the things that the customer really needs.<\/p>\n<p><b>Lesson 5: Good Requirements Can&#8217;t Replace Good Programmers<\/b><\/p>\n<p>Some people seem to think that if you write your requirements well enough, you can afford sub-par programmers. This is simply not true. I don&#8217;t care how good your requirements are. I don&#8217;t care how much work you did to make them perfect. If you hand them over to crappy programmers, your project will fail. Period.<\/p>\n<p>The only way to run a successful software project is to employ the best people. Never think that if you apply enough rigorous process and manage requirements well enough that you can compensate for having crappy programmers on your project. Nothing can compensate for crappy programmers.<\/p>\n<p>Remember what I said about 30% vs 70%? Good programmers make up the 70%, even if you have perfect requirements (hint: you don&#8217;t have perfect requirements).<\/p>\n<p><b>Happy Coding!<\/b><\/p>\n<p>Now that you know what I know, get out there and find out what your customers really want! Oh, and don&#8217;t expect to find the answer by just asking, &#8220;Hey, what do you really want?&#8221;<\/p>\n<p>Good luck!<\/p>\n<p>P.S. I mentioned a &#8220;deeper problem&#8221; in my first section. Did you figure out what it is? I hope so.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I am a computer programmer by profession. In my personal time, however, I am a computer programmer. The difference between the two: requirements (or the absence thereof). In my industry, software requirements are considered a big deal by nearly all of my users, especially the paying kind. In the 5 years I&#8217;ve been working in [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-77","post","type-post","status-publish","format-standard","hentry","category-code-and-cruft"],"_links":{"self":[{"href":"https:\/\/thesmithfam.org\/blog\/wp-json\/wp\/v2\/posts\/77","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thesmithfam.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thesmithfam.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thesmithfam.org\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thesmithfam.org\/blog\/wp-json\/wp\/v2\/comments?post=77"}],"version-history":[{"count":3,"href":"https:\/\/thesmithfam.org\/blog\/wp-json\/wp\/v2\/posts\/77\/revisions"}],"predecessor-version":[{"id":1570,"href":"https:\/\/thesmithfam.org\/blog\/wp-json\/wp\/v2\/posts\/77\/revisions\/1570"}],"wp:attachment":[{"href":"https:\/\/thesmithfam.org\/blog\/wp-json\/wp\/v2\/media?parent=77"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thesmithfam.org\/blog\/wp-json\/wp\/v2\/categories?post=77"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thesmithfam.org\/blog\/wp-json\/wp\/v2\/tags?post=77"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}