{"id":4471,"date":"2015-08-05T13:00:10","date_gmt":"2015-08-05T13:00:10","guid":{"rendered":"http:\/\/writeasync.net\/?p=4471"},"modified":"2015-08-05T04:34:08","modified_gmt":"2015-08-05T04:34:08","slug":"automatic-vs-automated","status":"publish","type":"post","link":"http:\/\/writeasync.net\/?p=4471","title":{"rendered":"Automatic vs. automated"},"content":{"rendered":"<p>Modern software systems involve plenty of automation, especially in <a href=\"https:\/\/en.wikipedia.org\/wiki\/Test_automation\">testing<\/a>, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Continuous_integration#Automate_deployment\">deployment<\/a>, and <a href=\"https:\/\/en.wikipedia.org\/wiki\/DevOps\">operations<\/a>. However, there is a world of difference between <a href=\"https:\/\/www.englishforums.com\/English\/AutomaticVsAutomated\/bczlkx\/post.htm\"><em>automatic<\/em> and automated<\/a> processes. Automation can be an insidious half measure which creates the illusion of agility while actually leaving less time for engineering real solutions.<\/p>\n<p>Now, don&#8217;t get me wrong &#8212; automation can also be a wonderful thing. I just hate to see it applied to anything that could instead be done <strong>automatically<\/strong> without intervention by a single human being. And that really is the key difference &#8212; automation still needs a person to decide to invoke it. It might be a gloriously simple invocation, say, a single button press. Yet, the button must still be pressed.<\/p>\n<p>Maybe you have a really cool script that can run all the tests against a given feature branch to let the developer know if their changes broke anything. That&#8217;s a great first step, but if you really want to avoid breaking the tree, this process must be <strong>automatic<\/strong>. Someone (more likely through negligence than malice) could forget to run the cool script or ignore the results and merge their changes anyway.<\/p>\n<p>Maybe you have a really useful troubleshooting app which can detect and recycle a server instance that appears unresponsive. This is surely a good tool to have in your arsenal, but do you really want to spend an operator&#8217;s time on this task? Why not build that monitoring and recovery strategy into the system itself?<\/p>\n<p>Anything straightforward enough to already have well-defined and well-scoped automation can likely become automatic with a bit more effort. Still, you must exercise caution. For example, an overzealous &#8220;auto-reboot on failure&#8221; policy can easily bring down an entire server farm. As a general (perhaps obvious) rule, any action which has the potential to cause data loss or violate an <a href=\"https:\/\/en.wikipedia.org\/wiki\/Service-level_agreement\">SLA<\/a> needs careful input from a human. Consider going a bit meta and building automatic safeguards in your system that suspend automatic policies if they are likely to do more harm than good (e.g. &#8220;reboot no more than 10 machines in a 10 minute time window&#8221;).<\/p>\n<p>Whenever you are faced with an automation prompt, ask yourself, &#8220;Why am I making this decision?&#8221; If a machine can do it better, get out of the way!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Modern software systems involve plenty of automation, especially in testing, deployment, and operations. However, there is a world of difference between automatic and automated processes. Automation can be an insidious half measure which creates the illusion of agility while actually&hellip; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[91,81,51],"tags":[],"class_list":["post-4471","post","type-post","status-publish","format-standard","hentry","category-design","category-distributed","category-testing"],"_links":{"self":[{"href":"http:\/\/writeasync.net\/index.php?rest_route=\/wp\/v2\/posts\/4471","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/writeasync.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/writeasync.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/writeasync.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/writeasync.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4471"}],"version-history":[{"count":0,"href":"http:\/\/writeasync.net\/index.php?rest_route=\/wp\/v2\/posts\/4471\/revisions"}],"wp:attachment":[{"href":"http:\/\/writeasync.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4471"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/writeasync.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4471"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/writeasync.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4471"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}