{"id":879,"date":"2016-01-10T14:32:45","date_gmt":"2016-01-10T13:32:45","guid":{"rendered":"http:\/\/monodes.com\/predaelli\/?p=879"},"modified":"2016-01-10T14:32:45","modified_gmt":"2016-01-10T13:32:45","slug":"the-sad-graph-of-software-death","status":"publish","type":"post","link":"https:\/\/monodes.com\/predaelli\/2016\/01\/10\/the-sad-graph-of-software-death\/","title":{"rendered":"The sad graph of software death"},"content":{"rendered":"<blockquote><p><a href=\"http:\/\/tinyletter.com\/programming-beyond-practices\/letters\/the-sad-graph-of-software-death\"><img data-recalc-dims=\"1\" decoding=\"async\" class=\"alignnone size-full\" src=\"https:\/\/i0.wp.com\/monodes.com\/predaelli\/wp-content\/uploads\/sites\/4\/2016\/01\/37964b05-5e57-48f5-8645-70e296f2916a.png?w=910\" alt=\"\" \/><\/a>A few years ago, I helped save a company by showing them a single picture that took almost no work to produce<\/p><\/blockquote>\n<p>Sorgente: <em><a href=\"http:\/\/tinyletter.com\/programming-beyond-practices\/letters\/the-sad-graph-of-software-death\">The sad graph of software death<\/a><\/em><\/p>\n<p>&nbsp;<\/p>\n<blockquote>\n<p><!--more--><!--nextpage--><\/p>\n<div id=\"message-heading\">\n<div class=\"date\">December 31, 2015<\/div>\n<h1 class=\"subject\">The sad graph of software death<\/h1>\n<div class=\"by-line\">by <a class=\"tl_twitter_handle\" href=\"https:\/\/twitter.com\/practicingdev\">Gregory Brown<\/a><\/div>\n<div class=\"header-arrow-border\">\u00a0<\/div>\n<div class=\"header-arrow\">\u00a0<\/div>\n<\/div>\n<\/blockquote>\n<div class=\"message-body\">\n<blockquote>\n<div>A few years ago, I helped save a company by showing them a single picture that took almost no work to produce.<\/p>\n<p> Although formally speaking, the\u00a0picture was titled <em>Issue Open vs. Close Rate Over a Four Month Period\u00a0<\/em>&#8212; I tend to refer to it as <em>The Sad Graph of Death\u00a0<\/em>when discussing it in educational conversations. Here it is, in all its glory:<\/p>\n<p> <img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"tl-email-image\" src=\"https:\/\/i0.wp.com\/monodes.com\/predaelli\/wp-content\/uploads\/sites\/4\/2016\/01\/37964b05-5e57-48f5-8645-70e296f2916a1.png?resize=640%2C386\" alt=\"\" width=\"640\" height=\"386\" data-id=\"543661\" \/><\/p>\n<p> This figure tells a story that is no way surprising to anyone who has worked on software projects before: demand for fixes and features is rapidly outpacing the supply of development time invested, and so the issue tracker is no longer serving\u00a0as any sort of meaningful project planning tool.<\/p>\n<p> In all but the most well-funded, high functioning, and sustainable businesses &#8212; you can expect some degree of tension along these lines. The business side of the house may blame developers for not moving fast enough, while the developers blame the business for piling work on too quickly and not leaving time for cleanup, testing, and long-term investments. Typically, both sides have valid concerns, but they don&#8217;t do an especially good job of communicating with one another.<\/p>\n<p> When this\u00a0problem becomes severe enough or persists long enough, you end up with the sad graph of death shown above. And what the graph tells us is that both backlog length and issue resolution\u00a0time\u00a0are trending towards infinity. Even if the team is able to respond some small number of issues quickly, the fact remains that most will take a very long time to be resolved if they get worked on at all, and that situation will get worse over time unless something changes.<\/p>\n<p> In the best case scenario, an open\/close graph that looks like the one I&#8217;ve shown in this email is more of a sign of messy project management practices than it is of imminent doom. There might be lots of old tickets that were actually fixed but never closed, or a ton of duplicate issues that are artificially inflating the total count. Or in the &#8220;packrat project manager&#8221; scenario, there may be tons of low priority nice-to-have tickets that have been sitting around for months or years, even though everyone knows they&#8217;ll never be worked on any time soon. If this is the case, the graph is still &#8220;sad&#8221;, but it&#8217;s not a death spiral&#8230; it&#8217;s just a sign of a wasteful and broken issue tracking process.<\/p>\n<p> However, in my case, I built this graph because the company I was helping was going through major struggles. If you look around\u00a0and everything is on fire and your application\u00a0seems to be about to collapse into\u00a0the sea AND you produce a graph like this from your\u00a0tracker, it&#8217;s a sign of a real problem that needs to be dealt with right away.<\/p>\n<p> What would you do in this situation? Take a minute to think about it now.<\/p>\n<p> If your first instinct is to present this information to a project manager and then call for more time for testing, cleaner code, and improved architecture&#8230; your heart is in the right place, but you&#8217;re putting the cart before the horse.<\/p>\n<p> And if you&#8217;re thinking &#8220;after this iteration, we&#8217;ll request a couple weeks off for cleanup and working through the backlog of\u00a0issues&#8221; &#8212; that&#8217;s a brilliant idea, but it sounds a bit like wishful thinking if you&#8217;re currently part of\u00a0an organization that has let things degrade to this point. There may well be external pressures that are putting the business between a rock and a hard place, and so a direct appeal to just stop new work\u00a0for a while may not go over well.<\/p>\n<p> <em>(By all means, <strong>ask for the time<\/strong>, just don&#8217;t expect it in this sort of crisis situation)<\/em><\/p>\n<p> So if those were the first thoughts to come to mind, try to go back to the drawing board. Assume you have a decision-making stakeholder that is at least willing to listen at this point, and that making an argument that takes the business needs into account will be well received.<\/p>\n<p> What would\u00a0you suggest as a first step? Try to think of something that would begin having positive effects immediately, without you having to write a single line of code.<\/p>\n<p> <strong>I will share my own thoughts in a few days, but until then&#8230; I&#8217;d love to hear your thoughts!<br \/> Just hit reply to share your ideas, or catch up with me via <a href=\"http:\/\/practicingdeveloper.com\/workshop\/\">The Practicing Developer&#8217;s Workshop<\/a>.<\/strong><\/p>\n<p> -greg<\/p>\n<p> PS: Thanks so much to the many folks\u00a0who gave me feedback on the book chapters I sent out. Your comments\u00a0were super helpful!<\/p>\n<p> PPS: HAPPPPPPPPPY NEEEEEEWWWW YEEEEAAAR!!!<\/p><\/div>\n<\/blockquote>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p class=\"excerpt\">A few years ago, I helped save a company by showing them a single picture that took almost no work to produce Sorgente: The sad graph of software death &nbsp;<\/p>\n<p class=\"more-link-p\"><a class=\"more-link\" href=\"https:\/\/monodes.com\/predaelli\/2016\/01\/10\/the-sad-graph-of-software-death\/\">Read more &rarr;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"jetpack_post_was_ever_published":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,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","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}},"categories":[1],"tags":[],"class_list":["post-879","post","type-post","status-publish","format-standard","hentry","category-senza-categoria"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p6daft-eb","jetpack-related-posts":[{"id":4880,"url":"https:\/\/monodes.com\/predaelli\/2018\/11\/07\/neo4j-graph-database\/","url_meta":{"origin":879,"position":0},"title":"Neo4j, Graph database","author":"Paolo Redaelli","date":"2018-11-07","format":false,"excerpt":"Source: Graph database - Wikipedia Neo4j 3.3.5 (April 2018)[20] GPLv3 Community Edition, commercial & AGPLv3 options for enterprise and advanced editions I do like companies that uses AGPL.","rel":"","context":"In &quot;Proprietary software&quot;","block_context":{"text":"Proprietary software","link":"https:\/\/monodes.com\/predaelli\/category\/software\/proprietary-software\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":6362,"url":"https:\/\/monodes.com\/predaelli\/2019\/12\/30\/secushare\/","url_meta":{"origin":879,"position":1},"title":"SECUSHARE","author":"Paolo Redaelli","date":"2019-12-30","format":false,"excerpt":"Secushare employs GNUnet for end-to-end encryption and anonymizing mesh routing (because it has a more suitable architecture than Tor or I2P) and applies PSYC on top (because it performs better than XMPP, JSON or OStatus) to create a distributed social graph. Together, these technologies allow for distributed private social networking\u2026","rel":"","context":"In &quot;Osservanda&quot;","block_context":{"text":"Osservanda","link":"https:\/\/monodes.com\/predaelli\/category\/software\/osservanda\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/monodes.com\/predaelli\/wp-content\/uploads\/sites\/4\/2019\/12\/secushare-0444.png?fit=444%2C296&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":5214,"url":"https:\/\/monodes.com\/predaelli\/2019\/02\/12\/vue-js-app-performance-optimization-part-1%e2%80%8a-%e2%80%8aintroduction-to-performance-optimization-and-lazy\/","url_meta":{"origin":879,"position":2},"title":"Vue.js App Performance Optimization: part 1\u200a\u2014\u200aIntroduction to performance optimization and lazy\u2026","author":"Paolo Redaelli","date":"2019-02-12","format":false,"excerpt":"For the series, I will never stop learning While mobile-first approach becomes a standard and uncertain network conditions are something we should always take into consideration\u2026 Vue.js App Performance Optimization: part 1\u200a\u2014\u200aIntroduction to performance optimization and lazy\u2026 Vue.js App Performance Optimization: part 1\u200a\u2014\u200aIntroduction to performance optimization and lazy\u00a0loading. by Filip\u2026","rel":"","context":"In &quot;Documentations&quot;","block_context":{"text":"Documentations","link":"https:\/\/monodes.com\/predaelli\/category\/documentations\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":11240,"url":"https:\/\/monodes.com\/predaelli\/2024\/01\/19\/why-another\/","url_meta":{"origin":879,"position":3},"title":"Why another?","author":"Paolo Redaelli","date":"2024-01-19","format":false,"excerpt":"Wonderful! Most programmers struggle to design portable applications and support them over Win, Linux, MacOS , Android and iOS. And now this: Huawei Makes a Break From Android With Next Version of Harmony OS 9 China's Huawei will not support Android apps on the latest iteration of its in-house Harmony\u2026","rel":"","context":"In &quot;Ethics&quot;","block_context":{"text":"Ethics","link":"https:\/\/monodes.com\/predaelli\/category\/ethics\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":924,"url":"https:\/\/monodes.com\/predaelli\/2016\/01\/26\/json-references\/","url_meta":{"origin":879,"position":4},"title":"JSON references","author":"Paolo Redaelli","date":"2016-01-26","format":false,"excerpt":"Is there a standard way of referencing objects by identity in JSON? For example, so that graphs and other data structures with lots of (possibly circular) references can be sanely serialized\/loaded? From: JSON: Standard way of referencing an object by identity (for, eg, circular references)? - Stack Overflow Then there's\u2026","rel":"","context":"In &quot;Javascript&quot;","block_context":{"text":"Javascript","link":"https:\/\/monodes.com\/predaelli\/category\/javascript\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":13803,"url":"https:\/\/monodes.com\/predaelli\/2025\/07\/21\/wordpress-statistics-plugin\/","url_meta":{"origin":879,"position":5},"title":"WordPress Statistics plugin","author":"Paolo Redaelli","date":"2025-07-21","format":false,"excerpt":"\u00a0 Get website traffic insights with GDPR\/CCPA compliant, privacy-friendly analytics. Includes visitor data, stunning graphs, and no data sharing. Source: WP Statistics \u2013 The Most Popular Privacy-Friendly Analytics Plugin \u2013 Plugin WordPress | WordPress.org Italia The base version of this plugin is quite better than the base service provided by\u2026","rel":"","context":"In &quot;Basilica's website&quot;","block_context":{"text":"Basilica's website","link":"https:\/\/monodes.com\/predaelli\/category\/basilicas-website\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/monodes.com\/predaelli\/wp-json\/wp\/v2\/posts\/879","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/monodes.com\/predaelli\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/monodes.com\/predaelli\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/monodes.com\/predaelli\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/monodes.com\/predaelli\/wp-json\/wp\/v2\/comments?post=879"}],"version-history":[{"count":0,"href":"https:\/\/monodes.com\/predaelli\/wp-json\/wp\/v2\/posts\/879\/revisions"}],"wp:attachment":[{"href":"https:\/\/monodes.com\/predaelli\/wp-json\/wp\/v2\/media?parent=879"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/monodes.com\/predaelli\/wp-json\/wp\/v2\/categories?post=879"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/monodes.com\/predaelli\/wp-json\/wp\/v2\/tags?post=879"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}