{"id":23388,"date":"2021-06-09T12:39:30","date_gmt":"2021-06-09T17:39:30","guid":{"rendered":"http:\/\/blog.kenperlin.com\/?p=23388"},"modified":"2021-06-09T12:39:30","modified_gmt":"2021-06-09T17:39:30","slug":"programmum-non-nocere","status":"publish","type":"post","link":"https:\/\/blog.kenperlin.com\/?p=23388","title":{"rendered":"Programmum non nocere"},"content":{"rendered":"<p>I am in the middle of a rapid software development project. There is a first demo in a few weeks, and I need to add a lot more capability between now and then.<\/p>\n<p>Every day I add new features, or replace old ones. Which means that every day there are opportunities for massive failure.<\/p>\n<p>I keep backups at each step, so failure is never catastrophic. Still, I don&#8217;t really want to lose the bulk of a day&#8217;s work by introducing some bug that will force me to go back to a previous version.<\/p>\n<p>So I&#8217;m adopting a kind of variation of the physician&#8217;s motto &#8220;First do no harm.&#8221; Whenever I add a new feature that will replace an older one, I keep the older feature in for a while.<\/p>\n<p>The idea is that everything should continue to operate exactly the way it did before I added the new code. Except now there are new things you can also do if you know how.<\/p>\n<p>I keep it that way until I am confident that I haven&#8217;t broken anything. Only then do I get rid of the old version of the feature. <\/p>\n<p>I realize that the stakes here are a lot lower than what doctors deal with every day. Still, it&#8217;s good to have a way to work that doesn&#8217;t keep breaking anything.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I am in the middle of a rapid software development project. There is a first demo in a few weeks, and I need to add a lot more capability between now and then. Every day I add new features, or replace old ones. Which means that every day there are opportunities for massive failure. I &hellip; <a href=\"https:\/\/blog.kenperlin.com\/?p=23388\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Programmum non nocere&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.kenperlin.com\/index.php?rest_route=\/wp\/v2\/posts\/23388"}],"collection":[{"href":"https:\/\/blog.kenperlin.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.kenperlin.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.kenperlin.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.kenperlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=23388"}],"version-history":[{"count":1,"href":"https:\/\/blog.kenperlin.com\/index.php?rest_route=\/wp\/v2\/posts\/23388\/revisions"}],"predecessor-version":[{"id":23389,"href":"https:\/\/blog.kenperlin.com\/index.php?rest_route=\/wp\/v2\/posts\/23388\/revisions\/23389"}],"wp:attachment":[{"href":"https:\/\/blog.kenperlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=23388"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.kenperlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=23388"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.kenperlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=23388"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}