{"id":4739,"date":"2024-04-13T02:00:00","date_gmt":"2024-04-13T06:00:00","guid":{"rendered":"https:\/\/www.both.org\/?p=4739"},"modified":"2024-04-11T02:42:02","modified_gmt":"2024-04-11T06:42:02","slug":"temporary-fixes-that-become-permanent","status":"publish","type":"post","link":"https:\/\/www.both.org\/?p=4739","title":{"rendered":"Temporary fixes that become permanent"},"content":{"rendered":"<div class=\"pld-like-dislike-wrap pld-template-1\">\r\n    <div class=\"pld-like-wrap  pld-common-wrap\">\r\n    <a href=\"javascript:void(0)\" class=\"pld-like-trigger pld-like-dislike-trigger  \" title=\"\" data-post-id=\"4739\" data-trigger-type=\"like\" data-restriction=\"cookie\" data-already-liked=\"0\">\r\n                        <i class=\"fas fa-thumbs-up\"><\/i>\r\n                <\/a>\r\n    <span class=\"pld-like-count-wrap pld-count-wrap\">    <\/span>\r\n<\/div><\/div>\n<p>If you&#8217;ve worked in IT, you&#8217;ve seen this: &#8220;I&#8217;ll just make this patch until someone can do a more elegant solution.&#8221; And that temporary fix never gets replaced, because as the old saying goes, &#8220;Broken gets fixed, but &#8216;does the job&#8217; lasts forever.&#8221; We asked our community for their stories about a &#8220;quick fix&#8221; that became a permanent one.<\/p>\n\n\n\n<p>Chris Rigsby shared his experience in writing a fix as a proof of concept:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>One morning, my boss appeared in my cubicle, describing a new software-induced political crisis and wondering if I could help. After twenty years, I&#8217;ve forgotten the specifics of the issue, but the result still haunts me.<\/p>\n\n\n\n<p>First, I replicated the problem in a development environment. As fast as I could, I hacked together the code equivalent of a MacGyver duct tape, bailing twine, and bubble gum as a proof of concept (POC) only. I was moving fast, putting the word <code>TEMP<\/code> (and <em>worse<\/em>, my username) into object names and code as I scrambled to design a demo fix. I fully intended to take an hour to refactor the solution into a more elegant and standards compliant package before shipping it to the functional users for more thorough testing and approval.<\/p>\n\n\n\n<p>Alas, when I demonstrated the POC solution, I heard these terrifying words: &#8220;Perfect! Move it to the Test area and notify the customers.&#8221; When I replied it would be on its way in about an hour, I had to explain that what I&#8217;d just demonstrated was an ugly hack that wouldn&#8217;t pass the QA review and needed refinement.<\/p>\n\n\n\n<p>My stomach flipped when I heard the next sentence: &#8220;If this fixes the issue, ship it for testing. I&#8217;ll talk to the QA people. We&#8217;ll patch it in the next quarterly release.&#8221;<\/p>\n\n\n\n<p>Sadly, I never got to patch things up and as far as I know, the poorly named objects are still in production today. Lesson learned: never use <code>TEMP<\/code>, <code>TMP<\/code>, or your username in widget, table, or code object names.<\/p>\n<\/blockquote>\n\n\n\n<p>Byron Patterson used a misspelling in a URL for testing, but it stuck around forever:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Misspelling &#8220;subscription&#8221; as &#8220;subskripshun&#8221; so it would be unique and never used intentionally to build a list of courses included in an unlimited subscription a company could buy. Still in use today. The website URL looks like https:\/\/example.com\/SearchResults.aspx?searchterm=subskripshun<\/p>\n<\/blockquote>\n\n\n\n<p>David Both wrote a backup script that he never got around to replacing:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Over the more than forty years I&#8217;ve had one or more computers in my home, there&#8217;s always been the need for backups. Before I found Linux I used several expensive backup programs that relied on tape drives which were far less reliable than I would have liked. In fact, I was never able to restore from tape when necessary. To make matters worse, every time a tape drive died, the technology had changed so a replacement drive also required replacing all of the expensive tapes as well.<\/p>\n\n\n\n<p>When I started using Linux in 1996, I had an unusable tape drive and tapes that were unreadable. I needed a new approach to backups.<\/p>\n\n\n\n<p>Since my experiences with external USB hard drives was excellent, I decided to use them as my backup medium. All I needed was a program. I tried some open source backup programs and, although they worked well, they weren&#8217;t really what I wanted in a backup program.<\/p>\n\n\n\n<p>Way back in 2009 I had been experimenting with the <code>rsync<\/code> command, which has some very interesting features that I have been able to use to good advantage. My primary objectives were to create backups from which users could locate and restore files quickly without having to extract data from a backup tarball and to reduce the amount of time taken to create the backups. I planned to use this tool until I could find open source software available that I could use for backups.<\/p>\n\n\n\n<p>So I wrote a little program to encapsulate the <code>rsync<\/code> command along with a bit of code to determine whether a reboot was required and notify me about that. A little later I added code to deal with multiple hosts to backup, and later I added code to handle multiple backup devices so I could have an internal storage drive as well as the external one that I took to my safe deposit box for safekeeping. Then I added code for \u2026 you get the picture.<\/p>\n\n\n\n<p>I never found better software to do what I wanted than the &#8220;temporary&#8221; software I created myself.<\/p>\n<\/blockquote>\n\n\n\n<p>Jim Hall created a quick fix that lasted until the system&#8217;s end of life:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>When I worked in Enterprise IT at a public university, a legislator told our CIO: &#8220;We have a bill before us about your course evaluations. If you can make these public in four weeks, we won&#8217;t have to pass a law to make you do it.&#8221;<\/p>\n\n\n\n<p>Our lead developer said it would take that long to get something into QA.<\/p>\n\n\n\n<p>I had just updated my website to add an open source search engine called <code>perlfect<\/code>, so users could find the information they needed. I thought, &#8220;What if we turned the data into HTML files, I could put <code>perlfect<\/code> in front of it. Then you can &#8216;search&#8217; the course evaluations.&#8221;<\/p>\n\n\n\n<p>So I volunteered to try it out. It took a day for them to get me the data, a day to automate turning it into HTML, another day to set up and automate the search engine. And then the new &#8220;search the course evaluations&#8221; website was up.<\/p>\n\n\n\n<p>Of course, my quick fix had lots of &#8220;holes.&#8221; It searched text on HTML pages, so if you searched for any text that was on all the pages (like &#8220;instructor&#8221; or &#8220;course&#8221; or &#8220;evaluation&#8221;) it returned all the pages. But it was just supposed to be a temporary fix until the developers could write a proper web app.<\/p>\n\n\n\n<p>My temporary fix stayed in production until they replaced the course evaluation back-end.<\/p>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>We asked our community for their stories about a &#8220;quick fix&#8221; that became a permanent one.<\/p>\n","protected":false},"author":33,"featured_media":3365,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_lmt_disableupdate":"","_lmt_disable":"","footnotes":""},"categories":[98,157,69],"tags":[91,152],"class_list":["post-4739","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code","category-community","category-fun","tag-linux","tag-programming"],"modified_by":"David Both","_links":{"self":[{"href":"https:\/\/www.both.org\/index.php?rest_route=\/wp\/v2\/posts\/4739","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.both.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.both.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.both.org\/index.php?rest_route=\/wp\/v2\/users\/33"}],"replies":[{"embeddable":true,"href":"https:\/\/www.both.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4739"}],"version-history":[{"count":1,"href":"https:\/\/www.both.org\/index.php?rest_route=\/wp\/v2\/posts\/4739\/revisions"}],"predecessor-version":[{"id":4740,"href":"https:\/\/www.both.org\/index.php?rest_route=\/wp\/v2\/posts\/4739\/revisions\/4740"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.both.org\/index.php?rest_route=\/wp\/v2\/media\/3365"}],"wp:attachment":[{"href":"https:\/\/www.both.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4739"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.both.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4739"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.both.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4739"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}