    <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/">
     <channel>
        <title>ACCU  :: RE:Purpose FWD:Thinking</title>
        <link>https://members.accu.org/index.php/journals/2824</link>
        <description>Professionalism in Programming</description>
        <dc:language>en-us</dc:language> 
        <dc:creator>Administrator</dc:creator> 
        <admin:generatorAgent rdf:resource="http://www.xaraya.org" /> 
        <admin:errorReportsTo rdf:resource="mailto:webeditor@accu.org" />
       <sy:updatePeriod>hourly</sy:updatePeriod>
       <sy:updateFrequency>1</sy:updateFrequency>
       <docs>http://backend.userland.com/rss</docs>


        <h2>Journal Articles</h2>


<div class="xar-mod-head"><span class="xar-mod-title">Overload Journal #158 - August 2020 + Journal Editorial</span></div>

<table border="0" cellpadding="1" cellspacing="0">
    <tbody>
    <tr>
        <td valign="top">
            Browse in :
       </td>
       <td valign="top">

                                            <a href="https://members.accu.org/index.php/journals/">All</a>

                     &gt;                         <a href="https://members.accu.org/index.php/journals/c76/">Journals</a>

                     &gt;                         <a href="https://members.accu.org/index.php/journals/c78/">Overload</a>

                     &gt;                         <a href="https://members.accu.org/index.php/journals/c413/">o158</a>
                    (7)
<br />

                                            <a href="https://members.accu.org/index.php/journals/">All</a>

                     &gt;                         <a href="https://members.accu.org/index.php/journals/c184/">Journal Columns</a>

                     &gt;                         <a href="https://members.accu.org/index.php/journals/c185/">Editorial</a>
                    (221)
<br />

                                            <a href="https://members.accu.org/index.php/journals/c413-185/">Any of these categories</a>

                    -                        <a href="https://members.accu.org/index.php/journals/c413+185/">All of these categories</a>
<br />
</td>
   </tr>
   </tbody>
</table>




<div class="xar-error">
   <p>
 <strong>Note:</strong> when you create a new publication type,
the articles module will automatically use the templates
<em>user-display-[publicationtype].xt</em>
and <em>user-summary-[publicationtype].xt</em>.
If those templates do not exist when you try to preview or display a new article,
you'll get this warning :-)  Please place your own templates in themes/<em>yourtheme</em>/modules/articles . The templates will get the extension .xt there. </p>
</div>
<div class="xar-norm xar-standard-box-padding">
   <h1><strong>Title:</strong>&nbsp;RE:Purpose FWD:Thinking</h1>
<p><strong>Author:</strong>&nbsp;Bob Schmidt</p>
<p>
<strong>Date:</strong> 01 August 2020 18:14:21 +01:00 or Sat, 01 August 2020 18:14:21 +01:00</p>
<p><strong>Summary:</strong>&nbsp;The pandemic could be a â€˜Once in a Lifetimeâ€™ opportunity to stop and think. Frances Buontempo misses this chance and muses on lyrics by Talking Heads instead.</p>
<p><strong>Body:</strong>&nbsp;<p>Though I should write an editorial, I might take a break this time, and think about the purpose of an <em>Overload</em> editorial instead. As I muse, I am looking out of the window watching rain dripping off trees, shoots and leaves. Without a strong sense of purpose, a compelling reason behind a chore, distractions creep in. Not that an editorial is a chore â€“ Iâ€™ve never written one, so wouldnâ€™t know. Even with a sense of purpose, fear can creep in if you suspect your opinion may be in the minority, or controversial. I could write about diversity and inclusion. I could call into question excuses as to why there are fewer women in programming, and science or mathematics, in some parts of the world. I could discuss why some people claim women donâ€™t enjoy mathematics or their brains arenâ€™t wired up properly for it, or I could consider racial prejudice, and its preconceptions about innate â€˜racialâ€™ ability. Such biases tend to become self-fulfilling prophecies and even feedback loops. If most people in prison are black, police are more likely to stop and search black people, so in all probability more black people end up in prison, reinforcing the conception that â€˜they are criminalsâ€™. Iâ€™ve been reading geneticist Adam Rutherfordâ€™s <em>How to argue with a racist</em> [<a href="#[Rutherford20]">Rutherford20</a>], which shows why the idea of race is ill-formed to begin with. Highly recommended. </p>

<p>One very striking point made by Rutherford is that race, either in terms of genetics or other measures, is based on clustering. This is a statistical technique, often also used in machine learning. Data points, say people, are described by a tuple of features, say genes, skin colour, IQ, whatever. The clustering algorithm is then run, and reports back who belongs in which cluster. There are various ways to assign tuples to different groups, though all rely on a distance measure and almost all need to know how many groups you want. So, how many races are there? Two. Great youâ€™ll get the tuples of people split between two groups. Five. Ditto. What is the point of clustering data? Well, sometimes you get a clear â€˜decision boundaryâ€™, helping you disambiguate between labels. If I plot the height of a random collection of mice and elephants, against specimen number, I can draw a straight line between the two groups. Above the line means elephant; below means mouse. If I asked for three clusters, Iâ€™d get three. The data would be labelled into one of three groups, but that wouldnâ€™t help spot elephants, in the room or otherwise. Why try clustering? To fish around and see if you do have some â€˜differentâ€™ potential labels going on. If you do, you can then ask which features correlate best with the labels. Even if you discover something via clustering, you still need to think about what you have found out. If you discover AI can work out someoneâ€™s â€˜criminalityâ€™ by their skin colour, you may have discovered systemic racism. Just saying. Statistics often forms a null hypothesis; nothing to see here, and an alternate hypothesis; thatâ€™s significant. The purpose of subsequence analysis is to decide which hypothesis is more likely correct. Some machine learning is applied without an up-front purpose. Thatâ€™s ok. A data pipeline producing visualisations for people to consider can be useful or interesting. Data science often does this â€“ itâ€™s an initial step, but hasnâ€™t fully covered the â€˜scienceâ€™ part to my mind. It can be the start of some science though.</p>

<p>Thatâ€™s enough of controversial subjects. As I was saying, without a sense of purpose, random distractions creep in. If youâ€™ve ever worked on a legacy code base, you may have found yourself deep in a call stack wondering how you got there. â€˜<em>And you may ask yourself, â€œHow do I work this?â€</em>â€™ [<a href="#[Talking Heads]">Talking Heads</a>]. Furthermore,</p>

<p class="blockquote">And you may ask yourself, â€˜What is that beautiful house?â€™</p>

<p class="blockquote">And you may ask yourself, â€˜Where does that highway go to?â€™</p>

<p class="blockquote">And you may ask yourself, â€˜Am I right? Am I wrong?â€™</p>

<p class="blockquote">And you may say to yourself, â€˜My God! What have I done?â€™</p>

<p>Actually, listening to music can help you concentrate and not get too distracted by the highways in the code. If you get to the end of a playlist or album and havenâ€™t got anywhere, itâ€™s time to get up and walk, grab a drink, do something else for a bit to get your focus back. Legacy code can be hard work. If you understand what part of it is trying to achieve, for example if you have some kind of code test round a bit of it, you can experiment with the code and try to refactor to something clearer. Without tests, youâ€™re probably trying to dig yourself out of a hole though:</p>

<p class="blockquote">Water dissolving and water removing</p>

<p class="blockquote">There is water at the bottom of the ocean</p>

<p class="blockquote">Under the water, carry the water</p>

<p class="blockquote">Remove the water at the bottom of the ocean</p>

<p>If youâ€™re trying to bail out the ocean, you need to give up and learn to swim. Donâ€™t drown in a confusing code base. There are many resources to help with such code, for example <em>Working Effectively with Legacy code</em> by Mike Feathers, or <em>The Legacy Programmerâ€™s Toolbox</em> By Jonathan Boccara. Make sure you are using version control, then you wonâ€™t be afraid to try changes to see what happens. Donâ€™t trust the comments, though they may show the original purpose of some code. Think about what you need to achieve, and donâ€™t get lost in a maze of twisty passages, all alike. Use a heuristic â€“ always go left, always delete the comments, never change code without a test. Donâ€™t get put off â€“ keep your eyes on the prize. Above all, donâ€™t drown.</p>

<p>Our garden looks slightly drowned at the moment, which is a distraction. Several of the bushes look a bit overgrown, and a few weeds are trying to take over. Looking at it, I can see how it possibly was, a while ago. I can sense what sort of shape might be trying to happen â€“ where to prune, and cut back. However, Iâ€™ll get soaked if I go out there so these refactors will have to wait. If you look at legacy code you can sometimes see an older, simpler code base in the undergrowth and behind the weeds. I often see branches spring up to bolt-on new behaviour. Rather than grafting new growth on to established root-stocks, a cutting in a pot has been balanced in a tree, fallen over, smashed and turned into some weird looking triffid. OK, perhaps the analogy isnâ€™t perfect, but you get the idea. Why does this happen? Because the simplest ways to shoe-horn new features into code is often by slapping an <code>if</code>/<code>else</code> in. If code has been designed with potential future variations in mind, there may be a place to use a new strategy, send in a lambda, or similar. The Open/Closed principle (OCP) might be driving at this idea. Jon Skeet blogged about the OCP a while ago [<a href="#[Skeet13]">Skeet13</a>]. He questions what â€˜openâ€™ and â€˜closedâ€™ mean here, and quotes Wikipediaâ€™s summary of Bertrand Meyerâ€™s version:</p>

<p class="blockquote">The idea was that once completed, the implementation of a class could only be modified to correct errors; new or changed features would require that a different class be created. That class could reuse coding from the original class through inheritance. The derived subclass might or might not have the same interface as the original class.</p>

<p>Kinda like repurposing the original, via inheritance, or as Jon puts it, â€œ<em>A ghastly abuse of inheritance</em>â€. He is having more of a dig at Uncle Bobâ€™s annotation than Meyerâ€™s original quote though. Jon talks about â€˜Protected variationâ€™ as a clearer idea:</p>

<p class="blockquote">Identify points of predicted variation and create a stable interface around them.</p>

<p>In order to achieve this, some forward thinking is required. On the face of it, this seems to be in conflict with the YAGNI principle â€“ â€˜You arenâ€™t going to need itâ€™ â€“ a mantra from Extreme Programming. The words, â€˜on the face of itâ€™ are important. There is a difference between building something now, that you might need in the future, versus architecting your code so that you can add new features in the future. Otherwise the twisty maze of <code>if</code>s/<code>else</code>s will happen. Martin Fowler talks about YAGNI in a blog [<a href="#[Fowler15]">Fowler15</a>]. He asks devs to consider what refactoring would be needed to introduce a new feature later on, and as a side effect, to:</p>

<p class="blockquote">â€¦add something thatâ€™s easy to do now, adds minimal complexity, yet significantly reduces the later cost. Using lookup tables for error messages rather than inline literals are an example that are simple yet make later translations easier to support.</p>

<p>A little bit of forward thinking and a sense of purpose can make your life easier.</p>

<p>One advantage the pandemic has brought is many local Meetups now take place online. You can therefore join people who are miles away, and virtually attend talks you would otherwise have not been able to get to. A case in point, for me, being the Norfolk developers [<a href="#[Nor(DEV)]">Nor(Dev)</a>]. On the 2nd July, Jez Higgins gave a talk entitled, â€˜Journey into spaceâ€™ [<a href="#[Higgins20]">Higgins20</a>]. He started by reminiscing about computers from the 1980s and how he learnt to code. He talked about good code, agile, and how he â€˜<em>read an article by one of the original signatories of the manifesto for agile software development, and accidentally ended up writing a version of Asteroids for [his] phone.</em>â€™ The talk was excellent and is available on YouTube. By talking about previous work on a long project, which had been designed up front, Jez reminded us to ask why the agile manifesto had been written. I suspect many scrum masters and agile managers havenâ€™t worked on an old-school Waterfall project, so donâ€™t fully appreciate the context on this. Iâ€™ve heard people talk about being â€˜rigidly agileâ€™, or insisting you need specified meetings for prescribed lengths of time. Four-hour back-log grooming meetings etc. The first of the four better ways of developing software stated in the manifesto says, â€˜<em>Individuals and interactions over processes and tools.</em>â€™ [<a href="#[Agile]">Agile</a>]. Ron Jeffries, the signatory to whom Jez referred, blogged about â€˜Dark Scrumâ€™ [<a href="#[Jeffries16]">Jeffries16</a>]. He talks about how Scrum can end up being a tool of oppression. If you understand why youâ€™re using scrum, and how to keep communication open things will improve. If the goal is working software, then being able to show new features, no matter how small/lean, that do something useful is a win for everyone. Getting to that point can be hard work though.</p>

<p>Jefferies talks about testing quite a bit in the blog. Who doesnâ€™t? Well, I know I do, and it annoys some people. He also talks about continuous integration. I notice build/test/deploy pipelines referred to frequently, for example on Jenkinsâ€™ â€˜Continuous Deliveryâ€™ articles [<a href="#[Jenkins]">Jenkins</a>]. Recently, the UK prime minister announced, â€œ<em>Weâ€™re going to build, build, build, and deploy jobs, jobs, jobs.</em>â€ To build and deploy without testing is asking for trouble. When we test, we check what effect our construction has, and ask if it does what we expected. This inspired me to write a dreadful little ditty:</p>

<p class="blockquote">Weâ€™re going to build, build, build</p>

<p class="blockquote">And deliver jobs, jobs, jobs</p>

<p class="blockquote">sudo crontab -e e e</p>

<p class="blockquote">Gee</p>

<p class="blockquote">Didnâ€™t work.</p>

<p class="blockquote">Didnâ€™t test first. What a berk.</p>

<p>Apologies. Iâ€™ll stick to the day job. So, whatâ€™s the purpose of an <em>Overload</em> editorial? Iâ€™ll go have a think about that for next time, while you read this issuesâ€™ articles. Do feel free to contact our writers and encourage them. It gives a sense of purpose, and might spark new ideas to think about, and hopefully more articles in the future.</p>

<h2>References</h2>

<p class="bibliomixed"><a id="[Agile]"></a>[Agile] Manifesto for Agile Software Development at: <a href="https://agilemanifesto.org/">https://agilemanifesto.org/</a></p>

<p class="bibliomixed"><a id="[Fowler15]"></a>[Fowler15] Martin Fowler (2015) â€˜Yagniâ€™ posted 26 May 2015 at:<a href="https://www.martinfowler.com/bliki/Yagni.html">https://www.martinfowler.com/bliki/Yagni.html</a></p>

<p class="bibliomixed"><a id="[Higgins20]"></a>[Higgins20] Jez Higgins (2020) â€˜Journey Into Spaceâ€™, talk on 2 July 2020. Abstract: <a href="https://www.meetup.com/Norfolk-Developers-NorDev/events/271181133/">https://www.meetup.com/Norfolk-Developers-NorDev/events/271181133/</a>Recording: <a href="https://www.youtube.com/watch?v=8BOnppFZo6s">https://www.youtube.com/watch?v=8BOnppFZo6s</a></p>

<p class="bibliomixed"><a id="[Jeffries16]"></a>[Jeffries16] Ron Jeffries (2016) â€˜Dark Scrumâ€™, posted 8 September 2015 at <a href="https://ronjeffries.com/articles/016-09ff/defense/">https://ronjeffries.com/articles/016-09ff/defense/</a></p>

<p class="bibliomixed"><a id="[Jenkins]"></a>[Jenkins] â€˜Continuous Deliver Articlesâ€™ at <a href="https://www.jenkins.io/solutions/pipeline/">https://www.jenkins.io/solutions/pipeline/</a></p>

<p class="bibliomixed"><a id="[Nor(DEV)]"></a>[Nor(DEV)] Norfolk Developers meetups: <a href="https://www.meetup.com/Norfolk-Developers-NorDev/">https://www.meetup.com/Norfolk-Developers-NorDev/</a></p>

<p class="bibliomixed"><a id="[Rutherford20]"></a>[Rutherford20] Adam Rutherford (2020) <em>How to argue with a racist</em> Orion Publishing Co, Feb 2020, ISBN 978-1474611244</p>

<p class="bibliomixed"><a id="[Skeet13]"></a>[Skeet13] Jon Skeet (2013) â€˜The Openâ€“Closed Principle, in Reviewâ€™ on Jon Skeetâ€™s coding blog, posted 15 March 2013 at: <a href="https://codeblog.jonskeet.uk/2013/03/15/the-open-closed-principle-in-review/">https://codeblog.jonskeet.uk/2013/03/15/the-open-closed-principle-in-review/</a></p>

<p class="bibliomixed"><a id="[Talking Heads]"></a>[Talking Heads] Talking Heads: Lyrics from <em>Once in a lifetime</em></p>

<p class="bio"><span class="author"><b>Frances Buontempo</b></span> has a BA in Maths + Philosophy, an MSc in Pure Maths and a PhD technically in Chemical Engineering, but mainly programming and learning about AI and data mining. She has been a programmer since the 90s, and learnt to program by reading the manual for her Dadâ€™s BBC model B machine.</p>
</p>
<p><strong>Notes:</strong>&nbsp;</p>
<p><em>More fields may be available via dynamicdata ..</em></p>
</div>
</channel>
</rss>
