<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
<channel>
 <title>www.thoughtworks.com aggregator</title>
 <link>http://www.thoughtworks.com/blogs/current</link>
 <description>www.thoughtworks.com - aggregated feeds in category Current ThoughtWorkers</description>
 <language>en</language>
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/thoughtworks-blogs" /><feedburner:info uri="thoughtworks-blogs" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
 <title>Sean Doran: What are the Pennies in Your Process?</title>
 <link>http://feedproxy.google.com/~r/thoughtworks-blogs/~3/s7WtSNfBGy4/</link>
 <description>&lt;p&gt;I was intrigued and pleased to see that Canada has recently decided to &lt;a title="Eliminating the Penny" href="http://www.mint.ca/store/mint/learn/eliminating-the-penny-6900002" target="_blank"&gt;eliminate pennies from the coinage system&lt;/a&gt;. Although not the first country to do so, Canada certainly will not be the last.&lt;/p&gt;
&lt;p&gt;The simple reason to eliminate the lowest denominated coins is that they cost significantly more to produce and manage then they deliver in benefits to the economy. The raw cost of the metal added to the significant manufacturing and transportation costs means that “it costs the Government of Canada 1.6 cents to produce each new penny.” These tangible costs to the Mint are substantial but the total costs to the economy are estimated to be even higher, &lt;a title="Costs of the Penny" href="http://www.actionplan.gc.ca/eng/media.asp?id=5207" target="_blank"&gt;perhaps as much as $150 million&lt;/a&gt;. All for a coin that most Canadians simply toss in a jar when they get home.&lt;/p&gt;
&lt;p&gt;Eliminating the penny got me thinking about the nature of continuous improvement on a software team and the need to eliminate practices that were formerly useful but are no longer worth the effort. Said another way, what are our pennies?&lt;/p&gt;
&lt;p&gt;One practice that comes to mind is high ceremony estimation activities. Even Agile teams that are doing effective relative estimation of effort can have time consuming estimation practices. Symptoms include long estimation meetings with elaborate planning poker techniques to evaluate each individual story. Like a penny, each question of “how big is this story?” may be small, but across a large user story list it adds up to a lot of extra time invested.&lt;/p&gt;
&lt;p&gt;Is the investment in doing high ceremony estimation worth the value achieved? I would argue that most teams do get some value out of accurate estimations in the form of predictability, but many people challenge this. For new teams (or teams new to Agile) I would argue that value also comes from the conversation about the story during estimation as it helps increase understanding of the project backlog, helps establish a common domain language, and helps explore differences in implementation approaches between different developers. All in line with the old cliche that the plan is nothing, the planning is everything.&lt;/p&gt;
&lt;p&gt;However, as a project team gels, it may find that high ceremony estimation delivers less and less value. A high performing development team should be able to provide consistent estimates quickly because it has a well understood relative effort scale. And the additional benefits are less important to the team as it already knows the user story list well, does lots pairing, and so on. So these teams should be able to greatly reduce their investment in estimation ceremony and estimate much quicker. Or even stop estimating altogether and just manage a flow of stories.&lt;/p&gt;
&lt;p&gt;I see lots of teams approach continuous improvement from the perspective of fixing broken processes. The metaphor of eliminating pennies highlights a perspective that focuses on the value returned from the small, little activities that a team does over and over again. These practices are not necessary broken. The penny works perfectly well in the Canadian economy to deliver a very small amount of change. And some high ceremony team practices do provide some value. But is the level of effort worth the value received? A worthwhile question for more than pennies.&lt;/p&gt;
&lt;br /&gt;  &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/seandoran.wordpress.com/107/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/seandoran.wordpress.com/107/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/seandoran.wordpress.com/107/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/seandoran.wordpress.com/107/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/seandoran.wordpress.com/107/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/seandoran.wordpress.com/107/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/seandoran.wordpress.com/107/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/seandoran.wordpress.com/107/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/seandoran.wordpress.com/107/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/seandoran.wordpress.com/107/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/seandoran.wordpress.com/107/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/seandoran.wordpress.com/107/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/seandoran.wordpress.com/107/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/seandoran.wordpress.com/107/" /&gt;&lt;/a&gt; &lt;img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seandoran.wordpress.com&amp;#038;blog=3453650&amp;#038;post=107&amp;#038;subd=seandoran&amp;#038;ref=&amp;#038;feed=1" width="1" height="1" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=s7WtSNfBGy4:tlakxnt0bsU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=s7WtSNfBGy4:tlakxnt0bsU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=s7WtSNfBGy4:tlakxnt0bsU:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?i=s7WtSNfBGy4:tlakxnt0bsU:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/thoughtworks-blogs/~4/s7WtSNfBGy4" height="1" width="1"/&gt;</description>
 <pubDate>Fri, 01 Jun 2012 00:46:53 +0000</pubDate>
<feedburner:origLink>http://seandoran.wordpress.com/2012/05/31/what-are-the-pennies-in-your-process/</feedburner:origLink></item>
<item>
 <title>Mark Needham: Google Maps without any labels/country names</title>
 <link>http://feedproxy.google.com/~r/thoughtworks-blogs/~3/d8FWwp8R0Kw/</link>
 <description>&lt;p&gt;I wanted to get a blank version of Google Maps without any of the country names on for a visualisation I&amp;#8217;m working on but I&amp;#8217;d been led to believe that this wasn&amp;#8217;t actually possible.&lt;/p&gt;
&lt;p&gt;In actual fact we do have control over &lt;a href="http://stackoverflow.com/questions/3110020/google-maps-api-v3-no-labels"&gt;whether the labels are shown&lt;/a&gt; &lt;a href="https://developers.google.com/maps/documentation/javascript/styling#styling_the_default_map"&gt;via the &amp;#8216;styles&amp;#8217; option&lt;/a&gt; which we can call on the map.&lt;/p&gt;
&lt;p&gt;In my case the code looks like this:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="javascript" style="font-family:monospace;"&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; map &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;new&lt;/span&gt; google.&lt;span style="color: #660066;"&gt;maps&lt;/span&gt;.&lt;span style="color: #660066;"&gt;Map&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;document.&lt;span style="color: #660066;"&gt;getElementById&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;&amp;quot;map_canvas&amp;quot;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
  zoom&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #CC0000;"&gt;3&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
  center&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;new&lt;/span&gt; google.&lt;span style="color: #660066;"&gt;maps&lt;/span&gt;.&lt;span style="color: #660066;"&gt;LatLng&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #CC0000;"&gt;31.492121&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #CC0000;"&gt;14.919434&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
  mapTypeId&lt;span style="color: #339933;"&gt;:&lt;/span&gt; google.&lt;span style="color: #660066;"&gt;maps&lt;/span&gt;.&lt;span style="color: #660066;"&gt;MapTypeId&lt;/span&gt;.&lt;span style="color: #660066;"&gt;ROADMAP&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; emptyStyles &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
    featureType&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;&amp;quot;all&amp;quot;&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
    elementType&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;&amp;quot;labels&amp;quot;&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
    stylers&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt; visibility&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;&amp;quot;off&amp;quot;&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&amp;nbsp;
map.&lt;span style="color: #660066;"&gt;setOptions&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;styles&lt;span style="color: #339933;"&gt;:&lt;/span&gt; emptyStyles&lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And this is the result:&lt;/p&gt;
&lt;div align="left"&gt;
&lt;img src="http://www.markhneedham.com/blog/wp-content/uploads/2012/05/map-no-labels.jpg" alt="Map no labels" title="map-no-labels.jpg" border="0" width="600" height="389" /&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/MarkNeedham/~4/YqAiDM69gzc" height="1" width="1"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=d8FWwp8R0Kw:sIMMX-71u-0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=d8FWwp8R0Kw:sIMMX-71u-0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=d8FWwp8R0Kw:sIMMX-71u-0:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?i=d8FWwp8R0Kw:sIMMX-71u-0:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/thoughtworks-blogs/~4/d8FWwp8R0Kw" height="1" width="1"/&gt;</description>
 <pubDate>Thu, 31 May 2012 21:52:29 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/MarkNeedham/~3/YqAiDM69gzc/</feedburner:origLink></item>
<item>
 <title>Jim Highsmith: Reducing Cycle Time</title>
 <link>http://feedproxy.google.com/~r/thoughtworks-blogs/~3/5yJ-h8GcbgI/</link>
 <description>&lt;p&gt;&lt;a href="http://jimhighsmith.com/2012/05/31/reducing-cycle-time/cycle_time_cycle/" rel="attachment wp-att-1470"&gt;&lt;img class="alignleft size-full wp-image-1470" title="cycle_time_cycle" src="http://jimhighsmith.com/wpress/wp-content/uploads/2012/05/cycle_time_cycle.jpg" alt="" width="280" height="168" /&gt;&lt;/a&gt;An increasing number of organizations are moving towards radical reductions in cycle time as they move towards rapid business responsiveness and Continuous Delivery. (I&amp;#8217;m trying to reduce my personal cycle time, but that&amp;#8217;s another issue.)&lt;/p&gt;
&lt;p&gt;One mantra that seems to help teams and organizations in this quest is, “If it’s hard to do, do it more often!” Keep this mantra in mind. If something appears too hard, or too costly, or too slow—figure out a way to do it more often. I once worked with a company whose product took six months of Q/A prior to release. The Q/A manager couldn’t imagine how to reduce the time to two-week iterations, so I asked him if he could figure out how to do it every two months. After several subsequent iterations, his group was able to support two-week iterations. From lean manufacturing examples, we often see that 80% or more of the time taken to accomplish a process usually works out to be wait time, not work time, so pushing for significant reductions is often much easier than anticipated at first.&lt;/p&gt;
&lt;p&gt;In trying to answer the question &amp;#8220;How can we do something frequently?&amp;#8221; the answer may come from a combination of simplification, eliminating constraints, and automation. Every time we push to do something more often, be it a software build and integration or design, we learn. Learning comes from repetition.&lt;/p&gt;
&lt;p&gt;From Goldratt’s theory of constraints we have learned to look for process bottlenecks. The bottleneck could be the lack of a particular skill or the throughput of a machine or a computer, but the key aspect of a bottleneck is that eliminating it can create significant improvements in overall throughput and cycle time reduction. Conversely, if we don’t think about bottlenecks, we can add significant resources without impacting throughput at all.&lt;/p&gt;
&lt;p&gt;Teams should always ask the question, “How could we simplify this process or activity?” Or, the question may be more like, “What can we eliminate or streamline in order to reduce the time to do this from 6 weeks to 1?” Again, the time to accomplish some overall process can often be traced to delays between groups and excessive control processes or steps. For example, if there is a sequential process that takes eight weeks and involves four groups, each group may have a logging, prioritization, and reviewing process for work items. Reducing the process to a week by eliminating communication delays may also eliminate the need for these control processes.&lt;/p&gt;
&lt;p&gt;Since we are in the business of IT, automation always comes to mind as an enabler to doing things more often, but we shouldn’t jump to automation until some of these other ideas have been tried.&lt;/p&gt;
&lt;p&gt;The mantra “If it’s hard to do, do it more often!” espouses the agile value of responding to change. In today’s high-change world responsiveness to change is tied to the cost of change—reducing its cost increases our responsiveness. The high cost of some change should not be viewed as a barrier to responsiveness, but as an opportunity to increase our responsiveness by overcoming that barrier.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/AgileImagineering/~4/4k3TMnQj9vw" height="1" width="1"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=5yJ-h8GcbgI:dv1HB_NrF7o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=5yJ-h8GcbgI:dv1HB_NrF7o:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=5yJ-h8GcbgI:dv1HB_NrF7o:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?i=5yJ-h8GcbgI:dv1HB_NrF7o:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/thoughtworks-blogs/~4/5yJ-h8GcbgI" height="1" width="1"/&gt;</description>
 <pubDate>Thu, 31 May 2012 18:05:14 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/AgileImagineering/~3/4k3TMnQj9vw/</feedburner:origLink></item>
<item>
 <title>Anand Bagmar: Test Driven Development via Agile Testing</title>
 <link>http://feedproxy.google.com/~r/thoughtworks-blogs/~3/DHuIwM1mfvg/test-driven-development-via-agile.html</link>
 <description>&lt;span style="font-family: Verdana, sans-serif;"&gt;I will be giving a talk in the "&lt;a href="http://www.unicomlearning.com/event/seminar/next-generation-testing-conference" target="_blank"&gt;&lt;span style="color: blue;"&gt;&lt;i&gt;Next Generation Testing Conference&lt;/i&gt;&lt;/span&gt;&lt;/a&gt;" held in Bangalore on 21st June 2012.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;The topic and abstract is as mentioned below. See you at the conference!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="left" border="0" cellpadding="0" cellspacing="0" style="background-color: rgba(255, 255, 255, 0.917969); border-collapse: collapse; color: #222222; font-family: arial, sans-serif; font-size: 13px; margin-left: 6pt; margin-right: 6pt; width: 541px;"&gt;&lt;tbody&gt;&lt;tr style="min-height: 20.6pt;"&gt;&lt;td style="background-color: #ddd9c3; border-color: windowtext black windowtext windowtext; border-style: solid; border-width: 1pt; margin: 0px; min-height: 20.6pt; padding: 0cm 5.4pt; width: 540.85pt;" width="541"&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;span lang="EN-GB"&gt;Title:&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span lang="EN-IN"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="min-height: 20.6pt;"&gt;&lt;td style="background-color: #eaf1dd; border-bottom-color: windowtext; border-bottom-width: 1pt; border-left-color: windowtext; border-left-width: 1pt; border-right-color: black; border-right-width: 1pt; border-style: none solid solid; margin: 0px; min-height: 20.6pt; padding: 0cm 5.4pt; width: 540.85pt;" width="541"&gt;&lt;h2&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;span style="font-family: Arial;"&gt;Test Driven Development via Agile Testing&lt;/span&gt;&lt;/b&gt;&lt;span style="text-align: center;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="min-height: 20.6pt;"&gt;&lt;td style="background-color: #ddd9c3; border-bottom-color: windowtext; border-bottom-width: 1pt; border-left-color: windowtext; border-left-width: 1pt; border-right-color: black; border-right-width: 1pt; border-style: none solid solid; margin: 0px; min-height: 20.6pt; padding: 0cm 5.4pt; width: 540.85pt;" width="541"&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;b&gt;&lt;span lang="EN-IN"&gt;&lt;span style="font-size: small;"&gt;Abstract covering main features of the talk:&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="min-height: 87.25pt;"&gt;&lt;td style="background-color: #eaf1dd; border-bottom-color: windowtext; border-bottom-width: 1pt; border-left-color: windowtext; border-left-width: 1pt; border-right-color: black; border-right-width: 1pt; border-style: none solid solid; margin: 0px; min-height: 87.25pt; padding: 0cm 5.4pt; width: 540.85pt;" width="541"&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;b&gt;&lt;span lang="EN-IN"&gt;&lt;span style="font-size: small;"&gt;In this talk, I will cover the following topics and answer questions related to:&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="margin: 0cm 0cm 0.0001pt 38pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;span lang="EN-IN" style="font-family: Symbol;"&gt;·&lt;span style="font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-IN"&gt;Overview of Agile Testing&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0cm 0cm 0.0001pt 38pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;span lang="EN-IN" style="font-family: Symbol;"&gt;·&lt;span style="font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-IN"&gt;The Test Pyramid&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0cm 0cm 0.0001pt 38pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;span lang="EN-IN" style="font-family: Symbol;"&gt;·&lt;span style="font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-IN"&gt;Different flavors of TDD&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0cm 0cm 0.0001pt 74pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;span lang="EN-IN" style="font-family: 'Courier New';"&gt;o&lt;span style="font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-IN"&gt;BDD – Behavior Driven Development?&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0cm 0cm 0.0001pt 74pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;span lang="EN-IN" style="font-family: 'Courier New';"&gt;o&lt;span style="font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-IN"&gt;ATDD – Acceptance Driven Development?&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0cm 0cm 0.0001pt 74pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;span lang="EN-IN" style="font-family: 'Courier New';"&gt;o&lt;span style="font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-IN"&gt;BDT – Behavior Driven Testing?&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0cm 0cm 0.0001pt 110pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;span lang="EN-IN" style="font-family: Wingdings;"&gt;§&lt;span style="font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-IN"&gt;Difference between BDD and BDT&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0cm 0cm 0.0001pt 110pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;span lang="EN-IN" style="font-family: Wingdings;"&gt;§&lt;span style="font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-IN"&gt;Tools that support BDT&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0cm 0cm 0.0001pt 110pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;span lang="EN-IN" style="font-family: Wingdings;"&gt;§&lt;span style="font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-IN"&gt;The value proposition&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8599960509213929276-1219784374802502883?l=essenceoftesting.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=DHuIwM1mfvg:ateR3FcxYd8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=DHuIwM1mfvg:ateR3FcxYd8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=DHuIwM1mfvg:ateR3FcxYd8:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?i=DHuIwM1mfvg:ateR3FcxYd8:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/thoughtworks-blogs/~4/DHuIwM1mfvg" height="1" width="1"/&gt;</description>
 <pubDate>Thu, 31 May 2012 16:48:00 +0000</pubDate>
<feedburner:origLink>http://essenceoftesting.blogspot.com/2012/05/test-driven-development-via-agile.html</feedburner:origLink></item>
<item>
 <title>Ross Pettit: Rules versus Results</title>
 <link>http://feedproxy.google.com/~r/thoughtworks-blogs/~3/aO0gigT72dU/rules-versus-results.html</link>
 <description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;blockquote&gt;Assessments are based, not on whether the decisions made are any good, but on whether they were made in accordance with what is deemed to be an appropriate process. We assume, not only that good procedure will give rise to good outcome, but also that the ability to articulate the procedure is the key to good outcomes.&lt;/blockquote&gt;&lt;blockquote&gt;-- John Kay, writing in the &lt;a href="http://www.johnkay.com/2012/04/18/beware-of-franklin%E2%80%99s-gambit-in-making-decisions"&gt;Financial Times&lt;/a&gt;&lt;/blockquote&gt;A common error in both the management and governance of IT is an over-reliance on rules, process and "best practices" that portend to give us a means for modeling and controlling delivery.  We see this in different ways.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Project managers construct elaborately detailed project plans that show business needs decomposed into tasks which are to be performed by specialists in a highly orchestrated effort.  And detailed they are, often down to the specific task that will be performed by the specific "resource" (never "person", it's always "resource") on a specific day.  This forms a script for delivery.  The tech investor without a tech background cannot effectively challenge a model like this, and might even take great comfort in the level of detail and specificity.  &lt;i&gt;They have this broken down into precise detail; they must really know what they're doing.&lt;/i&gt; &lt;/li&gt;&lt;li&gt;Companies invest in "process improvement" initiatives, with a focus on establishing a common methodology.  The belief is that if we have a methodology - if we write unit tests and have our requirements written up as Stories and if we have a continuous build - we'll get better results.  Methodology becomes an implicit guarantor of success.  &lt;i&gt;If we become Agile, we'll get more done with smaller teams.&lt;/i&gt; &lt;/li&gt;&lt;li&gt;"Best practices" are held out as the basis of IT governance.  Libraries of explicit "best practices" prescriptively define how we should organize and separate responsibilities, manage data centers, contract with vendors and suppliers, and construct solutions.  If there is a widely accepted codification of "best practices", and we can show that we're in compliance with those practices, then there's nothing else to be done: you can't get better then "best".  &lt;i&gt;We'll get people certified in ITIL - then we know we'll be compliant with best practices.&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;center&gt;* * *&lt;/center&gt;&lt;br /&gt;&lt;blockquote&gt;To see how stultifying such behaviour can be, imagine the application of this emphasis on process over outcome in fields other than politics or business. Suppose we were to insist that Wayne Rooney explain his movements on the field; ask Mozart to justify his choice of key, or Van Gogh to explain his selection of colours. We would end up with very articulate footballers, composers and painters, and very bad football, music and art.&lt;/blockquote&gt;&lt;blockquote&gt;-- &lt;a href="http://www.johnkay.com/"&gt;John Kay&lt;/a&gt;&lt;/blockquote&gt;It is tempting to try to derive universal cause-and-effect truths from the performance of specific teams. &lt;i&gt;Because this team writes unit tests, they have higher code quality.&lt;/i&gt;  Or, &lt;i&gt;Because we ask users to review security policies and procedures at the time their network credentials expire, we have fewer security issues.&lt;/i&gt;   Does unit testing lead to higher quality?  Does our insistence on policy result in tighter security?  It may be that we have highly skilled developers who are collaborative by nature, writing relatively simple code that is not subject to much change.  It may be that our network has never been the target of a cyber attack.  A "rule" that dictates that we write unit tests or that we flog people with security policy will be of variable impact depending on the context.&lt;br /&gt;&lt;blockquote&gt;There are no such things as best practices. There are such things as practices that teams have found useful within their own contexts.&lt;/blockquote&gt;&lt;blockquote&gt;&lt;a href="https://twitter.com/#%21/mikebroberts"&gt;@mikeroberts&lt;/a&gt;&lt;/blockquote&gt;Suppose a team has low automated unit test coverage but high quality, while another team has high automated unit test coverage but low quality.  A rule for high unit test coverage is no longer indicative of outcome.  The good idea of writing unit tests is compromised by examples that contradict lofty expectations for going to the trouble for writing them.&lt;br /&gt;&lt;br /&gt;It isn't just the rules that are compromised: rule makers and rule enforcers are as well.  When a team compliant with rules posts a disappointing result, or a team ignorant of rules outperforms expectation, rule makers and rule enforcers are left to make &lt;i&gt;ceteris peribus&lt;/i&gt; arguments of an unprovable counterfactual: &lt;i&gt;had we not been following the rule that we always write unit tests, quality would have been much lower.&lt;/i&gt;  Maybe it would. Maybe it would not.&lt;br /&gt;&lt;br /&gt;Rules are not a solid foundation for management or governance, particularly in technology.  For one thing, they lag innovation, rather than lead it: prescriptive IT security guidelines circa 2007 were ignorant of the risks posed by social media.  Since technology is a business of invention and innovation, rules will always be out of date.&lt;br /&gt;&lt;br /&gt;For another, rules create the appearance of control while actually subverting it.  Rules appear to be explicit done-or-not-done statements.  But rules shift the burden of proof of compliance to the regulator (who must show the regulated isn't following the rule), and away from the regulated (who gets to choose the most favourable interpretation of the rules which apply).  Tax law which explicitly defines how income or sales transactions are to be taxed encourage the individual to seek out the most favourable tax treatment: e.g., people within easy driving distance of a lower cost sales tax jurisdiction will go there to make large purchases.  The individual's tax obligation is minimized, but at a cost to society which is starved for public revenues.  In IT terms, the regulated (that is, the individual responsible for getting something done) holds the power to determine whether a task is completed or a governance box can be ticked.  &lt;i&gt;I was told to complete this technical task; I have completed it to a point where nobody can tell me I am not done with it.&lt;/i&gt; The individual effort is minimized, but at a cost to the greater good of the software under development which is starved for attention.  It is up to the regulator (e.g., the business as the consumer of a deliverable, or a steering committee member as a regulator) to prove that it is not.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;When the totality of the completed technical tasks does not produce the functionality we wanted, or the checboxes are ticked but governance fails to recognize an existential problem, our results fall short of our expectations &lt;i&gt;despite the fact that we are in full compliance with the rules.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;center&gt;* * *&lt;/center&gt;&lt;br /&gt;&lt;blockquote&gt;Instead, we claim to believe that there is an objective method by which all right thinking people would, with sufficient diligence and intelligence, arrive at a good answer to any complex problem. But there is no such method.&lt;/blockquote&gt;&lt;blockquote&gt;-- &lt;a href="http://www.johnkay.com/"&gt;John Kay&lt;/a&gt;&lt;/blockquote&gt;Just because rules-based mechanisms are futile does not mean that all our decisions - project plans, delivery process, governance - are best made ad hoc.&lt;br /&gt;&lt;br /&gt;Clearly, not every IT situation is unique, and we can learn and apply across contexts.  But we do ourselves a disservice when we hold out those lessons to be dogma.  Better that we recognize that rigorous execution and good discipline are good lifestyle decisions, which lead to good hygiene.  Good hygiene prevents bad outcomes more than it enables good ones.  Not smoking is one way to prevent lung cancer.  Not smoking is not, however, the sole determinant of good respiratory health.&lt;br /&gt;&lt;br /&gt;Principles give us an important intermediary between prescriptive rules and flying by the seat of our pants.  Principles tend to be less verbose than rules, which makes them more accessible to the people subject to them.  They reinforce behaviours which reinforce good lifestyle decisions.  And although there is more leeway in interpretation of principles versus rules, it is the regulator, not the regulated, who has the power to interpret results.  Compliance with a principle is a question of intent, which is determined by the regulator.  If our tax law is a principle that "everybody must pay their fair share", it is the regulator who decides what constitutes "fair share" and does so in a broader, societal context.  Similarly, a business person determines whether or not software satisfies acceptance criteria, while a steering committee member assesses competency of people in delivery roles.  Management and governance are not wantonly misled by a developer deciding that they have completed a task, or an auditor confirming that VMO staffing criteria are met.&lt;br /&gt;&lt;br /&gt;"We always write unit tests" is a rule.  "We have appropriate test coverage" is a principle.  "Appropriate" is in the eye of the beholder.  Coming to some conclusion of what is "appropriate" requires context of the problem at hand.  Do we run appreciable risks by not having unit test coverage? Are we gilding the lily by piling on unit test after unit test?&lt;br /&gt;&lt;br /&gt;We are better served if we manage and govern by result, not rule. Compliance with a rule is at best an indicator; it is not a determinant.  Ultimately, we want people producing outstanding results on the field, not to be dogmatic in how they go about it.  Rules, processes, and "best practices" - whether in the form of an explicit task order that tells people what they are to do day in and day out or a collection of habits that people follow - do not compensate for a fundamental lack of capability.&lt;br /&gt;&lt;br /&gt;Adjudication of principles requires a higher degree of capability and situational awareness by everybody in a team. But then we would expect the team with the best players to triumph over a team with adequate players in an adequate system.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30621875-3567130296310792019?l=www.rosspettit.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=aO0gigT72dU:vJ-XRNlYX7Q:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=aO0gigT72dU:vJ-XRNlYX7Q:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=aO0gigT72dU:vJ-XRNlYX7Q:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?i=aO0gigT72dU:vJ-XRNlYX7Q:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/thoughtworks-blogs/~4/aO0gigT72dU" height="1" width="1"/&gt;</description>
 <pubDate>Thu, 31 May 2012 15:20:00 +0000</pubDate>
<feedburner:origLink>http://www.rosspettit.com/2012/05/rules-versus-results.html</feedburner:origLink></item>
<item>
 <title>Martin Fowler: NoSQL Distilled Rough Cut Now Visible</title>
 <link>http://feedproxy.google.com/~r/thoughtworks-blogs/~3/GUmrLF72sbA/201205310845.html</link>
 <description>&lt;div class = 'img'&gt;&lt;img src = 'http://martinfowler.com/nosql.jpg' width = '100' height = '' alt = '' title = ''/&gt;&lt;/div&gt;&lt;p&gt;The &lt;a href='http://my.safaribooksonline.com/9780133036138'&gt;rough cut of NoSQL Distilled is now online&lt;/a&gt;. If you have a subscription that supports rough cuts you will see the whole book, if not you&amp;#8217;ll see a preview of the book with the table of contents and the first paragraph or two from each section. Remember this is a rough cut and has not been copy edited.&lt;/p&gt;

&lt;p&gt;I was a bit hesitant to announce this, after my false sighting on Tuesday, but I&amp;#8217;ve had a few tweets now confirming that it&amp;#8217;s online.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=GUmrLF72sbA:EvYrt3yYy2w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=GUmrLF72sbA:EvYrt3yYy2w:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=GUmrLF72sbA:EvYrt3yYy2w:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?i=GUmrLF72sbA:EvYrt3yYy2w:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/thoughtworks-blogs/~4/GUmrLF72sbA" height="1" width="1"/&gt;</description>
 <pubDate>Thu, 31 May 2012 13:45:00 +0000</pubDate>
<feedburner:origLink>http://martinfowler.com/snips/201205310845.html</feedburner:origLink></item>
<item>
 <title>Daniel Aragão: Simple things to develop public speaking and presenting confidence</title>
 <link>http://feedproxy.google.com/~r/thoughtworks-blogs/~3/A8iPOU3eaB4/title-explained.html</link>
 <description>&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-9_WctKOgAkw/T8bFcQBdz3I/AAAAAAAAAjY/29nIk82o_Eo/s1600/Martin_Luther_King_-_March_on_Washington.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-9_WctKOgAkw/T8bFcQBdz3I/AAAAAAAAAjY/29nIk82o_Eo/s320/Martin_Luther_King_-_March_on_Washington.jpg" width="305" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/-9_WctKOgAkw/T8bFcQBdz3I/AAAAAAAAAjY/29nIk82o_Eo/s1600/Martin_Luther_King_-_March_on_Washington.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;It's quite common to fear public speaking. Getting in front of everybody and defending your point of view can be daunting. If you aren't good at it and would like, or need to, get better, here some tips.&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;Stand up&lt;/b&gt;. Literally. When in meetings or at a restaurant, get out of the chair and stand up. You can use whatever excuse you want. Say you’re stretching. The point here is to get used to you standing while others are seated. Stay up as long as you can.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;This is a corollary of standing up. You need to &lt;b&gt;enjoy the silence&lt;/b&gt; while standing up. A good presentation has good pauses. They are powerful. Don't be a chatterbox.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;Present it! &lt;/b&gt;Present to your dog, children or stranger at the bus stop. Get used to talking about the things you do to people that don’t necessarily care or understand them. They will give you feedback on how to dumb things down.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;Watch&lt;/b&gt; as many &lt;b&gt;presentations&lt;/b&gt; as you can on the subject you’re trying to get better at. Observe how presenters and consultants behave, the things they say and how they say them.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Present other people’s ideas and presentations. &lt;b&gt;Get a random slide deck from slideshare.com and present it.&lt;/b&gt; Don’t forget to give proper credits, of course. Then see what you’d have done differently if you were to create the slides yourself.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;Learn to keep track of time.&lt;/b&gt; It’s crucial to gain peoples trust that you will guide them through the meeting/presentation on time. Let people know you’re tracking time and what’s left of it. You can do this by going to have coffee with your work mates. Establish a time to do the task and track it.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4806640790205683824-3869856090419716263?l=antagonisticpleiotropy.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=A8iPOU3eaB4:2OgH5ccjhBE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=A8iPOU3eaB4:2OgH5ccjhBE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=A8iPOU3eaB4:2OgH5ccjhBE:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?i=A8iPOU3eaB4:2OgH5ccjhBE:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/thoughtworks-blogs/~4/A8iPOU3eaB4" height="1" width="1"/&gt;</description>
 <pubDate>Thu, 31 May 2012 01:24:00 +0000</pubDate>
<feedburner:origLink>http://antagonisticpleiotropy.blogspot.com/2007/10/title-explained.html</feedburner:origLink></item>
<item>
 <title>Mark Needham: Haskell: Using type classes to generify Project Euler #31</title>
 <link>http://feedproxy.google.com/~r/thoughtworks-blogs/~3/Mlif53ulC6k/</link>
 <description>&lt;p&gt;As I mentioned in my previous post I&amp;#8217;ve been working on &lt;a href="http://www.markhneedham.com/blog/2012/05/30/haskell-java-style-enums/"&gt;Project Euler #31&lt;/a&gt; and initially wasn&amp;#8217;t sure how to write the algorithm.&lt;/p&gt;
&lt;p&gt;I came across &lt;a href="http://stackoverflow.com/questions/1106929/find-all-combinations-of-coins-when-given-some-dollar-value"&gt;a post on StackOverflow which explained it in more detail&lt;/a&gt; but unfortunately the example used US coins rather than UK ones like in the Project Euler problem.&lt;/p&gt;
&lt;p&gt;To start with I created two versions of the function &amp;#8211; one for US coins and one for UK coins:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="haskell" style="font-family:monospace;"&gt;combinations &lt;span style="color: #339933; font-weight: bold;"&gt;::&lt;/span&gt; &lt;span style="color: #cccc00; font-weight: bold;"&gt;Int&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;USCoin&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;USCoin&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;USCoin&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt;
combinations &lt;span style="color: red;"&gt;0&lt;/span&gt; current &lt;span style="color: #339933; font-weight: bold;"&gt;_&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;current&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt;
combinations &lt;span style="color: #339933; font-weight: bold;"&gt;_&lt;/span&gt;  current &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt;
combinations total p &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;c:cs&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;concatMap&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;\ times &lt;span style="color: #339933; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; combinations &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;total &lt;span style="color: #339933; font-weight: bold;"&gt;-&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;times &lt;span style="color: #339933; font-weight: bold;"&gt;*&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;fromEnum&lt;/span&gt; c&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;p &lt;span style="color: #339933; font-weight: bold;"&gt;++&lt;/span&gt; replicate times c&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt; cs&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt; 
                                        &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: red;"&gt;0&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt;&lt;span style="color: red;"&gt;1&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;..&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;total `&lt;span style="font-weight: bold;"&gt;div&lt;/span&gt;` &lt;span style="font-weight: bold;"&gt;fromEnum&lt;/span&gt; c&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;


&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="haskell" style="font-family:monospace;"&gt;combinationsUK &lt;span style="color: #339933; font-weight: bold;"&gt;::&lt;/span&gt; &lt;span style="color: #cccc00; font-weight: bold;"&gt;Int&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;UKCoin&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;UKCoin&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;UKCoin&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt;
combinationsUK &lt;span style="color: red;"&gt;0&lt;/span&gt; current &lt;span style="color: #339933; font-weight: bold;"&gt;_&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;current&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt;
combinationsUK &lt;span style="color: #339933; font-weight: bold;"&gt;_&lt;/span&gt;  current &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt;
combinationsUK total p &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;c:cs&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;concatMap&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;\ times &lt;span style="color: #339933; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; combinationsUK &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;total &lt;span style="color: #339933; font-weight: bold;"&gt;-&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;times &lt;span style="color: #339933; font-weight: bold;"&gt;*&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;fromEnum&lt;/span&gt; c&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;p &lt;span style="color: #339933; font-weight: bold;"&gt;++&lt;/span&gt; replicate times c&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt; cs&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt; 
                                          &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: red;"&gt;0&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt;&lt;span style="color: red;"&gt;1&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;..&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;total `&lt;span style="font-weight: bold;"&gt;div&lt;/span&gt;` &lt;span style="font-weight: bold;"&gt;fromEnum&lt;/span&gt; c&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;As we can see the only difference between the two functions is the type being passed around and they are almost identical as well:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="haskell" style="font-family:monospace;"&gt;&lt;span style="color: #06c; font-weight: bold;"&gt;data&lt;/span&gt; USCoin &lt;span style="color: #339933; font-weight: bold;"&gt;=&lt;/span&gt; Quarter &lt;span style="color: #339933; font-weight: bold;"&gt;|&lt;/span&gt; Dime &lt;span style="color: #339933; font-weight: bold;"&gt;|&lt;/span&gt; Nickel &lt;span style="color: #339933; font-weight: bold;"&gt;|&lt;/span&gt; Penny &lt;span style="color: #06c; font-weight: bold;"&gt;deriving&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #cccc00; font-weight: bold;"&gt;Eq&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: #cccc00; font-weight: bold;"&gt;Show&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;


&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="haskell" style="font-family:monospace;"&gt;&lt;span style="color: #06c; font-weight: bold;"&gt;instance&lt;/span&gt; &lt;span style="color: #cccc00; font-weight: bold;"&gt;Enum&lt;/span&gt; USCoin &lt;span style="color: #06c; font-weight: bold;"&gt;where&lt;/span&gt;
    &lt;span style="font-weight: bold;"&gt;fromEnum&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;=&lt;/span&gt; fromJust &lt;span style="color: #339933; font-weight: bold;"&gt;.&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;flip&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;lookup&lt;/span&gt; usTable
    &lt;span style="font-weight: bold;"&gt;toEnum&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;=&lt;/span&gt; fromJust &lt;span style="color: #339933; font-weight: bold;"&gt;.&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;flip&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;lookup&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;map&lt;/span&gt; swap usTable&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;
usTable &lt;span style="color: #339933; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;Quarter&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;25&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;Dime&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;10&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;Nickel&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;5&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;Penny&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;1&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;


&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="haskell" style="font-family:monospace;"&gt;&lt;span style="color: #06c; font-weight: bold;"&gt;data&lt;/span&gt; UKCoin &lt;span style="color: #339933; font-weight: bold;"&gt;=&lt;/span&gt; OnePence &lt;span style="color: #339933; font-weight: bold;"&gt;|&lt;/span&gt; TwoPence &lt;span style="color: #339933; font-weight: bold;"&gt;|&lt;/span&gt; FivePence &lt;span style="color: #339933; font-weight: bold;"&gt;|&lt;/span&gt; TenPence &lt;span style="color: #339933; font-weight: bold;"&gt;|&lt;/span&gt; TwentyPence &lt;span style="color: #339933; font-weight: bold;"&gt;|&lt;/span&gt; FiftyPence &lt;span style="color: #339933; font-weight: bold;"&gt;|&lt;/span&gt; OnePound &lt;span style="color: #339933; font-weight: bold;"&gt;|&lt;/span&gt; TwoPounds &lt;span style="color: #06c; font-weight: bold;"&gt;deriving&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #cccc00; font-weight: bold;"&gt;Eq&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: #cccc00; font-weight: bold;"&gt;Show&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;


&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="haskell" style="font-family:monospace;"&gt;&lt;span style="color: #06c; font-weight: bold;"&gt;instance&lt;/span&gt; &lt;span style="color: #cccc00; font-weight: bold;"&gt;Enum&lt;/span&gt; UKCoin &lt;span style="color: #06c; font-weight: bold;"&gt;where&lt;/span&gt;
    &lt;span style="font-weight: bold;"&gt;fromEnum&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;=&lt;/span&gt; fromJust &lt;span style="color: #339933; font-weight: bold;"&gt;.&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;flip&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;lookup&lt;/span&gt; ukTable
    &lt;span style="font-weight: bold;"&gt;toEnum&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;=&lt;/span&gt; fromJust &lt;span style="color: #339933; font-weight: bold;"&gt;.&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;flip&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;lookup&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;map&lt;/span&gt; swap ukTable&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;
ukTable &lt;span style="color: #339933; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;OnePence&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;1&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;TwoPence&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;2&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;FivePence&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;5&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;TenPence&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;10&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; 
           &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;TwentyPence&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;20&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;FiftyPence&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;50&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;OnePound&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;100&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;TwoPounds&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;200&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We can run those two functions like this:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="haskell" style="font-family:monospace;"&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;length&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;$&lt;/span&gt; combinations &lt;span style="color: red;"&gt;200&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;reverse&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;$&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;map&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;fst&lt;/span&gt; usTable&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;
&lt;span style="color: red;"&gt;1463&lt;/span&gt;
&amp;nbsp;
&lt;span style="color: #339933; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;length&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;$&lt;/span&gt; combinationsUK &lt;span style="color: red;"&gt;200&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;reverse&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;$&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;map&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;fst&lt;/span&gt; ukTable&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;
&lt;span style="color: red;"&gt;73682&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After spending a lot of the past week reading about type classes I figured we could probably make use of one here so I created a &amp;#8216;Coin&amp;#8217; type class:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="haskell" style="font-family:monospace;"&gt;&lt;span style="color: #06c; font-weight: bold;"&gt;class&lt;/span&gt; Coin a &lt;span style="color: #06c; font-weight: bold;"&gt;where&lt;/span&gt; 
  value &lt;span style="color: #339933; font-weight: bold;"&gt;::&lt;/span&gt; a &lt;span style="color: #339933; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #cccc00; font-weight: bold;"&gt;Int&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And then implemented that with &amp;#8216;USCoin&amp;#8217; and &amp;#8216;UKCoin&amp;#8217;:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="haskell" style="font-family:monospace;"&gt;&lt;span style="color: #06c; font-weight: bold;"&gt;instance&lt;/span&gt; Coin USCoin &lt;span style="color: #06c; font-weight: bold;"&gt;where&lt;/span&gt; value coin &lt;span style="color: #339933; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;fromEnum&lt;/span&gt; coin
&lt;span style="color: #06c; font-weight: bold;"&gt;instance&lt;/span&gt; Coin UKCoin &lt;span style="color: #06c; font-weight: bold;"&gt;where&lt;/span&gt; value coin &lt;span style="color: #339933; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;fromEnum&lt;/span&gt; coin&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then we need to make some small adjustments to &amp;#8216;combinations&amp;#8217; to make it work with &amp;#8216;Coin&amp;#8217; instead:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="haskell" style="font-family:monospace;"&gt;combinations &lt;span style="color: #339933; font-weight: bold;"&gt;::&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;Coin a&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #cccc00; font-weight: bold;"&gt;Int&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;a&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;a&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;a&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt;
combinations &lt;span style="color: red;"&gt;0&lt;/span&gt; current &lt;span style="color: #339933; font-weight: bold;"&gt;_&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;current&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt;
combinations &lt;span style="color: #339933; font-weight: bold;"&gt;_&lt;/span&gt;  current &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt;
combinations total p &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;c:cs&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;=&lt;/span&gt; 
  &lt;span style="font-weight: bold;"&gt;concatMap&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;\ times &lt;span style="color: #339933; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; combinations &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;total &lt;span style="color: #339933; font-weight: bold;"&gt;-&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;times &lt;span style="color: #339933; font-weight: bold;"&gt;*&lt;/span&gt; value c&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;p &lt;span style="color: #339933; font-weight: bold;"&gt;++&lt;/span&gt; replicate times c&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt; cs&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt; 
            &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: red;"&gt;0&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt;&lt;span style="color: red;"&gt;1&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;..&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;total `&lt;span style="font-weight: bold;"&gt;div&lt;/span&gt;` value c&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Instead of calling &amp;#8216;fromEnum&amp;#8217; we call &amp;#8216;value&amp;#8217; and the function can now be used with any types which implement the Coin type class should we wish to do that.&lt;/p&gt;
&lt;p&gt;We can actually go even further and get rid of our Enum type class instances and just put that code onto the Coin type class:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="haskell" style="font-family:monospace;"&gt;&lt;span style="color: #06c; font-weight: bold;"&gt;class&lt;/span&gt; &lt;span style="color: #cccc00; font-weight: bold;"&gt;Eq&lt;/span&gt; a &lt;span style="color: #339933; font-weight: bold;"&gt;=&amp;gt;&lt;/span&gt; Coin a &lt;span style="color: #06c; font-weight: bold;"&gt;where&lt;/span&gt; 
  table &lt;span style="color: #339933; font-weight: bold;"&gt;::&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;a&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: #cccc00; font-weight: bold;"&gt;Int&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt;
&amp;nbsp;
  value &lt;span style="color: #339933; font-weight: bold;"&gt;::&lt;/span&gt; a &lt;span style="color: #339933; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #cccc00; font-weight: bold;"&gt;Int&lt;/span&gt;
  value &lt;span style="color: #339933; font-weight: bold;"&gt;=&lt;/span&gt; fromJust &lt;span style="color: #339933; font-weight: bold;"&gt;.&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;flip&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;lookup&lt;/span&gt; table&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;


&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="haskell" style="font-family:monospace;"&gt;&lt;span style="color: #06c; font-weight: bold;"&gt;instance&lt;/span&gt; Coin USCoin &lt;span style="color: #06c; font-weight: bold;"&gt;where&lt;/span&gt; 
  table &lt;span style="color: #339933; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;Quarter&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;25&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;Dime&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;10&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;Nickel&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;5&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;Penny&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;1&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt;	
&amp;nbsp;
&lt;span style="color: #06c; font-weight: bold;"&gt;instance&lt;/span&gt; Coin UKCoin &lt;span style="color: #06c; font-weight: bold;"&gt;where&lt;/span&gt; 
  table &lt;span style="color: #339933; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;OnePence&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;1&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;TwoPence&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;2&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;FivePence&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;5&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;TenPence&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;10&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;TwentyPence&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;20&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;FiftyPence&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;50&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;OnePound&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;100&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;TwoPounds&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;200&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We can then call the function with either of those coins:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="haskell" style="font-family:monospace;"&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;length&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;$&lt;/span&gt; combinations &lt;span style="color: red;"&gt;200&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;reverse&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;$&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;map&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;fst&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;table &lt;span style="color: #339933; font-weight: bold;"&gt;::&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;USCoin&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: #cccc00; font-weight: bold;"&gt;Int&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;
&lt;span style="color: red;"&gt;1463&lt;/span&gt;
&amp;nbsp;
&lt;span style="color: #339933; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;length&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;$&lt;/span&gt; combinations &lt;span style="color: red;"&gt;200&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;reverse&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;$&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;map&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;fst&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;table &lt;span style="color: #339933; font-weight: bold;"&gt;::&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;UKCoin&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: #cccc00; font-weight: bold;"&gt;Int&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;
&lt;span style="color: red;"&gt;73682&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;img src="http://feeds.feedburner.com/~r/MarkNeedham/~4/7qNBqD8SiCM" height="1" width="1"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=Mlif53ulC6k:IhJXabHJUmQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=Mlif53ulC6k:IhJXabHJUmQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=Mlif53ulC6k:IhJXabHJUmQ:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?i=Mlif53ulC6k:IhJXabHJUmQ:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/thoughtworks-blogs/~4/Mlif53ulC6k" height="1" width="1"/&gt;</description>
 <pubDate>Wed, 30 May 2012 12:08:25 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/MarkNeedham/~3/7qNBqD8SiCM/</feedburner:origLink></item>
<item>
 <title>Mark Needham: Haskell: Java Style Enums</title>
 <link>http://feedproxy.google.com/~r/thoughtworks-blogs/~3/JUOe5tptTvE/</link>
 <description>&lt;p&gt;I&amp;#8217;ve been playing around with &lt;a href="http://projecteuler.net/problem=31"&gt;problem 31 of Project Euler&lt;/a&gt; which is defined as follows:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
In England the currency is made up of pound, £, and pence, p, and there are eight coins in general circulation:&lt;/p&gt;
&lt;p&gt;1p, 2p, 5p, 10p, 20p, 50p, £1 (100p) and £2 (200p).&lt;/p&gt;
&lt;p&gt;It is possible to make £2 in the following way:&lt;/p&gt;
&lt;p&gt;1 £1 + 150p + 220p + 15p + 12p + 31p&lt;/p&gt;
&lt;p&gt;How many different ways can £2 be made using any number of coins?
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Having coded way too much in Java my first thought was that the coins could be represented as an Enum but I wasn&amp;#8217;t sure how to do that in Haskell.&lt;/p&gt;
&lt;p&gt;As it turns out &lt;a href="http://stackoverflow.com/questions/6000511/better-way-to-define-an-enum-in-haskell"&gt;the question has been asked on Stack Overflow&lt;/a&gt; and there&amp;#8217;s an Enum type class we can implement to achieve the same thing.&lt;/p&gt;
&lt;p&gt;In this case:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="haskell" style="font-family:monospace;"&gt;&lt;span style="color: #06c; font-weight: bold;"&gt;data&lt;/span&gt; UKCoin &lt;span style="color: #339933; font-weight: bold;"&gt;=&lt;/span&gt; OnePence &lt;span style="color: #339933; font-weight: bold;"&gt;|&lt;/span&gt; TwoPence &lt;span style="color: #339933; font-weight: bold;"&gt;|&lt;/span&gt; FivePence &lt;span style="color: #339933; font-weight: bold;"&gt;|&lt;/span&gt; TenPence &lt;span style="color: #339933; font-weight: bold;"&gt;|&lt;/span&gt; TwentyPence &lt;span style="color: #339933; font-weight: bold;"&gt;|&lt;/span&gt; FiftyPence &lt;span style="color: #339933; font-weight: bold;"&gt;|&lt;/span&gt; OnePound &lt;span style="color: #339933; font-weight: bold;"&gt;|&lt;/span&gt; TwoPounds 
              &lt;span style="color: #06c; font-weight: bold;"&gt;deriving&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #cccc00; font-weight: bold;"&gt;Eq&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: #cccc00; font-weight: bold;"&gt;Show&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;


&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="haskell" style="font-family:monospace;"&gt;&lt;span style="color: #06c; font-weight: bold;"&gt;instance&lt;/span&gt; &lt;span style="color: #cccc00; font-weight: bold;"&gt;Enum&lt;/span&gt; UKCoin &lt;span style="color: #06c; font-weight: bold;"&gt;where&lt;/span&gt;
    &lt;span style="font-weight: bold;"&gt;fromEnum&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;=&lt;/span&gt; fromJust &lt;span style="color: #339933; font-weight: bold;"&gt;.&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;flip&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;lookup&lt;/span&gt; table
    &lt;span style="font-weight: bold;"&gt;toEnum&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;=&lt;/span&gt; fromJust &lt;span style="color: #339933; font-weight: bold;"&gt;.&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;flip&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;lookup&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;map&lt;/span&gt; swap table&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;
table &lt;span style="color: #339933; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;OnePence&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;1&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;TwoPence&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;2&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;FivePence&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;5&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;TenPence&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;10&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;TwentyPence&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;20&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; 
         &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;FiftyPence&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;50&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;OnePound&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;100&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;TwoPounds&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;200&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If we want to get the monetary value of a coin we use &amp;#8216;fromEnum&amp;#8217;:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="haskell" style="font-family:monospace;"&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;fromEnum&lt;/span&gt; TwoPounds
&lt;span style="color: red;"&gt;200&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And if we wanted to go back to the enum value we&amp;#8217;d do this:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="haskell" style="font-family:monospace;"&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: green;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;toEnum&lt;/span&gt; &lt;span style="color: red;"&gt;200&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #339933; font-weight: bold;"&gt;::&lt;/span&gt; UKCoin
TwoPounds&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If we want to get a list of all the instances of &amp;#8216;UKCoin&amp;#8217; we can just do a map over &amp;#8216;table&amp;#8217;:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="haskell" style="font-family:monospace;"&gt;&lt;span style="color: #339933; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #06c; font-weight: bold;"&gt;let&lt;/span&gt; ukCoins &lt;span style="color: #339933; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;map&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;fst&lt;/span&gt; table
&lt;span style="color: #339933; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt; ukCoins
&lt;span style="color: green;"&gt;&amp;#91;&lt;/span&gt;OnePence&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt;TwoPence&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt;FivePence&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt;TenPence&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt;TwentyPence&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt;FiftyPence&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt;OnePound&lt;span style="color: #339933; font-weight: bold;"&gt;,&lt;/span&gt;TwoPounds&lt;span style="color: green;"&gt;&amp;#93;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;img src="http://feeds.feedburner.com/~r/MarkNeedham/~4/ZPd_1tgU8jU" height="1" width="1"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=JUOe5tptTvE:Pt-BsNSXuzw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=JUOe5tptTvE:Pt-BsNSXuzw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=JUOe5tptTvE:Pt-BsNSXuzw:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?i=JUOe5tptTvE:Pt-BsNSXuzw:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/thoughtworks-blogs/~4/JUOe5tptTvE" height="1" width="1"/&gt;</description>
 <pubDate>Wed, 30 May 2012 11:10:15 +0000</pubDate>
<feedburner:origLink>http://feedproxy.google.com/~r/MarkNeedham/~3/ZPd_1tgU8jU/</feedburner:origLink></item>
<item>
 <title>Aaron Erickson: On (not) Being Post-Technical</title>
 <link>http://feedproxy.google.com/~r/thoughtworks-blogs/~3/_ta81TdtTfw/</link>
 <description>&lt;p&gt;In ThoughtWorks, one of the most poignant insults one can throw at you is &amp;#8220;so-and-so has gone post-technical&amp;#8221;. This usually means one has entered the land of management, that place where you give back your brain in exchange for money (or prestige.. or nothing, as it turns out).&lt;/p&gt;
&lt;p&gt;Lately, as I have taken on additional roles at ThoughtWorks, the temptation to go &amp;#8220;post technical&amp;#8221; has put itself forward. Imagine not having to think anymore. Imagine being able to just focus on &amp;#8220;strategy&amp;#8221; and &amp;#8220;people issues&amp;#8221;, without all that hard technology stuff.&lt;/p&gt;
&lt;p&gt;I could take that path, but I&amp;#8217;d rather not&amp;#8230;&lt;/p&gt;
&lt;p&gt;I remain technical. My day-to-day job may involve things like Statements of Work and such, and I do not write code 100% of the time, but I am making a decision to at least remain somewhat involved in the technical communities in which I have interest.&lt;/p&gt;
&lt;p&gt;Of course, my time is more limited, given I have taken on some management responsibility lately. So I can&amp;#8217;t pursue everything. And I do have to admit that with my reduced time, I am likely never to be the most &amp;#8220;technical person&amp;#8221; in any given group of TWers. In fact, given that TWers are all generally really good at their jobs, it would be utter arrogance for me to assume I could keep up with them when I only act in a technical role for 40% of my time. So my bar isn&amp;#8217;t TWers &amp;#8211; they will most likely all be more technical than I am. But it is remaining competent enough to understand at least 40% of what they talk about, and more importantly, remain excited about technology.&lt;/p&gt;
&lt;p&gt;So what am I excited about these days, here is my own, personal, &amp;#8220;tech radar&amp;#8221; (no fancy graphics required):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Functional Languages and Big Data&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Someday, the world will catch up to where the F#/Clojure people are now. I think the tie between FP and Big Data is strong, and given that is where much of the value will be created in the next 5 years with corporate IT spend, the use of FP will only increase.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IaaS (note, I don&amp;#8217;t say cloud&amp;#8230; too overloaded)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I got the cloud bug this year, and I will admit, I am a terminal case. I saw an app where someone deployed a load balancer with an http request. And not an http request that converts into an email that goes to a tech that puts a physical one on a rack. Infrastructure as code is changing this business. Imagine the ability to specify, in human readable code, an organization&amp;#8217;s entire server configuration. And realize that configuration by executing the DSL it is written in. That day is approaching, fast. Imagine the possibilities &amp;#8211; from everything to devops to disaster recovery.&lt;/p&gt;
&lt;p&gt;Why don&amp;#8217;t I say cloud? The term is so overloaded that it is meaningless. Anything that runs on the internet is putting &amp;#8220;cloud&amp;#8221; in front of it&amp;#8217;s name, which is why I have stopped using the term and do everything I can to use more descriptive terms.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lean Startup&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Though not a technology, it is the first thing from a project management standpoint I have been truly excited about in years. At least since Agile, maybe more so. Why? It finally closes the loop, bringing in the entire scientific method into the business of software development. It seems so obvious now, it never ceases to surprise me that it took our industry 50 years to adopt it. Lean Startup, to me, is the application of the scientific method to how you run business. I recently did a &lt;a href="http://www.thoughtworks.com/events/understanding-mvp-connecting-continuous-delivery-lean-startup-movement"&gt;webinar that nicely encapsulates&lt;/a&gt; how I feel about it in much more detail, but my general sense is that this builds on CD and gives organizations that embrace it a much more repeatable, sustainable path to successfully delivering business results with software.&lt;/p&gt;
&lt;p&gt;The three things above are the tools I believe will create most of the value in corporate software over the next 5 years. And I fully intend to remain competent enough to discuss these topics with both technical and business audiences, even if I don&amp;#8217;t write code every single day anymore. The trick, not being a full time software developer anymore, will be to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make sure I don&amp;#8217;t stop doing some technical work &amp;#8211; I still intend to pair program with the team when I can, as well as keep up with a selection of OSS projects I am involved with.&lt;/li&gt;
&lt;li&gt;Continue to read new technical material &amp;#8211; I am on planes a lot, should not be too hard. For example, I am learning Python now, despite that I don&amp;#8217;t have a good reason to personally code in python.&lt;/li&gt;
&lt;li&gt;Be aware &amp;#8211; ultra-aware &amp;#8211; that I am not the most technical person in the room. My team-mates will likely know more than me, and I will defer to them on technical arguments more often than not, especially if they have decent data on why a given technical decision needs to be one way or another.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Will this work? We will see. I am only in the starting stages of this journey &amp;#8211; will be interesting to see the degree to which my technical skills atrophy from not being a full time developer anymore!&lt;/p&gt;
&lt;br /&gt;  &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/thenomadicdeveloper.wordpress.com/211/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/thenomadicdeveloper.wordpress.com/211/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/thenomadicdeveloper.wordpress.com/211/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/thenomadicdeveloper.wordpress.com/211/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/thenomadicdeveloper.wordpress.com/211/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/thenomadicdeveloper.wordpress.com/211/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/thenomadicdeveloper.wordpress.com/211/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/thenomadicdeveloper.wordpress.com/211/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/thenomadicdeveloper.wordpress.com/211/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/thenomadicdeveloper.wordpress.com/211/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/thenomadicdeveloper.wordpress.com/211/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/thenomadicdeveloper.wordpress.com/211/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/thenomadicdeveloper.wordpress.com/211/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/thenomadicdeveloper.wordpress.com/211/" /&gt;&lt;/a&gt; &lt;img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nomadic-developer.com&amp;#038;blog=4544199&amp;#038;post=211&amp;#038;subd=thenomadicdeveloper&amp;#038;ref=&amp;#038;feed=1" width="1" height="1" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=_ta81TdtTfw:lGj5-n6r_Fw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=_ta81TdtTfw:lGj5-n6r_Fw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thoughtworks-blogs?a=_ta81TdtTfw:lGj5-n6r_Fw:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thoughtworks-blogs?i=_ta81TdtTfw:lGj5-n6r_Fw:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/thoughtworks-blogs/~4/_ta81TdtTfw" height="1" width="1"/&gt;</description>
 <pubDate>Wed, 30 May 2012 00:20:25 +0000</pubDate>
<feedburner:origLink>http://nomadic-developer.com/2012/05/30/on-not-being-post-technical/</feedburner:origLink></item>
</channel>
</rss>

