{"id":858,"date":"2012-07-09T00:14:19","date_gmt":"2012-07-09T00:14:19","guid":{"rendered":"https:\/\/www.joelonsoftware.com\/?p=858"},"modified":"2012-07-09T00:14:19","modified_gmt":"2012-07-09T00:14:19","slug":"software-inventory","status":"publish","type":"post","link":"https:\/\/www.joelonsoftware.com\/2012\/07\/09\/software-inventory\/","title":{"rendered":"Software Inventory"},"content":{"rendered":"<p>Imagine, for a moment, that you came upon a bread factory for the first time. At first it just looks like a jumble of incomprehensible machinery with a few people buzzing around. As your eyes adjust you start to see little piles of things that you <em>do<\/em> understand. Buckets of sesame seeds. Big vats of dough. Little balls of dough. Baked loaves of bread.<\/p>\n<p>Those things are inventory. Inventory tends to pile up between machines. Next to the machine where sesame seeds are applied to hamburger buns, there\u2019s a big vat of&#8230;sesame seeds. At the very end of the assembly line, there are boxes and boxes of bread, waiting for trucks to drive them off to customers.<\/p>\n<p>Keeping inventory costs money. Suppose your bakery has six 50-ton silos to store flour. Whenever they empty out, you fill them up. That means on the average day you have 150 metric tons of wheat flour in stock. At today\u2019s prices, you\u2019ve tied up $73,000. Forever.<\/p>\n<p>Inventory may have other costs too, like spoilage. Flour lasts for months, but the minute bread comes out of the oven it starts dropping in value; after 24 hours it\u2019s nearly worthless.<\/p>\n<p><span class=\"side\"><a href=\"https:\/\/i0.wp.com\/www.joelonsoftware.com\/wp-content\/uploads\/2012\/07\/09taco1.jpg?ssl=1\"><img data-recalc-dims=\"1\" decoding=\"async\" class=\"sideimg\" alt=\"\" src=\"https:\/\/i0.wp.com\/www.joelonsoftware.com\/wp-content\/uploads\/2012\/07\/09taco1-thumbnail.jpg?w=730&#038;ssl=1\" \/><\/a><\/span>Why keep inventory at all? Because there are costs associated with running out of things, too. If sesame seeds take two days to order, and you run out of sesame seeds, you are out of the hamburger bun business for two days. Inventory provides a buffer that prevents any part of the process from stalling. There are modern algorithms to optimize how much buffer you need at every point (read up on Toyota\u2019s lean production system and the Theory of Constraints to get started).<\/p>\n<p>Why do I care about any of this? The software production process has several major \u201cinventory\u201d accumulation points, itself. Stuff accumulates at those points and ends up wasting a lot of time and money.<\/p>\n<p>\u201cWhat? How is software like a factory?\u201d you ask.<\/p>\n<p>Think of product ideas as the raw material. Depending on your process, product ideas may go through several assembly line points before they are delivered as finished features to the customer:<\/p>\n<ol>\n<li>A decision-making process (should we implement this feature?)<\/li>\n<li>A design process (specs, whiteboards, mockups, etc)<\/li>\n<li>An implementation process (writing code)<\/li>\n<li>A testing process (finding bugs)<\/li>\n<li>A debugging process (fixing bugs)<\/li>\n<li>A deployment process (sending code to customers, putting it on web server, etc)<\/li>\n<\/ol>\n<p>(PS No, this is not \u201cwaterfall.\u201d No it isn\u2019t. Is <em>not. <\/em>Shut up.)<\/p>\n<p>In between each of these stages, inventory can pile up. For example, when a programmer finishes implementing their code (stage 3) they give it to a tester to check (stage 4). At any given time, there is a certain amount of code waiting to be tested. That code is inventory.<\/p>\n<p>The \u201ccost\u201d of code inventory is huge. It might add up to six or twelve months of work that is stuck in the assembly line and not yet in customers\u2019 hands. This could be the difference between having a cutting-edge product (iPhone) or constantly playing catchup (Windows Phone). It\u2019s nearly impossible to get people to buy Windows Phones, even if the iPhone is only six months better. A lot of markets have network effects, and being first has winner-take-all implications. So getting rid of inventory in the development process can make or break a product.<\/p>\n<p>Let\u2019s go over the three places most inventory accumulates.<\/p>\n<p><strong>Feature backlogs.<\/strong> Every product attracts new feature ideas, and you can\u2019t implement ideas as fast as you can think them up, so you write them down, and this list is called the feature backlog. A lot of the ideas on the backlog are bad ideas, and you merely wrote them down to avoid hurting the feelings of the people who thought them up. Backlogs make everyone feel good. <\/p>\n<p>The trouble is that 90% of the things in the feature backlog will never get implemented, ever. So every minute you spent writing down, designing, thinking about, or discussing features that are never going to get implemented is just time wasted. When I hear about product teams that regularly have \u201cbacklog grooming\u201d sessions, in which they carefully waste a tiny amount of time and mental energy every day or every week thinking about every single feature which will never be implemented, I want to poke my eyes out.<\/p>\n<ul>\n<li>Suggestion: Do not allow more than a month or two of work to get into the feature backlog list. Once the backlog is full, do not allow new items to be added unless you remove an item. Do not spend any time speccing, designing, or talking about backlog items: the backlog, in fact, should be seen as a list of things you are not allowed to talk about or work on.<\/li>\n<\/ul>\n<p><strong><span class=\"side\"><a href=\"https:\/\/i0.wp.com\/www.joelonsoftware.com\/wp-content\/uploads\/2012\/07\/09taco2.jpg?ssl=1\"><img data-recalc-dims=\"1\" decoding=\"async\" class=\"sideimg\" alt=\"\" src=\"https:\/\/i0.wp.com\/www.joelonsoftware.com\/wp-content\/uploads\/2012\/07\/09taco2-thumbnail.jpg?w=730&#038;ssl=1\" \/><\/a><\/span>The bug database<\/strong> is obviously a great thing to have. Bug reports should be complete, accurate, and actionable. But I have noticed that in many real-world companies, the desire never to miss any bug report leads to bug bankrupcy, where you wake up one day and discover that there are 3000 open bugs in the database, some of which are so old they may not apply any more, some of which can never be reproduced, and most of which are not even worth fixing because they\u2019re so tiny. When you look closely you realize that months or years of work has gone into preparing those bug reports, and you ask yourself, how could we have 3000 bugs in the database while our product is delightful and customers love it and use it every day? At some point you realize that you\u2019ve put too much work into the bug database and not quite enough work into the product.<\/p>\n<ul>\n<li>Suggestion: use a triage system to decide if a bug is even worth recording. <\/li>\n<li>Do not allow more than two weeks (in fix time) of bugs to get into the bug database. <\/li>\n<li>If you have more than that, stop and fix bugs until you feel like you\u2019re fixing stupid bugs. Then close as \u201cwon\u2019t fix\u201d everything left in the bug database. Don\u2019t worry, the severe bugs will come back.<\/li>\n<\/ul>\n<p><strong>Undeployed features.<\/strong> There are still a lot of teams doing quarterly or annual releases, usually because their deployment process is expensive. Operating systems, or anything where software has to be installed by every user, is usually batched up. <\/p>\n<p>This is one of the most expensive forms of inventory: unshipped feature inventory. It could be earning you money, but it\u2019s sitting on the shipping dock of your factory, while the guy down the street already has a product that does that exact same thing.<\/p>\n<p>Sometimes, perniciously, you don\u2019t even feel the pain, because everyone on your team has been dogfooding the new version for months. I\u2019m sure everyone at Microsoft has been happily using Windows 8 for a year now, so they don\u2019t really feel, on a day to day basis, the pain of OEMs trying to sell Windows 7 in a Mac OS X Lion world.<\/p>\n<ul>\n<li>Suggestion: Don\u2019t let completed features pile up in ways that don\u2019t make you money. Work on your deployment process so that you can get customers features in months rather than years. If you\u2019re already shipping monthly, figure out how to ship weekly. Keep pushing the bar on more and more frequent deployment of smaller and smaller changes.<\/li>\n<\/ul>\n<p>So, where am I going with this? We\u2019ve had all three kinds of inventory at Fog Creek: crazy long backlogs, overambitious bug databases, and features which got stuck for a year waiting for the next release to go out. All of these snuck up on us. I realized that we needed a system to constrain inventory so it doesn\u2019t build up.&nbsp;<\/p>\n<p>My original idea was to make a product called <em>Five Things<\/em>. It was going to be a project manager where everybody was allowed to have five things assigned to them: two things they were actively doing, one thing that was \u201cup next\u201d, and a couple more that they were planning. That exact design idea didn\u2019t go anywhere (but if you want to build it, go for it), but it did evolve into <a href=\"http:\/\/trello.com\/\">Trello<\/a>.<\/p>\n<p><span class=\"side\"><a href=\"https:\/\/trello.com\/dev\"><img data-recalc-dims=\"1\" decoding=\"async\" class=\"sideimg\" alt=\"\" src=\"https:\/\/i0.wp.com\/www.joelonsoftware.com\/wp-content\/uploads\/2012\/07\/09trelloOnTrello-thumbnail.png?w=730&#038;ssl=1\" \/><\/a><\/span>Trello works great for a <em>reasonable<\/em> amount of inventory, but it intentionally starts to get klunky if you have too many cards in one list. And that\u2019s exactly the point: it makes inventory <em>visible<\/em> so that you know when it\u2019s starting to pile up. (Click on the image at the right to see the Trello team\u2019s own development board).<\/p>\n<p>Every day you look at your Trello board and see that there are seventeen completed features that are totally ready to ship but which haven\u2019t shipped for some reason, and you go find the bottleneck and eliminate it. <\/p>\n<p>Every time somebody suggests a crazy feature idea, you look at the Feature Backlog and realize it\u2019s just too long, so you don\u2019t waste any time documenting or designing that crazy idea.<\/p>\n<p>And hopefully, you\u2019ll spend less effort working on things that never see the light of day. \u201cBacklog grooming.\u201d Sheeeesh.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Imagine, for a moment, that you came upon a bread factory for the first time. At first it just looks like a jumble of incomprehensible machinery with&hellip; <span class=\"read-more\"><a class=\"more-link\" href=\"https:\/\/www.joelonsoftware.com\/2012\/07\/09\/software-inventory\/\" rel=\"bookmark\">Read more <span class=\"screen-reader-text\">&#8220;Software Inventory&#8221;<\/span><\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[2,11],"tags":[],"class_list":["post-858","post","type-post","status-publish","format-standard","hentry","category-news","category-program-manager"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p83KNI-dQ","_links":{"self":[{"href":"https:\/\/www.joelonsoftware.com\/wp-json\/wp\/v2\/posts\/858","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.joelonsoftware.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.joelonsoftware.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.joelonsoftware.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.joelonsoftware.com\/wp-json\/wp\/v2\/comments?post=858"}],"version-history":[{"count":0,"href":"https:\/\/www.joelonsoftware.com\/wp-json\/wp\/v2\/posts\/858\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.joelonsoftware.com\/wp-json\/wp\/v2\/media?parent=858"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.joelonsoftware.com\/wp-json\/wp\/v2\/categories?post=858"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.joelonsoftware.com\/wp-json\/wp\/v2\/tags?post=858"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}