<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

 <title>L B Paine Ltd</title>
 <link href="http://lbpaine.com/jekyll//atom.xml" rel="self"/>
 <link href="http://lbpaine.com/jekyll/"/>
 <updated>2017-06-19T23:44:16+01:00</updated>
 <id>http://lbpaine.com/jekyll/</id>
 <author>
   <name>Lance Paine</name>
   <email>lance@lbpaine.com</email>
 </author>

 
 <entry>
   <title>Clojure tutorials with klipse</title>
   <link href="http://lbpaine.com/jekyll//agile/development-musings/2016/03/23/clojure-klipse-tutorial"/>
   <updated>2016-03-23T11:45:51+00:00</updated>
   <id>http://lbpaine.com/jekyll//agile/development-musings/2016/03/23/clojure-klipse-tutorial</id>
   <content type="html">&lt;p&gt;I’ve attended London Clojure Dojo today, and an overwhelmingly appealing option was &lt;em&gt;something&lt;/em&gt; with klipse.&lt;/p&gt;

&lt;p&gt;So here’s an attempt.&lt;/p&gt;

&lt;p&gt;Note that each clojure block is editable. And will instantly evaluate as you type (just that sexp). A single repl is shared by all the blocks on this page. You need to modify a block to run the block.&lt;/p&gt;

&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;https://storage.googleapis.com/app.klipse.tech/css/codemirror.css&quot; /&gt;

&lt;pre&gt;&lt;code class=&quot;language-klipse&quot;&gt;
(+ 1 4)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Define a function that doubles it’s argument.&lt;/p&gt;

&lt;div class=&quot;language-klipse&quot;&gt;
(defn dble [n] (* n 2))
&lt;/div&gt;

&lt;p&gt;Call the function from above!&lt;/p&gt;
&lt;div class=&quot;language-klipse&quot;&gt;
(dble 3)
&lt;/div&gt;

&lt;p&gt;How do I do string interpolation? You don’t, just call str on a list&lt;/p&gt;

&lt;div class=&quot;language-klipse&quot;&gt;
(str &quot;Something &quot; &quot;about &quot; &quot;the &quot; &quot;way&quot;)
&lt;/div&gt;

&lt;div class=&quot;language-klipse&quot;&gt;
(defn hello [name] (str &quot;hello, &quot; name))
&lt;/div&gt;
&lt;div class=&quot;language-klipse&quot;&gt;
(hello &quot;john&quot;)
&lt;/div&gt;

&lt;p&gt;A clojure function will evaluate to it’s last item&lt;/p&gt;

&lt;div class=&quot;language-klipse&quot;&gt;
(defn broken-hello [name] &quot;hello, &quot; name)
&lt;/div&gt;
&lt;div class=&quot;language-klipse&quot;&gt;
(broken-hello &quot;john&quot;)
&lt;/div&gt;

&lt;p&gt;How about conditionals?&lt;/p&gt;

&lt;div class=&quot;language-klipse&quot;&gt;
(defn hate-john [name]
   (if (= name &quot;john&quot;)
       &quot;Go away john&quot;
       (str &quot;Hello, &quot; name) 
       ))
&lt;/div&gt;

&lt;div class=&quot;language-klipse&quot;&gt;
(hate-john &quot;john&quot;)
&lt;/div&gt;

&lt;div class=&quot;language-klipse&quot;&gt;
(hate-john &quot;jerry&quot;)
&lt;/div&gt;

&lt;h4 id=&quot;true-and-false&quot;&gt;True and false&lt;/h4&gt;

&lt;p&gt;Truthy things&lt;/p&gt;

&lt;div class=&quot;language-klipse&quot;&gt;
(= true true)
&lt;/div&gt;

&lt;div class=&quot;language-klipse&quot;&gt;
(= false true)
&lt;/div&gt;

&lt;div class=&quot;language-klipse&quot;&gt;
(= false false)
&lt;/div&gt;

&lt;div class=&quot;language-klipse&quot;&gt;
(= false nil)
&lt;/div&gt;

&lt;div class=&quot;language-klipse&quot;&gt;
(= nil nil)
&lt;/div&gt;

&lt;p&gt;A single quote before parens says “Don’t treat this list as a function call, it is really a list!”.
An empty list is ‘()&lt;/p&gt;
&lt;div class=&quot;language-klipse&quot;&gt;
(= '() '())
&lt;/div&gt;

&lt;p&gt;Vectors are like arrays in other languages, but without the horrific mutability stuff. You want them instead of lists when you want fast-indexing to the middle of the datastructure. 
Empty Vectors are ‘[]. Note that we’ve already seen vectors above, clojure uses them for parameter lists in functions!&lt;/p&gt;

&lt;div class=&quot;language-klipse&quot;&gt;
(= '[] '[])
&lt;/div&gt;

&lt;p&gt;Let’s compare a non-empty list to a non-empty vector&lt;/p&gt;

&lt;div class=&quot;language-klipse&quot;&gt;
(= '[123 456 789] '(123 456 789))
&lt;/div&gt;

&lt;script&gt;
    window.klipse_settings = {
        selector: '.language-klipse'// css selector for the html elements you want to klipsify
    };
&lt;/script&gt;

&lt;script src=&quot;https://storage.googleapis.com/app.klipse.tech/plugin/js/klipse_plugin.js&quot;&gt;&lt;/script&gt;

</content>
 </entry>
 
 <entry>
   <title>On the friction between agile and traditional approaches in software delivery</title>
   <link href="http://lbpaine.com/jekyll//agile/development-musings/2016/03/23/on-the-friction-between-agile-and-traditional-approaches-in-software-delivery"/>
   <updated>2016-03-23T11:45:51+00:00</updated>
   <id>http://lbpaine.com/jekyll//agile/development-musings/2016/03/23/on-the-friction-between-agile-and-traditional-approaches-in-software-delivery</id>
   <content type="html">&lt;p&gt;I’m an Agile pragmatist.&lt;/p&gt;

&lt;p&gt;What do I mean by that? I find that for practically every piece
of software I’ve ever written, or seen written, agile practices will deliver a solution
that is a better fit for the customers needs, with something valuable in a shorter timeframe, and with happier developers than a ‘traditional’ Big Upfront Design (BUD) approach, e.g. waterfall.&lt;/p&gt;

&lt;p&gt;But, and it’s an important &lt;em&gt;but&lt;/em&gt;, I’m not ruling out that there’s a class of problems
where BUD has it’s place.&lt;/p&gt;

&lt;h3 id=&quot;what-is-that-place&quot;&gt;What is that place?&lt;/h3&gt;

&lt;p&gt;To answer that, let’s take a side to to Value Stream Mapping
&lt;a href=&quot;http://twitter.com/swardley&quot;&gt;Simon Wardley&lt;/a&gt; at QCon 2015 gave a talk that touched on this very topic. &lt;em&gt;An introduction to value stream mapping&lt;/em&gt;, I wish you could have seen it, or that they had made the full 40 minute talk public, you will have to make do with &lt;a href=&quot;https://www.youtube.com/watch?v=NnFeIt-uaEc&quot;&gt;this 13 minute flash talk from OSCON 2014&lt;/a&gt;. It managed to be funny, insightful, and enlightening
in just one talk.&lt;/p&gt;

&lt;h3 id=&quot;the-evolution-of-technologies&quot;&gt;The evolution of technologies&lt;/h3&gt;
&lt;p&gt;One of the key takeaways for me from that talk was that all technologies go through an evolutionary process. Overtime they will move from &lt;em&gt;Genesis&lt;/em&gt;, through &lt;em&gt;custom built&lt;/em&gt; to &lt;em&gt;product&lt;/em&gt;, and eventually, to &lt;em&gt;commodity&lt;/em&gt;.
He uses the example of light sources:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;The evolution of light sources&quot; width=&quot;100%&quot; src=&quot;/assets/lightevolution.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;We started out with a candle - eventually we get Edison’s light bulb, but that requires custom installers, and eventually we get to LED downlighting that you can install yourself.&lt;/p&gt;

&lt;p&gt;We also had it with electricity itself, 3 thousand years ago the Egyptians had begun exploring electricity with Seleucian jar type things (&lt;a href=&quot;http://www.badarchaeology.com/out-of-place-artefacts/anomalously-old-technology/the-%E2%80%98batteries-of-babylon%E2%80%99/&quot;&gt;a myth, apparently&lt;/a&gt;), then with Tesla and Edison we get the shift to commodity electricity to the wall through Westinghouse.&lt;/p&gt;

&lt;p&gt;The point he made that I found so compelling was that on the left, in emergent technology, agile fits brilliantly – we’re dealing with the unknowns, the unknown-unknowns – but over on the right, as things become commoditized, we have more certainty, predictions/estimations are more reliable. Those traditional project management approaches like Waterfall and PRINCE2 make sense in this space. All the steps are known, and it’s just a matter of following them until you’re done.&lt;/p&gt;

&lt;p&gt;10 years ago Jeff Atwood was blogging on this very topic in  “&lt;a href=&quot;http://blog.codinghorror.com/is-software-development-like-manufacturing/&quot;&gt;Is software Development like Manufacturing&lt;/a&gt;”. While I’m a huge fan of the realisations and improvements that have come LEAN, misapplying project management from manufacturing to discovery/engineering pursuits on the left of the graph is a long-standing problem.&lt;/p&gt;

&lt;blockquote&gt;

  &lt;ul&gt;
    &lt;li&gt;Variability is the enemy in manufacturing; in software, it’s the reason we get up in the morning. Every worthwhile software development project is a custom one-off job for a unique problem.&lt;/li&gt;
    &lt;li&gt;Requirements are the bread and butter of manufacturing; in software, we rarely have meaningful requirements. Even if we do, the only measure of success that matters is whether our solution solves the customer’s shifting idea of what their problem is.&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;– Jeff Atwood&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Patrick Mockridge — CEO of &lt;a href=&quot;http://engzig.com&quot;&gt;engzig.com&lt;/a&gt; — &lt;a href=&quot;https://www.linkedin.com/pulse/burgerneering-patrick-mockridge-ceng-micheme?trk=hp-feed-article-title-publish&quot;&gt;touches on the same topic&lt;/a&gt; though a little more tongue-in-cheek.&lt;/p&gt;

&lt;p&gt;I think a lot of  discomfort in software development comes from the friction in the interaction between these two worlds. In the traditional camp you’ve got business managers, possibly from an operations background, used to performing actions such as getting a trade to settled. And in the other you’ve got ideological ‘agile’ developers who can be resistant to estimating anything.&lt;/p&gt;

&lt;p&gt;Frequently the business managers become project managers, or sponsors of projects to replace some, or all of the process they’re used to performing. Never mind the potential for conflict-of-interest (“we’re automating their jobs!”), if you’re lucky enough to have one that buys into the development effort, in my experience it’s likely that they think software development fits the mould of widget stamping. Because they’re used to performing to measurable targets, and motivating their people to achieve them, they think software development can be hurried the same way.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://twitter.com/swardley&quot;&gt;Simon Wardley&lt;/a&gt; shows us that some activities we class as Software Development may have evolved to occupy that product or commodity side of the chart, these are the places where the ‘software laborer’ can exist. It’s the rote, copy/paste expansion of functionality on systems were those functions haven’t been made so simple the user can click themselves. However, these are unlikely to be positions we want continue to occupy if we want strategic business advantage.&lt;/p&gt;

&lt;p&gt;This is where I believe it’s important to do cost/benefit analysis of any improvement, and apply it to a value stream (different to a value chain map!) — Checkout the amazing work done by &lt;a href=&quot;https://gds.blog.gov.uk/2015/08/18/mapping-new-ideas-for-the-digital-justice-system-2/&quot;&gt;GDS for the Criminal Justice System&lt;/a&gt; — But having done that analysis, don’t consider your plan set in stone.&lt;/p&gt;

&lt;p&gt;The other important thing to realise is that the distance between genesis and commodity can be huge. I’ve seen the difficulty/amount of work involved in bridging that gap under-estimated time and again. A solution to that is to accept it’s not necessary to do that bridging yourself. Choose carefully and open-source where you can to build a community and the evolution will occur given time. Spend your effort on building the novel.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>My approach: agile pragmatism, and the agile as the application of scientific method to software development</title>
   <link href="http://lbpaine.com/jekyll//agile/development-musings/2016/03/03/my-approach-agile-pragmatism-and-the-agile-as-the-application-of-scientific-method-to-software-development"/>
   <updated>2016-03-03T12:48:00+00:00</updated>
   <id>http://lbpaine.com/jekyll//agile/development-musings/2016/03/03/my-approach-agile-pragmatism-and-the-agile-as-the-application-of-scientific-method-to-software-development</id>
   <content type="html">&lt;h1 id=&quot;agile-pragmatism&quot;&gt;Agile pragmatism&lt;/h1&gt;

&lt;p&gt;Ideologies are bad, m’kay? Instead aim for &lt;a href=&quot;http://blog.codinghorror.com/strong-opinions-weakly-held/&quot;&gt;strong opinions, weakly held&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Blindly adhering to any methodology without adapting is not a good thing. There are no truths handed down from on-high, just the best thing we know right now.&lt;/p&gt;

&lt;h4 id=&quot;agile-is-the-scientific-method&quot;&gt;Agile is the scientific method&lt;/h4&gt;

&lt;p&gt;I tend to view agile done well as the application of the scientific method to software development. Not just the writing of the code, but the whole process around it.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/The_Scientific_Method.png&quot; alt=&quot;The Scientific Method&quot; height=&quot;200px&quot; /&gt; &lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;For any piece of code you’re about to write:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Think (form, alter, refine or reject hypothesis)&lt;/li&gt;
  &lt;li&gt;Now think how to measure it&lt;/li&gt;
  &lt;li&gt;‘Write’ your test (create your experimental protocol)&lt;/li&gt;
  &lt;li&gt;Execute test - see it fail&lt;/li&gt;
  &lt;li&gt;Write the code&lt;/li&gt;
  &lt;li&gt;Execute tests - see them pass&lt;/li&gt;
  &lt;li&gt;Refactor&lt;/li&gt;
  &lt;li&gt;Goto beginning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The feedback loop is the key similarity, and the thing that distinguishes either from a ‘classic waterfall’ approach.
In practice, in both applied science (say &lt;a href=&quot;http://qz.com/603356/why-scientific-studies-cant-be-reproduced/&quot;&gt;Medical Research&lt;/a&gt;), and coding, people seem to forget the ‘think’ step. And when formulating tests, sometimes they seek to prove their hypothesis, rather than seek to prove it wrong. I guess that’s human nature.&lt;/p&gt;

&lt;p&gt;It’s remarkable; when I’m pairing with a dev — maybe they’re new to TDD, maybe they’ve been going through the motions for years — how much of a revelation they find my suggestion of testing the negatives, of proving yourself wrong. It’s a mindset shift, but it’s a powerful one.&lt;/p&gt;

&lt;p&gt;Does this slow you down? It depends on your timescale, your familiarity with the approach, and the complexity of the test necessary to prove your hypothesis. On a short timescale of between writing the functioning code, and seeing the results from a run - it doesn’t necessarily payoff - as is the case with much TDD.
As you get better at formulating meaningful tests,
exploring the boundaries and the negatives, and the failure modes, you’ll find your pace accelerates due to the &lt;a href=&quot;Digging a hole&quot;&gt;harness(es)&lt;/a&gt; you have built.&lt;/p&gt;

&lt;p&gt;Once you adopt the approach, and practice, it becomes seconds nature. You’ll begin to feel uncomfortable without a solid testing approach (I almost said Framework, but you can adopt the approach without the framework). You don’t need a framework, because for somethings you do you may not need the regression tests that would grow out of it. You were just doing exploratory testing to establish what should be added to the regression set.&lt;/p&gt;

&lt;p&gt;The key is continual feedback. And perpetual refinement. Also, don’t be afraid to reject long held hypothesis if something is proven to fit the problem better (I should write something on committing the Sunk Cost Fallacy - and institutional inertia).&lt;/p&gt;

&lt;h4 id=&quot;change-just-one-thing&quot;&gt;Change just one thing&lt;/h4&gt;

&lt;p&gt;The other thing I always try to limit myself to:
&lt;strong&gt;Change just one thing!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In any given development cycle, change just one thing. This can be a difficult habit to get into. We want to feel productive. Plenty of developers are mighty smart, they are confident in their abilities. They’ll try and tackle a ‘couple of things’. I don’t mean features - though I’ve seen that too. I mean in unit testing, did you just add something that forces you to introduce an &lt;strong&gt;if&lt;/strong&gt;? Then only add the code for one branch: &lt;strong&gt;No matter how simple it seems to do the other branch&lt;/strong&gt;. Focus only on the behaviour you’re driving with tests.&lt;/p&gt;

&lt;h4 id=&quot;summary--conclusion--tldr&quot;&gt;Summary / Conclusion / tl;dr;&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Agile development done well IS the scientific method applied&lt;/li&gt;
  &lt;li&gt;Testing pays off sooner than you expect&lt;/li&gt;
  &lt;li&gt;Don’t just test the positive cases, come up with the negatives&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;I Nabbed the scientific method picture &lt;a href=&quot;http://idea.ucr.edu/documents/flash/scientific_method/story.htm&quot;&gt;here&lt;/a&gt;, via wikipedia &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Digging a hole</title>
   <link href="http://lbpaine.com/jekyll//development-musings/agile/testing/2016/03/02/digging-a-hole"/>
   <updated>2016-03-02T21:03:37+00:00</updated>
   <id>http://lbpaine.com/jekyll//development-musings/agile/testing/2016/03/02/digging-a-hole</id>
   <content type="html">&lt;p&gt;There’s a tale of how to dig a hole.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/digging-a-hole.jpg&quot; alt=&quot;Digging A Hole&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If you watch a professional dig a large hole they don’t
just dig straight down. They build themselves a little set of steps. First one step, then they’ll stand on that one to dig the next, and so on until they reach a depth they’re aiming for, and they’ll dig away the steps.&lt;/p&gt;

&lt;p&gt;Don’t be afraid to dig away your steps (intermediate tests) once they’ve got you where you’re going. Developers are often reluctant to delete code, even if it was code they just wrote themselves.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;If you’re afraid of losing something worthwhile,
commit it to version control. The delete it.&lt;/li&gt;
  &lt;li&gt;If it was code written by someone else:
    &lt;ul&gt;
      &lt;li&gt;is it obvious this test is now not worthwhile? Delete it.&lt;/li&gt;
      &lt;li&gt;is the original developer still available to you? - chat to them about the purpose of the tests. Is that purpose still necessary. Then delete it.&lt;/li&gt;
      &lt;li&gt;are they not here?  What are you afraid of? Delete it.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I am NOT advocating deleting tests willy-nilly. I’m talking about trivial, starter tests that have outgrown their usefulness. Stuff like:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Constructor tests (by the time you’ve got a test harness you’ll have made test constructors that define this behaviour)&lt;/li&gt;
  &lt;li&gt;Exploratory tests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once they’ve been committed, let them go.&lt;/p&gt;

&lt;p&gt;People will be able to find them in the future with&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;git log -S&lt;span class=&quot;s2&quot;&gt;&quot;&amp;lt;magic line of code that I had committed 6 months ago&amp;gt;&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

</content>
 </entry>
 
 <entry>
   <title>My new series: coding, refactoring, and TDD as the application of the scientific method</title>
   <link href="http://lbpaine.com/jekyll//agile/refactoring/development-musings/2016/02/24/my-new-series-coding-refactoring-and-tdd-as-the-application-of-the-scientific-method"/>
   <updated>2016-02-24T11:31:09+00:00</updated>
   <id>http://lbpaine.com/jekyll//agile/refactoring/development-musings/2016/02/24/my-new-series-coding-refactoring-and-tdd-as-the-application-of-the-scientific-method</id>
   <content type="html">&lt;p&gt;Over the last several years, a large part of my role has been mentoring more junior developers. They have frequently encouraged me to blog about my approaches, and I’ve finally decided to give into the pressure.&lt;/p&gt;

&lt;p&gt;So, I’ll be starting a series of posts about the sorts of code-smells, and organisational-smells I’ve
seen in the wild, the approaches I might take to fix them, and why I’d use those approaches. I expect that largely it
will be an effort for me to crystallize my thinking, and also prove a useful resource
when I’m next teaching a concept - I won’t have to jump to a whiteboard, I’ll just be able to point to something here.&lt;/p&gt;

&lt;p&gt;Almost everything you’ll read here owes a huge debt of gratitude to the Master Craftsmen:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Michael Feathers — &lt;a href=&quot;http://www.amazon.co.uk/Working-Effectively-Legacy-Robert-Martin-ebook/dp/B005OYHF0A/ref=dp_kinw_strp_1&quot;&gt;Refactoring Legacy Code&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Martin Fowler &lt;a href=&quot;http://refactoring.com&quot;&gt;Refactoring&lt;/a&gt;
 &lt;a rel=&quot;nofollow&quot; href=&quot;http://www.amazon.co.uk/gp/product/0201485672/ref=as_li_tl?ie=UTF8&amp;amp;camp=1634&amp;amp;creative=6738&amp;amp;creativeASIN=0201485672&amp;amp;linkCode=as2&amp;amp;tag=lbpainecom-21&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://ws-eu.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;amp;ASIN=0201485672&amp;amp;Format=_SL110_&amp;amp;ID=AsinImage&amp;amp;MarketPlace=GB&amp;amp;ServiceVersion=20070822&amp;amp;WS=1&amp;amp;tag=lbpainecom-21&quot; /&gt; Buy the book!&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Uncle Bob Martin — Everything, everywhere, but &lt;a href=&quot;http://www.amazon.co.uk/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/ref=sr_1_1?ie=UTF8&amp;amp;qid=1456313233&amp;amp;sr=8-1&amp;amp;keywords=clean+code&quot;&gt;Clean Code&lt;/a&gt; is a great start&lt;/li&gt;
  &lt;li&gt;Andrew Hunt And Dave Thomas &lt;a href=&quot;http://www.amazon.co.uk/The-Pragmatic-Programmer-Andrew-Hunt/dp/020161622X/ref=pd_sim_14_2?ie=UTF8&amp;amp;dpID=41BKx1AxQWL&amp;amp;dpSrc=sims&amp;amp;preST=_AC_UL160_SR127%2C160_&amp;amp;refRID=08CETQWZDWB136SYJMJ9&quot;&gt;Pragmatic Programmer&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Roy Osherove — [The art of unit testing] (old but good!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’m in no way suggesting you should only buy these from Amazon, but they’re a very convenient source.&lt;/p&gt;

&lt;h2 id=&quot;development-musings&quot;&gt;Development Musings&lt;/h2&gt;
&lt;ul class=&quot;posts&quot;&gt;
   
    
     &lt;li&gt;&lt;span&gt;23 Mar 2016&lt;/span&gt; &amp;raquo; &lt;a href=&quot;/agile/development-musings/2016/03/23/clojure-klipse-tutorial&quot;&gt;Clojure tutorials with klipse&lt;/a&gt;&lt;/li&gt;
     
   
    
     &lt;li&gt;&lt;span&gt;23 Mar 2016&lt;/span&gt; &amp;raquo; &lt;a href=&quot;/agile/development-musings/2016/03/23/on-the-friction-between-agile-and-traditional-approaches-in-software-delivery&quot;&gt;On the friction between agile and traditional approaches in software delivery&lt;/a&gt;&lt;/li&gt;
     
   
    
   
    
   
    
     &lt;li&gt;&lt;span&gt;24 Feb 2016&lt;/span&gt; &amp;raquo; &lt;a href=&quot;/agile/refactoring/development-musings/2016/02/24/my-new-series-coding-refactoring-and-tdd-as-the-application-of-the-scientific-method&quot;&gt;My new series: coding, refactoring, and TDD as the application of the scientific method&lt;/a&gt;&lt;/li&gt;
     
   
    
   
    
   
 &lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Fun with webcam mics and skype</title>
   <link href="http://lbpaine.com/jekyll//2013/06/01/fun-with-webcam-mics-and-skype"/>
   <updated>2013-06-01T21:53:29+01:00</updated>
   <id>http://lbpaine.com/jekyll//2013/06/01/fun-with-webcam-mics-and-skype</id>
   <content type="html">&lt;p&gt;Just spent some time troubleshooting my parents skype connection with me.&lt;br /&gt;
They could hear me, I couldn't hear them. They had this problem intermittently with some people.&lt;br /&gt;
After messing around with updating drivers, trying different mics etc, a quick google for logitech e3500  found this link:&lt;br /&gt;
http://forums.logitech.com/t5/Video-Chat-Applications-Non/E3500-microphone-not-working/td-p/326579&lt;/p&gt;
&lt;p&gt;and the useful message: &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I've just had a client with a similar E3500 volume problem. After some experimenting it appears that if the input volume is set above 90-95% the E3500 microphone stop recording. So long as the input volume remains below 90% it works fine.&lt;/p&gt;
&lt;p&gt;I can not be sure if this is new behaviour or started following recent updates.&lt;/p&gt;
&lt;p&gt;I shall continue looking for other information about this issue.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Setting the mic levels to less than 90 and ALSO changing the skype settings from auto level and setting them lower, and then re-setting to auto and suddenly there's sound. Marvellous. &lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>It's a wonderful vintage ball pics</title>
   <link href="http://lbpaine.com/jekyll//2011/12/04/its-a-wonderful-vintange-ball-pics"/>
   <updated>2011-12-04T08:35:20+00:00</updated>
   <id>http://lbpaine.com/jekyll//2011/12/04/its-a-wonderful-vintange-ball-pics</id>
   <content type="html">&lt;div style=&quot;padding: 0; overflow: hidden; margin: 0; width: 500px;&quot;&gt;&lt;a style=&quot;text-decoration: none;&quot; title=&quot;IMG_7779&quot; href=&quot;http://www.flickr.com/photos/tallnottom/6449581987/in/photostream/&quot;&gt;&lt;img style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot; src=&quot;/assets/6449581987_e41a21fa98_s.jpg&quot; alt=&quot;IMG_7779&quot; /&gt;&lt;/a&gt;&lt;a style=&quot;text-decoration: none;&quot; title=&quot;IMG_7776&quot; href=&quot;http://www.flickr.com/photos/tallnottom/6449581599/in/photostream/&quot;&gt;&lt;img style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot; src=&quot;/assets/6449581599_19c7b5f31a_s.jpg&quot; alt=&quot;IMG_7776&quot; /&gt;&lt;/a&gt;&lt;a style=&quot;text-decoration: none;&quot; title=&quot;IMG_7774&quot; href=&quot;http://www.flickr.com/photos/tallnottom/6449581265/in/photostream/&quot;&gt;&lt;img style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot; src=&quot;/assets/6449581265_8368fd6086_s.jpg&quot; alt=&quot;IMG_7774&quot; /&gt;&lt;/a&gt;&lt;a style=&quot;text-decoration: none;&quot; title=&quot;IMG_7773&quot; href=&quot;http://www.flickr.com/photos/tallnottom/6449580797/in/photostream/&quot;&gt;&lt;img style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot; src=&quot;/assets/6449580797_89e6b0170d_s.jpg&quot; alt=&quot;IMG_7773&quot; /&gt;&lt;/a&gt;&lt;a style=&quot;text-decoration: none;&quot; title=&quot;IMG_7771&quot; href=&quot;http://www.flickr.com/photos/tallnottom/6449580327/in/photostream/&quot;&gt;&lt;img style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot; src=&quot;/assets/6449580327_b6e48cf900_s.jpg&quot; alt=&quot;IMG_7771&quot; /&gt;&lt;/a&gt;&lt;a style=&quot;text-decoration: none;&quot; title=&quot;IMG_7767&quot; href=&quot;http://www.flickr.com/photos/tallnottom/6449579911/in/photostream/&quot;&gt;&lt;img style=&quot;padding: 0 0 10px 0; width: 75px; height: 75px; float: left;&quot; src=&quot;/assets/6449579911_87200604a8_s.jpg&quot; alt=&quot;IMG_7767&quot; /&gt;&lt;/a&gt;&lt;br clear=&quot;all&quot; /&gt;&lt;a style=&quot;text-decoration: none;&quot; title=&quot;IMG_7761&quot; href=&quot;http://www.flickr.com/photos/tallnottom/6449579481/in/photostream/&quot;&gt;&lt;img style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot; src=&quot;/assets/6449579481_5f3b342312_s.jpg&quot; alt=&quot;IMG_7761&quot; /&gt;&lt;/a&gt;&lt;a style=&quot;text-decoration: none;&quot; title=&quot;IMG_7760&quot; href=&quot;http://www.flickr.com/photos/tallnottom/6449578899/in/photostream/&quot;&gt;&lt;img style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot; src=&quot;/assets/6449578899_0127545fa7_s.jpg&quot; alt=&quot;IMG_7760&quot; /&gt;&lt;/a&gt;&lt;a style=&quot;text-decoration: none;&quot; title=&quot;IMG_7638&quot; href=&quot;http://www.flickr.com/photos/tallnottom/6449578431/in/photostream/&quot;&gt;&lt;img style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot; src=&quot;/assets/6449578431_2c4b934f92_s.jpg&quot; alt=&quot;IMG_7638&quot; /&gt;&lt;/a&gt;&lt;a style=&quot;text-decoration: none;&quot; title=&quot;IMG_7758&quot; href=&quot;http://www.flickr.com/photos/tallnottom/6449578107/in/photostream/&quot;&gt;&lt;img style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot; src=&quot;/assets/6449578107_8c7f0d6bea_s.jpg&quot; alt=&quot;IMG_7758&quot; /&gt;&lt;/a&gt;&lt;a style=&quot;text-decoration: none;&quot; title=&quot;IMG_7636&quot; href=&quot;http://www.flickr.com/photos/tallnottom/6449577757/in/photostream/&quot;&gt;&lt;img style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot; src=&quot;/assets/6449577757_b1643ebdc1_s.jpg&quot; alt=&quot;IMG_7636&quot; /&gt;&lt;/a&gt;&lt;a style=&quot;text-decoration: none;&quot; title=&quot;IMG_7635&quot; href=&quot;http://www.flickr.com/photos/tallnottom/6449577363/in/photostream/&quot;&gt;&lt;img style=&quot;padding: 0 0 10px 0; width: 75px; height: 75px; float: left;&quot; src=&quot;/assets/6449577363_b6f98eea33_s.jpg&quot; alt=&quot;IMG_7635&quot; /&gt;&lt;/a&gt;&lt;br clear=&quot;all&quot; /&gt;&lt;a style=&quot;text-decoration: none;&quot; title=&quot;IMG_7634&quot; href=&quot;http://www.flickr.com/photos/tallnottom/6449576937/in/photostream/&quot;&gt;&lt;img style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot; src=&quot;/assets/6449576937_d4311d783e_s.jpg&quot; alt=&quot;IMG_7634&quot; /&gt;&lt;/a&gt;&lt;a style=&quot;text-decoration: none;&quot; title=&quot;IMG_7755&quot; href=&quot;http://www.flickr.com/photos/tallnottom/6449576563/in/photostream/&quot;&gt;&lt;img style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot; src=&quot;/assets/6449576563_3b419c8c84_s.jpg&quot; alt=&quot;IMG_7755&quot; /&gt;&lt;/a&gt;&lt;a style=&quot;text-decoration: none;&quot; title=&quot;IMG_7632&quot; href=&quot;http://www.flickr.com/photos/tallnottom/6449576223/in/photostream/&quot;&gt;&lt;img style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot; src=&quot;/assets/6449576223_55b12db02e_s.jpg&quot; alt=&quot;IMG_7632&quot; /&gt;&lt;/a&gt;&lt;a style=&quot;text-decoration: none;&quot; title=&quot;IMG_7633&quot; href=&quot;http://www.flickr.com/photos/tallnottom/6449575729/in/photostream/&quot;&gt;&lt;img style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot; src=&quot;/assets/6449575729_12a43a6544_s.jpg&quot; alt=&quot;IMG_7633&quot; /&gt;&lt;/a&gt;&lt;a style=&quot;text-decoration: none;&quot; title=&quot;IMG_7749&quot; href=&quot;http://www.flickr.com/photos/tallnottom/6449575405/in/photostream/&quot;&gt;&lt;img style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot; src=&quot;/assets/6449575405_346e10c6e6_s.jpg&quot; alt=&quot;IMG_7749&quot; /&gt;&lt;/a&gt;&lt;a style=&quot;text-decoration: none;&quot; title=&quot;IMG_7746&quot; href=&quot;http://www.flickr.com/photos/tallnottom/6449575023/in/photostream/&quot;&gt;&lt;img style=&quot;padding: 0 0 10px 0; width: 75px; height: 75px; float: left;&quot; src=&quot;/assets/6449575023_656de8cb8c_s.jpg&quot; alt=&quot;IMG_7746&quot; /&gt;&lt;/a&gt;&lt;br clear=&quot;all&quot; /&gt;&lt;a style=&quot;text-decoration: none;&quot; title=&quot;IMG_7630&quot; href=&quot;http://www.flickr.com/photos/tallnottom/6449574725/in/photostream/&quot;&gt;&lt;img style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot; src=&quot;/assets/6449574725_48470eaf9b_s.jpg&quot; alt=&quot;IMG_7630&quot; /&gt;&lt;/a&gt;&lt;a style=&quot;text-decoration: none;&quot; title=&quot;IMG_7628&quot; href=&quot;http://www.flickr.com/photos/tallnottom/6449574265/in/photostream/&quot;&gt;&lt;img style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot; src=&quot;/assets/6449574265_2f304f5616_s.jpg&quot; alt=&quot;IMG_7628&quot; /&gt;&lt;/a&gt;&lt;a style=&quot;text-decoration: none;&quot; title=&quot;IMG_7421&quot; href=&quot;http://www.flickr.com/photos/tallnottom/6449573943/in/photostream/&quot;&gt;&lt;img style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot; src=&quot;/assets/6449573943_049b6384fa_s.jpg&quot; alt=&quot;IMG_7421&quot; /&gt;&lt;/a&gt;&lt;a style=&quot;text-decoration: none;&quot; title=&quot;IMG_7732&quot; href=&quot;http://www.flickr.com/photos/tallnottom/6449573509/in/photostream/&quot;&gt;&lt;img style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot; src=&quot;/assets/6449573509_e4b05affb9_s.jpg&quot; alt=&quot;IMG_7732&quot; /&gt;&lt;/a&gt;&lt;a style=&quot;text-decoration: none;&quot; title=&quot;IMG_7728&quot; href=&quot;http://www.flickr.com/photos/tallnottom/6449573107/in/photostream/&quot;&gt;&lt;img style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot; src=&quot;/assets/6449573107_6aa97456f3_s.jpg&quot; alt=&quot;IMG_7728&quot; /&gt;&lt;/a&gt;&lt;a style=&quot;text-decoration: none;&quot; title=&quot;IMG_7623&quot; href=&quot;http://www.flickr.com/photos/tallnottom/6449572715/in/photostream/&quot;&gt;&lt;img style=&quot;padding: 0 0 10px 0; width: 75px; height: 75px; float: left;&quot; src=&quot;/assets/6449572715_31515127d7_s.jpg&quot; alt=&quot;IMG_7623&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;font-size: 0.8em; margin-top: 0px; margin-bottom: 5px;&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/tallnottom/&quot;&gt;tallnottom's photostream&lt;/a&gt; on Flickr.&lt;/p&gt;
&lt;/div&gt;
</content>
 </entry>
 

</feed>
