<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Rob Cooper</title>
    <description>The latest articles on Forem by Rob Cooper (@robcthegeek).</description>
    <link>https://forem.com/robcthegeek</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F465863%2F2c9beec5-ca33-48f9-9edb-134e135bdde1.jpeg</url>
      <title>Forem: Rob Cooper</title>
      <link>https://forem.com/robcthegeek</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/robcthegeek"/>
    <language>en</language>
    <item>
      <title>Technical Debt - The Unseen and Surprising</title>
      <dc:creator>Rob Cooper</dc:creator>
      <pubDate>Thu, 18 Mar 2021 07:15:53 +0000</pubDate>
      <link>https://forem.com/robcthegeek/technical-debt-the-unseen-and-surprising-l9d</link>
      <guid>https://forem.com/robcthegeek/technical-debt-the-unseen-and-surprising-l9d</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;We accrue technical debt in different, often unseen and innocent ways:

&lt;ul&gt;
&lt;li&gt;'Unexpected' - created by unpredictable or aggressive change.&lt;/li&gt;
&lt;li&gt;'Unintended' - created by something missed at the design/development phase.&lt;/li&gt;
&lt;li&gt;'Tools and Tech' - opportunity cost of &lt;em&gt;not&lt;/em&gt; leveraging faster, more effective tooling and technologies.&lt;/li&gt;
&lt;li&gt;'Team changes' - codebase incoherence due to number of contributors (who may no longer be part of the team).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;As with all work - get it into the backlog so it's visible.&lt;/li&gt;
&lt;li&gt;Weigh up not only the cost of clearing technical debt, but also the value &lt;em&gt;gained&lt;/em&gt; from clearing &lt;em&gt;quickly&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;If you can't 'sell' the benefits of a refactoring - you probably shouldn't do it.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;'Technical Debt' (Tech Debt) is explained nicely by &lt;a href="https://en.wikipedia.org/wiki/Technical_debt"&gt;Wikipedia&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Technical debt (also known as design debt or code debt, but can be also related to other technical endeavors) is a concept in software development that reflects the implied cost of additional rework caused by choosing an easy (limited) solution now instead of using a better approach that would take longer.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Many roll with the financial metaphor and discuss 'interest' (time, effort) to clear the debt.&lt;/p&gt;

&lt;p&gt;Tech debt is recognition that "we're &lt;em&gt;intentionally&lt;/em&gt; cutting corners here". This may &lt;em&gt;sound&lt;/em&gt; bad - but there's several great reasons to do take on tech debt - to name a few:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Speed to market&lt;/strong&gt; - especially if a new product where scale and reliability are less important than early user feedback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Beta testing&lt;/strong&gt; - similar to the above - but normally to a closed group. While we may not ship the product to the public - we're willing to 'roll forward' with warts-and-all. This is very typical in Scrum teams where Products are continuously incremented.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deadlines&lt;/strong&gt; - the &lt;em&gt;real&lt;/em&gt; kind. While generally rare - they do exist. Contractual or legal obligations may force corners to be cut.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I believe these are well understood - and often agreeable. &lt;em&gt;However,&lt;/em&gt; I keep seeing 'Technical Debt' getting used for very different types of problems. They need different approaches to solve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Traditional Tech Debt
&lt;/h2&gt;

&lt;p&gt;Let's get the common and easy one out of the way. &lt;strong&gt;When knowingly cutting corners, define up-front when you expect/want to pay that debt off.&lt;/strong&gt; Similar to how you'd take out a loan.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"We know this won't scale" - "When we hit a sign up rate of X/Y, we'll get this into the next Sprint"&lt;/li&gt;
&lt;li&gt;"We want to get this out ASAP, with some known bugs" - "We'll clean these up next Sprint"&lt;/li&gt;
&lt;li&gt;"To meet contratual agreements - we'll do X, but we must spend the next Y Sprints cleaning up"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Generally speaking - the more 'interest' you need to pay, it's best done quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unexpected Tech Debt
&lt;/h2&gt;

&lt;p&gt;Increasingly common - especially with the rise of more highly distributed, service-orientated systems. Essentially &lt;strong&gt;the system becomes a victim of it's own success and/or isn't refactored quickly enough to meet rapidly-changing business demands.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Explosion of usage&lt;/strong&gt; (e.g. increased user counts, taking an API public) means that the system is now operating way beyond it's original design. For example: Data stored may not be partitioned effectively given the new usage patterns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What &lt;em&gt;seemed&lt;/em&gt; sensible at the time... Wasn't.&lt;/strong&gt; While moving fast - things might get implemented in the heat of the moment - and look fine. The holistic view of the system is missed - and a key refactoring should have taken place to accommodate the new demand. For example: Addition of new markets introducing cross-cutting, leaky models into an architecture.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These ones are very tricky and frankly - often painful for the development team. They could start to manifest as performance issues. Or, the 'awesome team that made this business' suddenly starting to look slow and like a bug factory.&lt;/p&gt;

&lt;p&gt;A typical phrase I use when working with a team experiencing these is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Knowing what you know now - how would you build it?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the solution is architecturally very different - you've likely got some unexpected tech debt.&lt;/p&gt;

&lt;p&gt;As soon as these are identified - &lt;em&gt;get them in the backlog&lt;/em&gt;. Make sure the Product Owners are &lt;em&gt;extremely&lt;/em&gt; aware of the problem and how &lt;strong&gt;it's only going to get worse&lt;/strong&gt;. Sitting down and devising some immediate (albeit hacky) mitigations while figuring out a long-term fix is often needed. Give the Product Owner options to work with.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unintended Tech Debt
&lt;/h2&gt;

&lt;p&gt;If 'unexpected' is the tech debt created in the future, 'unintended' is created in the past. This is essentially &lt;strong&gt;"we built with the best of intentions, but we missed something"&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Again, this is becoming increasingly common - especially with the glorification of phrases like "move fast and break things".&lt;/p&gt;

&lt;p&gt;I like to throw different ones around like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Don't break the till" (or 'cash register' for our friends speaking American English 😊). If people can't pay, you don't get paid.&lt;/li&gt;
&lt;li&gt;"Don't break the door" - No signups, no users - not to mention reputation damage. Ever seen a busted door during a extremely successful marketing campaign? Not pretty.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are certain areas where unintended tech debt can be &lt;em&gt;very&lt;/em&gt; damaging - so extra care/attention is required. I'm not advocating &lt;a href="https://en.wikipedia.org/wiki/Big_Design_Up_Front"&gt;"Big Design Up Front" (BDUF)&lt;/a&gt;, but "care and attention to details when and where it matters".&lt;/p&gt;

&lt;p&gt;This kind of tech debt can vary in severity based on what's affected. However, normally these come as a nasty shock to the team and can result in high-priority fixes. Not only do these lower the profile of the development team, but also ruin plans in progress. Not fun for anyone involved.&lt;/p&gt;

&lt;p&gt;The key here is quality design and testing. Spend &lt;em&gt;enough&lt;/em&gt; time in the design/modelling phase. What's your testing plan? Do you have adequate time to perform exploratory testing? What else can be &lt;a href="https://en.wikipedia.org/wiki/Shift-left_testing"&gt;shifted-left&lt;/a&gt;?&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech and Tools
&lt;/h2&gt;

&lt;p&gt;It's worth highlighting these because:&lt;/p&gt;

&lt;h3&gt;
  
  
  Tools and technologies evolve
&lt;/h3&gt;

&lt;p&gt;What was good yesterday, may be superseded tomorrow by something 100x better. &lt;em&gt;Not&lt;/em&gt; leveraging that can introduce debt due to opportunity cost etc.&lt;/p&gt;

&lt;p&gt;To help overcome this - I think best thing is a &lt;strong&gt;healthy culture of curiosity, learning and sharing&lt;/strong&gt; among the developers. We can't learn &lt;em&gt;everything&lt;/em&gt; so spread the load and get talking about the highlights!&lt;/p&gt;

&lt;p&gt;Make sure you and your team has the freedom to learn, play and discover what's new and upcoming so they can be ready to run with it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Platforms change, as do their costs
&lt;/h3&gt;

&lt;p&gt;I remember having to rent fixed kit with a fixed cost (👴). We now live in incredible times with a veritable feast of &lt;a href="https://en.wikipedia.org/wiki/Platform_as_a_service"&gt;PaaS&lt;/a&gt; options on the table. These are constantly evolving - potentially offering (significant) cost savings both in usage and (often more importantly) saved developer time and cognitive load.&lt;/p&gt;

&lt;p&gt;Similar to the above - a healthy culture creating awareness is key. If you're in an organisation large enough to have Architects around - this should absolutely be one of their core objectives to be on top of this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Team Changes
&lt;/h2&gt;

&lt;p&gt;We work in teams with multiple Developers. There's churn. A lot of opinions end up in the code. You end up with code that's "kind of OK", but over time has become increasingly awkward or downright dangerous to work with. Yes, we know "it needs a refactor, and better tests". But, few are willing to do it given the risks it &lt;em&gt;might&lt;/em&gt; introduce.&lt;/p&gt;

&lt;p&gt;Whenever I am working with teams and hear grumbles of "oh no, we need to go near &lt;em&gt;that&lt;/em&gt;", I'll start to ask what their understanding of the problem(s) are, how they intend to fix it, and risks.&lt;/p&gt;

&lt;p&gt;If it feels like a &lt;a href="https://en.wikipedia.org/wiki/Spike_(software_development)"&gt;spike&lt;/a&gt; is needed to work out answers, then we'll do that.&lt;/p&gt;

&lt;p&gt;Once we're armed with plan and possible solution(s) - I'll then ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"What is your estimate if we &lt;em&gt;don't&lt;/em&gt; take time to fix this?"&lt;/li&gt;
&lt;li&gt;"... and what if &lt;em&gt;had&lt;/em&gt; fixed it, per this plan?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the plan means smaller, more confident estimates - we likely commit to it. &lt;em&gt;Especially&lt;/em&gt; if we know that there's a lot of change in that area coming up. Having several 5-pointers turn into a series of 2's by taking the time to 'finally fix that thing' not only feels good from a planning point-of-view, but general pride in the codebase.&lt;/p&gt;

&lt;h2&gt;
  
  
  'Dislike' Isn't 'Debt'
&lt;/h2&gt;

&lt;p&gt;This is the one that tends to lose me most friends 😉 It's important to call it out though, because &lt;strong&gt;it's doing us harm.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When adding tech debt to the backlog - &lt;strong&gt;it needs to be based on 'this is causing objective pain'&lt;/strong&gt; - not "I don't like it" or "this would be cool".&lt;/p&gt;

&lt;p&gt;This will often manifest as "The Great Refactoring", only to discover one or more of the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It's in a part of the codebase that's barely touched - and no further changes needed on the horizon.&lt;/li&gt;
&lt;li&gt;The developer flew solo - often creating more of the 'incoherence' problem. They dip in, changing patterns/conventions in place &lt;em&gt;in just that bit&lt;/em&gt; - may look good for them, but the wider team now struggles with it.&lt;/li&gt;
&lt;li&gt;It was an opportunity to introduce {coolest pattern/technology of the day} - often &lt;em&gt;adding&lt;/em&gt; complexity rather than taking it away.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Product Owner doesn't really 'get' it, and trusted the developer in that 'we just need it'.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is tricky to pick up. It &lt;em&gt;can&lt;/em&gt; be difficult to judge if a refactor adds &lt;em&gt;enough&lt;/em&gt; value. It's important that we try though because &lt;strong&gt;these low/no/negative value-add refactorings cost time, energy but more importantly - &lt;em&gt;trust&lt;/em&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As &lt;em&gt;professionals&lt;/em&gt; we need to work with our Product Owners and the rest of the team, and be conscious of the investment (our time, opportunity cost, increases in complexity) we're proposing.&lt;/p&gt;

&lt;p&gt;A good way of getting a sense of it is to simply do the maths! Take your daily salary - plus some for that of your &lt;a href="https://en.wikipedia.org/wiki/Pair_programming"&gt;pair&lt;/a&gt;. Guesstimate time you're going to spend on it - what would be required to get that return on investment back? This can be a real eye-opening experience - especially when you consider that some people go down the rabbit hole for entire &lt;em&gt;Sprints&lt;/em&gt; or more.&lt;/p&gt;

&lt;p&gt;In my experience - there's two common warning signs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;'Tech Debt' Sprints appearing on plans.&lt;/li&gt;
&lt;li&gt;Developer X (often a senior) doing a 'thing' for days/weeks that no-one else on the team can really explain. But "they know what they're doing".&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Arguably - local leadership could/should pick this up, but we're all human. Everyone has good intentions.&lt;/p&gt;

&lt;p&gt;So, &lt;strong&gt;be conscious of your investments. If you can't 'sell it' to your Product Owner (as you should), skip it&lt;/strong&gt; (or spend more time figuring out the benefits).&lt;/p&gt;

&lt;h2&gt;
  
  
  To close...
&lt;/h2&gt;

&lt;p&gt;Not all tech debt is created equal, much (most?) of it is unintentional. This unintentional debt often has very negative side effects when it becomes apparent. There's several warning signs we can look out for. Once discovered, get it into your backlog to review and resolve.&lt;/p&gt;

&lt;p&gt;Understanding the cost of both paying off the debt, and &lt;em&gt;delay&lt;/em&gt; in paying of the debt are key for prioritising.&lt;/p&gt;

&lt;p&gt;Work with your Product Owner - if you can't 'sell' a refactoring, you probably shouldn't be doing it. Present options/trade-offs. &lt;em&gt;Negotiate&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Now go create.&lt;/p&gt;

&lt;p&gt;Happy hacking!&lt;/p&gt;

</description>
      <category>planning</category>
      <category>management</category>
      <category>architecture</category>
      <category>refactoring</category>
    </item>
    <item>
      <title>Learn a New Language!</title>
      <dc:creator>Rob Cooper</dc:creator>
      <pubDate>Tue, 09 Mar 2021 08:13:14 +0000</pubDate>
      <link>https://forem.com/robcthegeek/deliberate-practice-for-programmers-learn-a-new-language-5aja</link>
      <guid>https://forem.com/robcthegeek/deliberate-practice-for-programmers-learn-a-new-language-5aja</guid>
      <description>&lt;p&gt;In &lt;a href="https://dev.to/robcthegeek/programmers-need-deliberate-practice-411"&gt;the last post&lt;/a&gt; - we talked about &lt;em&gt;why&lt;/em&gt; deliberate practice is important, and that I aim to approach my practice with:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Purpose&lt;/strong&gt; - I'm spending my non-refundable time on something, I want it to count.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan&lt;/strong&gt; - Before I start, I think about how I'm going to &lt;em&gt;structure&lt;/em&gt; my practice so that it (hopefully) meets it's purpose.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Progress&lt;/strong&gt; - Ensuring I take time to reflect on the practice, and adjust as necessary.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To get specific (we're programmers, after all) - this translates to:&lt;/p&gt;

&lt;h2&gt;
  
  
  Defining Purpose
&lt;/h2&gt;

&lt;p&gt;Creating plans to exercise 'something' that I encounter in my career - for example (and this list is &lt;em&gt;far&lt;/em&gt; from exhaustive):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Learning a new programming language.&lt;/li&gt;
&lt;li&gt;Working with different IDE's to develop and debug.&lt;/li&gt;
&lt;li&gt;Traversing and processing data.&lt;/li&gt;
&lt;li&gt;Effective automated testing. From unit to end-to-end.&lt;/li&gt;
&lt;li&gt;Creating build and deployment pipelines.&lt;/li&gt;
&lt;li&gt;Working with different databases and ORMs.&lt;/li&gt;
&lt;li&gt;Performance profiling and testing.&lt;/li&gt;
&lt;li&gt;Finding memory leaks.&lt;/li&gt;
&lt;li&gt;Rapid prototyping.&lt;/li&gt;
&lt;li&gt;Paradigm shifts - e.g. object-oriented to functional.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I will find myself in a situation where either I or a colleague needs some help with a specific area - I then go to my list and see if I either have something defined that works, or start defining what I want from the session based on needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Defining a Plan
&lt;/h2&gt;

&lt;p&gt;Given the &lt;em&gt;Purpose&lt;/em&gt; I then start to think about a &lt;em&gt;Plan&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Let's say I want to pick up a new language as the client I am working with is on a different stack. I think I generally need to:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Get the basics
&lt;/h3&gt;

&lt;p&gt;Can I &lt;em&gt;start&lt;/em&gt; to express myself in the new language? &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How do I define basic types? (Integers, Floats, Booleans, Strings, Array)&lt;/li&gt;
&lt;li&gt;How do I concatenate or interpolate strings?&lt;/li&gt;
&lt;li&gt;How do I read from/write to the console?&lt;/li&gt;
&lt;li&gt;What are the basic control flow statements? (&lt;code&gt;if/else&lt;/code&gt;, &lt;code&gt;foreach&lt;/code&gt;, &lt;code&gt;switch&lt;/code&gt; etc.) &lt;/li&gt;
&lt;li&gt;How do I define functions and methods?&lt;/li&gt;
&lt;li&gt;Can I define anonymous functions?&lt;/li&gt;
&lt;li&gt;How do I control the &lt;em&gt;visibility&lt;/em&gt; of those functions and methods?&lt;/li&gt;
&lt;li&gt;How do exceptions work? How do I handle them?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This stage is generally easier if you know how to code already - you'll often ask "&lt;em&gt;How do I do X in Y?&lt;/em&gt;" This can lead to easier searches. However, having a checklist makes as a great teaching aid for fledgling programmers.&lt;/p&gt;

&lt;p&gt;By the time I'm done with this list - I'm &lt;em&gt;generally&lt;/em&gt; able to bumble my way through a problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Get Productive and Effective
&lt;/h3&gt;

&lt;p&gt;Now that I can write &lt;em&gt;some&lt;/em&gt; code - I am starting to think more about how it's really &lt;em&gt;working&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How do I define, run and interpret automated tests?&lt;/li&gt;
&lt;li&gt;What data structures do I have available to me? How could/would I implement them if not?&lt;/li&gt;
&lt;li&gt;What foundation / base libraries do I have available for common things - for example collections, HTTP, serialisation etc.&lt;/li&gt;
&lt;li&gt;How do I use packages/modules that others have created?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At this stage, I'm probably starting to feel a lot more confident. I've got tests backing up my work and I'm using tried-and-tested code from others where possible.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Optimise!
&lt;/h3&gt;

&lt;p&gt;I'm writing code - but it's likely not the 'best' code. I'm likely upsetting the veterans in the codebase with every pull request. Now I start to think about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Going 'native' - how do I write more idiomatic code for that language? Is the method named &lt;code&gt;IsAuthenticated&lt;/code&gt;, &lt;code&gt;isAuthenticated&lt;/code&gt;, &lt;code&gt;is_authenticated&lt;/code&gt;, &lt;code&gt;is_authenticated?&lt;/code&gt; or &lt;code&gt;HOW IZ I AUTHENTICATED YR USER&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;Thinking about performance - using correct data structures (because not everything belongs in an array, y'all), understanding how they're traversed etc.&lt;/li&gt;
&lt;li&gt;Being conscientious with memory usage - how do I get stuff off the heap? Reduce allocations etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ... Reflect on Progress
&lt;/h2&gt;

&lt;p&gt;I'll open up some notes, and work my way through the above, in order. Getting "the basics" might take an hour or so. From there, I'll try and start solving some simple problems via Katas.&lt;/p&gt;

&lt;p&gt;As I start to learn more (e.g. more expressive/cleaner ways of saying things) - I'll continually refine my notes.&lt;/p&gt;

&lt;p&gt;I get a real sense of achievement in seeing my notes evolve. &lt;strong&gt;Going back to something you've &lt;em&gt;personally&lt;/em&gt; written and editing/improving &lt;em&gt;proves&lt;/em&gt; progress.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'll also solidify/verify the growth by tackling random coding problems (e.g. from the likes of &lt;a href="https://www.codingame.com/"&gt;CodinGame&lt;/a&gt; or &lt;a href="https://www.codewars.com/"&gt;CodeWars&lt;/a&gt;).&lt;br&gt;
It's amazing how quickly you can get &lt;em&gt;something&lt;/em&gt; going!&lt;/p&gt;

&lt;p&gt;Rinse and repeat!&lt;/p&gt;

&lt;h1&gt;
  
  
  Enough Talk, Let's Code!
&lt;/h1&gt;

&lt;p&gt;We've outlined a plan - let's go learn the basics of a new language!&lt;/p&gt;

&lt;p&gt;Now - my 'home' language is C#, but I've done some JavaScript, TypeScript, Python, Ruby and Java at varying levels. I'm gonna pick a random just for funsies - &lt;a href="https://elixir-lang.org/"&gt;Elixir&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;🥰 Big thanks to the awesome that is &lt;a href="https://repl.it/l"&gt;repl.it&lt;/a&gt; for enabling me to hack in a browser-based IDE! I highly recommend trying it (or similar) so that you can get to &lt;em&gt;the language&lt;/em&gt; without worrying about IDE setup etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run the List
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="c1"&gt;# How do I define basic types? (Integers, Floats, Booleans, Strings, Array)&lt;/span&gt;
&lt;span class="n"&gt;an_int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;an_float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;
&lt;span class="n"&gt;an_bool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;an_str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Elixir"&lt;/span&gt;
&lt;span class="n"&gt;an_arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# How do I concatenate or interpolate strings?&lt;/span&gt;
&lt;span class="n"&gt;ans&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Forty-two"&lt;/span&gt;
&lt;span class="n"&gt;meaning&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"The answer to the great question.. Of Life, the Universe and Everything.. Is.. &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;ans&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;."&lt;/span&gt;

&lt;span class="c1"&gt;# How do I read from/write to the console?&lt;/span&gt;
&lt;span class="n"&gt;user_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"What's your name? "&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Trailing space to look nicer in console&lt;/span&gt;
&lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Hello, &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;user_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Note that you get the trailing newline with gets- so you'll likely want to trim&lt;/span&gt;
&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"?"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"?"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# Can also pipe - easier on the eyes?&lt;/span&gt;

&lt;span class="c1"&gt;# What are the basic control flow statements? (`if/else`, `foreach`, `switch` etc.) &lt;/span&gt;
&lt;span class="c1"&gt;# https://elixir-lang.org/getting-started/case-cond-and-if.html&lt;/span&gt;
&lt;span class="c1"&gt;# https://elixir-lang.org/getting-started/recursion.html&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="c1"&gt;# ...&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="c1"&gt;# ...&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="c1"&gt;# ...&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;# Enum module also has map and reduce functions&lt;/span&gt;
&lt;span class="c1"&gt;# https://elixir-lang.org/getting-started/enumerables-and-streams.html#enumerables&lt;/span&gt;
&lt;span class="no"&gt;Enum&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# [2, 4, 6]&lt;/span&gt;
&lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Enum&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;# 12&lt;/span&gt;

&lt;span class="n"&gt;beats&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;play&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="s2"&gt;"scissors"&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"paper"&lt;/span&gt;
    &lt;span class="s2"&gt;"paper"&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"rock"&lt;/span&gt;
    &lt;span class="s2"&gt;"rock"&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"lizard"&lt;/span&gt;
    &lt;span class="s2"&gt;"lizard"&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"spock"&lt;/span&gt;
    &lt;span class="s2"&gt;"spock"&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"scissors"&lt;/span&gt;
    &lt;span class="s2"&gt;"scissors"&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"lizard"&lt;/span&gt;
    &lt;span class="s2"&gt;"lizard"&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"paper"&lt;/span&gt;
    &lt;span class="s2"&gt;"paper"&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"spock"&lt;/span&gt;
    &lt;span class="s2"&gt;"spock"&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"rock"&lt;/span&gt;
    &lt;span class="s2"&gt;"rock"&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"scissors"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# How do I define functions and methods?&lt;/span&gt;
&lt;span class="c1"&gt;# (Elixir is functional, and doesn't have concept of Objects, Classes and Methods)&lt;/span&gt;
&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;MyModule&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# How do I control the visibility of those functions and methods?&lt;/span&gt;
&lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;im_a_private_function&lt;/span&gt;
    &lt;span class="c1"&gt;# ...&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# Can I define anonymous functions?&lt;/span&gt;
&lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;&amp;amp;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;&amp;amp;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Shorthand using &amp;amp;&lt;/span&gt;
&lt;span class="c1"&gt;# Note, these need to be called with .&lt;/span&gt;
&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# -&amp;gt; 5&lt;/span&gt;

&lt;span class="c1"&gt;# How do exceptions work? How do I handle them?&lt;/span&gt;
&lt;span class="c1"&gt;# https://elixir-lang.org/getting-started/try-catch-and-rescue.html&lt;/span&gt;

&lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="no"&gt;ArgumentError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;message:&lt;/span&gt; &lt;span class="s2"&gt;"Argument out of range"&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="c1"&gt;# ...Code that might raise&lt;/span&gt;
&lt;span class="k"&gt;rescue&lt;/span&gt;
    &lt;span class="no"&gt;ArgumentException&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Caught the ArgumentException"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# Define custom exceptions via a Module with defexception&lt;/span&gt;
&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;MyError&lt;/span&gt;
    &lt;span class="k"&gt;defexception&lt;/span&gt; &lt;span class="ss"&gt;message:&lt;/span&gt; &lt;span class="s2"&gt;"Default message"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Now Go Play...
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Define a &lt;em&gt;Purpose&lt;/em&gt;&lt;/strong&gt; - What would you like to learn? Try to keep this in the abstract so it will be reusable for exploring similar scenarios. "Languages" over "C#", "Build Systems" over "TeamCity", "Cloud" over "Azure".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Define a &lt;em&gt;Plan&lt;/em&gt;&lt;/strong&gt; - How will you go about exploring? Make a list - or map - to keep you focused. Iterate and refine this map as you learn more about this "type" of problem. For example - anonymous functions are so useful for cleaning up code, so I added a specific item for in to my list above to make sure I found out if it's possible, and how to do it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reflect&lt;/strong&gt; - How will you solidify your learning? What's next? I really like to have some kind of physical output here - &lt;strong&gt;working code FTW&lt;/strong&gt;, but - it's your practice! Do what you like!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now go practice.&lt;/p&gt;

&lt;p&gt;Happy hacking! 🤩&lt;/p&gt;

</description>
      <category>katas</category>
      <category>learning</category>
    </item>
    <item>
      <title>Programmers Need Deliberate Practice</title>
      <dc:creator>Rob Cooper</dc:creator>
      <pubDate>Sun, 06 Dec 2020 21:03:11 +0000</pubDate>
      <link>https://forem.com/robcthegeek/programmers-need-deliberate-practice-411</link>
      <guid>https://forem.com/robcthegeek/programmers-need-deliberate-practice-411</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Consistent, effective practice is a key part of a healthy, enjoyable career.&lt;/li&gt;
&lt;li&gt;Most people practice without purpose.&lt;/li&gt;
&lt;li&gt;This means they either quit and/or learn less than they could.&lt;/li&gt;
&lt;li&gt;Read this for inspiration on how to take a more considered approach to your practice.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Note: I'm English, but opted for the US English spelling of 'Practice' throughout (as opposed to 'practise/practice') to avoid confusion with the difference in spelling within the term 'Deliberate Practice'.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Practice?
&lt;/h2&gt;

&lt;p&gt;I think we can all agree on a couple of things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;People who are experts practice often.&lt;/li&gt;
&lt;li&gt;Experts are extremely disciplined with their practice.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This will generally come as no surprise when mentioned, and people will rarely argue those points. They make sense.&lt;br&gt;
Thanks to the growing number of interviews and podcasts - experts are getting more limelight, and we're getting more sneak-peeks into that practice routines, habits and rituals (podcasts like Tim Ferriss' are awesome for this).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;However&lt;/em&gt; - the one thing that &lt;em&gt;does&lt;/em&gt; surprise me when I ask my peers what &lt;em&gt;their&lt;/em&gt; practice schedule/routine is - I'm met with blank faces/realisations of "oh, I don't have one".&lt;/p&gt;

&lt;p&gt;If they do - it will likely be something that will be pretty loose/unregimented. So if then prodded on the &lt;em&gt;effectiveness&lt;/em&gt; of that practice - we're back to blank faces. &lt;strong&gt;I don't want that - I want to meet up with people and have them bursting with excitement on how they're growing.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The idea of effective practice has been has been solidified with the concept of &lt;em&gt;deliberate&lt;/em&gt; practice. That we shouldn't just "go through the motions" - but need to take a considered, thoughtful approach to our practice - that ensures we &lt;strong&gt;get outside our comfort zone and &lt;em&gt;grow&lt;/em&gt;.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;This is important - because I feel this is something that is &lt;em&gt;sorely&lt;/em&gt; missing from the tech community generally. Many of us tend to hack around on things, work on side projects, contribute to open source etc. - which are all &lt;em&gt;AWESOME&lt;/em&gt;. But how many of us take a disciplined, thoughtful approach to learning, growing and &lt;em&gt;honing&lt;/em&gt; our skillset?&lt;/p&gt;

&lt;p&gt;To be clear - I've been hit-and-miss over the years as well - which is why I'm spending real time on it now, and want to help you while I'm at it!&lt;/p&gt;

&lt;p&gt;This is &lt;em&gt;important&lt;/em&gt; and something I deeply care about - we're all time-poor, and what you spend you aren't getting back. &lt;strong&gt;Make it count!&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Problems with People's Practice
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;They don't have one!&lt;/strong&gt; Pretty self-explanatory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lack of direction.&lt;/strong&gt; They do things 'just because' - and work through the motions rather than aim for growth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lack of relevancy.&lt;/strong&gt; The practice doesn't seem relevant/useful to their day-to-day, so they either don't engage well with it - or bin it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope too large.&lt;/strong&gt; They never get to an "ah-ha" moment - normally ending the session with frustration and lack of desire to come back. This often occurs when we either don't have enough direction/leading questions and/or we've not identified the 20% we need to practice to give 80% of understanding (see 'Pareto Principle').&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Additional noise unrelated to the desired growth area.&lt;/strong&gt; Perhaps you want to practice with a certain design pattern, but spent over an hour battling framework incompatibility issues instead.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  But What About Katas?
&lt;/h2&gt;

&lt;p&gt;I know some of you are thinking "Rob! I know, this is why we do Katas!". I hear you, but I've been doing and leading these for years and I have to say - the results vary &lt;em&gt;wildly&lt;/em&gt; - sadly leaning on the side of 'poor'.&lt;/p&gt;

&lt;p&gt;For the uninitiated - a 'Kata' (the term taken from the usage in martial arts) is essentially repetition of a problem to see how we solve it. Better people than me have done a lot of write-up on this - so check out the links if you want more info. Essentially a kata will play out like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Bunch of coders get in a room.&lt;/li&gt;
&lt;li&gt;They solve a pre-defined problem.&lt;/li&gt;
&lt;li&gt;They discuss their code/thought-processes/lessons learned etc.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now, these are great - and if you've not done one. Do! They're great fun, and you &lt;em&gt;will&lt;/em&gt; learn &lt;em&gt;something&lt;/em&gt;. I'll link to a few at the end of this post for you.&lt;/p&gt;

&lt;p&gt;I think part of the problem is that perhaps 'Kata' isn't an adequate analogy. Katas are about increasing muscle memory or certain movements (getting progressively harder as you gain skills). I think Katas like this have a place, and I will continue to do them (The Gilded Rose is awesome, for example). But I think there's a missing piece - and once found (and done well) you can do away with 'repetitive' Katas all-together.&lt;/p&gt;

&lt;p&gt;The goal of this series of blog posts is to help do just that!  🥋  😁&lt;/p&gt;

&lt;h2&gt;
  
  
  If Not Katas, Then What?
&lt;/h2&gt;

&lt;p&gt;I'm not suggesting you do away Katas. I don't care for reinventing things that are (&lt;em&gt;mostly&lt;/em&gt;) working well. Let's just change up how you prep for them. I always think "3 P's":&lt;br&gt;
            1. &lt;strong&gt;Purpose&lt;/strong&gt; - Why are you doing this? Is it meaningful to your life right now?&lt;br&gt;
            2. &lt;strong&gt;Plan&lt;/strong&gt; - How are you going to &lt;em&gt;effectively&lt;/em&gt; meet the &lt;em&gt;purpose&lt;/em&gt; of the Kata? (Read: "remove the noise, stay focused, get outside comfort zone, learn").&lt;br&gt;
            3. &lt;strong&gt;Progress&lt;/strong&gt; - Reflect. What did you learn? What &lt;em&gt;didn't&lt;/em&gt; you learn? (You may discover way after doing the Kata! Go back and update it!) How will you take this forward into current/future projects?&lt;/p&gt;

&lt;p&gt;Now each Kata &lt;em&gt;should&lt;/em&gt; standardise points 1 and 2 (Purpose and Plan). &lt;strong&gt;Most katas lack focus&lt;/strong&gt; (sound familiar? 'Stories' anyone? &lt;em&gt;Cough&lt;/em&gt; 😂) &lt;strong&gt;and/or don't get you reaching outside your comfort zone enough.&lt;/strong&gt; Many people will solve the problem with what they know, and quickly move on.  If you take just &lt;em&gt;one&lt;/em&gt; thing from this post - take 5-10 mins to &lt;em&gt;think&lt;/em&gt; before you practice about &lt;em&gt;WHY&lt;/em&gt; you're practicing.&lt;/p&gt;

&lt;p&gt;Point 3 (Progress) is often done well (I always enjoy the group chats) - &lt;strong&gt;but I rarely (if ever) see Katas &lt;em&gt;refined&lt;/em&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So, let's walk through some quick examples! .⚠️ This series of posts &lt;em&gt;will&lt;/em&gt; go into more detailed examples - this is just a primer to get you going/thinking!&lt;/p&gt;

&lt;h2&gt;
  
  
  Ideas to Get Started/Improve
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Gilded Rose
&lt;/h3&gt;

&lt;p&gt;This is one of my favourite Katas - and it will always have a special place in my heart.  So let's start with that one.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If you've not done it before - just do it as per the README. 🚧&lt;/li&gt;
&lt;li&gt;Now consider the &lt;em&gt;purpose&lt;/em&gt; - we're talking about &lt;em&gt;refactoring&lt;/em&gt; here  - so what common problems come in to play? The goal of refactoring is to make the code easier to understand and (perhaps) easier to extend in the future. Here's some ideas:

&lt;ul&gt;
&lt;li&gt;Pair up with someone else! Does the refactoring make sense  to you both as you go?&lt;/li&gt;
&lt;li&gt;"Person down the hall test" - fly solo and then have a peer review your code &lt;em&gt;from cold&lt;/em&gt; at the end. For an added twist - submit the code anonymously, and only let them view it as a pull request. How quickly can the understand the code and the reason for your changes?&lt;/li&gt;
&lt;li&gt;Define one or more &lt;em&gt;additional&lt;/em&gt; requirement - but keep it secret until the end of the Kata and ask participants "What if?" The purpose is then the conversation, not the code.&lt;/li&gt;
&lt;li&gt;Consider the &lt;em&gt;test runner output&lt;/em&gt; - if there's a failure when adding new behaviours - &lt;em&gt;do those failure messages make it clear what the expectation is?&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Frameworks, Patterns and Paradigms
&lt;/h3&gt;

&lt;p&gt;Last, but not least  to plant the seeds of some of what's to come in this series. What about &lt;em&gt;frameworks, [design] patterns and [modelling] paradigms&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;Now these are everywhere - likely cross multiple layers (which each has their own &lt;em&gt;purpose&lt;/em&gt;. But here's some points to consider for some common ones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;UI&lt;/em&gt; - How do we bind to the UI to data? How do we maintain isolation across elements? How do we isolate elements to begin with? How do we cache content? How is that parameterised? How do we bind elements to data? What trade-offs does that design bring? How do we augment content based on device capability?&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Data modelling (and implementation)&lt;/em&gt; - &lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Database access (and ORMs)&lt;/em&gt; - How do we do basic CRUD operations? How do we do single property/column updates? How do we examine the execution plan and/or examine query performance? How/when do indexes/pages lock? How do we effectively partition data?&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Messaging&lt;/em&gt; - What options do we have for sending messages across boundaries? What about receiving &lt;em&gt;and&lt;/em&gt; processing them? What trade-offs do each entail? What patterns exists for common systems (e.g. eCommerce, Chat, Streaming, Gaming)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Others
&lt;/h3&gt;

&lt;p&gt;Other (but equally important) areas to note:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Algorithms&lt;/em&gt; - What algorithms can be used given the problem? What are the pros/cons/trade-offs?&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Data Structures&lt;/em&gt; - Similar to the above - how can the data structures used by the code be changed/effect the outcome?&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Performance&lt;/em&gt; - Under what circumstances does your code perform well? When &lt;em&gt;doesn't&lt;/em&gt; it? Are those OK? Practice identifying the usage patterns and &lt;em&gt;explaining&lt;/em&gt; them to mere mortals ☺️&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  In Summary
&lt;/h2&gt;

&lt;p&gt;I hope I've given you pause or thought about your practice. Practice is good - &lt;em&gt;great&lt;/em&gt; practice is better. Take time to think about the problems you need to solve and &lt;strong&gt;create a method to solve them in a way that gets you &lt;em&gt;growing&lt;/em&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I look forward to sharing more about how I do this - code and all - in this series.&lt;/p&gt;

&lt;p&gt;Until then - happy hacking! 🤩💻&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Some are Amazon links - for which I am an affiliate. I wouldn't recommend books that I've not read and enjoyed.&lt;/em&gt; 😉&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://jamesclear.com/deliberate-practice-theory"&gt;'Deliberate Practice' on James Clear's site&lt;/a&gt;  (Author of '&lt;a href="https://amzn.to/2JSGQg7"&gt;Atomic Habits&lt;/a&gt;') - contains some great links to other good articles, too.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://tim.blog/podcast/"&gt;The Tim Ferriss Podcast&lt;/a&gt; - Very high-quality interviews of high-performers from all walks of life.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/emilybache/GildedRose-Refactoring-Kata"&gt;The Gilded Rose Kata on Emily Bache's GitHub&lt;/a&gt; (Author of '&lt;a href="https://amzn.to/2JPiaFj"&gt;The Coding Dojo handbook&lt;/a&gt;')&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.codingame.com/"&gt;CodinGame&lt;/a&gt; - Great source of problems to solve, with a web-based IDE. I use this almost daily!&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.codewars.com/"&gt;codewars&lt;/a&gt; - Another great source of problems to solve.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://codekata.com/"&gt;CodeKata&lt;/a&gt; - One of the original sites - although I don't think it's actively maintained/contributed to any more. There's some classic problems on here worth checking out though.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kata-log.rocks"&gt;Kata-Log&lt;/a&gt; - Nice little library of Katas, including the &lt;a href="https://kata-log.rocks/bowling-game-kata"&gt;Bowling Game Kata&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>katas</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
