<?xml version="1.0" encoding="UTF-8"?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
  <id>tag:keithpitty.com,2005:/feed</id>
  <link rel="alternate" type="text/html" href="https://keithpitty.com"/>
  <link rel="self" type="application/atom+xml" href="https://keithpitty.com/feed.atom"/>
  <title>Keith Pitty</title>
  <updated>2021-08-09T21:12:54+10:00</updated>
  <entry>
    <id>tag:keithpitty.com,2005:BlogPost/100</id>
    <published>2021-08-09T21:12:54+10:00</published>
    <updated>2021-08-11T21:22:08+10:00</updated>
    <link rel="alternate" type="text/html" href="https://keithpitty.com/blog_posts/2021-08-10-reflecting-on-my-retrospectives-journey"/>
    <title>Reflecting on My Retrospectives Journey</title>
    <content type="html">&lt;h2&gt;The Initial Inspiration&lt;/h2&gt;
&lt;p&gt;It must be getting on to a decade ago now.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://pragprog.com/titles/dlret/agile-retrospectives/"&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/112/original/agile-retrospectives-book.jpg?1628507510" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I had been freelancing, doing Ruby on Rails development for Blake eLearning for a few years. The size of the team had grown significantly since I started contributing.&lt;/p&gt;
&lt;p&gt;Thinking further back, I had been a keen practitioner of all things Agile since 2001. My colleagues and I at an Enterprise Java consultancy had been early practitioners of eXtreme Programming. We were keen to learn more about the meeting of minds that led to the &lt;a href="https://agilemanifesto.org/"&gt;Agile Manifesto&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So, it was in about 2013 when I started reading &lt;a href="https://pragprog.com/titles/dlret/agile-retrospectives/"&gt;&lt;em&gt;Agile Retrospectives&lt;/em&gt;&lt;/a&gt; by Esther Derby and Diana Larsen that I suggested to the Blake Tech Lead, &lt;a href="https://www.linkedin.com/in/martinstannard/"&gt;Martin Stannard&lt;/a&gt;, that retrospectives would be beneficial to the team.&lt;/p&gt;
&lt;h2&gt;My Journey&lt;/h2&gt;
&lt;h3&gt;Using Trello&lt;/h3&gt;
&lt;p&gt;At some point we had adopted &lt;a href="https://trello.com"&gt;Trello&lt;/a&gt; as our tool of choice for tracking our work. So, when we began holding retrospectives, it seemed natural to use Trello to capture the discussion points for each retro. After all, Trello is an adaptable tool, and it enables remote participation.&lt;/p&gt;
&lt;p&gt;Regardless of the tool, my recollection is that adopting the practice of holding regular retros significantly helped our teamwork at Blake. We may not have been as sophisticated as Esther or Diana. Nevertheless, the simple opportunity for the team to gather and reflect on our recent work, and for each member to have their say, was powerful.&lt;/p&gt;
&lt;h3&gt;A lo-fi approach&lt;/h3&gt;
&lt;p&gt;In mid 2015 I moved on to work at The Conversation. I spent the first week on site, in Melbourne. At the end of that week, as was the usual practice on a Friday, the team held a retrospective.&lt;/p&gt;
&lt;p&gt;It was definitely lo-fi. The tools to support the discussion were a whiteboard and coloured markers. The board was divided into quadrants to guide the team&amp;#8217;s focus on what had gone well, what hadn&amp;#8217;t gone so well, what questions had arisen and what actions should be taken. At the end of the retro a mobile phone was used to take a photo of the board. That photo was then emailed to the team. It was a practice that had so far stood the test of time.&lt;/p&gt;
&lt;p&gt;At this point I should emphasise that I had joined the team as it&amp;#8217;s first remote member. So, at the end of the next week when I was back in my home office, an obvious challenge surfaced. I had no visibility of the retro board until after the retro had concluded! As the weeks went by I suggested that we consider using Trello. However, there was resistance, probably because the simplicity of the quadrants on the board had worked so well for the team for so long.&lt;/p&gt;
&lt;h3&gt;RemoteRetro is born&lt;/h3&gt;
&lt;p&gt;Months went by. In February of 2016 the team was at the Gold Coast in Queensland for the fourth edition of RubyConf AU. One of my colleagues, &lt;a href="https://www.markcipolla.com/"&gt;Mark Cipolla&lt;/a&gt;, had been thinking about my inability to participate in the retros as fully as the rest of the team.&lt;/p&gt;
&lt;p&gt;Thankfully for me, this thought led to action! During those few days on the Gold Coast, Mark started developing a web application that mimicked the team&amp;#8217;s retro white board. Sure, in it&amp;#8217;s initial form the tool was somewhat rough around the edges. But it solved my problem!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://remoteretro.io/"&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/113/original/remoteretro.jpg?1628508144" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;From then on, using &lt;a href="https://remoteretro.io/"&gt;RemoteRetro&lt;/a&gt;, everyone in our team was able to add items to the retro board via a web browser. Mark quickly added a feature to allow voting so that the team could give more focus to discussing the issues that most people cared about.&lt;/p&gt;
&lt;p&gt;For some time &lt;a href="https://remoteretro.io/"&gt;RemoteRetro&lt;/a&gt; was just used by the development team within The Conversation.&lt;/p&gt;
&lt;p&gt;Meanwhile, Mark kindly invited me to join him as a co-founder of this side-project. We worked on it at a Rails Camp in the Gold Coast hinterland, ironing out some bugs and gave a demo of &lt;a href="https://remoteretro.io/"&gt;RemoteRetro&lt;/a&gt; on the last night. I guess that was one way other development teams came to learn about the potential to use &lt;a href="https://remoteretro.io/"&gt;RemoteRetro&lt;/a&gt; in their team retros.&lt;/p&gt;
&lt;p&gt;At another Rails Camp in late 2017, we added some polish to &lt;a href="https://remoteretro.io/"&gt;RemoteRetro&lt;/a&gt; so that users could actually sign in and, for example, see boards for previous retros from within the tool. This was a significant weekend that saw us take the product towards a level where it may justify paying customers.&lt;/p&gt;
&lt;h3&gt;A demand to pay for RemoteRetro&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/114/original/feedback-from-myles.jpg?1628508534" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;As you can see from the tweet above, by March 2018 we were getting some encouraging feedback from other users of what was still a free product.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/115/original/demand-from-myles.jpg?1628508544" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Not only that, Myles quite rightly pointed out that users should have the opportunity to pay for RemoteRetro!&lt;/p&gt;
&lt;p&gt;So, Mark and I set about enabling others to pay for using what for a couple of years had been a free product.&lt;/p&gt;
&lt;h3&gt;Subscriptions launched&lt;/h3&gt;
&lt;p&gt;As has been the case for most of RemoteRetro&amp;#8217;s history, Mark did the bulk of the work on the codebase to pave the way for subscriptions to be introduced. However, I do recall that during a trip to Melbourne to watch a couple of games of footy and catch up with friends and family, I spent a few hours with Mark that culminated in us launching a version of &lt;a href="https://remoteretro.io/"&gt;RemoteRetro&lt;/a&gt; that allowed users to subscribe.&lt;/p&gt;
&lt;p&gt;Yes, after a period of more than two years during which the tool had been free to use, we had enabled Myles and others to &amp;#8220;throw us some dollars&amp;#8221; in exchange for using &lt;a href="https://remoteretro.io/"&gt;RemoteRetro&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Happily for us, despite it having a small user base, &lt;a href="https://remoteretro.io/"&gt;RemoteRetro&lt;/a&gt; is now used by teams all over the globe.&lt;/p&gt;
&lt;p&gt;We are aware that there is scope for improving the product. However, we also continue to guard against the tool becoming unnecessarily complex as a result of feature bloat. Having said that, if you&amp;#8217;ve given &lt;a href="https://remoteretro.io/"&gt;RemoteRetro&lt;/a&gt; a try and have some suggestions about how it would better serve your team, &lt;a href="mailto:support@remoteretro.io"&gt;feedback&lt;/a&gt; is always welcome.&lt;/p&gt;
&lt;h3&gt;More experience with retros&lt;/h3&gt;
&lt;p&gt;In 2018 I introduced retrospectives to the development team at Birdsnest. Looking back on that time, I must admit that there were times when I struggled to maintain my composure, sometimes during a retrospective. I am grateful to a colleague for reminding me of the &lt;em&gt;Prime Directive&lt;/em&gt;. Originally emphasised by Norm Kerth, it states:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;Regardless of what we discover, we understand and truly believe that everyone did the best job they could, given what they knew at the time, their skills and abilities, the resources available, and the situation at hand.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Reflecting on this fundamental perspective can be humbling.&lt;/p&gt;
&lt;p&gt;Later, after I had moved on to Clover in mid-2019, our teams benefited from using different formats of retrospectives. By this time &lt;a href="https://remoteretro.io/"&gt;RemoteRetro&lt;/a&gt; had been adapted to support alternatives such as Start/Stop/Continue and Mad/Sad/Glad, as well as the ability to create custom formats.&lt;/p&gt;
&lt;h3&gt;Why I love retrospectives&lt;/h3&gt;
&lt;p&gt;From very early years in my life I&amp;#8217;ve enjoyed teamwork. I guess it stems originally from the experiences I had playing team sports. As the years went by I accumulated other types of teamwork, at school, university and in the workplace.&lt;/p&gt;
&lt;p&gt;A core facet of teamwork is ensuring that every member of the team feels empowered to have their say.&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s why I love retrospectives. As the saying goes, a team is greater than the sum of its parts. Retrospectives are a powerful tool for drawing upon the thoughts and feelings of all members of a team in a constructive way.&lt;/p&gt;
&lt;h3&gt;Learning from the masters&lt;/h3&gt;
&lt;p&gt;Unsurprisingly, I still feel that I have much to learn about retrospectives.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.informit.com/store/retrospectives-antipatterns-9780136823360"&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/116/original/retrospective-antipatterns.jpg?1628510875" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Several years ago, at a &lt;span class="caps"&gt;YOW&lt;/span&gt;! conference, I recall hearing &lt;a href="https://www.linkedin.com/in/ainovongecorry/"&gt;Aino Vonge Corry&lt;/a&gt; speak passionately about retrospectives. She has accumulated much experience in facilitating them, to the extent that she has published a &lt;a href="https://www.informit.com/store/retrospectives-antipatterns-9780136823360"&gt;comprehensive book of retrospective antipatterns&lt;/a&gt;. I&amp;#8217;m still digesting them but based on what I have read so far, I thoroughly recommend adding Aino&amp;#8217;s book to the one by Esther and Diana that originally inspired me.&lt;/p&gt;
&lt;h3&gt;Looking ahead&lt;/h3&gt;
&lt;p&gt;If you&amp;#8217;ve read this far, you may have developed the impression that this post is a thinly-masked plug for &lt;a href="https://remoteretro.io/"&gt;RemoteRetro&lt;/a&gt;. I guess that&amp;#8217;s partly true.&lt;/p&gt;
&lt;p&gt;But only partly.&lt;/p&gt;
&lt;p&gt;As I discovered last year when &lt;a href="https://keithpitty.com/blog/archives/2020-10-21-succeeding-with-remote-retrospectives"&gt;facilitating a discussion about remote retrospectives&lt;/a&gt;, there&amp;#8217;s a range of tools that teams are using whilst conducting retrospectives online, now that the pandemic has resulted in team members working from home.&lt;/p&gt;
&lt;p&gt;With an eye to the future, I&amp;#8217;m fortunate to be looking forward to participating in retros on a regular basis, and learning more about how to make the most of them.&lt;/p&gt;</content>
    <author>
      <name>Keith Pitty</name>
      <email>keith@keithpitty.com</email>
    </author>
  </entry>
  <entry>
    <id>tag:keithpitty.com,2005:BlogPost/99</id>
    <published>2021-04-18T22:34:43+10:00</published>
    <updated>2021-04-23T09:53:20+10:00</updated>
    <link rel="alternate" type="text/html" href="https://keithpitty.com/blog_posts/2021-04-23-enabling-application-longevity"/>
    <title>Enabling Application Longevity</title>
    <content type="html">&lt;p&gt;The following tweet recently captured my attention:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/eduardsi/status/1381633331230601221"&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/111/original/we-dont-write-tests.png?1618748805" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It has obviously struck a chord with many others because it highlights a truism in software development. So many applications become burdened with being cumbersome to maintain because insufficient priority has been given to enabling them to be tested within a practical time-frame.&lt;/p&gt;
&lt;h2&gt;More on this theme&lt;/h2&gt;
&lt;p&gt;This is a theme that was also highlighted recently in an article in the Australian Computer Society&amp;#8217;s &lt;em&gt;Information Age&lt;/em&gt; entitled &lt;a href="https://ia.acs.org.au/content/ia/article/2021/software-testing-is-slowing-transformation.html"&gt;&lt;em&gt;Software testing is slowing transformation&lt;/em&gt;&lt;/a&gt;. This article cited a report by Tricentis that found that the average time software testers spent manually checking &amp;#8220;the functioning of every element to ensure that the quality and reliability of the whole solution have been maintained&amp;#8221; is now taking an average of 23 days.&lt;/p&gt;
&lt;p&gt;Obviously the reliance on manual quality assurance testing does not enable quick development and deployment of changes to applications.&lt;/p&gt;
&lt;p&gt;Unsurprisingly, the &lt;em&gt;Information Age&lt;/em&gt; article goes on to emphasise the importance of automated testing.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;Automated software testing has emerged as a key tool to make this happen, with increasingly intelligent, AI-driven tools able to source human-written source code for changes, dependencies, and even potential security issues.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Few companies are achieving the greater than 75 per cent automation rate that signifies mature software development processes, the report notes, while most lack supporting testing technology like service virtualisation and test data management.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;So What?&lt;/h2&gt;
&lt;p&gt;What&amp;#8217;s the point of this post? Essentially, I want to draw attention to the cost of maintaining an application. As has been acknowledged many times previously, the cost of maintaining an application is many times the cost of its initial development.&lt;/p&gt;
&lt;p&gt;Once an application has first been deployed to production, if it is to stand a chance of being successful into the future, careful consideration needs to be given to how to enable it to be maintained in a sustainable fashion.&lt;/p&gt;
&lt;h2&gt;When do we need to consider application longevity?&lt;/h2&gt;
&lt;p&gt;Before it is too late!&lt;/p&gt;
&lt;p&gt;If we observe what Ward Cunningham&amp;#8217;s original wiki had to say about &lt;a href="http://wiki.c2.com/?TechnicalDebt"&gt;Technical Debt&lt;/a&gt;, one of the key statements was:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;Don&amp;#8217;t let the debt build up. Everyone knows the list will never be addressed. Remove cruft as you go. Build simplicity and clarity in from the beginning, and never relent in keeping them in.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So, as a development team, in conjunction with the business, we need to deliberately focus on enabling application longevity from early in the piece. The longer we leave it, the harder it will be to recover the technical debt.&lt;/p&gt;
&lt;p&gt;Too often, this lesson is ignored.&lt;/p&gt;
&lt;h2&gt;What will enable an application to last and thrive?&lt;/h2&gt;
&lt;h3&gt;Automated tests&lt;/h3&gt;
&lt;p&gt;As the earlier tweet and &lt;span class="caps"&gt;ACS&lt;/span&gt; article emphasised, an absence of automated testing inevitably leads to a dependence on lengthy, manual testing. Given the fact that automated testing and continuous integration have been long-standing practices, there is no excuse for bypassing them.&lt;/p&gt;
&lt;p&gt;The alternative is, whichever way you consider it, a significant impediment.&lt;/p&gt;
&lt;p&gt;In one scenario, the team is faced with time-consuming, error-prone manual testing whenever a change is to be considered for deployment. Or, worse still, changes that would otherwise improve the internal design of the application or improve its business function, are not delivered at all due to a lack of confidence that the application will not break.&lt;/p&gt;
&lt;p&gt;There will be circumstances when years pass and the application has not been given the benefit of automated tests. If this is the case, it may not be too late. A decision can still be made to start building automated tests and a CI infrastructure. However, this is likely to require significant persuasion that the investment is worth it.&lt;/p&gt;
&lt;h3&gt;A commitment to refactoring&lt;/h3&gt;
&lt;p&gt;Before I go any further, let me be clear. Refactoring implies automated testing. Too often I have heard developers talk about their intention to &amp;#8220;refactor&amp;#8221; a part of a codebase when there are no automated tests. As Martin Fowler put it in the subtitle of his &lt;em&gt;Refactoring&lt;/em&gt; book back in 2000, it is &lt;em&gt;Improving the Design of Existing Code&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Automated tests are required to ensure that the behaviour of the existing code remains the same as the internal design is improved.&lt;/p&gt;
&lt;p&gt;Having made that point, it is important to recognise that a codebase is liable to decay over time. Quick fixes can be applied without concern for long-term maintainability. Developers new to a codebase can solve problems without adhering to patterns already established in the codebase. Many other factors can lead to code that is not easy to maintain.&lt;/p&gt;
&lt;p&gt;So, especially when a part of the codebase is being changed to add a business feature, care should be taken to refactor, to improve the design of existing code.&lt;/p&gt;
&lt;h3&gt;A commitment to updating dependencies&lt;/h3&gt;
&lt;p&gt;When an application is first launched, it is likely to depend upon recent versions of the operating system, database management system, web server, web framework, programming language and various open source libraries. It is also likely that, at this time, very little attention is paid to the fact that the versions of these dependent software systems and libraries are recent.&lt;/p&gt;
&lt;p&gt;Shortly after the time when an application is first launched, how much attention is paid to a maintenance plan? Probably not much. The business is likely to be more focused on how well the application will achieve its objectives. This is reasonable.&lt;/p&gt;
&lt;p&gt;However, at some point, as it hopefully becomes clear that the application is achieving sufficient success to remain deployed for the foreseeable future, attention must be paid to updating dependencies. Tools such as &lt;a href="https://dependabot.com/"&gt;Dependabot&lt;/a&gt; smooth the way.&lt;/p&gt;
&lt;p&gt;Failure to embark upon a program of regularly implementing updates will lead to a poor set of outcomes. As far as ease of maintenance is concerned, allowing versions of dependent software to get out of date is likely to result in much time lost in frustrating developer experience, whether it is due to difficulty in installing unsupported versions or a mismatch in online documentation and old versions that the application still depends upon.&lt;/p&gt;
&lt;p&gt;The lack of security patches, which are regularly included on new versions of software, can also result in risks to business operations.&lt;/p&gt;
&lt;p&gt;Relating these comments back to the tweet reference that started this post, a healthy set of automated tests will make it much easier to confidently apply updates of dependent software. A lack of automated tests and CI will likely lead to dependence on unsupported software. As a related aside, it is interesting to read the first two paragraphs of &lt;a href="https://guides.rubyonrails.org/upgrading_ruby_on_rails.html"&gt;Upgrading Ruby on Rails&lt;/a&gt; on the &lt;em&gt;Rails Guides&lt;/em&gt; site:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;Before attempting to upgrade an existing application, you should be sure you have a good reason to upgrade. You need to balance several factors: the need for new features, the increasing difficulty of finding support for old code, and your available time and skills, to name a few.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The best way to be sure that your application still works after upgrading is to have good test coverage before you start the process. If you don&amp;#8217;t have automated tests that exercise the bulk of your application, you&amp;#8217;ll need to spend time manually exercising all the parts that have changed. In the case of a Rails upgrade, that will mean every single piece of functionality in the application. Do yourself a favor and make sure your test coverage is good before you start an upgrade.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Parting thoughts&lt;/h2&gt;
&lt;p&gt;A successful application launch is something to be celebrated. An application successfully operating after a significant period of time is even better. However, careful planning and management are necessary to ensure that applications truly stand the test of time.&lt;/p&gt;
&lt;p&gt;Automated tests and continuous integration play a crucial role in allowing development teams to confidently maintain applications that will continue to adapt to changing business requirements.&lt;/p&gt;</content>
    <author>
      <name>Keith Pitty</name>
      <email>keith@keithpitty.com</email>
    </author>
  </entry>
  <entry>
    <id>tag:keithpitty.com,2005:BlogPost/98</id>
    <published>2021-02-17T07:16:27+11:00</published>
    <updated>2021-02-17T20:58:30+11:00</updated>
    <link rel="alternate" type="text/html" href="https://keithpitty.com/blog_posts/2021-02-17-recent-reading"/>
    <title>Recent Reading</title>
    <content type="html">&lt;p&gt;It has been a while since I wrote a post on this site. I have a few ideas for topics to write about in the future but I shall let them percolate for the time being.&lt;/p&gt;
&lt;p&gt;Meanwhile, I thought I would write a brief post to share what I have been reading lately that relates to my work.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/110/original/susan-yin-2JIvboGLeho-unsplash.jpg?1613506839" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Photo by &lt;a href="https://unsplash.com/@syinq?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Susan Yin&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/books?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;General&lt;/h2&gt;
&lt;h3&gt;Retrospective Antipatterns&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;By Aino Vonge Corry&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Aino is a long-time facilitator of retrospectives. Whilst she hails from Denmark, I recall hearing her speak at a &lt;span class="caps"&gt;YOW&lt;/span&gt;! conference in Sydney several years ago.&lt;/p&gt;
&lt;p&gt;As someone who has facilitated and participated in retrospectives for many years, I&amp;#8217;m keen to learn how to make them more effective. So I&amp;#8217;m grateful to Aino for sharing the knowledge she has gained from her experience.&lt;/p&gt;
&lt;p&gt;Somewhat ironically, &lt;em&gt;Retrospective Antipatterns&lt;/em&gt; is arranged in a pattern. Aino presents 24 antipatterns, divided into three parts: structural, planning and people. Each part contains eight antipatterns. Is it a coincidence that there is a picture of an octopus on the cover of the book?&lt;/p&gt;
&lt;p&gt;Anyway, I&amp;#8217;ve read the first three chapters and am keen to work my way through the remainder of the book. Unfortunately I haven&amp;#8217;t had the opportunity to be involved in any retrospectives for a while but hopefully that will change soon.&lt;/p&gt;
&lt;h3&gt;The Culture Code&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;By Daniel Coyle&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Whilst I haven&amp;#8217;t read Daniel Coyle&amp;#8217;s &lt;em&gt;The Talent Code&lt;/em&gt;, I recall hearing it recommended in a conference talk a few years ago. So, when I was curious to find a good book about what makes for a successful organisation, I was attracted to reading what Daniel had to say about culture.&lt;/p&gt;
&lt;p&gt;Throughout my career as a software developer, which now spans 37 years, I have firmly been of the opinion that people are more challenging than technology. Moreover, I have thrived when I&amp;#8217;ve worked within a well-functioning team. However, that has not always been the case. I can recall some stages in my career where, to me, there were significant problems with the organisation&amp;#8217;s culture.&lt;/p&gt;
&lt;p&gt;Daniel lays out advice about how a group can develop three crucial skills: building safety, sharing vulnerability and establishing purpose. I&amp;#8217;ve nearly finished reading the chapters in the first section and am impressed by what I have read so far. Once I&amp;#8217;ve finished the book, I anticipate delving back into it to refresh my memory on Daniel&amp;#8217;s advice about building a healthy culture. It&amp;#8217;s a vital topic for any workplace.&lt;/p&gt;
&lt;h3&gt;Succeeding with OKRs in Agile&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;By Allan Kelly&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ve been attempting to use Objectives and Key Results at work recently. I must admit I have been somewhat skeptical about how effective they have been. However, a few days ago I became aware of this book, which has been recently published in electronic form.&lt;/p&gt;
&lt;p&gt;Having read Allan&amp;#8217;s books &lt;em&gt;Project Myopia&lt;/em&gt; and &lt;em&gt;Continuous Digital&lt;/em&gt;, I was interested to learn that he had been moved to write a book about OKRs. I&amp;#8217;ve only just started reading it but, knowing that it is based on Allan&amp;#8217;s experience of &lt;em&gt;how&lt;/em&gt; to create and deliver OKRs, I&amp;#8217;m interested to read the rest of the book. Maybe then I&amp;#8217;ll be more convinced of how helpful OKRs can be.&lt;/p&gt;
&lt;h2&gt;Technical&lt;/h2&gt;
&lt;h3&gt;Elixir in Action, Second Edition&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;By Sa&amp;scaron;a Juri&amp;cacute;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve been maintaining and enhancing an Elixir application at work for the last 18 months or so.&lt;/p&gt;
&lt;p&gt;As I have built my knowledge about the application I have also found myself needing to delve into understanding the fundamentals of Elixir. This has been over and above understanding how Elixir implements functional programming. When needing to become more acquainted with the intricacies of Elixir&amp;#8217;s GenServers, supervisors and fault-tolerance, for example, &lt;em&gt;Elixir in Action&lt;/em&gt; has been an invaluable resource.&lt;/p&gt;
&lt;h3&gt;Adopting Elixir&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;By Ben Marx, Jos&amp;eacute; Valim and Bruce Tate&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Whilst I haven&amp;#8217;t got far into this book, I am sure that it is contains much good advice. The authors of &lt;em&gt;Adopting Elixir&lt;/em&gt;, published in 2018, wrote the book to share their experiences and provide details &amp;#8220;that are typically difficult to find for an emerging language&amp;#8221;.&lt;/p&gt;
&lt;p&gt;The book is divided into three parts, following adoption from concept to development and, finally, to production. I&amp;#8217;ve been dipping into different chapters in the book, mostly concerned with production. Despite the fact that it&amp;#8217;s three years since this book was written, I&amp;#8217;m finding it valuable. For example, given that we are in the process of shifting the deployment platform for our application from Heroku to &lt;span class="caps"&gt;AWS&lt;/span&gt;, the book provides helpful explanations of the details of how a release is built, how the application is configured, and how it can be deployed using blue-green deployments.&lt;/p&gt;
&lt;h3&gt;Craft GraphQL APIs in Elixir with Absinthe&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;By Bruce Williams and Ben Wilson&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Not so long ago at work I needed to develop a Proof of Concept &lt;span class="caps"&gt;API&lt;/span&gt; in our Elixir application. Given that we have used GraphQL elsewhere in our platform, I chose to develop an Elixir GraphQL &lt;span class="caps"&gt;API&lt;/span&gt;. This book proved to be extremely helpful.&lt;/p&gt;
&lt;p&gt;Whilst the book goes into more detail than I needed, I appreciated how it guided me through the process of creating a schema module and a GraphQL query so that I could then demonstrate the &lt;span class="caps"&gt;API&lt;/span&gt; via GraphiQL.&lt;/p&gt;
&lt;h2&gt;In Closing&lt;/h2&gt;
&lt;p&gt;So there you have it. I&amp;#8217;ve always valued reading books as a way of learning and this post gives you, dear reader, an idea of what I&amp;#8217;ve been reading lately.&lt;/p&gt;</content>
    <author>
      <name>Keith Pitty</name>
      <email>keith@keithpitty.com</email>
    </author>
  </entry>
  <entry>
    <id>tag:keithpitty.com,2005:BlogPost/97</id>
    <published>2020-10-08T21:51:30+11:00</published>
    <updated>2020-10-21T21:52:39+11:00</updated>
    <link rel="alternate" type="text/html" href="https://keithpitty.com/blog_posts/2020-10-21-succeeding-with-remote-retrospectives"/>
    <title>Succeeding with Remote Retrospectives</title>
    <content type="html">&lt;p&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/108/original/succeeding-with-remote-retros.jpg?1602762447" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Obviously 2020 has been a challenging year all round.&lt;/p&gt;
&lt;p&gt;In particular, when work groups meet to reflect on their recent work, now that these retrospectives are taking place virtually, extra challenges present themselves.&lt;/p&gt;
&lt;p&gt;Recently, as part of the &lt;a href="https://confengine.com/mini-last-2/schedule"&gt;mini-&lt;span class="caps"&gt;LAST&lt;/span&gt; #2 conference&lt;/a&gt;, I &lt;a href="https://speakerdeck.com/keithpitty/succeeding-with-remote-retrospectives"&gt;presented&lt;/a&gt; what was partly some of my suggestions and partly a facilitation of discussions about succeeding with remote retrospectives. I promised to share the outcomes. Hence this blog post.&lt;/p&gt;
&lt;h2&gt;Motivation&lt;/h2&gt;
&lt;p&gt;The first of three aspects that I covered was a fundamental one. Remote or in person, why would a team want to hold a retrospective anyway?&lt;/p&gt;
&lt;h3&gt;Share recent successes&lt;/h3&gt;
&lt;p&gt;In my view a good, positive reason to hold a retrospective is to reflect on recent successes. I recall occasions in my career when, at the end of a project, the team celebrated with a lunch paid for by the company. In these times of more iterative software development, I think it&amp;#8217;s healthy to regularly celebrate recent achievements as a team. This can be done as part of a retrospective and helps to build team morale.&lt;/p&gt;
&lt;h3&gt;Reduce frustration&lt;/h3&gt;
&lt;p&gt;As well as sharing reflections on things that went well, a key motivation to hold a retrospective may to allow team members to voice their views about sub-optimal experiences. Providing a forum in which to let people to get things &amp;#8220;off their chest&amp;#8221; is important so that negativity does not build.&lt;/p&gt;
&lt;h3&gt;Emphasise the Prime Directive&lt;/h3&gt;
&lt;p&gt;Whilst I think it&amp;#8217;s useful to allow people to comment on negative aspects of their recent work, it&amp;#8217;s important that the team approach the retrospective in good spirit. This is reflected in what Norm Kerth proposed as the &lt;em&gt;Prime Directive&lt;/em&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;Regardless of what we discover, we understand and truly believe that everyone did the best job they could, given what they knew at the time, their skills and abilities, the resources available, and the situation at hand.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So, it’s not a witch hunt!  A healthy retrospective needs to acknowledge this as a premise.&lt;/p&gt;
&lt;h3&gt;Discuss questions&lt;/h3&gt;
&lt;p&gt;During the last iteration, sprint or whatever name your team has given to the period of time which you are reflecting upon, questions may have arisen. Encouraging team members to share uncertainties may lead to fruitful discussion, perhaps resulting in answers or actions that can lead to improvement.&lt;/p&gt;
&lt;h3&gt;Ideas from the audience&lt;/h3&gt;
&lt;p&gt;Having presented a few of my suggestions, I opened up discussion to seek more ideas from the audience about motivations for holding retrospectives. These included:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;to improve;&lt;/li&gt;
	&lt;li&gt;because it&amp;#8217;s expected by management;&lt;/li&gt;
	&lt;li&gt;to build team rapport;&lt;/li&gt;
	&lt;li&gt;to bond as a team&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The second suggestion was somewhat cynical but nevertheless important to recognise. Unless there is genuine desire from the team to engage in a retrospective, it&amp;#8217;s less likely to result in positive outcomes like improving teamwork.&lt;/p&gt;
&lt;h2&gt;Remote Challenges&lt;/h2&gt;
&lt;p&gt;Unsurprisingly the major aspect of my talk was to consider the challenges to holding a retrospective remotely.&lt;/p&gt;
&lt;h3&gt;Equal participation&lt;/h3&gt;
&lt;p&gt;It&amp;#8217;s important that each person participating in the retrospective feels that they are getting a fair go. In a remote retrospective this implies that each person participates via their own video connection.&lt;/p&gt;
&lt;p&gt;Before the onset of &lt;span class="caps"&gt;COVID&lt;/span&gt;-19 I can recall many retrospectives in which I was the only remote participant. Depending on the camera position in the room where everyone else was, this was at times quite disconcerting. Many times I felt like an outsider, having to say &amp;#8220;excuse me&amp;#8221; when I wanted to get a word in. And then everyone else looked at the camera. Contrast this everyone connecting with their own video camera as is more likely to be the case now that everyone is working from home.&lt;/p&gt;
&lt;p&gt;Happily, I can also recall being part of retrospectives where I was the only remote participant and the co-located participants each took their laptop to a different part of the office and connected as if they were remote. It&amp;#8217;s easy enough to do but, in my view, a very important step.&lt;/p&gt;
&lt;h3&gt;Audio and video&lt;/h3&gt;
&lt;p&gt;As with any online meeting, it helps to ensure that audio and video technology is working well. Invest in good microphones, make sure your software is configured to use them and prefer ethernet to wifi connections. Simple attention to these details will enable you to communicate seamlessly. For example, I know that in my home office the wifi connection in my office is not sufficient for smooth video.&lt;/p&gt;
&lt;p&gt;Another simple tip is to set up your computer so that the camera is at a good height to enable others to see you at a natural angle.&lt;/p&gt;
&lt;p&gt;Do everything you can to avoid distractions from good verbal and visual communication.&lt;/p&gt;
&lt;h3&gt;Retro tool&lt;/h3&gt;
&lt;p&gt;In a retrospective where everyone&amp;#8217;s in the same physical room, a white board and post-it notes can be used.&lt;/p&gt;
&lt;p&gt;When at least one participant is remote, this low fidelity approach breaks down. An online tool is needed. Whilst general purpose tools can be used, I favour one that is built for the purpose.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/109/original/favourite-remote-retro-tool.jpg?1603244613" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;A couple of months ago this tweet posed a question about which remote retro tool people preferred. Now at this point I need to disclose that I am a co-founder of one of the tools mentioned, &lt;a href="https://remoteretro.io/"&gt;RemoteRetro&lt;/a&gt;. How I came to be a co-founder of this tool is another story, which I may make the subject of another post.&lt;/p&gt;
&lt;p&gt;Suffice to say, to enable everyone to equally participate in a remote retrospective, you&amp;#8217;ll need to choose one or more tools for online collaboration.&lt;/p&gt;
&lt;h3&gt;Facilitation&lt;/h3&gt;
&lt;p&gt;Facilitation is even more important when participants are remote. The facilitator will need to guide the team’s use of the retro tool as well as communicate effectively with participants via the video tool.&lt;/p&gt;
&lt;h3&gt;Variety&lt;/h3&gt;
&lt;p&gt;What format will the retro take?  Don’t allow retros to become boring by choosing the same format each time.&lt;/p&gt;
&lt;p&gt;For example, RemoteRetro, as well as allowing custom formats to be created, offers four pre-set formats:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Good/Bad/Actions/Questions&lt;/li&gt;
	&lt;li&gt;Start/Stop/Continue&lt;/li&gt;
	&lt;li&gt;Mad/Sad/Glad&lt;/li&gt;
	&lt;li&gt;Liked/Learned/Loathed/Longed For&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Share ideas&lt;/h3&gt;
&lt;p&gt;In order to promote useful discussion the facilitator will need to encourage all participants to contribute ideas via the retro tool.&lt;/p&gt;
&lt;h3&gt;Facilitate discussion&lt;/h3&gt;
&lt;p&gt;Once ideas have been shared via the retro tool, at the very lest the facilitator needs to guide the resulting discussion.&lt;/p&gt;
&lt;h3&gt;Ideas from the audience&lt;/h3&gt;
&lt;p&gt;When we further discussed remote challenges as a group, the following ideas were generated:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;make sure that genuine variety occurs, not just different formats or recipes&lt;/li&gt;
	&lt;li&gt;changing the focus of each retrospective can help&lt;/li&gt;
	&lt;li&gt;we need to follow up ideas that require action&lt;/li&gt;
	&lt;li&gt;a live, anonymous, interactive polling tool called &lt;a href="https://www.mentimeter.com/"&gt;Mentimeter&lt;/a&gt; was recommended to collect views from the team&lt;/li&gt;
	&lt;li&gt;other retro tools that were recommended included &lt;a href="https://metroretro.io/"&gt;Metro Retro&lt;/a&gt;, &lt;a href="https://funretro.io/"&gt;FunRetro&lt;/a&gt; and &lt;a href="https://retroboard.io/"&gt;RetroBoard&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;general purpose tools that audience members use for retros included &lt;a href="https://www.mural.co/"&gt;&lt;span class="caps"&gt;MURAL&lt;/span&gt;&lt;/a&gt; and &lt;a href="https://miro.com/"&gt;Miro&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Enabling Improvement&lt;/h2&gt;
&lt;p&gt;To round out this presentation and discussion, I wanted to focus on improvement. Quite simply, if a retrospective doesn&amp;#8217;t result in improvements for the team, it&amp;#8217;s hard to justify holding it in the first place.&lt;/p&gt;
&lt;h3&gt;Note action items&lt;/h3&gt;
&lt;p&gt;Capture suggestions for actions arising from the discussion.&lt;/p&gt;
&lt;p&gt;Use your chosen tool(s) to note action items and agree on who should be assigned to them.&lt;/p&gt;
&lt;h3&gt;Support for tracking action items&lt;/h3&gt;
&lt;p&gt;It’s important that action items are completed before the next retrospective. Otherwise, the team can become demotivated. They may start questioning the point of holding retrospectives in the first place.&lt;/p&gt;
&lt;p&gt;A combination of using tools well and personal as well as team commitment to following through must support good intentions.&lt;/p&gt;
&lt;h3&gt;Ideas from the audience&lt;/h3&gt;
&lt;p&gt;Some ideas about enabling improvement that the audience suggested were:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;don&amp;#8217;t hold retros at 4pm on a Friday!&lt;/li&gt;
	&lt;li&gt;commit to realistic actions so that improvement has more chance of resulting&lt;/li&gt;
	&lt;li&gt;use the &lt;a href="https://heartofagile.com/"&gt;Heart of Agile&lt;/a&gt; as a prism for enabling improvement&lt;/li&gt;
	&lt;li&gt;use a Futurespective approach&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;In Conclusion&lt;/h2&gt;
&lt;p&gt;I would like to thank all who were involved in the mini-&lt;span class="caps"&gt;LAST&lt;/span&gt; #2 online conference, especially Ed Wong for enabling me to present. To those who listened and participated, a big thank you for what you contributed. Even though I&amp;#8217;ve been an enthusiastic participant and facilitator of remote retrospectives for quite a few years, I know I still have plenty to learn.&lt;/p&gt;
&lt;h2&gt;Postscript&lt;/h2&gt;
&lt;p&gt;Speaking of having plenty to learn, this morning I was alerted to the fact that Aino Vonge Corry&amp;#8217;s &lt;a href="https://twitter.com/AntipatternsRet"&gt;&lt;em&gt;Retrospectives Antipatterns&lt;/em&gt;&lt;/a&gt; book was available. Having anticipated it for some time, I quickly took the opportunity to purchase it and start reading it. I&amp;#8217;m sure that there will be many nuggets therein from which I can improve my own facilitation of retrospectives.&lt;/p&gt;</content>
    <author>
      <name>Keith Pitty</name>
      <email>keith@keithpitty.com</email>
    </author>
  </entry>
  <entry>
    <id>tag:keithpitty.com,2005:BlogPost/96</id>
    <published>2020-05-06T23:17:14+10:00</published>
    <updated>2020-05-11T22:41:05+10:00</updated>
    <link rel="alternate" type="text/html" href="https://keithpitty.com/blog_posts/2020-05-11-on-working-remotely"/>
    <title>On Working Remotely</title>
    <content type="html">&lt;p&gt;The &lt;span class="caps"&gt;COVID&lt;/span&gt;-19 pandemic has obviously brought remote working into focus.  Many meetups have also been forced to move to use online mediums.  Of interest to me is that this month&amp;#8217;s Sydney &lt;a href="https://www.meetup.com/Ruby-On-Rails-Oceania-Sydney/events/269028394/"&gt;Rorosyd&lt;/a&gt; meetup will focus on how &lt;span class="caps"&gt;COVID&lt;/span&gt;-19 has affected workers.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/107/original/rorosyd.jpg?1588771739" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;The meetup will include an interactive forum about &amp;#8220;issues, opportunities, and challenges during the pandemic&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Some of the questions to be discussed will include:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;What do you do to socialise remotely and what tools do you use?  Do you plan virtual events?&lt;/li&gt;
	&lt;li&gt;How do you get into “work mode” working from home?  Do you have a routine that gets you ready for the day?&lt;/li&gt;
	&lt;li&gt;Has the collaboration in your teams changed since working from home?  How has it changed?&lt;/li&gt;
	&lt;li&gt;How are you keeping taking care of yourself during &lt;span class="caps"&gt;COVID&lt;/span&gt;, (mental health, learning, side projects)?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As someone who has worked remotely since 2008 I have a keen perspective on these questions. So I thought I would lay out some thoughts in this post in advance of the meetup.&lt;/p&gt;
&lt;h2&gt;Reflecting on Remote Work during &lt;span class="caps"&gt;COVID&lt;/span&gt;-19&lt;/h2&gt;
&lt;p&gt;Before I say more about working remotely during &lt;span class="caps"&gt;COVID&lt;/span&gt;-19 it is important for me to stress that because I have had the advantage of working remotely for many years, some of my recent experience is not that different from my experience during the previous 12 years.&lt;/p&gt;
&lt;p&gt;However, perhaps that is one reason why I think I can offer a useful perspective about work during the pandemic.&lt;/p&gt;
&lt;h3&gt;Remote social connection&lt;/h3&gt;
&lt;p&gt;I&amp;#8217;ve always felt that there&amp;#8217;s something very valuable about mixing with work colleagues in a social environment, whether it&amp;#8217;s at a pub or elsewhere. Obviously when all members of the work group are forced to work remotely from each other, the lack of such gatherings is brought into sharp focus.&lt;/p&gt;
&lt;p&gt;Last week I realised that my own work group had been missing an element of social interaction. Before the &lt;span class="caps"&gt;COVID&lt;/span&gt;-19 restrictions came into force, I would visit the office in Melbourne every few months, enabling some important face-to-face interaction. It has now been nearly three months since my last visit and the next is unlikely to be any time soon. So, we have agreed to a monthly online gathering which has only two stipulations. Each member of the group will bring their beverage of choice and the online gathering will be strictly social. I&amp;#8217;m hopeful that it will prove to be a fruitful bonding exercise. We shall see!&lt;/p&gt;
&lt;h3&gt;Remote work routines&lt;/h3&gt;
&lt;p&gt;My work group is currently all in the same time zone on the east coast of Australia. Several elements guide our daily work routine. First of all, we have a custom that when we start work for the day we announce that fact in our main Slack channel and set ourselves to active. This signal in Slack is a simple yet effective way of letting our colleagues know that we are working and available to collaborate.&lt;/p&gt;
&lt;p&gt;Another key part of the &amp;#8220;getting ready for the day&amp;#8221; is our standup meeting, which we hold via a video call. Whilst we don&amp;#8217;t conform to the traditional expectation of standing up, we definitely keep the meeting brief by sharing our main Trello screen and taking turns to let each other know where we are up to.&lt;/p&gt;
&lt;p&gt;Our daily standup meeting is scheduled for 10am, which I consider to be a civilised time of day. Personally, I&amp;#8217;m not an early starter. I tend to start work between 9am and 9:30am most days and usually work through until after 6pm. I find that our team&amp;#8217;s 10am startup meeting is an importance cadence for our work pattern. It gives us a chance to get on the same page, understand what each other is aiming to achieve for the remainder of the day and then allows us to all get on with it.&lt;/p&gt;
&lt;p&gt;For the remainder of the day, we communicate using whichever means is most effective. It may be via Slack, Trello, GitHub or, when the need arises, via a video call.&lt;/p&gt;
&lt;h3&gt;Remote collaboration&lt;/h3&gt;
&lt;p&gt;Has our team&amp;#8217;s collaboration changed since we we all began working from home most of the time?&lt;/p&gt;
&lt;p&gt;I find this question difficult to answer because I&amp;#8217;m so used to working from home. However, I really don&amp;#8217;t think it has much for us.&lt;/p&gt;
&lt;p&gt;More generally, I will be interested to hear more about other people&amp;#8217;s experiences. I know that some colleagues in the industry have found it difficult to adjust to working from home, especially those who live alone and are used to depending on social interaction in the workplace.&lt;/p&gt;
&lt;h3&gt;Taking care of yourself&lt;/h3&gt;
&lt;p&gt;How am I taking care of myself?&lt;/p&gt;
&lt;p&gt;Well, I do try to maintain a discipline of doing my morning stretches and getting some exercise, even if it&amp;#8217;s just walking the dog. And, in my case I&amp;#8217;ve been fortunate to get in a few games of golf. Simple actions like getting outside and watering plants in my garden help my mental health as well.&lt;/p&gt;
&lt;p&gt;As far as more work-related activities goes, I&amp;#8217;ve been doing some work on the codebase that supports this site. I also provide occasional assistance to my startup partner on our side project, &lt;a href="https://remoteretro.io"&gt;RemoteRetro&lt;/a&gt;, which, by the way, is an even more useful tool during these times.&lt;/p&gt;
&lt;p&gt;And there&amp;#8217;s always something work-related that I&amp;#8217;m reading.&lt;/p&gt;
&lt;h2&gt;Remote Work in General&lt;/h2&gt;
&lt;h3&gt;Advantages&lt;/h3&gt;
&lt;p&gt;I find it interesting to observe how people are adapting to remote work. To me it has many obvious advantages apart from helping prevent the spread of disease!&lt;/p&gt;
&lt;p&gt;Here are a few that come easily to mind:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;avoiding unnecessary travel time&lt;/li&gt;
	&lt;li&gt;allowing more time with family&lt;/li&gt;
	&lt;li&gt;allowing more time to do household chores&lt;/li&gt;
	&lt;li&gt;reducing my carbon-footprint&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Acceptance&lt;/h3&gt;
&lt;p&gt;Acceptance of remote work by managers was a sticking point in many organisations prior to &lt;span class="caps"&gt;COVID&lt;/span&gt;-19. It will be interesting to see how much this attitude will have changed after the crisis has passed.&lt;/p&gt;
&lt;p&gt;An obvious reason for a lack of acceptance in the past relates to trusting workers to actually spend the time that they&amp;#8217;re paid to work by working. As software developers, it should be obvious how we can demonstrate that we are producing work of value.&lt;/p&gt;
&lt;p&gt;Collectively, if we can use the tools at our disposal to demonstrate that we are being productive workers, hopefully greater acceptance will result.&lt;/p&gt;</content>
    <author>
      <name>Keith Pitty</name>
      <email>keith@keithpitty.com</email>
    </author>
  </entry>
  <entry>
    <id>tag:keithpitty.com,2005:BlogPost/95</id>
    <published>2020-04-13T23:28:16+10:00</published>
    <updated>2020-05-06T23:52:47+10:00</updated>
    <link rel="alternate" type="text/html" href="https://keithpitty.com/blog_posts/2020-04-14-adopting-tailwind-css"/>
    <title>Adopting Tailwind CSS</title>
    <content type="html">&lt;p&gt;It&amp;#8217;s now more than seven years since I &lt;a href="https://keithpitty.com/blog/archives/2013-01-28-twitter-bootstrap-to-the-rescue"&gt;converted this site to use Twitter Bootstrap&lt;/a&gt;. At the time, I was pleased to be able to use Twitter Bootstrap to enable the site to be responsive to different devices.&lt;/p&gt;
&lt;p&gt;However, time moves on. Almost two years ago I tweeted:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/105/original/bootstrap-alternative.jpg?1586815852" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;And this was the reply that interested me most:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/104/original/sebastian-porto-tailwind-css.jpg?1586815675" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;More recently, at this year&amp;#8217;s RubyConf AU opening party, my friend Josh Price was extolling the virtues of &lt;a href="https://tailwindcss.com/"&gt;Tailwind &lt;span class="caps"&gt;CSS&lt;/span&gt;&lt;/a&gt;. So, when the recent four day holiday break presented itself, I took the plunge and converted this site.&lt;/p&gt;
&lt;h2&gt;The Process&lt;/h2&gt;
&lt;p&gt;There are plenty of good resources on the web about Tailwind &lt;span class="caps"&gt;CSS&lt;/span&gt; and supporting technologies so I don&amp;#8217;t intend to provide a step by step guide here. However, I will reflect on the steps I ended up taking.&lt;/p&gt;
&lt;h3&gt;Remove Twitter Bootstrap&lt;/h3&gt;
&lt;p&gt;Naturally, having created a git branch on which to start experimenting with Tailwind &lt;span class="caps"&gt;CSS&lt;/span&gt;, the first step was to remove Twitter bootstrap. For me, that essentially entailed deleting the &lt;code&gt;twitter-bootstrap-rails&lt;/code&gt; gem from my &lt;code&gt;Gemfile&lt;/code&gt; as well as any references to it in my Rails application. As expected, that resulted in the pages on my site being displayed bereft of any styles.&lt;/p&gt;
&lt;h3&gt;Install Tailwind &lt;span class="caps"&gt;CSS&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;To install Tailwind &lt;span class="caps"&gt;CSS&lt;/span&gt;, I used &lt;a href="https://www.pixelflush.com/blog/2020/02/09/tailwind-css-with-rails/"&gt;this guide&lt;/a&gt; as a reference as well as the &lt;a href="https://tailwindcss.com/docs/installation/"&gt;official advice&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So far so good. Now it was time to start making use of this &amp;#8220;highly customizable, low-level &lt;span class="caps"&gt;CSS&lt;/span&gt; framework&amp;#8221;.&lt;/p&gt;
&lt;h3&gt;Build up Tailwind &lt;span class="caps"&gt;CSS&lt;/span&gt; Styles&lt;/h3&gt;
&lt;p&gt;The next phase was one of experimentation. In some cases, such as for my Rails layouts, it involved applying Tailwind styles directly to &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; tags. This was the first time I started to realise that Tailwind adopts a mobile-first approach. For example, consider the following:&lt;/p&gt;
&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;
  &amp;lt;div class=&amp;quot;block lg:hidden&amp;quot;&amp;gt;
    &amp;lt;!-- other tags --&amp;gt;
  &amp;lt;/div&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The significance of &lt;code&gt;lg:hidden&lt;/code&gt; is that this tag will be hidden for devices of size &lt;code&gt;lg&lt;/code&gt; and above where &lt;code&gt;lg&lt;/code&gt; equates to &lt;code&gt;max-width: 1024px&lt;/code&gt;. For more on Tailwind&amp;#8217;s approach to responsive design, see &lt;a href="https://tailwindcss.com/docs/responsive-design"&gt;the official documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As I learnt more about Tailwind&amp;#8217;s styles it became clearer to me that I needed to focus on the &lt;code&gt;app/javascript/src/application.css&lt;/code&gt; file. In addition to incorporating Tailwind&amp;#8217;s base, components and utilities styles, this is where I built up a list of styles to apply to various tags and classes. As a simple example, my first custom definition in this file is:&lt;/p&gt;
&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;
  p {
    @apply font-serif py-2 leading-snug;
  }
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Translated, this means that for paragraphs, I apply Tailwind&amp;#8217;s &lt;code&gt;font-serif&lt;/code&gt;, &lt;code&gt;py-2&lt;/code&gt; and &lt;code&gt;leading-snug&lt;/code&gt; styles. What do each of these mean? To find out, explore the documentation about &lt;a href="https://tailwindcss.com/docs/font-family"&gt;font families&lt;/a&gt;, &lt;a href="https://tailwindcss.com/docs/padding"&gt;padding&lt;/a&gt; and &lt;a href="https://tailwindcss.com/docs/line-height"&gt;line height&lt;/a&gt;. The documentation is very helpful.&lt;/p&gt;
&lt;p&gt;Tailwind styles can also be applied to classes, as in the following example.&lt;/p&gt;
&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;
  .error {
    @apply text-red-700 pb-2;
  }
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I&amp;#8217;ll leave you to explore the &lt;a href="https://tailwindcss.com/docs"&gt;documentation&lt;/a&gt; this time to figure out the meaning of the styles.&lt;/p&gt;
&lt;h3&gt;Use Custom Tailwind &lt;span class="caps"&gt;CSS&lt;/span&gt; Forms&lt;/h3&gt;
&lt;p&gt;Whilst I got most of the way towards styling my site using just Tailwind&amp;#8217;s styles, I did find difficulties with forms. To solve this problem I used the &lt;a href="https://tailwindcss-custom-forms.netlify.com/"&gt;Tailwind &lt;span class="caps"&gt;CSS&lt;/span&gt; Custom Forms plugin&lt;/a&gt;. I was then able to apply styles from that plugin as follows:&lt;/p&gt;
&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;
  form input {
    @apply form-input mt-1 block w-full;
  }
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;Complete transfer from Asset Pipeline to Webpacker&lt;/h3&gt;
&lt;p&gt;This site has been around for a while. I recall creating it in 2007. I can&amp;#8217;t be exactly sure when because the git history only goes back to 26 April, 2009 when I migrated it from &lt;a href="https://subversion.apache.org/"&gt;Subversion&lt;/a&gt; to &lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Anyway, as a developer who leans towards the server-side, I&amp;#8217;ve neglected some aspects of upgrading the site along the way. One of those has been moving from the Rails Asset Pipeline to Webpacker. That is no longer the case. As part of converting the site to use Tailwind &lt;span class="caps"&gt;CSS&lt;/span&gt; I realised that I needed to completely move my assets to Webpacker. The penny dropped when I understood the reason why the CodeRay styles that I use for code syntax highlighting were no longer working. After all, the following code snippet in my layout has a clue:&lt;/p&gt;
&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;
  &amp;lt;%= stylesheet_pack_tag &amp;quot;application&amp;quot; %&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The word &amp;#8220;pack&amp;#8221;, of course, indicates that the styles are managed by Webpacker.&lt;/p&gt;
&lt;p&gt;Thankfully, the &lt;code&gt;app/assets&lt;/code&gt; directory no longer exists in my application.&lt;/p&gt;
&lt;h2&gt;The Verdict&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/106/original/tailwindcss.jpg?1586865954" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;I now understand why Sebastian and Josh gave Tailwind &lt;span class="caps"&gt;CSS&lt;/span&gt; such enthusiastic endorsements.&lt;/p&gt;
&lt;p&gt;Once I had experimented enough with applying the styles to tags and classes in a way that the styles could be reused, I found the experience addictive. And that&amp;#8217;s saying something for a predominantly server-side programmer who cut his teeth on mainframes several decades ago.&lt;/p&gt;</content>
    <author>
      <name>Keith Pitty</name>
      <email>keith@keithpitty.com</email>
    </author>
  </entry>
  <entry>
    <id>tag:keithpitty.com,2005:BlogPost/94</id>
    <published>2020-04-01T13:01:29+11:00</published>
    <updated>2020-04-22T00:17:58+10:00</updated>
    <link rel="alternate" type="text/html" href="https://keithpitty.com/blog_posts/2020-04-02-on-communities-in-crisis-mode"/>
    <title>On Communities in Crisis Mode</title>
    <content type="html">&lt;p&gt;Like many in Australia I&amp;#8217;ve been at home for more than a week now.&lt;/p&gt;
&lt;p&gt;For my work, that&amp;#8217;s not so unusual. It has been well over a decade since I started working from home most of the time. So I haven&amp;#8217;t had to adapt in the same way that many of my colleagues in the software development industry have.&lt;/p&gt;
&lt;h2&gt;The &lt;span class="caps"&gt;COVID&lt;/span&gt;-19 threat&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/100/original/martin-sanchez-Tzoe6VCvQYg-unsplash.jpg?1585742998" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo by &lt;a href="https://unsplash.com/@martinsanchez"&gt;Martin Sanchez&lt;/a&gt; on Unsplash&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Obviously there is a broader community focus now that the spectre of &lt;span class="caps"&gt;COVID&lt;/span&gt;-19 looms ever larger.&lt;/p&gt;
&lt;p&gt;For the last couple of weeks, as the risk of the coronavirus spreading in Australia has become more serious, I have been doing my best to stay at home. I&amp;#8217;ve made no trips to my golf club in the last fortnight and those of you who know me well will know what a sacrifice that is!&lt;/p&gt;
&lt;p&gt;In normal times I also look forward to Sunday morning trips to the local farmers&amp;#8217; markets. The Sunday morning before last turned out to be our last trip for the time being. We arrived relatively early to find the biggest crowd we&amp;#8217;ve ever witnessed at these markets. Whilst they are classified as an essential source of food, we felt it was impossible to practice safe physical distancing. My wife and I decided it was, regrettably, our last visit for now.&lt;/p&gt;
&lt;h3&gt;Before&lt;/h3&gt;
&lt;p&gt;As I mentioned at the outset of this post, I&amp;#8217;ve been used to working remotely for many years. In doing so I have gradually accumulated experience with using a variety of tools to become more effective as a remote worker.&lt;/p&gt;
&lt;p&gt;The most relevant class of tools to this post is those that enable meetings via video. I&amp;#8217;ll come back to those in a moment.&lt;/p&gt;
&lt;p&gt;I think it&amp;#8217;s also important to acknowledge that, until recently, my remote work was broken up by face to face social activity that I took for granted.&lt;/p&gt;
&lt;p&gt;Whether it was sharing a round of golf with mates and catching up with others in the clubhouse afterwards, chatting with stall holders at the farmers&amp;#8217; markets or even enjoying my trips to the barber, there has been the simple pleasure of conversation in person to sustain me.&lt;/p&gt;
&lt;p&gt;And to give me a break from the isolation of working alone in my home office.&lt;/p&gt;
&lt;h3&gt;New considerations&lt;/h3&gt;
&lt;p&gt;Now that&amp;#8217;s gone. At least in my case I have my wife, who has recently started working from home full time, in the same house. I know others who live alone and don&amp;#8217;t usually work from home are finding the adjustment especially challenging.&lt;/p&gt;
&lt;p&gt;One thing I&amp;#8217;m acutely aware of is the need to look after my mental health. My &lt;a href="/blog/archives/2014-10-10-stress-and-software-development"&gt;personal experience&lt;/a&gt; has taught me that I need to be careful not to let too much stress build up.&lt;/p&gt;
&lt;p&gt;In my experience, antidotes to stress include getting outdoors, mixing with other people, playing sport and having a good laugh with others. There&amp;#8217;s nothing quite like impulsively laughing or seeing the joyful laughter on someone else&amp;#8217;s face as your joke lands.&lt;/p&gt;
&lt;p&gt;&lt;span class="caps"&gt;COVID&lt;/span&gt;-19 obviously brings new challenges to staying sane.&lt;/p&gt;
&lt;h3&gt;Communities staying connected&lt;/h3&gt;
&lt;p&gt;So, how can communities help in these times of being distanced from each other?&lt;/p&gt;
&lt;p&gt;Sometimes by necessity a community group that would normally meet face to face now has to meet via video. For example, only last night my golf club&amp;#8217;s board of directors met via Zoom. To those in the tech community reading this for whom the mention of Zoom will raise a red flag on security grounds, please suspend your cries of protest! As we know, many people are adapting as they go, attempting to respond to this crisis as best they can as it unfolds. For some in our board, this was a first experience of a video meeting. Once we gathered all the participants and the meeting got into full swing, I sensed a reassuring feeling. A strong impression for me was the renewed connection between us, simply by virtue of being able to see each other as the discussion ensued.&lt;/p&gt;
&lt;h3&gt;Professional Communities&lt;/h3&gt;
&lt;p&gt;There are other contexts I would like to relate whilst writing about the theme of community in a crisis.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/102/original/hoa-fireside.jpg?1585747066" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;A professional community that I&amp;#8217;ve been attracted to and involved in since 2018 is the Heart of Agile. Whilst there have been physical meetups all over the world, I was pleased to have the opportunity the other day to participate in the first &lt;a href="https://heartofagile.com/heart-of-agile-fireside-chat-with-alistair-cockburn-and-hoa-colleagues-australia-edition/"&gt;fireside chat&lt;/a&gt; in an Australian time zone. I found the experience of being connected to more than 50 like-minded professionals via video to be quite uplifting.&lt;/p&gt;
&lt;p&gt;Indeed, tomorrow morning it would seem that this community is facilitating a &amp;#8220;drop-in&amp;#8221; video hook-up. Maybe I&amp;#8217;ll remember to drop in, we&amp;#8217;ll see. Even if I don&amp;#8217;t, I love the fact that someone has taken the initiative to make this opportunity available.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/103/original/ruby-au.jpg?1585822425" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Since 2006 I have been privileged to be part of the Australian Ruby Community. I&amp;#8217;ve enjoyed so many wonderful face to face experiences as part of this community, whether they have been meetups, Rails Camps, conferences or just catching up with friends that I have made as part of this community.&lt;/p&gt;
&lt;p&gt;In recent days, I&amp;#8217;ve drawn sustenance from friends who have taken the initiative to invite others to catch up over video. About a week ago I had, not to put too fine a point on it, a pretty shitty day. My Ruby friends Elle and Lachlan kindly invited me to drop into their place to chat online over video. Such kindness. The weekend before that my good friend Matt had facilitated a video chat amongst his professional friends. To hear the different ways that the economic fallout of the coronavirus had affected folks was humbling. And, last weekend, Pete put out a call over Twitter that he was interested in catching up. A video chat ensued, which allowed several of us in the tight-knit Australian Ruby community to share our challenges with respect to dealing with living in isolation.&lt;/p&gt;
&lt;p&gt;To all these dear friends in the Ruby community, I express my heartfelt thanks.&lt;/p&gt;
&lt;h3&gt;An Approximation to Face to Face&lt;/h3&gt;
&lt;p&gt;Within and beyond the Ruby community I know that many meetups are adapting to hold their gatherings online. I had thought of attending the Sydney Elixir meetup last night but in the end was unable to.&lt;/p&gt;
&lt;p&gt;Ultimately, we all crave connection to other humans, no matter how introverted we are. And, let&amp;#8217;s face it, many programmers are.&lt;/p&gt;
&lt;p&gt;During the coming weeks and months, the best we will be able to do in almost all circumstances, is to come together as communities with the aid of video meeting tools. Before you get too down about that, consider how it must have been 100 years ago as communities did their best to deal with the Spanish flu.&lt;/p&gt;
&lt;p&gt;At least in 2020 we have tools like Zoom, Google Hangouts and Whereby.&lt;/p&gt;
&lt;h2&gt;Staying positive&lt;/h2&gt;
&lt;p&gt;In a way, the online connectivity of life in April 2020 is a double-edged sword.&lt;/p&gt;
&lt;p&gt;On the one hand, technology brings the harsh realities of the horrific effects of &lt;span class="caps"&gt;COVID&lt;/span&gt;-19 into our lives in a way that is difficult to ignore. From an Australian perspective, what we see, hear and read of life in Italy, Spain, the UK and &lt;span class="caps"&gt;USA&lt;/span&gt; is sobering and disquieting, to say the least.&lt;/p&gt;
&lt;p&gt;On the other, if we use the technology mindfully, staying connected within our communities via video tools can help. Whilst not perfect, it can provide us with at least a good approximation of what we, as humans, crave.&lt;/p&gt;</content>
    <author>
      <name>Keith Pitty</name>
      <email>keith@keithpitty.com</email>
    </author>
  </entry>
  <entry>
    <id>tag:keithpitty.com,2005:BlogPost/93</id>
    <published>2020-03-04T05:16:14+11:00</published>
    <updated>2020-07-24T11:41:31+10:00</updated>
    <link rel="alternate" type="text/html" href="https://keithpitty.com/blog_posts/2020-03-12-reflecting-on-rubyconf-au-2020"/>
    <title>Reflecting on RubyConf AU 2020</title>
    <content type="html">&lt;p&gt;Life can get busy can&amp;#8217;t it?&lt;/p&gt;
&lt;p&gt;Among a myriad of things that have been on my list of things to do is write another blog post. Somewhat embarrassingly, as I write this, my most recent post was written over a year ago, when I reflected on the experience of presenting at RubyConf AU 2019.&lt;/p&gt;
&lt;p&gt;Having recently attended RubyConf AU 2020, it&amp;#8217;s only fair that I share my reflections about this year&amp;#8217;s conference. If nothing else, it will provide some recent content on this site!&lt;/p&gt;
&lt;p&gt;I think the following tweet from Josh Price echoes my feelings about RubyConf AU very well.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/099/original/rubyconf-au-2020.jpg?1583837117" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Whilst I know that Josh has moved on to focus on other technologies such as Elixir I agree with him that there&amp;#8217;s something very special about the Ruby community. Here in Australia it is still going strong after emerging in about 2006. Eight conferences since 2013 and 26 Rails Camps since 2007 speak for the continued desire for the community to get together.&lt;/p&gt;
&lt;h2&gt;RubyConf AU 2020 Talks&lt;/h2&gt;
&lt;p&gt;So, what did I find especially poignant about this, the eighth edition of RubyConf AU? Whilst &lt;a href="https://rubyconf.org.au/2020/speakers"&gt;all the talks&lt;/a&gt; were worth paying attention to, let me select a few highlights.&lt;/p&gt;
&lt;h3&gt;Lemurs&lt;/h3&gt;
&lt;p&gt;I did use the word poignant purposefully just now with a reason. &lt;a href="https://twitter.com/keystonelemur"&gt;Brandon Weaver&lt;/a&gt; gave a story telling performance, &lt;a href="https://www.youtube.com/watch?v=xRj5DWvdx6k"&gt;Tales from the Ruby Grimoire&lt;/a&gt;, that certainly provoked echoes of &lt;a href="https://poignant.guide/"&gt;Why&amp;#8217;s Poignant Guide to Ruby&lt;/a&gt;, an online tome that has found a special place in the Ruby community&amp;#8217;s folklore.&lt;/p&gt;
&lt;p&gt;Brandon most definitely had me captivated as he facilitated the journey of several lemurs on their way to discovering more intricacies of the Ruby language. I&amp;#8217;m sure his talk affected different people in different ways. For me, whilst I&amp;#8217;m sure there was valuable content about programming in Ruby, I was blown away by Brandon&amp;#8217;s artistry. The drawings in his slides were astounding. Then there was the storytelling itself!&lt;/p&gt;
&lt;h3&gt;Escaping&lt;/h3&gt;
&lt;p&gt;Talks about good code quality and how to pragmatically achieve it always hold my attention. Ernesto Tagwerker&amp;#8217;s &lt;a href="https://www.youtube.com/watch?v=ORb2UQ0_8zg"&gt;Escaping The Tar Pit&lt;/a&gt; was no exception.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/etagwerker"&gt;Ernesto&lt;/a&gt; focussed on a topic dear to my heart: maintainability of software. To those who know me and know how much time I&amp;#8217;ve spent maintaining codebases throughout my career, this will come as no surprise. Ernesto went beyond talking about code coverage using tools such as simplecov. When Ernesto honed in on code quality, I was interested to learn about &lt;a href="https://github.com/whitesmith/rubycritic"&gt;RubyCritic&lt;/a&gt;, which I hadn&amp;#8217;t previously been aware of. RubyCritic uses other tools such as flog and flay to highlight churn and complexity.&lt;/p&gt;
&lt;p&gt;Ernesto didn&amp;#8217;t, however, stop at code coverage and code quality. He went on to highlight a combination of the two, what he refers to as the &amp;#8220;stink score&amp;#8221;. He then referred to a tool, appropriately called &lt;a href="https://github.com/fastruby/skunk"&gt;Skunk&lt;/a&gt;, which measures this score.&lt;/p&gt;
&lt;p&gt;Without giving away any more of the details of Ernesto&amp;#8217;s talk, I thoroughly recommend it. That&amp;#8217;s unless you&amp;#8217;re happy to let your codebase descend into the tar pit, never to be recovered!&lt;/p&gt;
&lt;h3&gt;Documentation&lt;/h3&gt;
&lt;p&gt;Helpful documentation is something else that dear to my heart. I was delighted to see the way that &lt;a href="https://twitter.com/carmenhchung"&gt;Carmen Chung&lt;/a&gt; brought attention to this important topic with the title of her talk, &lt;a href="https://www.youtube.com/watch?v=ocqjOFrrios"&gt;How To Write Tech Documentation That Will Save Your Career&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Carmen took us through a journey of how incomplete communication resulted in a disastrous outcome, which could have been avoided by thoughtful documentation.&lt;/p&gt;
&lt;p&gt;I think of my own current work environment and the multitude of opportunities for developers to thoughtfully leave clues for their colleagues about the reasons for their actions. It does require self-discipline and consideration for others. Carmen offered several useful tips for how to leave a trail of helpful documentation, using various tools to help others in the team.&lt;/p&gt;
&lt;p&gt;However, as Carmen illustrated so well, there is also a considerable element of protecting yourself as well.&lt;/p&gt;
&lt;h3&gt;Experience&lt;/h3&gt;
&lt;p&gt;To close out the conference, I thought the organisers did very well to choose Xavier Shay&amp;#8217;s talk on &lt;a href="https://www.youtube.com/watch?v=0na_1A_-Ebo"&gt;My Experience With Experience&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I loved one of Xavier&amp;#8217;s opening statements, which was &amp;#8220;learning from experience is hard.&amp;#8221; To me that is such a thoughtful and honest thing to say. It begs the question that Xavier went on to explore: &amp;#8220;how can we better learn from experience?&amp;#8221;&lt;/p&gt;
&lt;p&gt;Xavier initially introduced feedback loops and their role in learning. However, he quickly illustrated that this learning pattern does not apply to all situations. For example, it doesn&amp;#8217;t help with improving one&amp;#8217;s organisation of code.&lt;/p&gt;
&lt;p&gt;When Xavier went on to talk about wicked learning environments, his talk grabbed my attention, which was quite a feat at this late stage of the conference. He referred to a &lt;a href="https://pdfs.semanticscholar.org/5c5d/33b858eaf38f6a14b3f042202f1f44e04326.pdf"&gt;paper&lt;/a&gt; by Hogarth et al entitled &amp;#8220;The Two Settings of Kind and Wicked Learning Environments&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Using the challenge of hiring staff as an example of a wicked learning environment, Xavier illustrated the inherent problem.&lt;/p&gt;
&lt;p&gt;I won&amp;#8217;t spoil the rest of Xavier&amp;#8217;s talk. It certainly contained more nuggets of reflection and reference to others&amp;#8217; research. Suffice to say that I thoroughly recommend listening carefully to it.&lt;/p&gt;
&lt;p&gt;This was a very thoughtful talk to end the conference.&lt;/p&gt;
&lt;h2&gt;Thanks to the organisers&lt;/h2&gt;
&lt;p&gt;As I said earlier, this was the eighth Australian Ruby Conference. As I know very well, they don&amp;#8217;t happen &lt;a href="https://keithpitty.com/blog/archives/2013-02-15-anticipating-rubyconf-austalia-2013"&gt;without much effort&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I would like to pay my thanks to this year&amp;#8217;s organisers, Rache, Ben and Caitlin. Undoubtedly, the support from Ruby Australia&amp;#8217;s sponsors helps ensure that these conferences are financially viable. Equally, without the willingness of people to volunteer to help organise the conferences, they wouldn&amp;#8217;t happen.&lt;/p&gt;
&lt;p&gt;So, to Rache, Ben and Caitlin, once again, I express my heartfelt thanks for organising RubyConf AU 2020.&lt;/p&gt;</content>
    <author>
      <name>Keith Pitty</name>
      <email>keith@keithpitty.com</email>
    </author>
  </entry>
  <entry>
    <id>tag:keithpitty.com,2005:BlogPost/90</id>
    <published>2019-02-13T22:16:03+11:00</published>
    <updated>2020-07-24T11:41:08+10:00</updated>
    <link rel="alternate" type="text/html" href="https://keithpitty.com/blog_posts/2019-02-20-reflecting-on-rubyconf-au-2019"/>
    <title>Reflecting on RubyConf AU 2019</title>
    <content type="html">&lt;h2&gt;Surprise!&lt;/h2&gt;
&lt;p&gt;On 12th November last year I received an email via PaperCall with the following words which grabbed my attention:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Congratulations Keith Pitty! &lt;img alt="tada" src="/images/emoji/unicode/1f389.png" style="vertical-align:middle" width="20" height="20" /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;We are really excited to let you know that your talk, &amp;#8220;What were they thinking?&amp;#8221;, has been selected for RubyConf AU 2019.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Can you please confirm that you will be able to bring yourself and your talk by visiting the link below?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I immediately felt a mixture of excitement and panic. Having submitted a proposal at the last minute I was now faced with the prospect of converting my abstract into a 20 minute talk that did it justice and provided value to the audience.&lt;/p&gt;
&lt;p&gt;I accepted the challenge and earlier this month &lt;a href="https://rubyconf.org.au/2019/schedule#friday"&gt;presented at RubyConf AU&lt;/a&gt; in Melbourne!&lt;/p&gt;
&lt;h2&gt;My Talk&lt;/h2&gt;
&lt;p&gt;The genesis of my talk was many years of thinking about experiences I have had with codebases. Legacy code that hasn&amp;#8217;t &lt;a href="https://keithpitty.com/blog/archives/2015-02-06-loving-legacy-code"&gt;been loved&lt;/a&gt; can result in painful experiences for future developers, frustration for users not to mention expensive consequences for owners.&lt;/p&gt;
&lt;p&gt;So that&amp;#8217;s the background. You can &lt;a href="https://www.youtube.com/watch?v=KiGbAbjYAjI&amp;amp;index=13&amp;amp;t=0s&amp;amp;list=PL9_jjLrTYxc3dTbvb8fIuzDFGTCaEdO3a"&gt;watch the video&lt;/a&gt; and &lt;a href="https://speakerdeck.com/keithpitty/what-were-they-thinking"&gt;see the slides&lt;/a&gt; for yourself. To give you a bit more of an idea of the content, I&amp;#8217;ll give a quick overview below.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/096/original/rubyconf-au-2019-kp.jpg?1550487815" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thanks to John Carney for this photo of me presenting.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Disciplined Development&lt;/h3&gt;
&lt;p&gt;Software is liable to decay over time unless it is nurtured. Such nurturing should include such things as refactoring to improve internal design, which implies automated testing, sufficient up-front design to increase the likelihood of a successful outcome, healthy peer review, a well documented git history and load testing.&lt;/p&gt;
&lt;p&gt;All of this requires discipline. Sometimes it also requires negotiation with stakeholders.&lt;/p&gt;
&lt;h3&gt;Planned Maintenance&lt;/h3&gt;
&lt;p&gt;An aspect that can involve both discipline and negotiation with stakeholders is planning and carrying out maintenance such as installing security patches and keeping software on which your applications depend up to date.&lt;/p&gt;
&lt;p&gt;Whilst attention to the detail of planned maintenance is something that many developers can do well, negotiating with business owners to give it sufficient priority is a different challenge altogether.&lt;/p&gt;
&lt;h3&gt;Philosophy&lt;/h3&gt;
&lt;p&gt;Before delving into the challenges to communicate better, I touched on a couple of more philosophical topics which I considered relevant to the topic. Firstly I referred to what is sometimes described as &amp;#8220;continuous flow&amp;#8221;. I then suggested that it was time to reflect on how a mature consideration of the Agile approach could better serve us.&lt;/p&gt;
&lt;h3&gt;Persuasion&lt;/h3&gt;
&lt;p&gt;In my experience it can be difficult to persuade some business owners of the vital importance of the sort of activities that are essential to keep legacy codebase in a healthy state so that it survives in a form that enables it to support evolving needs.&lt;/p&gt;
&lt;p&gt;The challenge to practice becoming more persuasive comprised a large part of the second half of my talk.&lt;/p&gt;
&lt;h2&gt;Feedback&lt;/h2&gt;
&lt;p&gt;Once I had given my talk I was delighted at the positive feedback I received in person, whether it was from other &lt;a href="https://rubyconf.org.au/2019/speakers"&gt;speakers&lt;/a&gt;, former colleagues or new Ruby acquaintances. By the way, there were many inspiring talks at the conference so if you weren&amp;#8217;t there I encourage you to &lt;a href="https://rubyconf.org.au/2019/schedule#thursday"&gt;watch&lt;/a&gt; &lt;a href="https://rubyconf.org.au/2019/schedule#friday"&gt;them&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When I looked at Twitter I was humbled to see lovely feedback such as the following from Mel.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/097/original/rubyconf-au-2019-humourous.jpg?1550487836" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m keen to hear further reactions, especially from those who weren&amp;#8217;t able to be in Melbourne for the conference. We were so lucky that &lt;a href="https://twitter.com/CaitlinPB/status/1093422786196889600"&gt;the organisers&lt;/a&gt; engaged &lt;a href="http://t.co/zibfPzbNyS"&gt;Next Day Video&lt;/a&gt; who in fact made the videos of the talks available on the &lt;em&gt;same&lt;/em&gt; day!&lt;/p&gt;
&lt;p&gt;So, if you&amp;#8217;d like to get in touch and give me your take on my talk, please feel free to do so either via this site or &lt;a href="https://twitter.com/keithpitty"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Thanks&lt;/h2&gt;
&lt;p&gt;Finally, a big thank you to all who made my experience at RubyConf AU 2019 so rewarding: those who selected the talk, my family for listening to me practice, the organisers, the lovely MCs, the audience and especially those who were kind and thoughtful enough to discuss my talk with me afterwards.&lt;/p&gt;</content>
    <author>
      <name>Keith Pitty</name>
      <email>keith@keithpitty.com</email>
    </author>
  </entry>
  <entry>
    <id>tag:keithpitty.com,2005:BlogPost/87</id>
    <published>2018-08-12T22:20:46+10:00</published>
    <updated>2019-06-04T22:50:55+10:00</updated>
    <link rel="alternate" type="text/html" href="https://keithpitty.com/blog_posts/2018-08-14-remembering-jerry-weinberg"/>
    <title>Remembering Jerry Weinberg</title>
    <content type="html">&lt;p&gt;I&amp;#8217;ve been thinking about Jerry Weinberg&amp;#8217;s writing over the last few days, since his passing moved many including myself to words in his honour.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/060/original/jerry.jpg?1534074008" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;His words inspired me.&lt;/p&gt;
&lt;p&gt;I know that I&amp;#8217;ve dipped into the pages of &lt;a href="https://www.amazon.com.au/Secrets-Consulting-Giving-Getting-Advice/dp/0932633013"&gt;&lt;em&gt;The Secrets of Consulting&lt;/em&gt;&lt;/a&gt; many times over the years. I should probably, in the near future, take time to refresh my memory of the excellent advice that I know that tome contains. And I know there are many other books of Jerry&amp;#8217;s that are worth reading or re-reading.&lt;/p&gt;
&lt;p&gt;However, of all Jerry&amp;#8217;s writing, there is one book that stands out to me. I was moved to write about it back in 2007 in a now defunct blog. Fortunately I have an extract of the text.&lt;/p&gt;
&lt;p&gt;I introduced my post with a a reference to a picture of a beautiful stone wall in my back yard. Whilst I&amp;#8217;ve lost the original photo, here is a fresh one of the same wall:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/061/original/garden-wall.jpg?1534213661" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;And here&amp;#8217;s what I wrote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What a beautiful stone wall! My family is now lucky enough to have this wall in our back yard. The bloke who built it is obviously a master of his craft.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;What does our wall have to do with writing? The answer is to be found in &lt;a href="https://www.amazon.com.au/Weinberg-Writing-Fieldstone-Gerald-M/dp/093263365X/sr=1-1/qid=1169097733/ref=pd_bbs_sr_1/002-3271336-6932029"&gt;&lt;em&gt;Weinberg on Writing&lt;/em&gt;&lt;/a&gt;, a thought-provoking book about how to write using the metaphor of building a fieldstone wall.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Gerald_Weinberg"&gt;Jerry Weinberg&lt;/a&gt; addresses the problem of writer&amp;#8217;s block by showing how metaphorical stones can be continually collected. Each stone may or may not end up as part of a published work. The process of collecting stones typically contributes to ongoing work on a number of potential finished books, articles, reports or even blog entries. The trick is to always be ready to write. Carry a pen and notebook everywhere so that ideas can be readily captured. Later on the stones can be organised, perhaps eventually being crafted together in a finished wall to be admired. Or perhaps not. Stones may be thrown away during the editing process.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;I think the Fieldstone Method employs a useful metaphor that keeps the writer productive. Of the many lessons in this book worth heeding my favourite is Jerry&amp;#8217;s first: &lt;strong&gt;&lt;em&gt;&amp;#8220;Never attempt to write something you don&amp;#8217;t care about&amp;#8221;&lt;/em&gt;&lt;/strong&gt;. After all, a fine stone wall is built by a master craftsman with passion. Writing should be similar.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Although I never met Jerry, that&amp;#8217;s the lasting impression I have of him. Passion poured from the pages he wrote.&lt;/p&gt;
&lt;p&gt;The software development community is very fortunate that Jerry has left such a wonderful written legacy. If you have a thirst for learning from a &lt;a href="https://www.amazon.com/gp/product/0932633420/ref=dbs_a_def_rwt_hsch_vapi_taft_p1_i0"&gt;pioneer of a people-oriented approach to programming&lt;/a&gt; about topics ranging from &lt;a href="https://www.amazon.com/gp/product/0932633013/ref=dbs_a_def_rwt_hsch_vapi_taft_p1_i1"&gt;consulting&lt;/a&gt;, &lt;a href="https://www.amazon.com/gp/product/0932633013/ref=dbs_a_def_rwt_hsch_vapi_taft_p1_i1"&gt;becoming a technical leader&lt;/a&gt;, &lt;a href="https://www.amazon.com/gp/product/0932633498/ref=dbs_a_def_rwt_hsch_vapi_taft_p1_i3"&gt;systems thinking&lt;/a&gt;, &lt;a href="https://www.amazon.com/gp/product/0932633692/ref=dbs_a_def_rwt_hsch_vapi_taft_p2_i0"&gt;testing&lt;/a&gt;, &lt;a href="https://www.amazon.com/gp/product/0932633730/ref=dbs_a_def_rwt_hsch_vapi_taft_p2_i2"&gt;exploring requirements&lt;/a&gt; and, of course, &lt;a href="https://www.amazon.com/gp/product/093263365X/ref=dbs_a_def_rwt_hsch_vapi_taft_p1_i7"&gt;writing&lt;/a&gt;, amongst &lt;a href="https://www.amazon.com/Gerald-M.-Weinberg/e/B000AP8TZ8"&gt;many others&lt;/a&gt;, I thoroughly recommend reading his books.&lt;/p&gt;
&lt;p&gt;Jerry may be gone but his words will live on.&lt;/p&gt;</content>
    <author>
      <name>Keith Pitty</name>
      <email>keith@keithpitty.com</email>
    </author>
  </entry>
  <entry>
    <id>tag:keithpitty.com,2005:BlogPost/54</id>
    <published>2018-03-30T23:07:03+11:00</published>
    <updated>2019-06-04T22:51:02+10:00</updated>
    <link rel="alternate" type="text/html" href="https://keithpitty.com/blog_posts/2018-04-22-on-mentoring-and-being-mentored"/>
    <title>On Mentoring and Being Mentored</title>
    <content type="html">&lt;h2&gt;Background&lt;/h2&gt;
&lt;p&gt;Why would I choose to write about mentoring?&lt;/p&gt;
&lt;p&gt;I guess it&amp;#8217;s a topic that I&amp;#8217;ve pondered over the years, ever since my first job out of university. During the couple of years I worked at &lt;span class="caps"&gt;TNT&lt;/span&gt; I didn&amp;#8217;t benefit from any formal mentoring. However, when I think of who had a big impact on my learning on the job, there were certainly a couple of people who immediately come to mind.&lt;/p&gt;
&lt;p&gt;But it was when I arrived at &lt;span class="caps"&gt;IBM&lt;/span&gt; that I was struck by the fact that everyone in the team was allocated an adviser. So I knew that, if I ever had any questions about anything, I could approach Rod, my adviser. I knew he had a wealth of experience and found his help invaluable. What impressed me even more was the fact that the company considered mentoring important enough to implement such a scheme.&lt;/p&gt;
&lt;p&gt;That was back in 1986. Fast forward to 2018 and I&amp;#8217;m in a very different situation, keenly aware of the need for young programmers with whom I work to have good mentoring.&lt;/p&gt;
&lt;p&gt;So, several weeks ago, at &lt;a href="https://rubyconf.org.au/2018"&gt;RubyConf AU&lt;/a&gt;, when &lt;a href="https://twitter.com/alainakafkes"&gt;Alaina Kafkes&lt;/a&gt; challenged those in the audience of her talk about &lt;em&gt;Tackling Technical Writing&lt;/em&gt; to publicly commit to writing about a particular topic, my response was:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/023/original/rubyconfau2018-mentoring.jpg?1522410098" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;And given that Sean was generous enough to say that he&amp;#8217;d read what I had to say on this topic, it&amp;#8217;s only fair that I put words to the screen and share my thoughts.&lt;/p&gt;
&lt;h2&gt;Mentoring Others&lt;/h2&gt;
&lt;h3&gt;Meaning&lt;/h3&gt;
&lt;p&gt;Before I dive into my thoughts about mentoring others, I think it pays to pause and consider the meaning of the word &lt;em&gt;mentor&lt;/em&gt;. The dictionary on my Mac defines a mentor as:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;An experienced and trusted adviser.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now that we have that definition out of the way, let&amp;#8217;s consider what it takes, in my experience, to be a &lt;em&gt;good&lt;/em&gt; experienced and trusted adviser.&lt;/p&gt;
&lt;h3&gt;Patience&lt;/h3&gt;
&lt;p&gt;One thing that I consider to be vital when mentoring is to be aware of the right time to offer advice. As a parent I&amp;#8217;ve come to learn that one has to be patient and &lt;em&gt;wait&lt;/em&gt; for the right moment. Or, to borrow from another context, I love the quote from Jack Gibson, the Rugby League coach, who said:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;A good coach thinks twice and says nothing.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In other words, try to cultivate a sense of recognising moments when your colleague is ready for advice. It&amp;#8217;s important to allow them the time and space to try to figure things out for themselves. You&amp;#8217;ll usually know when they&amp;#8217;re ready for your advice. They&amp;#8217;ll ask you a question!&lt;/p&gt;
&lt;p&gt;On the other hand, there will be times when your colleague could use some advice but doesn&amp;#8217;t ask for it. So make it clear that he or she is welcome to ask questions about anything.&lt;/p&gt;
&lt;p&gt;And then wait.&lt;/p&gt;
&lt;h3&gt;Provide a framework&lt;/h3&gt;
&lt;p&gt;It&amp;#8217;s one thing to encourage your mentee to ask questions. However, to provide them with the basis to ask good questions that will help them learn, a framework will help.&lt;/p&gt;
&lt;p&gt;What do I mean by a framework?&lt;/p&gt;
&lt;p&gt;To begin with, something that provides structured learning. To be fair to your colleague, they&amp;#8217;ll need training to help them be most effective at their work. Appropriate training will help the developer feel that they have ascended to a new level and give them confidence. That confidence should translate into a greater preparedness to attempt new tasks and, importantly, spark questions that will further improve understanding.&lt;/p&gt;
&lt;p&gt;Also, it&amp;#8217;s likely that different members of the team will have different strengths. Part of my envisioned framework is a skills matrix. For each skill there will be specialist mentors as well as a set of training resources.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/058/original/skills-matrix.jpg?1522841479" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;In the early stages of implementing a mentoring program for a team, there may be a few gaps and imbalances in this matrix. For example, a skill that is important to the team may be &lt;em&gt;Ruby Performance Optimisation&lt;/em&gt;. However, there may be nobody in the team that has sufficient strength in that skill to mentor others in the team. A next step to start filling that gap may be to identify some training resources, allocate one developer to complete that training and then become the mentor for that skill.&lt;/p&gt;
&lt;p&gt;Continuing in this way, the skills matrix should start to take better shape. The aim should be to manage its evolution so that there is an even spread of mentors across the skills that are important to the team.&lt;/p&gt;
&lt;h3&gt;Everyone is different&lt;/h3&gt;
&lt;p&gt;Naturally we all differ. We gravitate towards different skills. We think differently. We have different needs.&lt;/p&gt;
&lt;p&gt;So, in my perfect mentoring world, the needs of every individual should be provided for by a mentoring program that is fine-tuned and continuously adapted for that person. In practice this may not always be possible to the ideal degree. However, I think it is worth striving for.&lt;/p&gt;
&lt;h3&gt;Consider the other&amp;#8217;s viewpoint&lt;/h3&gt;
&lt;p&gt;Perhaps this point is obvious.&lt;/p&gt;
&lt;p&gt;However, I think it&amp;#8217;s worth stating explicitly. Whether it&amp;#8217;s during the process of creating and maintaining a mentoring framework, or in the act of mentoring, it pays to put oneself in the shoes of the other.&lt;/p&gt;
&lt;p&gt;What are they keen to learn? What do they think they need to learn in order to do their job better? What do you think they need to learn in order to do their job better?&lt;/p&gt;
&lt;p&gt;It pays to explore these questions in an open manner.&lt;/p&gt;
&lt;h3&gt;Pairing&lt;/h3&gt;
&lt;p&gt;Working as a pair, where one developer is a mentor and the other is more focussed on learning, can be an effective way of enabling a junior developer to grow. Whilst in general a more typical pair programming approach would involve two developers who are on a more or less even footing, switching the driver and navigator roles, a mentor/mentee pair offers an effective learning experience.&lt;/p&gt;
&lt;p&gt;Having said that, there is a caveat. When there is a marked difference in skill levels, pair programming can be intensive and tiring, especially for the mentor. So it is important to be aware of this and provide sufficient breaks between pairing sessions. Ideally, as &lt;a href="https://ryanbigg.com/now"&gt;Ryan Bigg&lt;/a&gt; emphasised in his talk about &lt;a href="https://ryanbigg.com/2018/03/hiring-juniors"&gt;hiring juniors&lt;/a&gt; at the recent RubyConf AU, a task that can be completed within two to three days is a good choice for this style of pairing.&lt;/p&gt;
&lt;h3&gt;One-on-one&lt;/h3&gt;
&lt;p&gt;As I alluded to previously, it&amp;#8217;s important to consider the point of view of the person you are teaching. It&amp;#8217;s not going to be surprising for them to feel self-conscious, even overwhelmed at times. So, as a caring mentor, ensure that there will be regular opportunities to catch up with your colleague in a one-on-one context.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m reminded about a coaching context again. When you&amp;#8217;re coaching a team or a group, it pays to offer praise in public. It makes the recipient feel good. A little bit of an ego boost goes a long way.&lt;/p&gt;
&lt;p&gt;On the other hand, if there&amp;#8217;s a need for some constructive criticism, this is obviously best given in private. Nobody likes to be given negative feedback in front of their peers.&lt;/p&gt;
&lt;h2&gt;Being Mentored&lt;/h2&gt;
&lt;h3&gt;Identifying mentors&lt;/h3&gt;
&lt;p&gt;When you&amp;#8217;re a younger worker, learning your craft, it shouldn&amp;#8217;t be difficult to identify trusted advisers. However, as one grows older, mentors aren&amp;#8217;t as easy to identify. I know that from experience.&lt;/p&gt;
&lt;p&gt;And I have to admit that in recent years I have struggled to find a single person who I can look to for advice as my professional advisor. When I consider my experience over the last decade or so, it leads me to reflect on the various needs I have for advice.&lt;/p&gt;
&lt;p&gt;Perhaps, in my case, as an older, experienced IT professional working within a small group of developers, I need to be more flexible in the way I seek advice.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/059/original/thinking-face.png?1523967577" alt="" /&gt;&lt;/p&gt;
&lt;h3&gt;Relevant experience&lt;/h3&gt;
&lt;p&gt;My need for advice may stem from different sources.&lt;/p&gt;
&lt;p&gt;In a more general, career sense, given that I&amp;#8217;m closer to 60 years of age than 50, it&amp;#8217;s likely that I need to look broadly to find someone who can give me appropriate career advice. Or, perhaps, I need to consider my own counsel. However, having said that, I think that&amp;#8217;s probably a lazy response. Even though it will take more effort, I think it&amp;#8217;s worth my while to keep searching for someone who I feel I can trust to give me good advice about how to approach the closing decade of my career as a software developer. Such an advisor will most likely outside my usual circle of professional colleagues.&lt;/p&gt;
&lt;p&gt;Then again, my need for advice in a professional context may result from other sources. Perhaps I will need specific technical advice?&lt;/p&gt;
&lt;h3&gt;Younger mentors?&lt;/h3&gt;
&lt;p&gt;It shouldn&amp;#8217;t be surprising in the context of professional software development as a senior practitioner to encounter situations where younger colleagues have greater expertise in specific disciplines and technologies. One only has to think of the latest JavaScript framework to develop a keen appreciation!&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m certainly not too proud to seek advice from younger developers about technologies such as &lt;a href="https://reactjs.org/"&gt;React&lt;/a&gt; and &lt;a href="https://webpack.js.org/"&gt;Webpack&lt;/a&gt;, for example.&lt;/p&gt;
&lt;p&gt;So I guess, in essence, I think I should be prepared to seek and accept advice from different mentors for different topics.&lt;/p&gt;
&lt;h3&gt;Getting specific advice&lt;/h3&gt;
&lt;p&gt;At any stage in one&amp;#8217;s career I think it makes sense to be flexible about seeking specific advice. Obviously some people are going to have greater expertise in particular topics than others.&lt;/p&gt;
&lt;p&gt;In my own case, I think it definitely makes sense to think of seeking advice in specific terms. Who has the best advice to offer about specific skills?&lt;/p&gt;
&lt;p&gt;So, when I&amp;#8217;m looking to be mentored, it probably makes sense to consider the same matrix that I proposed earlier.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/058/original/skills-matrix.jpg?1522841479" alt="" /&gt;&lt;/p&gt;
&lt;h2&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;One of the things I love about working as a software developer is the opportunity for learning and teaching.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s pretty rare to go through a career in software development without working as part of a development team. Every member of a team needs mentoring and most will be in a position to also help others in their team. Even if you spend much of your career as a freelance developer you will benefit from and be in a position to provide mentoring.&lt;/p&gt;
&lt;p&gt;I hope this post has stimulated your thinking in some way about mentoring.&lt;/p&gt;
&lt;p&gt;After all, when you think about it, it&amp;#8217;s a two-way street. There are obviously going to be times when you need advice. So, it seems only fair that you be prepared to offer advice as well!&lt;/p&gt;</content>
    <author>
      <name>Keith Pitty</name>
      <email>keith@keithpitty.com</email>
    </author>
  </entry>
  <entry>
    <id>tag:keithpitty.com,2005:BlogPost/53</id>
    <published>2017-12-08T18:47:23+11:00</published>
    <updated>2019-06-04T22:50:41+10:00</updated>
    <link rel="alternate" type="text/html" href="https://keithpitty.com/blog_posts/2017-12-08-moving-on-to-birdsnest"/>
    <title>Moving on to Birdsnest</title>
    <content type="html">&lt;p&gt;For the cast of thousands who hang off every word that I write on this site I am delighted to announce that I will be commencing a new role in the new year!&lt;/p&gt;
&lt;p&gt;In January I will be starting work as a Senior Software Developer with &lt;a href="https://www.birdsnest.com.au/"&gt;Birdsnest&lt;/a&gt;, an online retailing company based in Cooma, &lt;span class="caps"&gt;NSW&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Whilst I will be based at my home office on the &lt;span class="caps"&gt;NSW&lt;/span&gt; Central Coast, I will be making regular visits to Cooma to work with staff on-site, especially the software development team.&lt;/p&gt;
&lt;p&gt;Birdsnest is an inspiring company that &lt;a href="https://www.birdsnest.com.au/our-story/about-us"&gt;offers a unique online shopping experience&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I look forward to working with the development team to help them build upon their successes to date.&lt;/p&gt;</content>
    <author>
      <name>Keith Pitty</name>
      <email>keith@keithpitty.com</email>
    </author>
  </entry>
  <entry>
    <id>tag:keithpitty.com,2005:BlogPost/52</id>
    <published>2017-11-20T21:34:51+11:00</published>
    <updated>2019-06-04T22:51:14+10:00</updated>
    <link rel="alternate" type="text/html" href="https://keithpitty.com/blog_posts/2017-11-20-available-in-the-new-year"/>
    <title>Available in the New Year</title>
    <content type="html">&lt;p&gt;The new year promises to bring new challenges.&lt;/p&gt;
&lt;p&gt;Yes, having contributed to &lt;a href="https://theconversation.com/columns/building-the-conversation-534"&gt;The Conversation&amp;#8217;s development team&lt;/a&gt; as a contractor since June 2015, I will be moving on in late January, or earlier if I am able to provide fair notice.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve very much enjoyed the opportunity to work with &lt;a href="https://theconversation.com"&gt;The Conversation&lt;/a&gt; over the last two and a half years and will have fond memories of collaborating with development colleagues as well as editors of the various editions around the globe.&lt;/p&gt;
&lt;p&gt;What&amp;#8217;s next?&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m open to both consulting and permanent roles. If you&amp;#8217;re looking for a seasoned, passionate software developer who has a &lt;a href="/about"&gt;track record&lt;/a&gt; for helping people by solving problems, please &lt;a href="/contact"&gt;get in touch&lt;/a&gt;.&lt;/p&gt;</content>
    <author>
      <name>Keith Pitty</name>
      <email>keith@keithpitty.com</email>
    </author>
  </entry>
  <entry>
    <id>tag:keithpitty.com,2005:BlogPost/51</id>
    <published>2017-10-21T11:03:01+11:00</published>
    <updated>2019-06-04T22:51:20+10:00</updated>
    <link rel="alternate" type="text/html" href="https://keithpitty.com/blog_posts/2017-11-01-on-non-determinism"/>
    <title>On Non-Determinism</title>
    <content type="html">&lt;p&gt;It&amp;#8217;s something that irks me.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve seen it time and time again. Martin Fowler was moved to &lt;a href="https://martinfowler.com/articles/nonDeterminism.html"&gt;write&lt;/a&gt; about it and &lt;a href="https://www.youtube.com/watch?v=p5Qj75nJPEs#t2m15s"&gt;speak&lt;/a&gt; about it in 2011. I&amp;#8217;ve stressed it&amp;#8217;s importance many times since. Again recently I was moved to share it:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/022/original/martin-fowler-non-determinism.jpg?1508795216" alt="" /&gt;&lt;/p&gt;
&lt;h2&gt;Resistance&lt;/h2&gt;
&lt;p&gt;My observation has been that developers are resistant to accepting the challenge of battling the scourge of intermittently failing tests.&lt;/p&gt;
&lt;p&gt;What is the reason for this resistance? This is something that has intrigued me for years. And I&amp;#8217;d like to delve into it in a little more depth.&lt;/p&gt;
&lt;h3&gt;Time and Effort&lt;/h3&gt;
&lt;p&gt;I suspect that part of the human impulse to resist addressing non-deterministic tests is the intuition that to accept such a challenge might lead to much time and effort expended for little result. If that is the case, believe me, I understand. Fixing this sort of problem is not for those faint of heart!&lt;/p&gt;
&lt;p&gt;Having experienced the struggle of identifying what causes an intermittent failure, I know it isn&amp;#8217;t easy to unearth the root cause.&lt;/p&gt;
&lt;h3&gt;Quarantining&lt;/h3&gt;
&lt;p&gt;In my experience there is a palpable resistance to Martin Fowler&amp;#8217;s suggested approach of quarantining non-deterministic tests. On one level, this bewilders me. As Martin illustrates, if a test cannot be relied upon to pass or fail, it is worse than useless. It is infecting the whole test suite. So, the sane approach is to, at least temporarily, remove it from the test suite.&lt;/p&gt;
&lt;p&gt;Whenever I have suggested this, I have been met with resistence. Developers claim that the test is useful, that it provides protection as part of the regression suite against bugs being introduced. I&amp;#8217;m still searching for a way of countering this argument, which is clearly fallacious. As Martin quite rightly asserts, if a test cannot be relied upon to pass or fail against the same codebase, it is worse than useless and must be immediately quarantined!&lt;/p&gt;
&lt;p&gt;Sure, there is extra effort involved in configuring the quarantining process. The use of &lt;a href="https://relishapp.com/rspec/rspec-core/docs/command-line/tag-option"&gt;RSpec tags&lt;/a&gt; is handy for this. Then there is the perceived risk of the team forgetting to fix the quarantined test. Again, it requires some effort to set up, but it is certainly possible to automate warnings to the team about tests that have been quarantined for too long as well as build pipelines that contain too many quarantined tests.&lt;/p&gt;
&lt;h3&gt;Removal&lt;/h3&gt;
&lt;p&gt;Of course, another possible response to a troublesome non-deterministic test is to simply remove it from the suite.&lt;/p&gt;
&lt;p&gt;This may sound radical, but let&amp;#8217;s consider the situation from a cost/benefit perspective. If a test cannot be guaranteed to reliably pass or fail then it is clearly not providing much benefit. If it takes considerable effort to debug and still cannot be guaranteed to reliably pass or fail, what should the developers make of it? It has clearly already absorbed considerable cost. This leaves the question of potential benefit.&lt;/p&gt;
&lt;p&gt;A related question is: how crucial is this test as part of the suite? Is it a vital part of the test suite? If the answer to this question is &amp;#8220;yes&amp;#8221; then it is appropriate to continue trying to solve the non-deterministic behaviour. However, if the answer is &amp;#8220;no&amp;#8221;, there seems little value in keeping the test within the suite.&lt;/p&gt;
&lt;h3&gt;Laziness&lt;/h3&gt;
&lt;p&gt;People are naturally lazy. Why do something that requires effort unless you really have to or there is a clear benefit that will accrue to you?&lt;/p&gt;
&lt;p&gt;If a developer is working on a pull request, pushes a commit and the resultant build on the CI server fails with an error that is obviously unrelated to their pull request, what&amp;#8217;s the easiest thing to do? Click the button to rebuild the test, of course! The temptation to take this action, even if the developer in question has the appreciation that this may not be a helpful response in the even slightly longer term for his or her colleagues, can be compelling.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m not sure of the best way of countering this. Appealing to the greater good?&lt;/p&gt;
&lt;h3&gt;Priority&lt;/h3&gt;
&lt;p&gt;Usually when a developer notices an intermittently failing test their focus is elsewhere. They may be working on a feature and notice that the build fails due to a non-deterministic test that is unrelated to their feature. Or they may be watching the master build in preparation for a deployment. Understandably the priority in these scenarios is to enable the feature to be merged or the deployment to go ahead.&lt;/p&gt;
&lt;p&gt;The key here is to at least take some action to fix the non-determinism, even if it is to schedule some work to rectify the situation later. Unfortunately, in my experience, the tendency is often to ignore the intermittently failing test.&lt;/p&gt;
&lt;h2&gt;Causes&lt;/h2&gt;
&lt;p&gt;As Martin Fowler points out, there are many causes of non-deterministic tests. Among them are:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;lack of isolation&lt;/li&gt;
	&lt;li&gt;asynchronous behaviour&lt;/li&gt;
	&lt;li&gt;remote services&lt;/li&gt;
	&lt;li&gt;time&lt;/li&gt;
	&lt;li&gt;resource leaks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each of these deserves an article on their own. In &lt;a href="http://rubyonrails.org/"&gt;Rails&lt;/a&gt; applications, the type of intermittent failure I&amp;#8217;ve seen most is due to asynchronous JavaScript. Indeed, it is interesting to note that &lt;a href="http://mir.cs.illinois.edu/%7Eqluo2/fse14LuoHEM.pdf"&gt;An Empirical Analysis of Flaky Tests&lt;/a&gt; found that 45% of flaky tests were due to the test execution making an asynchronous call and not properly waiting for the result of the call to become available before using it.&lt;/p&gt;
&lt;p&gt;Much has been written elsewhere about dealing with non-deterministic tests that use &lt;a href="http://rspec.info/"&gt;RSpec&lt;/a&gt; and &lt;a href="https://github.com/teamcapybara/capybara"&gt;Capybara&lt;/a&gt;. For example:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Maria Verba gave some &lt;a href="https://www.joinhandshake.com/engineering/testing/automation/best-practices/2016/11/30/making-your-specs-bulletproof-tips-and-best-practices.html"&gt;tips and best practices for identifying and fixing bad tests&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Nebojša Stričević gave some guidance about &lt;a href="https://semaphoreci.com/community/tutorials/how-to-deal-with-and-eliminate-flaky-tests"&gt;how to deal with and eliminate flaky tests&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Gabe Berke-Williams wrote about giving Capybara a helping hand by &lt;a href="https://robots.thoughtbot.com/automatically-wait-for-ajax-with-capybara"&gt;introducing a wait_for_ajax helper&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Added to this, Keith Pitt has detailed &lt;a href="https://building.buildkite.com/5-ways-weve-improved-flakey-test-debugging-4b3cfb9f27c8"&gt;5 ways we’ve improved flakey test debugging&lt;/a&gt;, which focuses more on how to capture the database state when a test fails intermittently.&lt;/p&gt;
&lt;p&gt;They are all worth reading. However, what I&amp;#8217;m pondering in this article is more to do with motivation.&lt;/p&gt;
&lt;h2&gt;A Way Forward&lt;/h2&gt;
&lt;p&gt;How can we best encourage developers to tackle non-deterministic tests?&lt;/p&gt;
&lt;p&gt;Expecting the person who first notices the failing test to fix it is probably not a good approach. After all, that person is likely to be feeling frustrated or even angry that an unrelated test failure is holding up their progress.&lt;/p&gt;
&lt;p&gt;A colleague of mine recently suggested assigning the task of fixing a non-deterministic test to the last person who changed that test. It&amp;#8217;s a helpful suggestion that at least circumvents the frustration that I wrote about earlier. It also assumes that the team member assigned to fix the flaky test is willing and capable.&lt;/p&gt;
&lt;p&gt;Of course, keeping a CI build healthy is a shared responsibility. The build is more likely to be healthy if all members of the team contribute to meeting the challenge posed by non-determinism.&lt;/p&gt;
&lt;h3&gt;A Parting Thought&lt;/h3&gt;
&lt;p&gt;In my case, one thing I need to be mindful of is to be careful not to let the frustration that I sometimes feel become counter-productive. As Kent Beck &lt;a href="https://twitter.com/KentBeck/status/675800995427827712"&gt;implied a while back&lt;/a&gt;, as well as working in small increments, it is important to be both kind and honest.&lt;/p&gt;
&lt;p&gt;If I follow that advice hopefully I will respond to discovering non-deterministic tests by gradually finding ways to help the team to handle the challenge of fixing them more successfully.&lt;/p&gt;</content>
    <author>
      <name>Keith Pitty</name>
      <email>keith@keithpitty.com</email>
    </author>
  </entry>
  <entry>
    <id>tag:keithpitty.com,2005:BlogPost/50</id>
    <published>2017-03-16T23:12:03+11:00</published>
    <updated>2019-06-04T22:51:30+10:00</updated>
    <link rel="alternate" type="text/html" href="https://keithpitty.com/blog_posts/2017-06-01-achieving-flow-in-a-development-team"/>
    <title>Achieving Flow in a Development Team</title>
    <content type="html">&lt;p&gt;One day last June I was moved to &lt;a href="https://twitter.com/keithpitty/status/745781077126504448"&gt;share an opinion on Twitter&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/019/original/team-flow.png?1489837275" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;And as the following exchange shows, at least one reader, my former colleague SengMing Tan, expressed a desire to know more.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/020/original/team-flow-sengming.png?1489837290" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;As I foreshadowed, it has taken me a while to get around to elaborating.&lt;/p&gt;
&lt;p&gt;However, the time has come. After nearly a year has elapsed I am fulfilling my promise.&lt;/p&gt;
&lt;p&gt;Here is a description of how the team I&amp;#8217;ve been working in at &lt;a href="https://theconversation.com"&gt;The Conversation&lt;/a&gt; uses Kanban, Trello, GitHub, Buildkite and Babushka to develop, review and ship software in a way that encourages flow.&lt;/p&gt;
&lt;h2&gt;Tools and Techniques&lt;/h2&gt;
&lt;h3&gt;Kanban&lt;/h3&gt;
&lt;p&gt;Whilst there are several tools that we use which combine to help our team feel that we are constantly making progress towards shipping software, it is the &lt;a href="https://en.wikipedia.org/wiki/Kanban"&gt;Kanban&lt;/a&gt; system which underpins them.&lt;/p&gt;
&lt;p&gt;As I understand it, the team started out with a low-fi approach by using a physical card Kanban wall. But by the time I joined, they had moved that wall to &lt;a href="https://trello.com/"&gt;Trello&lt;/a&gt;. Which was just as well, because I was the first remote member of the development team.&lt;/p&gt;
&lt;p&gt;Nevertheless, I think it is the Kanban style of only allowing a specified maximum number of cards in each &amp;#8220;swim lane&amp;#8221;, that is crucial to the overall feeling of progress that our team has.&lt;/p&gt;
&lt;h3&gt;Trello&lt;/h3&gt;
&lt;p&gt;As anyone who has used Trello knows, the general style is to represent progress by aiming to move cards from left to right across the columns. Whilst there are other columns on our development board, the following image depicts those that are essential to the way Trello supports our Kanban style of development.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve blurred out the details of the cards but the key things to notice are the column headings. Notice that we have upper limits set for how many cards should be &lt;em&gt;Queued&lt;/em&gt;, &lt;em&gt;In Progress&lt;/em&gt; or under &lt;em&gt;Review&lt;/em&gt;. This helps us each individually focus on completing a piece of work. As a team, it draws attention to ensuring that work is reviewed in a timely manner. If more than six cards are in the &lt;em&gt;Review&lt;/em&gt; column, we consider that to be a broken state. It is a prompt to the team to give more focus to reviewing pull requests until we can merge enough of them and move the corresponding Trello cards to the &lt;em&gt;Ready&lt;/em&gt; column.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s3.amazonaws.com/kpdotcom-assets/images/pictures/000/000/021/original/trello-kanban.jpg?1491630265" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;There are other columns on our development board such as &lt;em&gt;Confirmed&lt;/em&gt; to the left and &lt;em&gt;Complete&lt;/em&gt; to the right of those shown in the screenshot. And we have other boards. However, in the context of how we use Trello to help the team achieve flow, the four columns shown demonstrate what is at the heart of how we use Trello.&lt;/p&gt;
&lt;h3&gt;GitHub&lt;/h3&gt;
&lt;p&gt;One of the things I like about the paid version of Trello is the various &lt;a href="https://trello.com/power-ups"&gt;Power-Ups&lt;/a&gt;. I find the &lt;a href="http://info.trello.com/power-ups/github"&gt;GitHub Power-Up&lt;/a&gt; particularly useful. As &lt;a href="/blog/archives/2015-09-19-effective-collaboration-using-github-prs"&gt;I have written elsewhere&lt;/a&gt;, when I&amp;#8217;m working towards a solution I prefer to share code via a pull request as early as possible. Fortunately our team has a strong culture of providing respectful feedback via pull requests.&lt;/p&gt;
&lt;p&gt;There are times when I feel the need to gently prod my teammates to provide feedback on my pull requests. However, once the conversation within the context of a GitHub PR starts, it is usually very helpful. I like the way the tone of our comments tends to be questioning and curious rather than judgemental.&lt;/p&gt;
&lt;p&gt;Once a Trello card, with a linked PR, is designated as available for review, it is important for the team to give it timely attention. Occasionally attention is diverted elsewhere. For this reason our team programmed our Slackbot to inform us if a card has been in the Review column for too long. To me this is a helpful prompt to keep contributing to the effort that will result in shipping software. Speaking of Slack, its integration with GitHub is an obvious boon. Being able to see via our main &lt;strong&gt;#dev&lt;/strong&gt; Slack channel when a PR is created or merged certainly helps teamwork.&lt;/p&gt;
&lt;p&gt;Being able to easily trace code changes in a PR that result from a Trello card is wonderful for maintaining flow. Did I mention how much I love the &lt;a href="http://info.trello.com/power-ups/github"&gt;Trello GitHub Power-Up&lt;/a&gt;?&lt;/p&gt;
&lt;h3&gt;Buildkite&lt;/h3&gt;
&lt;p&gt;The ways in which &lt;a href="https://buildkite.com"&gt;Buildkite&lt;/a&gt; can assist teams achieve flow is worthy of a post in itself. For the purposes of this discussion, I&amp;#8217;ll confine myself to the way Buildkite is integrated into our team workflow.&lt;/p&gt;
&lt;p&gt;We use Buildkite to automate our continuous integration builds. Unsurprisingly it is integrated with GitHub so that it&amp;#8217;s easy to see whether or not the build has passed for the latest commit on a PR. Then there is the Slack integration, which I find useful as another prompt about the success or failure of builds. There are times when the first place I&amp;#8217;ll notice a build failure is via our &lt;strong&gt;#buildkite&lt;/strong&gt; Slack channel.&lt;/p&gt;
&lt;p&gt;Obviously part of achieving flow is ensuring that the build for a PR is successful before that PR is merged. And, of course, the build for the master branch must be &lt;img alt="green_heart" src="/images/emoji/unicode/1f49a.png" style="vertical-align:middle" width="20" height="20" /&gt; before we can deploy.&lt;/p&gt;
&lt;h3&gt;Babushka&lt;/h3&gt;
&lt;p&gt;Whilst we have not yet reached the point where we continuously deploy our software, we do typically deploy applications several times each day. The tool that helps us &lt;img alt="ship" src="/images/emoji/unicode/1f6a2.png" style="vertical-align:middle" width="20" height="20" /&gt; software is &lt;a href="https://babushka.me/"&gt;Babushka&lt;/a&gt;, courtesy of an alumnus of The Conversation, &lt;a href="https://github.com/benhoskings"&gt;Ben Hoskings&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Babushka may not be as well known as other tools which support deployment but it has served our team well so far. Once a master build is &lt;img alt="green_heart" src="/images/emoji/unicode/1f49a.png" style="vertical-align:middle" width="20" height="20" /&gt; for an application and we are ready to &lt;img alt="shipit" src="/images/emoji/shipit.png" style="vertical-align:middle" width="20" height="20" /&gt;, it is a simple matter of entering &lt;strong&gt;babushka &amp;#8216;&lt;span class="caps"&gt;SHIP&lt;/span&gt; IT&amp;#8217;&lt;/strong&gt; at the command line and the defined dependencies will enable babushka to deploy our software.&lt;/p&gt;
&lt;h2&gt;Summing Up&lt;/h2&gt;
&lt;p&gt;It&amp;#8217;s all about flow. As emphasised by psychologist &lt;a href="https://en.wikipedia.org/wiki/Mihaly_Csikszentmihalyi"&gt;Mihály Csíkszentmihályi&lt;/a&gt;, in a personal context &lt;a href="https://en.wikipedia.org/wiki/Flow_(psychology)"&gt;flow&lt;/a&gt; is &lt;em&gt;&amp;#8220;the mental state of operation in which a person performing an activity is fully immersed in a feeling of energized focus, full involvement, and enjoyment in the process of the activity.&amp;#8221;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Translating this concept into a software team, we can see that it is important to remove as many barriers as we can to the team being fully immersed in shipping quality software. The Kanban approach supported by various integrated tools can certainly help in this regard.&lt;/p&gt;
&lt;p&gt;And, in my experience, it can be fun too!&lt;/p&gt;</content>
    <author>
      <name>Keith Pitty</name>
      <email>keith@keithpitty.com</email>
    </author>
  </entry>
</feed>
