<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
  <id>http://thinkrelevance.com</id>
  <rights>Copyright 2013, Relevance Inc.; all rights reserved.</rights>
  <title>Relevance Blog</title>
  <updated>2013-05-21T13:30:00Z</updated>
  <link rel="alternate" type="text/html" href="http://thinkrelevance.com/blog/" />
  <author>
    <name>Relevance</name>
    <email>webmaster@thinkrelevance.com</email>
  </author>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/relevance-llc" /><feedburner:info uri="relevance-llc" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
    <title>Entropy and Evolution of a Codebase</title>
    <id>http://thinkrelevance.com/blog/2013/05/21/entropy-and-evolution-of-a-codebase</id>
    <updated>2013-05-21T13:30:00Z</updated>
    <published>2013-05-21T13:30:00Z</published>
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/aq-gxJokKaA/entropy-and-evolution-of-a-codebase" />
    <author>
      <name>Michael Nygard</name>
      <email>mtnygard@thinkrelevance.com</email>
    </author>
    <content type="html">&lt;p&gt;Let&amp;#39;s do a thought experiment about change over time. We will start
with a &amp;quot;clean&amp;quot; codebase, organized into a bunch of modules. These can
be classes, subsystems, namespaces... it doesn&amp;#39;t matter for our
purposes.&lt;/p&gt;

&lt;p&gt;As time goes on, we have to make changes in the code. Suppose the
changes are distributed randomly across the codebase. Some modules
will get changed a lot more often than others. Empirically, the
distribution of changes almost always follows a &lt;a href="http://en.wikipedia.org/wiki/Power_law"&gt;power law&lt;/a&gt;. That is, a
few modules get changed very frequently while a decreasing number have
an increasing interval between changes.&lt;/p&gt;

&lt;p&gt;(In fact, concave shapes resembling a power law are very common in
software. We see them in object lifespans, &lt;a href="http://homepages.ecs.vuw.ac.nz/%7Ealex/files/PotaninNobleFreanBiddleCACM2005.pdf"&gt;coupling&lt;/a&gt;, and the
&lt;a href="http://s3-eu-west-1.amazonaws.com/presentations2012/5_presentation.pdf"&gt;distribution of complexity across modules&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;We started with a clean codebase, but what does that mean? To me, it
means that the code is simple, cohesive, and loosely coupled. In
short, it is easy to change, and most changes are local.&lt;/p&gt;

&lt;p&gt;With every change a developer makes, the module might lose cohesion,
gain coupling, or become complex. These are entropy-increasing
changes. On the other hand, the developer could split an incohesive
module, decouple a coupled one, or factor out complexity. These are
entropy-reducing changes.&lt;/p&gt;

&lt;p&gt;Even with a very disciplined team, some proportion of changes will be
entropy-increasing. We would all like to avoid them, but they happen
anyway. I think of these as introducing stress into the codebase. The
stress is trying to collapse the codebase into a Ball of Mud. We must
eventually relieve that stress through refactoring. At every change,
there is a chance that the module transitions from clean to dirty, or
from dirty to clean.&lt;/p&gt;

&lt;p&gt;If the odds of a clean-to-dirty transition and a dirty-to-clean
transition were equal, then we should expect the codebase to reach a
kind of thermodynamic equilibrium where dirtiness is conserved, but
shuttled around. Sadly, the transition odds are not equal. The
definition of clean means that it is easy to change. Dirty code is
hard to change. We all intuitively understand that it is much harder
to clean up a module than to dirty it in the first place. Therefore,
the likelihood of clean-to-dirty transitions is higher than that of the reverse.
From this alone, we could expect the fraction of dirty
modules to increase over time. It is entropic decay.&lt;/p&gt;

&lt;p&gt;There&amp;#39;s a secondary effect at play that exacerbates this
problem. Because it is easier to change a clean module than a dirty
one, we will see some kinds of changes &amp;quot;sliding sideways&amp;quot; from a dirty
module to a cleaner one. This is just another way of saying that
kludges cluster. A developer who needs to change a dirty module in a
difficult way is very likely to make a nearby change instead,
especially under time or deadline pressure. That nearby change
inevitably dirties the module it lands in, often by adding coupling.&lt;/p&gt;

&lt;p&gt;If you imagine the modules in a codebase like cells in a Game of Life
automaton, you could see cells fading from healthy blue to sickly red,
then transmitting their disease elsewhere. Very occasionally, you&amp;#39;ll
see a cell or cluster of cells brightening to health as a developer
restructures that area. Mostly, the codebase will decay until it must
be discarded or rewritten.&lt;/p&gt;

&lt;p&gt;Can this entropic decay be prevented?&lt;/p&gt;

&lt;p&gt;Yes, but it is not easy. We know of several ways to avoid it.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Surgical anti-entropy. Have people consistently tackle the gnarliest,
smelliest parts of the system and bring them back to health.&lt;/li&gt;
&lt;li&gt;Ongoing stewardship. Have people nurture their part of the codebase
indefinitely. They should have the time, skill, and desire to tend to
their garden.&lt;/li&gt;
&lt;li&gt;Methodical attacks on suspected entropy strongholds. Use version
control records to find the least-frequently-changed modules that are
coupled to areas with high change rates. Odds are, the infrequently
changed module is really dirty. The frequent changes in nearby modules
indicate &amp;quot;sliding away&amp;quot; from the problem. The long time between
changes on the module in the middle is a sign of sickness, not
stability.&lt;/li&gt;
&lt;li&gt;Community spirit. Make sure the whole team knows that every single
person is responsible for cleaning modules, fixing broken windows,
reducing coupling, and reversing entropy. (This is the XP approach of
&lt;a href="http://c2.com/cgi/wiki?CollectiveCodeOwnership"&gt;Collective Code Ownership&lt;/a&gt;.)&lt;/li&gt;
&lt;li&gt;Disposable code. Discard the entire codebase periodically and recreate it. Do this often enough and you will create smaller and smaller codebases, each isolated from the others. Sam Umbach points out that many effective startups are built on this idea: if the startup fails, you throw the code away; if it succeeds, you throw it away and rewrite.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Some applications live for decades. These require strong anti-entropy measures. Others live for days or weeks. Dirty code is more expensive to maintain, but with such a short lifespan, who cares if these get dirty? Whatever your approach, think about the expected lifespan of the codebase. Be deliberate about your approach to entropy.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/aq-gxJokKaA" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://thinkrelevance.com/blog/2013/05/21/entropy-and-evolution-of-a-codebase</feedburner:origLink></entry>
  <entry>
    <title>Chas Emerick, Mostly Lazy - Podcast Episode 031</title>
    <id>http://thinkrelevance.com/blog/2013/05/14/chas-emerick-mostly-lazy-podcast-episode-031</id>
    <updated>2013-05-14T14:00:00Z</updated>
    <published>2013-05-14T14:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/gitNjn1odfY/chas-emerick-mostly-lazy-podcast-episode-031" />
    <author>
      <name>Craig Andera</name>
      <email>craig@thinkrelevance.com</email>
    </author>
    <content type="html">&lt;p&gt;&lt;img src="http://s3.amazonaws.com/thinkrelevance-podcast/031-chas-emerick.jpg" alt="cover art"&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://cemerick.com/"&gt;Chas Emerick&lt;/a&gt; is a well-known and respected member of the Clojure community. His contributions to the Clojure world include the &lt;a href="https://github.com/cemerick/friend"&gt;Friend&lt;/a&gt; authentication library, the annual &lt;a href="http://cemerick.com/2012/07/19/2012-state-of-clojure-survey/"&gt;State of Clojure Survey&lt;/a&gt;, and, of course, &lt;a href="http://www.clojurebook.com/"&gt;his book&lt;/a&gt;, to name just a few. On top of that, he&amp;#39;s a very insightful and interesting person. So I was thrilled to get the chance to sit down with him and record what I think turned out to be a fascinating conversation. We talked about his book, his business, his secret new project, &amp;quot;100% time&amp;quot;, and the weight of the word &amp;quot;should&amp;quot;.&lt;/p&gt;

&lt;p&gt;As a bonus, although he and I disagree about whose idea this was (I still say it was his), we continued the conversation on &lt;a href="http://mostlylazy.com/"&gt;Mostly Lazy&lt;/a&gt;, his podcast. That episode should be available not too long after this one.&lt;/p&gt;

&lt;p&gt;Download the &lt;a href="http://s3.amazonaws.com/thinkrelevance-podcast/ThinkRelevance-031-chas-emerick.mp3"&gt;episode&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The show is &lt;a href="http://itunes.apple.com/us/podcast/thinkrelevance-the-podcast/id498067022"&gt;available on iTunes&lt;/a&gt;! You can also subscribe to the podcast using our &lt;a href="http://feeds.feedburner.com/thinkrelevance/podcast"&gt;podcast feed&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can send feedback about the show to &lt;a href="mailto:podcast@thinkrelevance.com"&gt;podcast@thinkrelevance.com&lt;/a&gt;, or leave a comment here on the blog. Thanks for listening!&lt;/p&gt;

&lt;h1&gt;Our Guest, Chas Emerick&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;His &lt;a href="http://cemerick.com/"&gt;blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/cemerick"&gt;@cemerick&lt;/a&gt; on Twitter&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cemerick"&gt;His GitHub home&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Music&lt;/h1&gt;

&lt;p&gt;Chas chose &lt;a href="http://www.youtube.com/watch?v=_TXmzT818_k"&gt;&amp;quot;Whispering Wind&amp;quot; by Moby&lt;/a&gt; as the intro, and &lt;a href="http://www.youtube.com/watch?v=MWzeInQaUk4"&gt;&amp;quot;Take me Home Country Roads&amp;quot; by John Denver&lt;/a&gt; to end the show.&lt;/p&gt;

&lt;h1&gt;Links&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mostlylazy.com/"&gt;Mostly Lazy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clojurewest.org/"&gt;Clojure/West&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Clojure-Programming-Chas-Emerick/dp/1449394701"&gt;Clojure Programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Programming-Clojure-Stuart-Halloway/dp/1934356867/ref=pd_sim_b_2"&gt;Programming Clojure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/The-Joy-Clojure-Thinking-Way/dp/1935182641/ref=pd_sim_b_2"&gt;Joy of Clojure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Clojure-Action-Amit-Rathore/dp/1935182595/ref=pd_sim_b_2"&gt;Clojure in Action&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clj-me.cgrand.net/"&gt;Christophe Grande&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://briancarper.net/"&gt;Brian Carper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.4clojure.com/"&gt;4Clojure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clojurescriptone.com/"&gt;ClojureScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/richhickey"&gt;Rich Hickey&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://oreilly.com/"&gt;O&amp;#39;Reilly Media&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dev.clojure.org/display/design/Tagged+Literals"&gt;Tagged Literals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clojure.org/downloads"&gt;Clojure 1.5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ring-clojure"&gt;Ring&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/puredanger"&gt;Alex Miller&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.pcs.org/about-the-armory/"&gt;Clojure/West Venue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dev.clojure.org/display/community/Clojure+User+Groups"&gt;Clojure Meetups&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.meetup.com/Functional-Programming-Connoisseurs/"&gt;Functional Programming Connoisseurs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/alex-warr"&gt;Alex Warr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/alex-redington"&gt;Alex Redington&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/justin-gehtland"&gt;Justin Gehtland&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team"&gt;Relevance People&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clojure-conj.org/"&gt;Clojure/conj&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cemerick.com/2012/08/06/results-of-the-2012-state-of-clojure-survey/"&gt;State of Clojure Survey&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://snowtide.com/"&gt;Snowtide Informatics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.dev.gd/20130122-the-joys-of-having-a-forever-project.html"&gt;Blog post about Forever Projects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Natural_language_processing"&gt;Natural Language Processing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pedestal.io/"&gt;Pedestal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.clojureatlas.com/"&gt;Clojure Atlas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/adamwynne/twitter-api"&gt;Adam Wynne, Twitter API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cemerick.com/2013/05/06/ann-imho/"&gt;Chas&amp;#39; Twitter App&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cemerick.com/2013/02/15/100-time/"&gt;100% Time Post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/how-we-work/dev_team"&gt;20% Time&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://overtone.github.io/"&gt;Overtone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.noamwasserman.com/category/rich-vs-king/"&gt;Rich vs. King&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.noamwasserman.com/"&gt;Noam Wasserman&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Credits&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Episode Cover Art:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/michael-parenteau"&gt;Michael Parenteau&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Production Assistance:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/lynn-grogan"&gt;Lynn Grogan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/daemian-mack"&gt;Daemian Mack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/gitNjn1odfY" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://thinkrelevance.com/blog/2013/05/14/chas-emerick-mostly-lazy-podcast-episode-031</feedburner:origLink></entry>
  <entry>
    <title>Jason Wolfe of Prismatic - Podcast Episode 030</title>
    <id>http://thinkrelevance.com/blog/2013/05/07/jason-wolfe-of-prismatic-podcast-episode-030</id>
    <updated>2013-05-07T14:30:00Z</updated>
    <published>2013-05-07T14:30:00Z</published>
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/NNTviTNeHjM/jason-wolfe-of-prismatic-podcast-episode-030" />
    <author>
      <name>Craig Andera</name>
      <email>craig@thinkrelevance.com</email>
    </author>
    <content type="html">&lt;p&gt;&lt;img src="http://s3.amazonaws.com/thinkrelevance-podcast/030-jason-wolfe.jpg" alt="cover art"&gt;&lt;/p&gt;

&lt;p&gt;One of the few unfortunate aspects to working at Relevance is that we sometimes know about people using Clojure in cool ways that we can&amp;#39;t talk about. So when &lt;a href="http://pivotallabs.com/author/bmoss/"&gt;Ben Moss&lt;/a&gt; suggested that we talk to someone at &lt;a href="http://getprismatic.com"&gt;Prismatic&lt;/a&gt;, I jumped at the chance. They have definitely put Clojure into production in a big and awesome way, and I was really glad to get the chance to talk to &lt;a href="http://getprismatic.com/profile/w01fe"&gt;Jason Wolfe&lt;/a&gt; about their experience building Prismatic, including some of the cool stuff they&amp;#39;ve open sourced out of it. A big thanks to Jason, and to you, our listeners.&lt;/p&gt;

&lt;p&gt;Download the &lt;a href="http://s3.amazonaws.com/thinkrelevance-podcast/ThinkRelevance-030-jason-wolfe.mp3"&gt;episode&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The show is &lt;a href="http://itunes.apple.com/us/podcast/thinkrelevance-the-podcast/id498067022"&gt;available on iTunes&lt;/a&gt;! You can also subscribe to the podcast using our &lt;a href="http://feeds.feedburner.com/thinkrelevance/podcast"&gt;podcast feed&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can send feedback about the show to &lt;a href="mailto:podcast@thinkrelevance.com"&gt;podcast@thinkrelevance.com&lt;/a&gt;, or leave a comment here on the blog. Thanks for listening!&lt;/p&gt;

&lt;h1&gt;Our Guest, Jason Wolfe&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;His &lt;a href="http://getprismatic.com/profile/w01fe"&gt;Prismatic Profile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/w01fe"&gt;@w01fe&lt;/a&gt; on Twitter&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/w01fe"&gt;His GitHub home&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Music&lt;/h1&gt;

&lt;p&gt;Jason chose &lt;a href="http://www.youtube.com/watch?v=7EbrMAZbFpo"&gt;&amp;quot;Fight Test&amp;quot; by The Flaming Lips&lt;/a&gt; as the intro, and &lt;a href="http://www.youtube.com/watch?v=OI3shBXlqsw"&gt;&amp;quot;Get Free&amp;quot; by Major Lazer&lt;/a&gt; to end the show.&lt;/p&gt;

&lt;h1&gt;Links&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://pivotallabs.com/author/bmoss/"&gt;Ben Moss&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://getprismatic.com/"&gt;Prismatic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clojurescriptone.com/"&gt;ClojureScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://getprismatic.com/profile/bradfordcross"&gt;Bradford Cross&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://getprismatic.com/profile/aria42"&gt;Aria Haghighi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Persistent_data_structure"&gt;Persistent Data Structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Java_virtual_machine"&gt;JVM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/profiling_%28computer_programming%29"&gt;Profiling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.yourkit.com/"&gt;YourKit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ring-clojure"&gt;Ring&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://aws.amazon.com/"&gt;Amazon Web Services&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://beanstalkapp.com/"&gt;Beanstalk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon EC2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://aws.amazon.com/s3/"&gt;Amazon S3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://aws.amazon.com/dynamodb/"&gt;Amazon DynamoDB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mmcgrana/ring/tree/master/ring-jetty-adapter"&gt;Jetty&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nginx.com/"&gt;NGINX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://aws.amazon.com/elasticloadbalancing/"&gt;ELB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/JSON"&gt;JSON&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://aws.amazon.com/cloudfront/"&gt;Amazon CloudFront&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/edn-format/edn"&gt;EDN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://aws.amazon.com/ebs/"&gt;EBS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.getprismatic.com/blog/2013/2/1/graph-abstractions-for-structured-computation"&gt;Graph&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.getprismatic.com/blog/2012/4/5/software-engineering-at-prismatic.html"&gt;Fine Grained, Composable Abstraction (FCA)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Declarative_programming"&gt;Declarative Programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vimeo.com/45561411"&gt;Rich Hickey, Reducers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/stuart-sierra"&gt;Stuart Sierra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/technomancy/leiningen"&gt;Leiningen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Emacs"&gt;Emacs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop"&gt;REPL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Lisp_%28programming_language%29"&gt;Lisp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/clojure/tools.namespace"&gt;Clojure.tools.namespace&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://help.github.com/articles/using-pull-requests"&gt;Github Pull Requests&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Action Items&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Clojure Style Guide&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Credits&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Episode Cover Art:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/michael-parenteau"&gt;Michael Parenteau&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Production Assistance:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/lynn-grogan"&gt;Lynn Grogan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/jamie-kite"&gt;Jamie Kite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/kevin-altman"&gt;Kevin Altman&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/NNTviTNeHjM" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://thinkrelevance.com/blog/2013/05/07/jason-wolfe-of-prismatic-podcast-episode-030</feedburner:origLink></entry>
  <entry>
    <title>Where to Find Relevancers: May Edition</title>
    <id>http://thinkrelevance.com/blog/2013/05/01/where-to-find-relevancers-may-edition-2</id>
    <updated>2013-05-01T14:00:00Z</updated>
    <published>2013-05-01T14:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/c7t3-yR10ag/where-to-find-relevancers-may-edition-2" />
    <author>
      <name>Lynn Grogan</name>
      <email>lynn@thinkrelevance.com</email>
    </author>
    <content type="html">&lt;p&gt;Want to meet a Relevancer in person? Here&amp;#39;s where you can find us during the month of May:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Little Rock, AR&lt;/strong&gt; 5/4 &lt;br/&gt;
&lt;a href="http://madebyfew.com/"&gt;Made by Few&lt;/a&gt; &lt;br/&gt;
Attending: &lt;a href="http://thinkrelevance.com/team/members/kevin-altman"&gt;Kevin Altman&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Norfolk, VA&lt;/strong&gt; 5/6 @ 6pm &lt;br/&gt;
&lt;a href="http://www.meetup.com/ruby-130/events/114425752/"&gt;757.rb Ruby Meetup Group&lt;/a&gt; &lt;br/&gt;
Speaking: &lt;a href="http://thinkrelevance.com/team/members/russ-olsen"&gt;Russ Olsen&lt;/a&gt;: Looking Inside Your Ruby Implementation&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sydney, Australia&lt;/strong&gt; 5/9 &lt;br/&gt;
&lt;a href="http://ynsydmay2013-eorg.eventbrite.com.au/"&gt;YOW! Night&lt;/a&gt; &lt;br/&gt;
Speaking: &lt;a href="http://thinkrelevance.com/team/members/stuart-sierra"&gt;Stuart Sierra&lt;/a&gt;: Clojure: Lisp for the Real World&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cambridge, MA&lt;/strong&gt; 5/9 @ 6:30pm &lt;br/&gt;
&lt;a href="http://www.meetup.com/Boston-Clojure-Group/events/112568172/"&gt;Clojure Meetup&lt;/a&gt; &lt;br/&gt;
Attending: &lt;a href="http://thinkrelevance.com/team/members/gabriel-horner"&gt;Gabriel Horner&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sydney, Australia&lt;/strong&gt; 5/10-5/11 &lt;br/&gt;
&lt;a href="http://clojurecore-sydney-eorg.eventbrite.com.au/"&gt;Intro to Clojure Training&lt;/a&gt; &lt;br/&gt;
Trainer: &lt;a href="http://thinkrelevance.com/team/members/stuart-sierra"&gt;Stuart Sierra&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Brisbane, Australia&lt;/strong&gt; 5/14-5/15 &lt;br/&gt;
&lt;a href="http://clojurecore-brisbane-eorg.eventbrite.com.au/"&gt;Intro to Clojure Training&lt;/a&gt; &lt;br/&gt;
Trainer: &lt;a href="http://thinkrelevance.com/team/members/stuart-sierra"&gt;Stuart Sierra&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Portland, OR&lt;/strong&gt; 5/15 &lt;br/&gt;
&lt;a href="http://rfrshpdx.org/event/"&gt;Refresh PDX&lt;/a&gt; &lt;br/&gt;
Speaker: &lt;a href="http://thinkrelevance.com/team/members/michael-parenteau"&gt;Michael Parenteau&lt;/a&gt;: The Myth of the Half-Brained Designer… And Their Magic Vacuum&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Brisbane, Australia&lt;/strong&gt; 5/16-5/17 &lt;br/&gt;
&lt;a href="http://www.yowconference.com.au/lambdajam/"&gt;YOW! Lambda Jam&lt;/a&gt; &lt;br/&gt;
Speaking: &lt;a href="http://www.yowconference.com.au/lambdajam/Speakers.html"&gt;Stuart Sierra&lt;/a&gt;: Keynote, Data, Visibility &amp;amp; Abstraction; Datomic Jam&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Melbourne, Australia&lt;/strong&gt; 5/20-5/21 &lt;br/&gt;
&lt;a href="http://clojurecore-melbourne-eorg.eventbrite.com.au/"&gt;Intro to Clojure Training&lt;/a&gt;&lt;br/&gt;
Trainer: &lt;a href="http://thinkrelevance.com/team/members/stuart-sierra"&gt;Stuart Sierra&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Melbourne, Australia&lt;/strong&gt; 5/21 &lt;br/&gt;
&lt;a href="http://ynmelmay2013-eorg.eventbrite.com.au/"&gt;YOW! Night&lt;/a&gt; &lt;br/&gt;
Speaking: &lt;a href="http://thinkrelevance.com/team/members/stuart-sierra"&gt;Stuart Sierra&lt;/a&gt;: Clojure: Lisp for the Real World&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/c7t3-yR10ag" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://thinkrelevance.com/blog/2013/05/01/where-to-find-relevancers-may-edition-2</feedburner:origLink></entry>
  <entry>
    <title>Lake Denman - Podcast Episode 029</title>
    <id>http://thinkrelevance.com/blog/2013/04/23/lake-denman-podcast-episode-029</id>
    <updated>2013-04-23T14:00:00Z</updated>
    <published>2013-04-23T14:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/51sLC6xgpDs/lake-denman-podcast-episode-029" />
    <author>
      <name>Craig Andera</name>
      <email>craig@thinkrelevance.com</email>
    </author>
    <content type="html">&lt;p&gt;&lt;img src="http://s3.amazonaws.com/thinkrelevance-podcast/029-lake-denman.jpg" alt="cover art"&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://thinkrelevance.com/team/members/michael-parenteau"&gt;Michael Parenteau&lt;/a&gt; suggested to me that we ought to have &lt;a href="http://thinkrelevance.com/team/members/lake-denman"&gt;Lake Denman&lt;/a&gt; on the show. &amp;quot;He&amp;#39;s done some cool stuff, man.&amp;quot; I remember hearing about a crazy and awesome Arduino project that Lake had worked on, so I thought, &amp;quot;Yeah, sure, we should totally have Lake on.&amp;quot; And I&amp;#39;m very glad we did: Lake has indeed worked on some amazingly creative projects, and he has even more ambitious and interesting ones in mind. I hope you enjoy listening to him talk about them on this &lt;a href="http://s3.amazonaws.com/thinkrelevance-podcast/ThinkRelevance-029-lake-denman.mp3"&gt;episode&lt;/a&gt; as much as I enjoyed hearing them.&lt;/p&gt;
&lt;p&gt;The show is &lt;a href="http://itunes.apple.com/us/podcast/thinkrelevance-the-podcast/id498067022"&gt;available on iTunes&lt;/a&gt;! You can also subscribe to the podcast using our &lt;a href="http://feeds.feedburner.com/thinkrelevance/podcast"&gt;podcast feed&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can send feedback about the show to &lt;a href="mailto:podcast@thinkrelevance.com"&gt;podcast@thinkrelevance.com&lt;/a&gt;, or leave a comment here on the blog. Thanks for listening!&lt;/p&gt;

&lt;h1&gt;Our Guest, Lake Denman&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/l4k3"&gt;@L4k3&lt;/a&gt; on Twitter&lt;/li&gt;
&lt;li&gt;His &lt;a href="http://thinkrelevance.com/team/members/lake-denman"&gt;Relevance profile&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Music&lt;/h1&gt;

&lt;p&gt;Lake chose &lt;a href="http://www.youtube.com/watch?v=q-KE9lvU810"&gt;&amp;quot;Cherub Rock&amp;quot; by The Smashing Pumpkins&lt;/a&gt; as the intro, and &lt;a href="https://soundcloud.com/nailbiter-society"&gt;&amp;quot;Folk You&amp;quot; by Lake Denman/Nailbiter Society&lt;/a&gt; to end the show.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/michael-parenteau"&gt;Michael Parenteau&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/The_Smashing_Pumpkins"&gt;The Smashing Pumpkins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Charlotte,_North_Carolina"&gt;Charlotte, NC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://coreyhaines.com/"&gt;Corey Haines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.facebook.com/media/set/?set=a.131323010223352.16168.127784347243885&amp;amp;type=3"&gt;Relevance Roger’s Alley Office&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.davidchelimsky.net/"&gt;David Chelimsky&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.entryway.net/"&gt;Entryway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/bobby-calderwood"&gt;Bobby Calderwood&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/justin-gehtland"&gt;Justin Gehtland&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.arduino.cc/"&gt;Arduino&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Lucid_dream"&gt;Lucid Dreaming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arduino.cc/blog/2012/04/24/control-your-dreams-using-diy-goggles/"&gt;Arduino Lucid Dreaming Mask&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Microcontroller"&gt;Microcontroller&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.jodyculkin.com/wp-content/uploads/2011/09/arduino-comic-latest3.pdf"&gt;Arduino Comic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.imdb.com/title/tt0259711/"&gt;Vanilla Sky&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Dream_diary"&gt;Dream Journal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Sparkfun-Inventors-professional-Arduino-retail/dp/B005FMNJ3S/ref=sr_1_2?ie=UTF8&amp;amp;qid=1360764279&amp;amp;sr=8-2&amp;amp;keywords=arduino+starter+kit"&gt;Arduino Kit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/how-we-work/dev_team#dev_team-fridays"&gt;Fridays (20% Time)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://buy.garmin.com/shop/"&gt;Garmin Watch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.instructables.com/id/Arduino-Watch-Build-Instructions/"&gt;Arduino Watch Instructions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.google.com/earth/index.html"&gt;Google Earth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arduino.cc/en/main/software"&gt;Arduino Software&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arduino.cc/en/Reference/Libraries"&gt;Arduino Libraries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://playground.arduino.cc/Main/InterfacingWithHardware#location"&gt;Arduino GPS Libraries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arduino.cc/en/Reference/SD"&gt;Arduino SD Libraries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arduino.cc/en/Reference/Setup"&gt;Arduino Setup Method&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arduino.cc/en/Reference/loop"&gt;Arduino Loop Method&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.raspberrypi.org/"&gt;Raspberry PI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/ARM_architecture"&gt;Arm Processor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/russ-olsen"&gt;Russ Olsen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Acoustic_coupler"&gt;Acoustically Coupled Modem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ikea.com/us/en/catalog/products/40104294/"&gt;Ikea Table&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.instructables.com/member/grahamgelding/"&gt;Raspberry Pi Arcade Table Instructions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.retrojunk.com/article/show/3717/what-happened-to-pizza-hut"&gt;Pizza Hut Nostalgia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Retro-Nintendo-Controller-Not-Machine-Specific/dp/B0034ZOAO0"&gt;SNES USB Controllers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Super_Mario_World"&gt;Super Mario World&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.petrockblock.com/retropie/"&gt;RetroPie Description&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/petrockblog/RetroPie-Setup"&gt;RetroPie Setup on Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://xbmc.org/"&gt;XBMC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.apple.com/airplay/"&gt;Apple Air Play&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Home_automation"&gt;Home Automation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.x10.com/homepage.htm"&gt;X10&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.hacktronics.com/Tutorials/arduino-motion-sensor.html"&gt;Motion Sensor for Arduino&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://phonegap.com/"&gt;PhoneGap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clojurescriptone.com/"&gt;ClojureScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cbilson/lein-robbie"&gt;PhoneGap ClojureScript Library&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://leiningen.org/"&gt;Leiningen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clojure.com/about.html"&gt;Clojure/core&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/stuart-sierra"&gt;Stuart Sierra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/luke-vanderhart"&gt;Luke VanderHart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/stuart-halloway"&gt;Stu Halloway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/training"&gt;Clojure Training&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://shop.oreilly.com/product/0636920025139.do"&gt;ClojureScript: Up &amp;amp; Running&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clojurescript.eventbrite.com/"&gt;ClojureScript Training&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clojurewest.org/"&gt;Clojure/West&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clojurewest.org/sessions#ashworth"&gt;Pedestal Release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.kickstarter.com/projects/dustinandrews/robotic-minion-start-kit-arduino-compatible"&gt;Robotic Minion on KickStarter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=id9FRyI8T7k"&gt;Arduino MIDI Drum Controller&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=6Sf_pogZ8jE"&gt;Invisible Drum Kit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Credits&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Episode Cover Art:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/michael-parenteau"&gt;Michael Parenteau&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Production Assistance:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/lynn-grogan"&gt;Lynn Grogan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/daemian-mack"&gt;Daemian Mack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/51sLC6xgpDs" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://thinkrelevance.com/blog/2013/04/23/lake-denman-podcast-episode-029</feedburner:origLink></entry>
  <entry>
    <title>The Shoemakers</title>
    <id>http://thinkrelevance.com/blog/2013/04/22/the-shoemakers</id>
    <updated>2013-04-22T14:30:00Z</updated>
    <published>2013-04-22T14:30:00Z</published>
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/00z0m7IRAqU/the-shoemakers" />
    <author>
      <name>Michael Nygard</name>
      <email>mtnygard@thinkrelevance.com</email>
    </author>
    <content type="html">&lt;p&gt;Over an email thread a little while back, one of my colleagues suggested that
programming should be a required subject in high school. To survive in
today&amp;#39;s world, everyone should have a basic understanding of
programming because technology is so essential to everyone&amp;#39;s
lives. His friend retorted that, &amp;quot;Since shoes are also essential, 
high school students should take a mandatory year of cobbling.&amp;quot;&lt;/p&gt;
&lt;p&gt;I think the shoemaker analogy falls apart in a big way.
Companies don&amp;#39;t need to modify their shoes every time they want to
execute a business strategy. But I can&amp;#39;t think of any serious
strategic change that &lt;em&gt;doesn&amp;#39;t&lt;/em&gt; require software changes. I think this fallacy is also behind the notion of &amp;quot;outsourcing IT because it&amp;#39;s not &amp;#39;core&amp;#39;.&amp;quot; Technology is core to &lt;em&gt;every&lt;/em&gt; company&amp;#39;s business today.&lt;/p&gt;

&lt;p&gt;For example, suppose a big box shoe retailer in the US wants to enter the Canadian
market by opening just one store. Building the store and hiring the staff is the
single smallest part of that challenge. The retailer will need to set up at
least one new distribution center, so their supply chain systems will have to change. Canada has a completely different tax system from the US, so that means they either have to extend their current tax system to
support VAT and Canadian product classifications or, more likely,
create a parallel tax system for the new market. Two tax systems means
a new feed into their general ledger system.&lt;/p&gt;

&lt;p&gt;Products in some parts of Canada have to be labeled in both English and French so their merchandising system needs to keep track of multiple languages. The same goes for their online content management system.&lt;/p&gt;

&lt;p&gt;Employment laws are different in Canada, so the HR systems have to be extended, updated, or run in parallel to keep track of the workforce. Payroll is probably outsourced to an in-market provider, but a new feed will have to be built there.&lt;/p&gt;

&lt;p&gt;Data privacy laws are different, and they prohibit storing customer data in any US jurisdiction (thanks to the PATRIOT act). That means a new &amp;quot;single system of record&amp;quot; for the customer database. Any system dealing with loyalty programs also has to be updated to know about both customer databases.&lt;/p&gt;

&lt;p&gt;Oh, and the website should support single sign-on so a customer can use their one account ID and password no matter where they happen to be. A Canadian customer must be authenticated against the Canadian customer database, so identity federation comes into play.&lt;/p&gt;

&lt;p&gt;I&amp;#39;m already tired just writing this much up. There are probably a half-dozen other major enterprise systems that would all have to be modified, duplicated, integrated, or federated just to open this one
store in Canada.&lt;/p&gt;

&lt;p&gt;But I bet the employees can still wear the same shoes.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/00z0m7IRAqU" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://thinkrelevance.com/blog/2013/04/22/the-shoemakers</feedburner:origLink></entry>
  <entry>
    <title>Ben Vandgrift - Podcast Episode 028</title>
    <id>http://thinkrelevance.com/blog/2013/04/09/ben-vandgrift-podcast-episode-028</id>
    <updated>2013-04-09T14:00:00Z</updated>
    <published>2013-04-09T14:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/vb-RK1HkRgI/ben-vandgrift-podcast-episode-028" />
    <author>
      <name>Craig Andera</name>
      <email>craig@thinkrelevance.com</email>
    </author>
    <content type="html">&lt;p&gt;&lt;img src="http://s3.amazonaws.com/thinkrelevance-podcast/028-ben-vandgrift.jpg" alt="cover art"&gt;&lt;/p&gt;

&lt;p&gt;Pretty much every conversation I&amp;#39;ve ever had with &lt;a href="http://thinkrelevance.com/team/members/ben-vandgrift"&gt;Ben Vandgrift&lt;/a&gt; has involved him saying something profound or insightful. I think this &lt;a href="http://s3.amazonaws.com/thinkrelevance-podcast/ThinkRelevance-028-ben-vandgrift.mp3"&gt;episode&lt;/a&gt; of the podcast was no exception, as we talked about Ben&amp;#39;s experience as a relative newcomer to Clojure, and he had some constructive (and slightly painful) feedback for the Clojure community. We also got to talk about (inc Relevance), the quarterly gathering of Relevance employees, which Ben spearheads. I hope you enjoy the show!&lt;/p&gt;
&lt;p&gt;The show is &lt;a href="http://itunes.apple.com/us/podcast/thinkrelevance-the-podcast/id498067022"&gt;available on iTunes&lt;/a&gt;! You can also subscribe to the podcast using our &lt;a href="http://feeds.feedburner.com/thinkrelevance/podcast"&gt;podcast feed&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can send feedback about the show to &lt;a href="mailto:podcast@thinkrelevance.com"&gt;podcast@thinkrelevance.com&lt;/a&gt;, or leave a comment here on the blog. Thanks for listening!&lt;/p&gt;

&lt;h1&gt;Our Guest, Ben Vandgrift&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://twitter.com/bvandgrift"&gt;@bvandgrift&lt;/a&gt; on Twitter&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.github.com/bvandgrift"&gt;On GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;His &lt;a href="http://thinkrelevance.com/team/members/ben-vandgrift"&gt;Relevance profile&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Music&lt;/h1&gt;

&lt;p&gt;Ben chose &amp;quot;&lt;a href="http://www.youtube.com/watch?v=3HUGeA2lur4"&gt;Beat on the Brat&lt;/a&gt;&amp;quot; by The Ramones as the intro, and &amp;quot;&lt;a href="http://www.youtube.com/watch?v=N-EKcjpEIGo"&gt;I Wanna be Sedated&lt;/a&gt;&amp;quot; by The Ramones to end the show.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Lisp_%28programming_language%29"&gt;Lisp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rubyonrails.org/"&gt;Rails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.schemers.org/"&gt;Scheme&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Functional_programming"&gt;Functional programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Object-oriented_programming"&gt;Object-oriented programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/C_Sharp_%28programming_language%29"&gt;C#&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cemerick.com/"&gt;Chas Emerick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ccs.neu.edu/home/matthias/BTLS/"&gt;The Little Schemer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://landoflisp.com/"&gt;Land of Lisp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop"&gt;REPL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.gnu.org/software/emacs/"&gt;Emacs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Concurrency_%28computer_science%29"&gt;Concurrency&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clojuredocs.org/clojure_core/clojure.core/mapcat"&gt;mapcat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Drinking_the_Kool-Aid"&gt;Drinking the Kool-Aid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.sinatrarb.com/"&gt;Sinatra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.washington.edu/computing/unix/shell.html"&gt;Shell scripts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.paulgraham.com/avg.html"&gt;Paul Graham and the Blub Paradox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.gnu.org/software/bash/manual/bashref.html"&gt;Bash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.infoq.com/presentations/Simple-Made-Easy"&gt;Rich Hickey - Simple Made Easy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=fTqxFIpc1j4"&gt;The Noisy Cricket&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/justin-gehtland"&gt;Justin Gehtland&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dreisbach.us/"&gt;Clinton Dreisbach&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/diane-butler"&gt;Diane Butler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/lynn-grogan"&gt;Lynn Grogan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.charlottesgotalot.com/"&gt;Charlotte&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.durham-nc.com/"&gt;Durham&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.airbnb.com/"&gt;Airbnb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://railsrumble.com/"&gt;Rails Rumble&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://startupweekend.org/"&gt;Startup Weekend&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodeknockout.com/"&gt;Node Knockout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/blog/2012/05/02/why-retrospectives-should-get-personal"&gt;Personal Retrospective&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pedestal.io/"&gt;Pedestal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Credits&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Episode Cover Art:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/kevin-altman"&gt;Kevin Altman&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Production Assistance:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/marc-phillips"&gt;Marc Phillips&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/lynn-grogan"&gt;Lynn Grogan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/jamie-kite"&gt;Jamie Kite&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/vb-RK1HkRgI" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://thinkrelevance.com/blog/2013/04/09/ben-vandgrift-podcast-episode-028</feedburner:origLink></entry>
  <entry>
    <title>Abstraction or Leverage?</title>
    <id>http://thinkrelevance.com/blog/2013/04/04/abstraction-or-leverage</id>
    <updated>2013-04-04T13:30:00Z</updated>
    <published>2013-04-04T13:30:00Z</published>
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/OB9xsmHqwGU/abstraction-or-leverage" />
    <author>
      <name>Michael Nygard</name>
      <email>mtnygard@thinkrelevance.com</email>
    </author>
    <content type="html">&lt;p&gt;A colleague of mine recently accused me of speaking too precisely. He was
giving me a bit of grief, but I took it as a compliment. In this
industry, we torture words until they give up all meaning. Keep your
eyes open for the next time you read the word &amp;quot;significant.&amp;quot; Does it
actually refer to something that signifies? Or is it just salt,
sprinkled in for flavor?&lt;/p&gt;

&lt;p&gt;One of the words I see overused is &amp;quot;abstraction.&amp;quot; I hear developers use it when they talk about the DRY
principle and reducing common code. Reducing common code to eliminate
repetition improves your leverage, but not necessarily abstraction. Leverage allows you to make a change in one
place that affects all uses.&lt;/p&gt;

&lt;p&gt;As an example, think about one of my favorite code-eating patterns in
OO: the &lt;a href="http://c2.com/cgi/wiki?NullObject"&gt;Null Object&lt;/a&gt; pattern. It
concentrates a lot of &amp;quot;if not null&amp;quot; code into one place, which
means you can change the logic in that one place. That&amp;#39;s leverage:
you can make a small changes with large-scale effects.&lt;/p&gt;

&lt;p&gt;&amp;quot;Extract method&amp;quot; and &amp;quot;extract superclass&amp;quot; transformations
fall into this camp. They add leverage, which is useful. &lt;/p&gt;

&lt;p&gt;By drawing this distinction, I&amp;#39;m not criticizing leverage. It&amp;#39;s useful and important. But
there&amp;#39;s an additional thing to consider. When you extract common code to gain leverage, you
have little ability to ignore details. Indeed, the specific case is
often tightly coupled to the implementation of the general case.&lt;/p&gt;

&lt;p&gt;(I will admit that when I distill code down this way, it sometimes clears away the cobwebs enough to see the abstraction that was lurking in the corner. That&amp;#39;s always a lovely feeling. So leverage can lead to abstraction.)&lt;/p&gt;

&lt;p&gt;The essence of abstraction is &lt;em&gt;cleaving&lt;/em&gt;. Abstraction
separates a manifold thing into independent concepts. By separating
the concepts, it also allows us to see connections between things that
share one of those concepts. So abstraction also illuminates connections
between things.&lt;/p&gt;

&lt;p&gt;For example, consider Clojure&amp;#39;s seq (pronounced &amp;quot;seek&amp;quot;) abstraction. It calls out the concept &amp;quot;Sequential Iteration,&amp;quot; thus bringing together everything that acts like an ordered sequence that can be walked. At the same time, it separates that concept from others. For a vector, seq separates that concept of &amp;quot;Sequential Iteration&amp;quot; from the
concepts of &amp;quot;Random Access,&amp;quot; &amp;quot;Stacklike Object,&amp;quot; and &amp;quot;Lazy
Evaluation.&amp;quot; For a string, seq separates &amp;quot;Sequential Iteration&amp;quot; from &amp;quot;Unicode Storage&amp;quot; and
&amp;quot;Regex Matching.&amp;quot; That&amp;#39;s the part about separating a manifold
thing. At the same time, &amp;quot;seq&amp;quot; shows us that there is an important
characteristic shared across all those implementations.&lt;/p&gt;

&lt;p&gt;In each case, the abstraction allows us to emphasize a particular
aspect of the thing while disregarding the rest. This is the dual nature of
abstraction: it obscures and reveals.&lt;/p&gt;

&lt;p&gt;As it happens, good abstractions also provide leverage, because they separate concerns. I think this is why the words get conflated. All abstractions offer leverage, but not all leverage is an abstraction. &lt;/p&gt;

&lt;p&gt;As you work on your designs, think about where you can split those conceptual atoms. What ideas can you separate? How can you then reconnect the shared concepts?&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/OB9xsmHqwGU" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://thinkrelevance.com/blog/2013/04/04/abstraction-or-leverage</feedburner:origLink></entry>
  <entry>
    <title>Where to Find Relevancers: April Edition</title>
    <id>http://thinkrelevance.com/blog/2013/04/01/where-to-find-relevancers-april-edition</id>
    <updated>2013-04-01T14:00:00Z</updated>
    <published>2013-04-01T14:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/V12nxw9T0Uk/where-to-find-relevancers-april-edition" />
    <author>
      <name>Lynn Grogan</name>
      <email>lynn@thinkrelevance.com</email>
    </author>
    <content type="html">&lt;p&gt;Want to meet a Relevancer in person? Here&amp;#39;s where you can find us during the month of April:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Philadelphia, PA&lt;/strong&gt; 4/2-4/4 &lt;br/&gt;
&lt;a href="http://phillyemergingtech.com/2013"&gt;Emerging Technologies for the Enterprise&lt;/a&gt; &lt;br/&gt;
Speaking: &lt;a href="http://thinkrelevance.com/team/members/stuart-sierra"&gt;Stuart Sierra&lt;/a&gt;: &lt;a href="http://phillyemergingtech.com/2013/sessions/clojure-clojurescript-one-language-to-rule-the-web"&gt;Clojure/ClojureScript: One Language to Rule the Web&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;St. Augustine, FL&lt;/strong&gt; 4/4-4/5 &lt;br/&gt;
&lt;a href="http://www.ancientcityruby.com/"&gt;Ancient City Ruby&lt;/a&gt; &lt;br/&gt;
Speaking: &lt;a href="http://thinkrelevance.com/team/members/russ-olsen"&gt;Russ Olsen&lt;/a&gt;: Insight, Intuition and Programming&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Panama City Beach, FL&lt;/strong&gt; 4/11-4/14 &lt;br/&gt;
&lt;a href="http://lessconf.lesseverything.com/"&gt;LessConf&lt;/a&gt; &lt;br/&gt;
Attending: &lt;a href="http://thinkrelevance.com/team/members/maggie-litton"&gt;Maggie Litton&lt;/a&gt;, &lt;a href="http://thinkrelevance.com/team/members/ben-vandgrift"&gt;Ben Vandgrift&lt;/a&gt;, &lt;a href="http://thinkrelevance.com/team/members/marc-phillips"&gt;Marc Phillips&lt;/a&gt;, &lt;a href="http://thinkrelevance.com/team/members/ryan-neufeld"&gt;Ryan Neufeld&lt;/a&gt;, &lt;a href="http://thinkrelevance.com/team/members/kevin-altman"&gt;Kevin Altman&lt;/a&gt;, &lt;a href="http://thinkrelevance.com/team/members/sam-umbach"&gt;Sam Umbach&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Durham, NC&lt;/strong&gt; 4/16 &lt;br/&gt;
&lt;a href="http://www.meetup.com/raleighrb/"&gt;West End Ruby Hack Night&lt;/a&gt; @ &lt;a href="http://thinkrelevance.com/contact"&gt;Relevance HQ&lt;/a&gt; &lt;br/&gt;
Attending: &lt;a href="http://thinkrelevance.com/team/members/sam-umbach"&gt;Sam Umbach&lt;/a&gt;, &lt;a href="http://thinkrelevance.com/team/members/yoko-harada"&gt;Yoko Harada&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alexandria, VA&lt;/strong&gt; 4/23 @ 6pm &lt;br/&gt;
&lt;a href="http://www.meetup.com/ClojureDC/events/111301342/"&gt;ClojureDC Meetup Group&lt;/a&gt; &lt;br/&gt;
Speaking: &lt;a href="http://thinkrelevance.com/team/members/bobby-calderwood"&gt;Bobby Calderwood&lt;/a&gt;: Datomic&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Durham, NC&lt;/strong&gt; 4/25 @ 7pm &lt;br/&gt;
&lt;a href="http://www.meetup.com/TriClojure/events/112260502/?a=ea1_grp&amp;amp;rv=ea1&amp;amp;_af_eid=112260502&amp;amp;_af=event"&gt;Triangle Clojure Meetup Group&lt;/a&gt; @ &lt;a href="http://thinkrelevance.com/contact"&gt;Relevance HQ&lt;/a&gt;&lt;br/&gt;
Pedestal Q&amp;amp;A Leader: &lt;a href="http://thinkrelevance.com/team/members/ryan-neufeld"&gt;Ryan Neufeld&lt;/a&gt; &lt;br/&gt;
Attending: &lt;a href="http://thinkrelevance.com/team/members/chris-redinger"&gt;Chris Redinger&lt;/a&gt;, &lt;a href="http://thinkrelevance.com/team/members/daemian-mack"&gt;Daemian Mack&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Columbia, SC&lt;/strong&gt; 4/25-4/26 &lt;br/&gt;
&lt;a href="http://convergese.com/"&gt;ConvergeSE&lt;/a&gt; &lt;br/&gt;
Attending: &lt;a href="http://thinkrelevance.com/team/members/ben-vandgrift"&gt;Ben Vandgrift&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Portland, OR&lt;/strong&gt; 4/29-5/2 &lt;br/&gt;
&lt;a href="http://www.railsconf.com/"&gt;RailsConf&lt;/a&gt; &lt;br/&gt;
Speaking: &lt;a href="http://thinkrelevance.com/team/members/yoko-harada"&gt;Yoko Harada&lt;/a&gt;: &lt;a href="http://www.railsconf.com/2013/talks#talk-23"&gt;Datomic, From Ruby, From Rails&lt;/a&gt; &lt;br/&gt;
Attending: &lt;a href="http://thinkrelevance.com/team/members/jamie-kite"&gt;Jamie Kite&lt;/a&gt;, &lt;a href="http://thinkrelevance.com/team/members/lake-denman"&gt;Lake Denman&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/V12nxw9T0Uk" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://thinkrelevance.com/blog/2013/04/01/where-to-find-relevancers-april-edition</feedburner:origLink></entry>
  <entry>
    <title>Quick Bits from Speakerconf</title>
    <id>http://thinkrelevance.com/blog/2013/03/22/quick-bits-from-speakerconf</id>
    <updated>2013-03-22T18:30:00Z</updated>
    <published>2013-03-22T18:30:00Z</published>
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/c5b99D1JeQg/quick-bits-from-speakerconf" />
    <author>
      <name>Michael Nygard</name>
      <email>mtnygard@thinkrelevance.com</email>
    </author>
    <content type="html">&lt;p&gt;You know how one of the best parts of any conference is the &amp;quot;hallway track?&amp;quot; &lt;a href="http://speakerconf.com/"&gt;Speakerconf&lt;/a&gt; is designed to maximize that experience: conversation shaped by talks, but with more opportunity for many-to-many communication.&lt;/p&gt;

&lt;p&gt;The speakers are diverse and so are the topics. I thought I would share some of the more interesting references that came up during our discussions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LEDBAT (&lt;a href="http://tools.ietf.org/html/rfc6817"&gt;RFC 6817&lt;/a&gt;). &amp;quot;Lower-than-best-effort&amp;quot; data transfer reduces congestion by deliberately adding latency.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bittorrent/libutp"&gt;libutp&lt;/a&gt; - The uTorrent transport protocol library, which implements LEDBAT.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.jwz.org/blog/2003/07/de-shredder/"&gt;Iranian weavers&lt;/a&gt; deshredding documents from the U.S. embassy in Tehran in 1979, and the &lt;a href="http://en.wikipedia.org/wiki/DARPA_Shredder_Challenge_2011"&gt;DARPA challenge from 2011&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.crazyegg.com/"&gt;crazyegg&lt;/a&gt; - a service for heat mapping overlays on web pages.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.inf.ed.ac.uk/teaching/courses/propm/papers/CTL.pdf"&gt;Computational Tree Logic&lt;/a&gt; - an extension of first-order predicate logic to cover future universes. Quantifiers include &amp;quot;there exists at least one universe in which!&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.theatlantic.com/magazine/archive/1945/07/as-we-may-think/303881/"&gt;As We May Think&lt;/a&gt; - An enormously influential essay by Vannevar Bush.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.cse.chalmers.se/%7Erjmh/Papers/arrows.pdf"&gt;Generalizing Monads to Arrows&lt;/a&gt; - One of John Hughes&amp;#39; many excellent papers about abstraction.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Probabilistic-Graphical-Models-Principles-Computation/dp/0262013193"&gt;Probabilistic Graphical Models&lt;/a&gt; - A method for integrating uncertain beliefs to estimate likelihood of outcomes, like Bayesian networks on steroids.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lexifi.com/files/resources/MLFiPaper.pdf"&gt;Composing Contracts&lt;/a&gt; - A paper by Simon Peyton-Jones on using combinators in a functional language to model financial instruments.&lt;/li&gt;
&lt;li&gt;Five flavors of logic: miniKanran, cKanran, alphaKanran, and a couple more that I can&amp;#39;t remember.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As you can imagine, it was a stimulating week. Thanks to Jay Fields and Josh Graham for organizing it, and a special thanks to the sponsors &lt;a href="http://www.forward.co.uk/"&gt;Forward&lt;/a&gt;, &lt;a href="http://www.innoq.com/"&gt;innoQ&lt;/a&gt;, and &lt;a href="http://www.drw.com/"&gt;DRW Trading&lt;/a&gt; who make it possible.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/c5b99D1JeQg" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://thinkrelevance.com/blog/2013/03/22/quick-bits-from-speakerconf</feedburner:origLink></entry>
  <entry>
    <title>Tim Ewald on Pedestal - Podcast Episode 027</title>
    <id>http://thinkrelevance.com/blog/2013/03/18/pedestal-podcast-episode-027</id>
    <updated>2013-03-18T20:30:00Z</updated>
    <published>2013-03-18T20:30:00Z</published>
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/q0w9bGnvfvg/pedestal-podcast-episode-027" />
    <author>
      <name>Craig Andera</name>
      <email>craig@thinkrelevance.com</email>
    </author>
    <content type="html">&lt;p&gt;&lt;img src="http://s3.amazonaws.com/thinkrelevance-podcast/027-tim-ewald.jpg" alt="cover art"&gt;&lt;/p&gt;

&lt;p&gt;As this post goes up, &lt;a href="http://thinkrelevance.com/team/members/tim-ewald"&gt;Tim Ewald&lt;/a&gt; and &lt;a href="http://thinkrelevance.com/team/members/stuart-halloway"&gt;Stu Halloway&lt;/a&gt; are on stage at &lt;a href="http://clojurewest.org"&gt;Clojure/West&lt;/a&gt; unveiling &lt;a href="http://pedestal.io"&gt;Pedestal&lt;/a&gt;, a set of open source libraries for writing web applications and services in Clojure. We here at Relevance have been hard at work on it for months, and we&amp;#39;re extremely excited to be able to finally share it with the world.&lt;/p&gt;

&lt;p&gt;In this &lt;a href="http://s3.amazonaws.com/thinkrelevance-podcast/ThinkRelevance-027-tim-ewald.mp3"&gt;episode&lt;/a&gt;, I talk with my close friend Tim about what Pedestal is, why we wrote it, and what makes it so interesting. Enjoy!&lt;/p&gt;
&lt;p&gt;The show is &lt;a href="http://itunes.apple.com/us/podcast/thinkrelevance-the-podcast/id498067022"&gt;available on iTunes&lt;/a&gt;! You can also subscribe to the podcast using our &lt;a href="http://feeds.feedburner.com/thinkrelevance/podcast"&gt;podcast feed&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can send feedback about the show to &lt;a href="mailto:podcast@thinkrelevance.com"&gt;podcast@thinkrelevance.com&lt;/a&gt;, or leave a comment here on the blog. Thanks for listening!&lt;/p&gt;

&lt;h1&gt;Our Guest,&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/tim-ewald"&gt;Tim Ewald&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Music&lt;/h1&gt;

&lt;p&gt;Tim chose &lt;a href="http://www.youtube.com/watch?v=mCpzgcH0QBE"&gt;&amp;quot;Darkness on the Edge of Town&amp;quot; by Bruce Springsteen&lt;/a&gt; as the intro, and &lt;a href="http://brucespringsteen.net/"&gt;&amp;quot;Blinded by the Light&amp;quot; by Bruce Springsteen&lt;/a&gt; to end the show.&lt;/p&gt;

&lt;h1&gt;Links&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://clojurewest.org/"&gt;Clojure/West&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pedestal.io/"&gt;Pedestal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/clojure/clojurescript"&gt;ClojureScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/edn-format/edn"&gt;edn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/HTTP_pipelining"&gt;HTTP pipeline&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ring-clojure/ring"&gt;Ring&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Push_technology#Long_polling"&gt;Long polling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Interceptor_pattern"&gt;Interceptor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/technomancy/leiningen"&gt;Leiningen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Document_Object_Model"&gt;DOM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Event_%28computing%29#Event_handler"&gt;Event handlers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Data_structure"&gt;Data structures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Immutable_object"&gt;Immutability&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/brenton-ashworth"&gt;Brenton Ashworth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/stuart-sierra"&gt;Stuart Sierra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Open_source_software"&gt;Open source&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/how-we-work/dev_team#dev_team-fridays"&gt;Fridays (20% Time)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/alex-redington"&gt;Alex Redington&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Java_virtual_machine"&gt;Java Virtual Machine (JVM)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/stuart-halloway"&gt;Stu Halloway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Asynchronous_I/O"&gt;Asynchronous requests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.cs.mtu.edu/%7Eshene/NSF-3/e-Book/FUNDAMENTALS/thread-management.html"&gt;Thread management&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/weavejester/compojure"&gt;Compojure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mustache.github.com/"&gt;Mustache&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.webnoir.org/"&gt;Noir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.infoq.com/author/Rich-Hickey"&gt;Rich Hickey&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Mock_object"&gt;Mock services&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://curl.haxx.se/"&gt;curl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Server-sent_events"&gt;SSE channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/lake-denman"&gt;Lake Denman&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Cross-origin_resource_sharing"&gt;Cross-origin resource sharing (CORS)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Polyfill"&gt;Polyfill&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Vitruvius"&gt;Vitruvius&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Credits&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/marc-phillips"&gt;Marc Phillips&lt;/a&gt; (&lt;a href="https://twitter.com/turbomarc"&gt;@turbomarc&lt;/a&gt;), production assistance&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/michael-parenteau"&gt;Michael Parenteau&lt;/a&gt; (&lt;a href="http://twitter.com/parenteau"&gt;@parenteau&lt;/a&gt;), episode cover art&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/daemian-mack"&gt;Daemian Mack&lt;/a&gt; (&lt;a href="http://twitter.com/daemianmack"&gt;@daemianmack&lt;/a&gt;), production assistance&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/kim-foster"&gt;Kim Foster&lt;/a&gt;, production assistance&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/q0w9bGnvfvg" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://thinkrelevance.com/blog/2013/03/18/pedestal-podcast-episode-027</feedburner:origLink></entry>
  <entry>
    <title>Where to Find Relevancers: March Edition</title>
    <id>http://thinkrelevance.com/blog/2013/03/01/where-to-find-relevancers-march-edition-2</id>
    <updated>2013-03-01T16:00:00Z</updated>
    <published>2013-03-01T16:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/29_AjiFPxaI/where-to-find-relevancers-march-edition-2" />
    <author>
      <name>Lynn Grogan</name>
      <email>lynn@thinkrelevance.com</email>
    </author>
    <content type="html">&lt;p&gt;Want to meet a Relevancer in person? Here&amp;#39;s where you can find us during the month of March:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aruba&lt;/strong&gt; 3/4-3/8 &lt;br/&gt;
&lt;a href="http://speakerconf.com/"&gt;SpeakerConf&lt;/a&gt; &lt;br/&gt;
Speaking: &lt;a href="http://thinkrelevance.com/team/members/justin-gehtland"&gt;Justin Gehtland&lt;/a&gt;, &lt;a href="http://thinkrelevance.com/team/members/michael-nygard"&gt;Michael Nygard&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Durham, NC&lt;/strong&gt; 3/12 &lt;br/&gt;
&lt;a href="http://www.meetup.com/Girl-Develop-It-RDU/events/103131462/"&gt;Girl Develop It: Intro to Git &amp;amp; Github Class&lt;/a&gt; @ &lt;a href="http://thinkrelevance.com/contact"&gt;Relevance HQ&lt;/a&gt; &lt;br/&gt;
Attending: &lt;a href="http://thinkrelevance.com/team/members/lynn-grogan"&gt;Lynn Grogan&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Portland, OR&lt;/strong&gt; 3/17 &lt;br/&gt;
&lt;a href="http://clojurescript.eventbrite.com/"&gt;ClojureScript Training&lt;/a&gt;&lt;br/&gt;
Trainers: &lt;a href="http://thinkrelevance.com/team/members/stuart-sierra"&gt;Stuart Sierra&lt;/a&gt;, &lt;a href="http://thinkrelevance.com/team/members/luke-vanderhart"&gt;Luke VanderHart&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Portland, OR&lt;/strong&gt; 3/18-3/20 &lt;br/&gt;
&lt;a href="http://clojurewest.org/"&gt;Clojure/West&lt;/a&gt;&lt;br/&gt;
Speaking: &lt;br/&gt;
&lt;a href="http://thinkrelevance.com/team/members/stuart-sierra"&gt;Stuart Sierra&lt;/a&gt;: &lt;a href="http://clojurewest.org/sessions#sierra"&gt;Clojure in the Large&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://thinkrelevance.com/team/members/brenton-ashworth"&gt;Brenton Ashworth&lt;/a&gt; &amp;amp; &lt;a href="http://thinkrelevance.com/team/members/tim-ewald"&gt;Tim Ewald&lt;/a&gt;: &lt;a href="http://clojurewest.org/sessions#ashworth"&gt;Introducing Pedestal&lt;/a&gt; &lt;br/&gt;
&lt;a href="http://thinkrelevance.com/team/members/timothy-baldridge"&gt;Timothy Baldridge&lt;/a&gt;: &lt;a href="http://clojurewest.org/sessions#baldridge"&gt;Clojure &amp;amp; LLVM&lt;/a&gt; &lt;br/&gt;
&lt;a href="http://thinkrelevance.com/team/members/ryan-neufeld"&gt;Ryan Neufeld&lt;/a&gt;: &lt;a href="http://clojurewest.org/sessions#neufeld"&gt;Editing Clojure Effectively with Emacs&lt;/a&gt; &lt;br/&gt;
&lt;a href="http://thinkrelevance.com/team/members/stuart-halloway"&gt;Stuart Halloway&lt;/a&gt;: &lt;a href="http://clojurewest.org/sessions#halloway"&gt;Simulation Testing with Simulant&lt;/a&gt; &lt;br/&gt;
Attending: &lt;a href="http://thinkrelevance.com/team"&gt;Almost all of Relevance!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Durham, NC&lt;/strong&gt; 3/19 &lt;br/&gt;
&lt;a href="http://www.meetup.com/raleighrb/"&gt;West End Ruby Hack Night&lt;/a&gt; @ &lt;a href="http://thinkrelevance.com/contact"&gt;Relevance HQ&lt;/a&gt; &lt;br/&gt;
Attending: &lt;a href="http://thinkrelevance.com/team/members/sam-umbach"&gt;Sam Umbach&lt;/a&gt;, &lt;a href="http://thinkrelevance.com/team/members/yoko-harada"&gt;Yoko Harada&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Durham, NC&lt;/strong&gt; 3/20&lt;br&gt;
&lt;a href="http://www.meetup.com/Triangle-DevOps/events/105370252/"&gt;Triangle DevOps Meetup&lt;/a&gt; @ &lt;a href="http://bronto.com/contact-us"&gt;Bronto Software&lt;/a&gt;&lt;br&gt;
Speaking: &lt;a href="http://thinkrelevance.com/team/members/michael-nygard"&gt;Michael Nygard&lt;/a&gt;&lt;br&gt;
Attending: &lt;a href="http://thinkrelevance.com/team/members/sam-umbach"&gt;Sam Umbach&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boston, MA&lt;/strong&gt; 3/28-29 &lt;br/&gt;
&lt;a href="http://monitorama.com/"&gt;Monitorama&lt;/a&gt;&lt;br/&gt;
Attending: &lt;a href="http://thinkrelevance.com/team/members/sam-umbach"&gt;Sam Umbach&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/29_AjiFPxaI" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://thinkrelevance.com/blog/2013/03/01/where-to-find-relevancers-march-edition-2</feedburner:origLink></entry>
  <entry>
    <title>Alex Redington - Podcast Episode 026</title>
    <id>http://thinkrelevance.com/blog/2013/02/19/alex-redington-podcast-episode-026</id>
    <updated>2013-02-19T15:00:00Z</updated>
    <published>2013-02-19T15:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/gVmLh-ksj3g/alex-redington-podcast-episode-026" />
    <author>
      <name>Craig Andera</name>
      <email>craig@thinkrelevance.com</email>
    </author>
    <content type="html">&lt;p&gt;&lt;img src="http://s3.amazonaws.com/thinkrelevance-podcast/026-alex-redington.jpg" alt="cover art"&gt;&lt;/p&gt;

&lt;p&gt;If you&amp;#39;ve listened to the show more than once or twice, you&amp;#39;ve probably heard us mention pair programming. One of the things that people often ask us is how we make that work when so many of us are remote. So I thought that it would be good to talk with someone with whom I have done a fair amount of very successful remote pair programming: &lt;a href="http://thinkrelevance.com/team/members/alex-redington"&gt;Alex Redington&lt;/a&gt;. The result was this &lt;a href="http://s3.amazonaws.com/thinkrelevance-podcast/ThinkRelevance-026-alex-redington.mp3"&gt;episode&lt;/a&gt;, in which we talk about the various tools and pairing behaviors we use. And about setting things on fire.&lt;/p&gt;
&lt;p&gt;The show is &lt;a href="http://itunes.apple.com/us/podcast/thinkrelevance-the-podcast/id498067022"&gt;available on iTunes&lt;/a&gt;! You can also subscribe to the podcast using our &lt;a href="http://feeds.feedburner.com/thinkrelevance/podcast"&gt;podcast feed&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can send feedback about the show to &lt;a href="mailto:podcast@thinkrelevance.com"&gt;podcast@thinkrelevance.com&lt;/a&gt;, or leave a comment here on the blog. Thanks for listening!&lt;/p&gt;

&lt;h1&gt;Our Guest,&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/alex-redington"&gt;Alex Redington&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Music&lt;/h1&gt;

&lt;p&gt;Alex chose &amp;quot;Lateralus&amp;quot; by &lt;a href="http://toolband.com/"&gt;Tool&lt;/a&gt; as the intro, and &amp;quot;The Regulator&amp;quot; by &lt;a href="http://www.pro-rock.com/"&gt;Clutch&lt;/a&gt; to end the show.&lt;/p&gt;

&lt;h1&gt;Links&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Discordianism"&gt;Discordianism&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Lisp_(programming_language%29"&gt;Lisp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/how-we-work/dev_team#dev_team-pair_programming"&gt;Pair Programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Secure_Shell"&gt;Secure Shell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/ec2/"&gt;EC2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tmux.sourceforge.net/"&gt;tmux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.gnu.org/software/emacs/"&gt;Emacs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://emacswiki.org/emacs/ParEdit"&gt;ParEdit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.nomachine.com/"&gt;NX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Xvfb"&gt;Xvfb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://skype.com/"&gt;Skype&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mikogo.com/"&gt;Mikogo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.teamviewer.com/"&gt;TeamViewer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.playadelfuego.net/"&gt;Playa Del Fuego&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aredington/monotony"&gt;Monotony&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Credits&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/lake-denman"&gt;Lake Denman&lt;/a&gt; (&lt;a href="https://twitter.com/l4k3"&gt;@l4k3&lt;/a&gt;), &lt;a href="http://thinkrelevance.com/team/members/lynn-grogan"&gt;Lynn Grogan&lt;/a&gt; (&lt;a href="http://twitter.com/lynngrogan"&gt;@lynngrogan&lt;/a&gt;), &lt;a href="http://thinkrelevance.com/team/members/sam-umbach"&gt;Sam Umbach&lt;/a&gt; (&lt;a href="http://twitter.com/samumbach"&gt;@samumbach&lt;/a&gt;), production assistance&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/michael-parenteau"&gt;Michael Parenteau&lt;/a&gt; (&lt;a href="http://twitter.com/parenteau"&gt;@parenteau&lt;/a&gt;), episode cover art&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/gVmLh-ksj3g" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://thinkrelevance.com/blog/2013/02/19/alex-redington-podcast-episode-026</feedburner:origLink></entry>
  <entry>
    <title>Hash Maps as Mini State Machines</title>
    <id>http://thinkrelevance.com/blog/2013/02/18/hashmaps-as-mini-state-machines</id>
    <updated>2013-02-18T13:11:00Z</updated>
    <published>2013-02-18T13:11:00Z</published>
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/XqJIpipDe2c/hashmaps-as-mini-state-machines" />
    <author>
      <name>Timothy Baldridge</name>
      <email>timothy@thinkrelevance.com</email>
    </author>
    <content type="html">&lt;p&gt;While working with &lt;a href="http://thinkrelevance.com/team/members/ryan-neufeld"&gt;Ryan Neufeld&lt;/a&gt; last Friday, we came across a problem that I had experienced more than once in my programming career: how to toggle a hash map value between two (or more) states.&lt;/p&gt;

&lt;p&gt;As a starting example, let&amp;#39;s assume that we have a hash map that contains a single key/value, and that we want to toggle the value between -1 and 1. We could write the function thusly:&lt;/p&gt;
&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;(&lt;span style="color:#080;font-weight:bold"&gt;defn&lt;/span&gt; &lt;span style="color:#06B;font-weight:bold"&gt;toggle-value&lt;/span&gt; [m]
  (&lt;span style="color:#080;font-weight:bold"&gt;update-in&lt;/span&gt; m [&lt;span style="color:#A60"&gt;:value&lt;/span&gt;]
    (&lt;span style="color:#080;font-weight:bold"&gt;fn&lt;/span&gt; [v]
      (&lt;span style="color:#080;font-weight:bold"&gt;if&lt;/span&gt; (&lt;span style="color:#080;font-weight:bold"&gt;&amp;gt;=&lt;/span&gt; v &lt;span style="color:#00D"&gt;0&lt;/span&gt;)
        &lt;span style="color:#00D"&gt;-1&lt;/span&gt;
        &lt;span style="color:#00D"&gt;1&lt;/span&gt;))))
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Now while this code will work, it&amp;#39;s not exactly elegant, nor concise. And if we had more than two states (-1, and 1) then we would be forced to change the &amp;quot;if&amp;quot; into a &amp;quot;case&amp;quot; (or a &amp;quot;cond&amp;quot;) and then add more and more state transitions to the &amp;quot;if&amp;quot; expression, and our already ugly code would get that much uglier.&lt;/p&gt;

&lt;p&gt;It was at this part of my pairing session with Ryan that I remembered an old trick from when I first learned to program in QBasic (more than a few years ago). The trick was that multiplying either -1 or +1 by -1 will cause the resulting value to &amp;quot;toggle&amp;quot; between the two numbers. Actually this works for any states that need to toggle between -N and N, but we&amp;#39;ll use -1 today to demonstrate:&lt;/p&gt;
&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;(&lt;span style="color:#080;font-weight:bold"&gt;defn&lt;/span&gt; &lt;span style="color:#06B;font-weight:bold"&gt;toggle-value&lt;/span&gt; [m]
  (&lt;span style="color:#080;font-weight:bold"&gt;update-in&lt;/span&gt; m [&lt;span style="color:#A60"&gt;:value&lt;/span&gt;] (&lt;span style="color:#080;font-weight:bold"&gt;partial&lt;/span&gt; &lt;span style="color:#080;font-weight:bold"&gt;*&lt;/span&gt; &lt;span style="color:#00D"&gt;-1&lt;/span&gt;)))
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;This code is much more concise, but perhaps not as clear. However, for the problem Ryan and I were dealing with on Friday, we couldn&amp;#39;t use numbers: we needed to use keywords. We had two states: &amp;quot;:checked&amp;quot; and &amp;quot;:unchecked&amp;quot; and possibly nil. We needed a clear, concise way to toggle between these three states, without writing an ugly case/cond block. In my mind I thought, &amp;quot;we need a function that will return a new state, given an old state. A function that takes a single arg, and returns the new state value.&amp;quot; And then I remembered: &amp;quot;Clojure hash maps are functions! And they take a single value (key) and return a single result (value).&amp;quot; Well then, we can write our state transitions with this little bit of code:&lt;/p&gt;
&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;(&lt;span style="color:#080;font-weight:bold"&gt;def&lt;/span&gt; &lt;span style="color:#06B;font-weight:bold"&gt;toggle-states&lt;/span&gt;
  {&lt;span style="color:#A60"&gt;:checked&lt;/span&gt; &lt;span style="color:#A60"&gt;:unchecked&lt;/span&gt;
   &lt;span style="color:#A60"&gt;:unchecked&lt;/span&gt; &lt;span style="color:#A60"&gt;:checked&lt;/span&gt;
   &lt;span style="color:#069"&gt;nil&lt;/span&gt; &lt;span style="color:#A60"&gt;:checked&lt;/span&gt;})

(&lt;span style="color:#080;font-weight:bold"&gt;defn&lt;/span&gt; &lt;span style="color:#06B;font-weight:bold"&gt;toggle-value&lt;/span&gt; [m]
  (&lt;span style="color:#080;font-weight:bold"&gt;update-in&lt;/span&gt; m [&lt;span style="color:#A60"&gt;:value&lt;/span&gt;] toggle-states))

&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;This is what I consider good Clojure code. It&amp;#39;s simple, clean, concise, and easily extensible. And hopefully it comes in as handy for you as it did for me. &lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/XqJIpipDe2c" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://thinkrelevance.com/blog/2013/02/18/hashmaps-as-mini-state-machines</feedburner:origLink></entry>
  <entry>
    <title>GOTO Night on 2/25 with Michael Nygard!</title>
    <id>http://thinkrelevance.com/blog/2013/02/14/goto-night-on-2-25-with-michael-nygard</id>
    <updated>2013-02-14T22:07:00Z</updated>
    <published>2013-02-14T22:07:00Z</published>
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/bJOP0bu95hQ/goto-night-on-2-25-with-michael-nygard" />
    <author>
      <name>Lynn Grogan</name>
      <email>lynn@thinkrelevance.com</email>
    </author>
    <content type="html">&lt;p&gt;We&amp;#39;re pleased to announce that Michael Nygard will be the featured speaker at GOTO Nights in Chicago on Monday, February 25.
Space is limited, so &lt;a href="http://www.eventbrite.com/event/5473112226/eorg"&gt;sign up&lt;/a&gt; today.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chicago, IL&lt;/strong&gt; 2/25/2013, 5-7:30pm &lt;br/&gt;
&lt;a href="http://gotocon.com/chicago-2013/gotonights/"&gt;GOTO Night - Devops Night&lt;/a&gt;&lt;br/&gt;
Speaking: &lt;a href="http://thinkrelevance.com/team/members/michael-nygard"&gt;Michael Nygard&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the mean time, check out &lt;a href="http://www.infoq.com/interviews/nygard-redefining-CAP"&gt;Michael&amp;#39;s interview&lt;/a&gt; with Michael Floyd from &lt;a href="http://qconsf.com/sf2012/"&gt;QCon 2012&lt;/a&gt; about Redefining CAP.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/bJOP0bu95hQ" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://thinkrelevance.com/blog/2013/02/14/goto-night-on-2-25-with-michael-nygard</feedburner:origLink></entry>
  <entry>
    <title>Two Recent Talks</title>
    <id>http://thinkrelevance.com/blog/2013/02/11/two-recent-talks</id>
    <updated>2013-02-11T14:00:00Z</updated>
    <published>2013-02-11T14:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/ZqSQrwvfKbw/two-recent-talks" />
    <author>
      <name>Michael Nygard</name>
      <email>mtnygard@thinkrelevance.com</email>
    </author>
    <content type="html">&lt;p&gt;Video for two of my recent talks has gone live. Here they are!&lt;/p&gt;

&lt;h1&gt;Whence Complexity&lt;/h1&gt;

&lt;p&gt;As programmers we grapple with complexity. Whether we classify it as &amp;quot;essential&amp;quot; or &amp;quot;accidental&amp;quot; complexity, we all agree that complexity is poison. At the same time, as living beings, we are sustained by complexity. Complexity allows us to sustain our existence far from thermal equilibrium. In natural systems, complexity produces robustness. In human-created systems (whether information, social, political, or economic) complexity tends to create fragility and extreme non-linear responses to stimuli. &lt;/p&gt;

&lt;p&gt;At Clojure/conj last November, I discussed the origin of complexity as the result of ongoing dynamic processes.&lt;/p&gt;

&lt;p&gt;Thanks to some last-minute calculations about spherical chickens, there was also an excessively vivid mental image included, for which I apologize.&lt;/p&gt;

&lt;p&gt;This one is &lt;a href="http://www.youtube.com/watch?v=l_tULSeO9yg"&gt;on Youtube&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;Loopholes in CAP&lt;/h1&gt;

&lt;p&gt;Last November, I also spoke at QCon San Francisco on the subject of the &lt;a href="http://en.wikipedia.org/wiki/CAP_theorem"&gt;CAP Theorem&lt;/a&gt; (a.k.a. Brewer&amp;#39;s Conjecture.) CAP says that, of the three qualities of &amp;quot;consistency&amp;quot;, &amp;quot;availability&amp;quot;, and &amp;quot;partition-tolerance&amp;quot;, a distributed system can achieve at most two.&lt;/p&gt;

&lt;p&gt;I have to confess that this was a particularly nerve-wracking talk, because I followed Eric Brewer on to the stage. Yes, &lt;em&gt;that&lt;/em&gt; Eric Brewer, he of the Conjecture itself and one of the field&amp;#39;s top experts. &lt;/p&gt;

&lt;p&gt;CAP went from &amp;quot;conjecture&amp;quot; to &amp;quot;theorem&amp;quot; in 2002, when Seth Gilbert and Nancy Lynch proved it. And, thus, a thousand database products were launched. Like any theorem, though, there are subtleties to consider. In this playful talk, I look at all the assumptions underlying CAP and try to violate them all, with examples from real systems.&lt;/p&gt;

&lt;p&gt;You can see this talk at &lt;a href="http://www.infoq.com/presentations/Loopholes-CAP"&gt;InfoQ.com&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/ZqSQrwvfKbw" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://thinkrelevance.com/blog/2013/02/11/two-recent-talks</feedburner:origLink></entry>
  <entry>
    <title>Where to Find Relevancers: February Edition</title>
    <id>http://thinkrelevance.com/blog/2013/02/01/where-to-find-relevancers-february-edition</id>
    <updated>2013-02-01T18:32:00Z</updated>
    <published>2013-02-01T18:32:00Z</published>
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/WtOPUVPvKoU/where-to-find-relevancers-february-edition" />
    <author>
      <name>Lynn Grogan</name>
      <email>lynn@thinkrelevance.com</email>
    </author>
    <content type="html">&lt;p&gt;Want to meet a Relevancer in person? Here&amp;#39;s where you can find us during the month of February:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Durham, NC&lt;/strong&gt; 2/9-2/10 &lt;br/&gt;
&lt;a href="http://www.meetup.com/Girl-Develop-It-RDU/events/97503072/"&gt;Girl Develop IT - RDU Intro to JavaScript &amp;amp; jQuery&lt;/a&gt; @ &lt;a href="http://thinkrelevance.com/contact"&gt;Relevance HQ&lt;/a&gt; &lt;br/&gt;
Attending: &lt;a href="http://thinkrelevance.com/team/members/lynn-grogan"&gt;Lynn Grogan&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Raleigh, NC&lt;/strong&gt; 2/12 &lt;br/&gt;
&lt;a href="http://www.meetup.com/raleighrb/events/100820302/"&gt;Triangle.rb Meetup Group&lt;/a&gt;&lt;br/&gt;
Attending: &lt;a href="http://thinkrelevance.com/team/members/daemian-mack"&gt;Daemian Mack&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atlanta, GA&lt;/strong&gt; 2/18-2/19 &lt;br/&gt;
&lt;a href="http://devnexus.com/s/index"&gt;DevNexus&lt;/a&gt;&lt;br/&gt;
Speaking: &lt;a href="http://thinkrelevance.com/team/members/stuart-halloway"&gt;Stu Halloway&lt;/a&gt;&lt;br/&gt;
Talk 1: &lt;a href="http://devnexus.com/s/presentations#id-1394"&gt;Simulation Testing&lt;/a&gt;&lt;br/&gt;
Talk 2: &lt;a href="http://devnexus.com/s/presentations#id-1395"&gt;Concurrent Programming with Clojure&lt;/a&gt;&lt;br/&gt;
Talk 3: &lt;a href="http://devnexus.com/s/presentations#id-1396"&gt;Clojure in the Field&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Durham, NC&lt;/strong&gt; 2/19 &lt;br/&gt;
&lt;a href="http://www.meetup.com/raleighrb/"&gt;West End Ruby Hack Night&lt;/a&gt; @ &lt;a href="http://thinkrelevance.com/contact"&gt;Relevance HQ&lt;/a&gt; &lt;br/&gt;
Attending: &lt;a href="http://thinkrelevance.com/team/members/sam-umbach"&gt;Sam Umbach&lt;/a&gt;, &lt;a href="http://thinkrelevance.com/team/members/yoko-harada"&gt;Yoko Harada&lt;/a&gt;, &lt;a href="http://thinkrelevance.com/team/members/daemian-mack"&gt;Daemian Mack&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Charlotte, NC&lt;/strong&gt; 2/20 &lt;br/&gt;
&lt;a href="http://www.meetup.com/charlotte-rb/events/101329152/"&gt;Charlotte Ruby Meetup, Lightning Talks&lt;/a&gt;&lt;br/&gt;
Hosting: &lt;a href="http://thinkrelevance.com/team/members/ben-vandgrift"&gt;Ben Vandgrift&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Durham, NC&lt;/strong&gt; 2/28 &lt;br/&gt;
&lt;a href="http://www.meetup.com/TriClojure/"&gt;Triangle Clojure Meetup Group&lt;/a&gt; @ &lt;a href="http://thinkrelevance.com/contact"&gt;Relevance HQ&lt;/a&gt; &lt;br/&gt;
Attending: &lt;a href="http://thinkrelevance.com/team/members/daemian-mack"&gt;Daemian Mack&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/WtOPUVPvKoU" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://thinkrelevance.com/blog/2013/02/01/where-to-find-relevancers-february-edition</feedburner:origLink></entry>
  <entry>
    <title>Alex Warr - Podcast Episode 025</title>
    <id>http://thinkrelevance.com/blog/2013/01/29/alex-warr-podcast-episode-025</id>
    <updated>2013-01-29T15:00:00Z</updated>
    <published>2013-01-29T15:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/eSWPVJbqjXc/alex-warr-podcast-episode-025" />
    <author>
      <name>Craig Andera</name>
      <email>craig@thinkrelevance.com</email>
    </author>
    <content type="html">&lt;p&gt;&lt;img src="http://s3.amazonaws.com/thinkrelevance-podcast/025-alex-warr.jpg" alt="cover art"&gt;&lt;/p&gt;

&lt;p&gt;When potential customers decide that they might want to work with us, their first point of contact is our sales department. It&amp;#39;s there that they get their first impression of what sort of company we are. So it has been clear to me for quite some time that we needed to have &lt;a href="http://thinkrelevance.com/team/members/alex-warr"&gt;Alex Warr&lt;/a&gt;, the head of our sales team, on the show to talk about what sales is like at Relevance. Along the way, we also managed to talk about babysitting, gaming, law school, and a few other things besides. Enjoy the &lt;a href="http://s3.amazonaws.com/thinkrelevance-podcast/ThinkRelevance-025-alex-warr.mp3"&gt;episode&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;The show is &lt;a href="http://itunes.apple.com/us/podcast/thinkrelevance-the-podcast/id498067022"&gt;available on iTunes&lt;/a&gt;! You can also subscribe to the podcast using our &lt;a href="http://feeds.feedburner.com/thinkrelevance/podcast"&gt;podcast feed&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can send feedback about the show to &lt;a href="mailto:podcast@thinkrelevance.com"&gt;podcast@thinkrelevance.com&lt;/a&gt;, or leave a comment here on the blog. Thanks for listening!&lt;/p&gt;

&lt;h1&gt;Our Guest, Alex Warr&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jalexwarr"&gt;@jalexwarr&lt;/a&gt; on Twitter&lt;/li&gt;
&lt;li&gt;His &lt;a href="http://thinkrelevance.com/team/members/alex-warr"&gt;Relevance profile&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Music&lt;/h1&gt;

&lt;p&gt;Alex chose &lt;a href="http://www.youtube.com/watch?v=I_izvAbhExY"&gt;&amp;quot;Staying Alive&amp;quot; by The Bee Gees&lt;/a&gt; as the intro, and &lt;a href="http://www.youtube.com/watch?v=zxKu7ggU3HU"&gt;&amp;quot;Ziggy Stardust&amp;quot; by David Bowie&lt;/a&gt; to end the show.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Bee_Gees"&gt;It&amp;#39;s all Bee Gees these days&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.foofighters.com"&gt;Foo Fighters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/justin-gehtland"&gt;Justin Gehtland&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/craig-andera"&gt;Craig Andera&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/stuart-halloway"&gt;Stuart Halloway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.davemanuel.com/investor-dictionary/snake-oil-salesman/"&gt;Selling Snake Oil&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/brenton-ashworth"&gt;Brenton Ashworth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/stuart-sierra"&gt;Stuart Sierra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.datomic.com/"&gt;Datomic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mysql.com/"&gt;MySQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.oracle.com/index.html"&gt;Oracle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/how-we-work/dev_team#dev_team-fridays"&gt;Fridays (20% Time)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Open_source_software"&gt;Open Source&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/chris-redinger"&gt;Chris Redinger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wiktionary.org/wiki/in_someone&amp;#x27;s_wheelhouse"&gt;Wheelhouse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/roles/coaches"&gt;Coaches&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/roles/architects"&gt;Architects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/roles/designers"&gt;Designers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Request_for_proposal"&gt;RFP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/blog/2012/10/22/contingent-i0-reducing-the-risk-of-new-projects"&gt;Contingent Iteration Zero&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.facebook.com/joey.halloway"&gt;Joey Halloway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.visitlondon.com/"&gt;London&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.durham-nc.com/"&gt;Durham, NC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Au_pair"&gt;Au pair&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.law.emory.edu/"&gt;Emory School of Law&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.forbes.com/2009/04/16/airline-tickets-flights-lifestyle-travel-airlines-overbooked.html"&gt;American Airlines Overbooking&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.wizards.com/dnd/"&gt;Dungeons &amp;amp; Dragons&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.scholastic.com/animorphs/books/index.htm"&gt;Animorphs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.shmoop.com/wizard-of-earthsea/"&gt;A Wizard of Earthsea&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://finalfantasyviipc.com/en"&gt;Final Fantasy VII&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.wizards.com/Magic/Summoner/"&gt;Magic the Gathering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.riograndegames.com/games.html?id=5"&gt;Rio Grande Games - Power Grid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.wizards.com/dnd/product.aspx?x=dnd/products/dndacc/207790000"&gt;Castle Ravenloft&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.cruise-casinos.com/CruiseReviews/norwegiansun.htm"&gt;Norway&amp;#39;s Premier Blackjack Player&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.nealstephenson.com/snowcrash/"&gt;Snow Crash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clojure-conj.org/"&gt;Clojure Conj&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.pauldee.org/blog/"&gt;Paul deGrandis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clojurewest.org/"&gt;Clojure/West&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dictionary.reference.com/browse/bailiwick"&gt;Bailiwick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.infoq.com/author/Rich-Hickey"&gt;Rich Hickey&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mariasharapova.com/"&gt;A certain tennis star&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.dropbearaware.com/"&gt;Drop Bears&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Credits&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Episode Cover Art:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/michael-parenteau"&gt;Michael Parenteau&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Production Assistance:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/marc-phillips"&gt;Marc Phillips&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/stuart-sierra"&gt;Stuart Sierra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/ryan-neufeld"&gt;Ryan Neufeld&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/sam-umbach"&gt;Sam Umbach&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/eSWPVJbqjXc" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://thinkrelevance.com/blog/2013/01/29/alex-warr-podcast-episode-025</feedburner:origLink></entry>
  <entry>
    <title>What We Learned, and the End of the Magic</title>
    <id>http://thinkrelevance.com/blog/2013/01/28/what-we-learned-and-the-end-of-the-magic</id>
    <updated>2013-01-28T20:00:00Z</updated>
    <published>2013-01-28T20:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/eG2fl3y6OVI/what-we-learned-and-the-end-of-the-magic" />
    <author>
      <name>Michael Nygard</name>
      <email>mtnygard@thinkrelevance.com</email>
    </author>
    <content type="html">&lt;p&gt;When we started the &lt;a href="http://thinkrelevance.com/blog/tags/word-magic"&gt;Word Magic&lt;/a&gt; project, there were some things we wanted to learn, and some things we wanted to confirm. This post is about those things.&lt;/p&gt;

&lt;p&gt;First, we confirmed that the &lt;a href="http://thinkrelevance.com/blog/2012/04/04/big-data-reference-model"&gt;Big Data Reference Model&lt;/a&gt; holds true. We tried to operationalize analysis before we had really finalized the kind of information we wanted to produce. (Most specifically, how the numbers behind the &amp;quot;Word Usage Through the Decades&amp;quot; module would work.) In terms of the Reference Model, we were skipping the first two learning loops. Why would we do that? The same reason everyone else does. We thought we knew what we wanted.&lt;/p&gt;

&lt;p&gt;Our initial mockups looked great, but they were foiled by the real data. The algorithm was to divide a word&amp;#39;s occurrence in a decade by the occurrence of all words in that decade. That way, we expected to normalize out the general increase in written language since the 1600s. But, since we put both a phrase and the individual words on the same graph, we normalized to the largest occurrence of them. Sounds good, but in practice, the bubbles were all but invisible except for the most common word in the phrase. The most common word dominated the graph and caused the others to be invisible.&lt;/p&gt;

&lt;p&gt;We eventually tried two visualizations and three algorithms before we got one that was suitable for launch. There are some different calculations that might have worked out well, but we couldn&amp;#39;t try them. Why not? Because we jumped straight to operationalizing. Every time we changed the calculation in map/reduce, we had to spend multiple days reprocessing 400 years of humanity&amp;#39;s &lt;a href="http://storage.googleapis.com/books/ngrams/books/datasetsv2.html"&gt;entire printed output&lt;/a&gt;. We should have followed our own advice and done smaller samples in a quicker toolset.&lt;/p&gt;

&lt;p&gt;The second thing we confirmed is that JRuby on Hadoop is a viable way to write map/reduce jobs. It&amp;#39;s a thin wrapper on top of the Java API, but still an improvement.&lt;/p&gt;

&lt;p&gt;Stuart Sierra&amp;#39;s &lt;a href="https://github.com/stuartsierra/clojure-hadoop"&gt;clojure-hadoop&lt;/a&gt; library also worked very well. Because this was a &lt;a href="http://thinkrelevance.com/open-source"&gt;&amp;quot;20% project&amp;quot;&lt;/a&gt; for most of its life, we ended up with pieces written in JRuby, Clojure, and Java. The polyglot nature didn&amp;#39;t really present a problem, because each piece was its own data flow.&lt;/p&gt;

&lt;p&gt;On the deployment front, we used &lt;a href="http://palletops.com/"&gt;Pallet&lt;/a&gt;. It worked very well for deploying whole topologies of machines. We built several Hadoop + HBase + MapReduce clusters with it.&lt;/p&gt;

&lt;p&gt;Finally, we confirmed that the Hadoop and HBase APIs are cumbersome, poorly documented, and frequently misleading. The processing model is expensive, and the query model is user-hostile. (We aren&amp;#39;t the only ones to notice this.) Moving between our daily world of sharp tools like Ruby on Rails, Clojure, ClojureScript and Datomic and into the Hadoop world definitely felt like a step back in time.&lt;/p&gt;

&lt;p&gt;Now that we&amp;#39;ve learned what we needed to learn from Word Magic, we have shut it down. Hadoop is great for scaling up with lots of servers, but it doesn&amp;#39;t scale &lt;em&gt;down&lt;/em&gt; well at all. &lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/eG2fl3y6OVI" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://thinkrelevance.com/blog/2013/01/28/what-we-learned-and-the-end-of-the-magic</feedburner:origLink></entry>
  <entry>
    <title>i-Human - Podcast Episode 024</title>
    <id>http://thinkrelevance.com/blog/2013/01/15/i-human-podcast-episode-024</id>
    <updated>2013-01-15T15:00:00Z</updated>
    <published>2013-01-15T15:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/BRjbylinZ9E/i-human-podcast-episode-024" />
    <author>
      <name>Craig Andera</name>
      <email>craig@thinkrelevance.com</email>
    </author>
    <content type="html">&lt;p&gt;&lt;img src="http://s3.amazonaws.com/thinkrelevance-podcast/024-i-Human.jpg" alt="cover art"&gt;&lt;/p&gt;

&lt;p&gt;At Relevance, our mission is to help people solve hard problems through software. Most of the time, we do that through consulting. So it seemed well past time that we had one of our consulting clients on the show. And in my opinion we could not have made a better choice than Anne Tweet and Jay Patel of &lt;a href="https://www.i-human.com"&gt;i-Human&lt;/a&gt;. We got a chance to talk not only about their experience working with us, but also about the really interesting software that they&amp;#39;re building. I had a great time talking with them - I hope you, too, will enjoy this &lt;a href="http://s3.amazonaws.com/thinkrelevance-podcast/ThinkRelevance-024-i-Human.mp3"&gt;episode&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;The show is &lt;a href="http://itunes.apple.com/us/podcast/thinkrelevance-the-podcast/id498067022"&gt;available on iTunes&lt;/a&gt;! You can also subscribe to the podcast using our &lt;a href="http://feeds.feedburner.com/thinkrelevance/podcast"&gt;podcast feed&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can send feedback about the show to &lt;a href="mailto:podcast@thinkrelevance.com"&gt;podcast@thinkrelevance.com&lt;/a&gt;, or leave a comment here on the blog. Thanks for listening!&lt;/p&gt;

&lt;h1&gt;Guests&lt;/h1&gt;

&lt;p&gt;Our guests on this episode were Jay Patel and Anne Tweet of &lt;a href="https://www.i-human.com/"&gt;i-Human&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;Links&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Virtual_microscopy"&gt;Virtual microscopy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Image_resolution"&gt;High-resolution images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.google.com/earth/index.html"&gt;Google Earth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Histology"&gt;Histology&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Pathology"&gt;Pathology&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/russ-olsen"&gt;Russ Olsen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://html5.org/"&gt;HTML5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/muness"&gt;Muness Alrubaie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://aws.amazon.com/s3/"&gt;Amazon S3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://aws.amazon.com/swf/"&gt;Amazon SWF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Cloud_computing"&gt;Cloud computing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.heroku.com/"&gt;Heroku&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/michael-parenteau"&gt;Michael Parenteau&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Pair_programming"&gt;Pair Programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/how-we-work/product_owner#/product_owner-lifecycle"&gt;Iterations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/how-we-work/agile_principles"&gt;Agile development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/how-we-work/product_owner#product_owner-retrospectives"&gt;Retros&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon EC2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/jen-myers"&gt;Jen Myers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/sam-umbach"&gt;Sam Umbach&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/ryan-neufeld"&gt;Ryan Neufeld&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/lake-denman"&gt;Lake Denman&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/gabriel-horner"&gt;Gabriel Horner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/naoko-chamberlain"&gt;Naoko Chamberlain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/roles/coaches"&gt;Relevance coach&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Credits&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Episode Cover Art:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/michael-parenteau"&gt;Michael Parenteau&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Production Assistance:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/jen-myers"&gt;Jen Myers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/naoko-chamberlain"&gt;Naoko Chamberlain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/stuart-sierra"&gt;Stuart Sierra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/lake-denman"&gt;Lake Denman&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/daemian-mack"&gt;Daemian Mack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/BRjbylinZ9E" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://thinkrelevance.com/blog/2013/01/15/i-human-podcast-episode-024</feedburner:origLink></entry>
  <entry>
    <title>Taming side-effects with mutability</title>
    <id>http://thinkrelevance.com/blog/2013/01/14/taming-side-effects-with-mutability</id>
    <updated>2013-01-14T12:30:00Z</updated>
    <published>2013-01-14T12:30:00Z</published>
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/WoxJpn7qJtA/taming-side-effects-with-mutability" />
    <author>
      <name>Michael Nygard</name>
      <email>mtnygard@thinkrelevance.com</email>
    </author>
    <content type="html">&lt;p&gt;Clojure prefers &lt;a href="http://clojure.org/functional_programming#Functional%20Programming--Immutable%20Data%20Structures"&gt;immutable values&lt;/a&gt; and &lt;a href="http://c2.com/cgi/wiki?ReferentialTransparency"&gt;referentially transparent&lt;/a&gt; functions. But it also works well with the Java ecosystem, where everything is an object... mostly mutable.&lt;/p&gt;

&lt;p&gt;I was recently dealing with &lt;a href="http://asm.ow2.org/"&gt;ASM&lt;/a&gt;, the bytecode manipulation library. Most of the API is based on the &lt;a href="http://c2.com/cgi/wiki?VisitorPattern"&gt;Visitor pattern&lt;/a&gt;. To read a class from bytecode, you construct a &lt;a href="http://asm.ow2.org/asm40/javadoc/user/org/objectweb/asm/ClassReader.html"&gt;ClassReader&lt;/a&gt; object from an array of bytes or an input stream, then tell it to accept an object that implements the &lt;a href="http://asm.ow2.org/asm40/javadoc/user/index.html"&gt;ClassVisitor&lt;/a&gt; interface:&lt;/p&gt;
&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;&lt;span style="color:#088;font-weight:bold"&gt;public&lt;/span&gt; &lt;span style="color:#339;font-weight:bold"&gt;interface&lt;/span&gt; &lt;span style="color:#B06;font-weight:bold"&gt;ClassVisitor&lt;/span&gt;{
  &lt;span style="color:#339;font-weight:bold"&gt;void&lt;/span&gt; visit(&lt;span style="color:#339;font-weight:bold"&gt;int&lt;/span&gt; version, &lt;span style="color:#339;font-weight:bold"&gt;int&lt;/span&gt; access, &lt;span style="color:#0a5;font-weight:bold"&gt;String&lt;/span&gt; name, &lt;span style="color:#0a5;font-weight:bold"&gt;String&lt;/span&gt; signature, 
      &lt;span style="color:#0a5;font-weight:bold"&gt;String&lt;/span&gt; superName, &lt;span style="color:#0a5;font-weight:bold"&gt;String&lt;/span&gt;&lt;span style="color:#339;font-weight:bold"&gt;[]&lt;/span&gt; interfaces);
  &lt;span style="color:#339;font-weight:bold"&gt;void&lt;/span&gt; visitSource(&lt;span style="color:#0a5;font-weight:bold"&gt;String&lt;/span&gt; source, &lt;span style="color:#0a5;font-weight:bold"&gt;String&lt;/span&gt; debug);
  &lt;span style="color:#339;font-weight:bold"&gt;void&lt;/span&gt; visitOuterClass(&lt;span style="color:#0a5;font-weight:bold"&gt;String&lt;/span&gt; owner, &lt;span style="color:#0a5;font-weight:bold"&gt;String&lt;/span&gt; name, &lt;span style="color:#0a5;font-weight:bold"&gt;String&lt;/span&gt; desc);
  AnnotationVisitor visitAnnotation(&lt;span style="color:#0a5;font-weight:bold"&gt;String&lt;/span&gt; desc, &lt;span style="color:#339;font-weight:bold"&gt;boolean&lt;/span&gt; visible);
  &lt;span style="color:#339;font-weight:bold"&gt;void&lt;/span&gt; visitAttribute(&lt;span style="color:#0a5;font-weight:bold"&gt;Attribute&lt;/span&gt; attr);
  &lt;span style="color:#339;font-weight:bold"&gt;void&lt;/span&gt; visitInnerClass(&lt;span style="color:#0a5;font-weight:bold"&gt;String&lt;/span&gt; name, &lt;span style="color:#0a5;font-weight:bold"&gt;String&lt;/span&gt; outerName, 
      &lt;span style="color:#0a5;font-weight:bold"&gt;String&lt;/span&gt; innerName, &lt;span style="color:#339;font-weight:bold"&gt;int&lt;/span&gt; access);
  FieldVisitor visitField(&lt;span style="color:#339;font-weight:bold"&gt;int&lt;/span&gt; access, &lt;span style="color:#0a5;font-weight:bold"&gt;String&lt;/span&gt; name, &lt;span style="color:#0a5;font-weight:bold"&gt;String&lt;/span&gt; desc, 
      &lt;span style="color:#0a5;font-weight:bold"&gt;String&lt;/span&gt; signature, &lt;span style="color:#0a5;font-weight:bold"&gt;Object&lt;/span&gt; value);
  MethodVisitor visitMethod(&lt;span style="color:#339;font-weight:bold"&gt;int&lt;/span&gt; access, &lt;span style="color:#0a5;font-weight:bold"&gt;String&lt;/span&gt; name, &lt;span style="color:#0a5;font-weight:bold"&gt;String&lt;/span&gt; desc, 
      &lt;span style="color:#0a5;font-weight:bold"&gt;String&lt;/span&gt; signature, &lt;span style="color:#0a5;font-weight:bold"&gt;String&lt;/span&gt;&lt;span style="color:#339;font-weight:bold"&gt;[]&lt;/span&gt; exceptions);
  &lt;span style="color:#339;font-weight:bold"&gt;void&lt;/span&gt; visitEnd();
}
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Well, now we see a bit of a problem. The ClassReader gets to call these methods, which mostly return void. When a ClassVisitor does return an object, it returns yet another visitor that the ClassReader calls to descend into members of the class. The methods of the visitor get access to information about the class, but how do we get it out?&lt;/p&gt;

&lt;p&gt;In other words, how do you use an API that is 100% about side-effects and mutability inside a language that favors immutable values and pure functions?&lt;/p&gt;

&lt;p&gt;One solution is to use mutability to contain the side-effects within a function, such that the function is referentially transparent from the outside. In so doing, we tame the side-effects and put a boundary around them:&lt;/p&gt;
&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;(&lt;span style="color:#080;font-weight:bold"&gt;defn&lt;/span&gt; &lt;span style="color:#06B;font-weight:bold"&gt;analyze&lt;/span&gt; [c]
  (&lt;span style="color:#080;font-weight:bold"&gt;let&lt;/span&gt; [classinfo (&lt;span style="color:#080;font-weight:bold"&gt;atom&lt;/span&gt; {})
        v         (&lt;span style="color:#080;font-weight:bold"&gt;reify&lt;/span&gt; ClassVisitor
                    (visit [this version access &lt;span style="color:#080;font-weight:bold"&gt;name&lt;/span&gt; sig supername interfaces]
                      (&lt;span style="color:#080;font-weight:bold"&gt;swap!&lt;/span&gt; classinfo &lt;span style="color:#080;font-weight:bold"&gt;assoc&lt;/span&gt; 
                             &lt;span style="color:#A60"&gt;:static?&lt;/span&gt;    (static? access)
                             &lt;span style="color:#A60"&gt;:interface?&lt;/span&gt; (interface? access)
                             &lt;span style="color:#A60"&gt;:final?&lt;/span&gt;     (final? access)
                             &lt;span style="color:#A60"&gt;:classname&lt;/span&gt;  &lt;span style="color:#080;font-weight:bold"&gt;name&lt;/span&gt; 
                             &lt;span style="color:#A60"&gt;:super&lt;/span&gt;      supername))
                    (visitSource [this source debug])
                    (visitOuterClass [this owner &lt;span style="color:#080;font-weight:bold"&gt;name&lt;/span&gt; desc])
                    (visitAnnotation [this desc visible])
                    (visitAttribute [this attr])
                    (visitInnerClass [this &lt;span style="color:#080;font-weight:bold"&gt;name&lt;/span&gt; outername innername access])
                    (visitField [this access &lt;span style="color:#080;font-weight:bold"&gt;name&lt;/span&gt; desc sig value]
                      (&lt;span style="color:#080;font-weight:bold"&gt;swap!&lt;/span&gt; classinfo &lt;span style="color:#080;font-weight:bold"&gt;update-in&lt;/span&gt; [&lt;span style="color:#A60"&gt;:members&lt;/span&gt;] &lt;span style="color:#080;font-weight:bold"&gt;conj&lt;/span&gt; 
                             {&lt;span style="color:#A60"&gt;:type&lt;/span&gt;       &lt;span style="color:#A60"&gt;:field&lt;/span&gt;
                              &lt;span style="color:#A60"&gt;:visibility&lt;/span&gt; (visibility access)
                              &lt;span style="color:#A60"&gt;:static?&lt;/span&gt;    (static? access)
                              &lt;span style="color:#A60"&gt;:final?&lt;/span&gt;     (final? access)
                              &lt;span style="color:#A60"&gt;:name&lt;/span&gt;       &lt;span style="color:#080;font-weight:bold"&gt;name&lt;/span&gt;})
                      &lt;span style="color:#069"&gt;nil&lt;/span&gt;)
                    (visitMethod [this access &lt;span style="color:#080;font-weight:bold"&gt;name&lt;/span&gt; desc sig exceptions]
                      (&lt;span style="color:#080;font-weight:bold"&gt;swap!&lt;/span&gt; classinfo &lt;span style="color:#080;font-weight:bold"&gt;update-in&lt;/span&gt; [&lt;span style="color:#A60"&gt;:members&lt;/span&gt;] &lt;span style="color:#080;font-weight:bold"&gt;conj&lt;/span&gt; 
                             {&lt;span style="color:#A60"&gt;:type&lt;/span&gt;       &lt;span style="color:#A60"&gt;:method&lt;/span&gt;
                              &lt;span style="color:#A60"&gt;:visibility&lt;/span&gt; (visibility access)
                              &lt;span style="color:#A60"&gt;:static?&lt;/span&gt;    (static? access)
                              &lt;span style="color:#A60"&gt;:final?&lt;/span&gt;     (final? access)
                              &lt;span style="color:#A60"&gt;:abstract?&lt;/span&gt;  (abstract? access)
                              &lt;span style="color:#A60"&gt;:name&lt;/span&gt;       &lt;span style="color:#080;font-weight:bold"&gt;name&lt;/span&gt;})
                      &lt;span style="color:#069"&gt;nil&lt;/span&gt;)
                    (visitEnd [this]))]
    (&lt;span style="color:#080;font-weight:bold"&gt;.&lt;/span&gt;accept c v &lt;span style="color:#00D"&gt;0&lt;/span&gt;)
    @classinfo))
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;In the let form at the beginning, I create a new atom that holds an empty map. This will be my mutable state for this function. Then I create an instance of ClassVisitor, where most of the methods do nothing and return nil. Only visitClass, visitField, and visitMethod are interesting to me. In those, I mutate the atom to attach the info that ClassReader passed to the visitor.&lt;/p&gt;

&lt;p&gt;After the setup in the let, all that is left is to call ClassReader.accept with the new visitor. At that point the ClassReader does its bytecode interpretation and makes all its calls into the visitor. Finally, I get the resulting value out of the classinfo atom, which now has a nice, immutable Clojure-friendly map of information collected from that class file.&lt;/p&gt;

&lt;p&gt;This technique is similar to using &lt;a href="http://clojure.org/transients"&gt;transients&lt;/a&gt; to build collections: allow mutability within a function, but don&amp;#39;t let it escape. Transients do it for speed. The ClassVisitor does it to bridge to an object-oriented API.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/WoxJpn7qJtA" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://thinkrelevance.com/blog/2013/01/14/taming-side-effects-with-mutability</feedburner:origLink></entry>
  <entry>
    <title>Justin Gehtland - Podcast Episode 023</title>
    <id>http://thinkrelevance.com/blog/2013/01/03/justin-gehtland-podcast-episode-023</id>
    <updated>2013-01-03T15:00:00Z</updated>
    <published>2013-01-03T15:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/w-qTEkXF2as/justin-gehtland-podcast-episode-023" />
    <author>
      <name>Craig Andera</name>
      <email>craig@thinkrelevance.com</email>
    </author>
    <content type="html">&lt;p&gt;&lt;img src="http://s3.amazonaws.com/thinkrelevance-podcast/023-justin-gehtland.jpg" alt="cover art"&gt;&lt;/p&gt;

&lt;p&gt;Way back at the end of 2011, I had this idea that maybe I could record some conversations with various Relevancers and throw together a podcast. Our very first guest was &lt;a href="http://thinkrelevance.com/team/members/justin-gehtland"&gt;Justin Gehtland&lt;/a&gt;, so as the end of the year and the anniversary of the show approached, I thought it would be only too appropriate to have Justin on again. Besides, he&amp;#39;s a great guest, and we were clearly overdue to have him on the show again.&lt;/p&gt;

&lt;p&gt;As is traditional for this time of year, we spent a good chunk of our conversation talking about the year gone by (verdict: it was crazy) and the year to come (verdict: it&amp;#39;s super exciting).&lt;/p&gt;

&lt;p&gt;I hope you enjoy this &lt;a href="http://s3.amazonaws.com/thinkrelevance-podcast/ThinkRelevance-023-justin-gehtland.mp3"&gt;episode&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;The show is &lt;a href="http://itunes.apple.com/us/podcast/thinkrelevance-the-podcast/id498067022"&gt;available on iTunes&lt;/a&gt;! You can also subscribe to the podcast using our &lt;a href="http://feeds.feedburner.com/thinkrelevance/podcast"&gt;podcast feed&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can send feedback about the show to &lt;a href="mailto:podcast@thinkrelevance.com"&gt;podcast@thinkrelevance.com&lt;/a&gt;, or leave a comment here on the blog. Thanks for listening!&lt;/p&gt;

&lt;h1&gt;Our Guest, Justin Gehtland&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jgehtland"&gt;@jgehtland&lt;/a&gt; on Twitter&lt;/li&gt;
&lt;li&gt;His &lt;a href="http://thinkrelevance.com/team/members/justin-gehtland"&gt;Relevance profile&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Music&lt;/h1&gt;

&lt;p&gt;Justin chose &lt;a href="https://www.youtube.com/watch?feature=player_embedded&amp;amp;v=Mm2Z9Mr9Ilw"&gt;&amp;quot;Mountain Song&amp;quot; by Jane&amp;#39;s Addiction&lt;/a&gt; as the intro, and &lt;a href="https://www.youtube.com/watch?feature=player_embedded&amp;amp;v=CxBV-nxQiXQ"&gt;&amp;quot;Clean Elvis&amp;quot; by Dan Reeder&lt;/a&gt; to end the show.&lt;/p&gt;

&lt;h1&gt;Links&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/blog/2011/12/19/podcast-episode-001"&gt;Episode 1 of the Relevance Podcast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://datomic.com"&gt;Datomic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://endangereddurham.blogspot.com/2006/12/jourdan-house.html"&gt;The Jordan House&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/richhickey"&gt;Rich Hickey&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/stuart-halloway"&gt;Stuart Halloway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.venablecenter.com/spaces-ReceivingRoom.cfm"&gt;The New Office&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.durham-nc.com"&gt;Downtown Durham&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.colonialwilliamsburg.com"&gt;Colonial Williamsburg&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.snowshoemtn.com"&gt;Snowshoe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/ben-vandgrift"&gt;Ben Vandgrift&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/lynn-grogan"&gt;Lynn Grogan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clojure.org"&gt;Clojure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Ultralight_backpacking"&gt;Ultra Lightweight Backpacking&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?feature=player_embedded&amp;amp;v=jhat-xUQ6dw"&gt;Lucid Dreams&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/lake-denman"&gt;Lake Denman&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arduino.cc"&gt;Arduino&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://instagram.com/p/O_z-HhCqc3/"&gt;Pictures of (inc &amp;#39;Relevance) on Justin&amp;#39;s Instragram feed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clojureconj.com"&gt;Clojure Conj&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?feature=player_embedded&amp;amp;v=UJTi7KJPx_E"&gt;Star Trek II, the Wrath of Khan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://channel9.msdn.com/Events/PDC"&gt;Professional Developers Conference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://groupon.com"&gt;Groupon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://livingsocial.com"&gt;LivingSocial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/fogus"&gt;@fogus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/abedra"&gt;Aaron Bedra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/crnixon"&gt;Clinton Nixon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.consumerfinance.gov"&gt;Consumer Financial Protection Bureau&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/ryan-neufeld"&gt;Ryan Nuefeld&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/yoko-harada"&gt;Yoko Harada&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rubyheroes.com"&gt;Ruby Heroes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fivethirtyeight.blogs.nytimes.com"&gt;The 2012 Elections&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/jobs"&gt;Jobs at Relevance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/timothy-baldridge"&gt;Timothy Baldridge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.bcorporation.net"&gt;B Corporations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://etsy.com"&gt;Etsy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://warbyparker.com"&gt;Warby Parker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.nytimes.com/2011/01/17/technology/17glasses.html?_r=0"&gt;The Old Gray Lady&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/craig-andera"&gt;Craig Andera&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/jason-rudolph"&gt;Jason Rudolph&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/blog/2012/10/03/jamie-kite-podcast-episode-017"&gt;The Jamie Kite Episode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/clojure/clojurescript"&gt;ClojureScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clojurewest.org"&gt;Clojure/west&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://lambdajam.com"&gt;Lambda Jam&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Colorado"&gt;Colorado&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/michael-parenteau"&gt;Michael Parenteau&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/sam-umbach"&gt;Sam Umbach&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Singapore"&gt;Singapore&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/blog/2012/09/22/clojure-conference-organizers-podcast-episode-015"&gt;The Clojure Conference Episode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Credits&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Episode Cover Art:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/michael-parenteau"&gt;Michael Parenteau&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Production Assistance:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/justin-gehtland"&gt;Justin Gehtland&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/daemian-mack"&gt;Daemian Mack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/ryan-neufeld"&gt;Ryan Neufeld&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/timothy-baldridge"&gt;Timothy Baldridge&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/w-qTEkXF2as" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://thinkrelevance.com/blog/2013/01/03/justin-gehtland-podcast-episode-023</feedburner:origLink></entry>
  <entry>
    <title>Where to Find Relevancers: January Edition</title>
    <id>http://thinkrelevance.com/blog/2013/01/02/where-to-find-relevancers-january-edition</id>
    <updated>2013-01-02T16:30:00Z</updated>
    <published>2013-01-02T16:30:00Z</published>
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/NK7ZSLNrygE/where-to-find-relevancers-january-edition" />
    <author>
      <name>Lynn Grogan</name>
      <email>lynn@thinkrelevance.com</email>
    </author>
    <content type="html">&lt;p&gt;Want to meet a Relevancer in person? Here&amp;#39;s where you can find us during the month of January:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sandusky, OH&lt;/strong&gt; 1/8-1/11 &lt;br/&gt;
&lt;a href="http://codemash.org/"&gt;CodeMash&lt;/a&gt; &lt;br/&gt;
Speaking: &lt;a href="http://thinkrelevance.com/team/members/jen-myers"&gt;Jen Myers&lt;/a&gt; &lt;a href="http://codemash.org/sessions"&gt;Talk: Straight-Up Design: Simple Ways for Devs to Make Apps Look and Work Better&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Durham, NC&lt;/strong&gt; 1/9-1/30 &lt;br/&gt;
&lt;a href="http://www.meetup.com/Girl-Develop-It-RDU/events/92232332/"&gt;Girl Develop IT - RDU Intro to HTML &amp;amp; CSS&lt;/a&gt; @ &lt;a href="http://thinkrelevance.com/contact"&gt;Relevance HQ&lt;/a&gt; &lt;br/&gt;
Attending: &lt;a href="http://thinkrelevance.com/team/members/lynn-grogan"&gt;Lynn Grogan&lt;/a&gt; &lt;br/&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Richmond, VA&lt;/strong&gt; 1/15 &lt;br/&gt;
&lt;a href="http://cvreg.org/"&gt;Richmond Ruby User Group&lt;/a&gt; &lt;br/&gt;
Speaking: &lt;a href="http://thinkrelevance.com/team/members/russ-olsen"&gt;Russ Olsen&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Denver, CO&lt;/strong&gt; 1/17 &lt;br/&gt;
&lt;a href="http://www.meetup.com/denofclojure/events/95961062/"&gt;Den of Clojure Meetup Group&lt;/a&gt; &lt;br/&gt;
Attending: &lt;a href="http://thinkrelevance.com/team/members/timothy-baldridge"&gt;Timothy Baldridge&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Durham, NC&lt;/strong&gt; 1/24 &lt;br/&gt;
&lt;a href="http://www.meetup.com/TriClojure/events/96179092/"&gt;Triangle Clojure User Group Meetup&lt;/a&gt; @ &lt;a href="http://thinkrelevance.com/contact"&gt;Relevance HQ&lt;/a&gt; &lt;br/&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/NK7ZSLNrygE" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://thinkrelevance.com/blog/2013/01/02/where-to-find-relevancers-january-edition</feedburner:origLink></entry>
  <entry>
    <title>The Real Secret Behind Project Failure</title>
    <id>http://thinkrelevance.com/blog/2012/12/24/the-real-secret-behind-project-failure</id>
    <updated>2012-12-24T17:56:00Z</updated>
    <published>2012-12-24T17:56:00Z</published>
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/87fXAp-QNec/the-real-secret-behind-project-failure" />
    <author>
      <name>Marc Phillips</name>
      <email>marc@thinkrelevance.com</email>
    </author>
    <content type="html">&lt;p&gt;To the owner of a failed software project, there is little consolation that roughly   &lt;a href="http://www.zdnet.com/blog/projectfailures/cio-analysis-why-37-percent-of-projects-fail/12565"&gt;forty&lt;/a&gt; to &lt;a href="http://www.zdnet.com/blog/projectfailures/study-68-percent-of-it-projects-fail/1175"&gt;seventy&lt;/a&gt; out of every hundred &lt;em&gt;other&lt;/em&gt; projects have also failed to meet their goals.&lt;/p&gt;

&lt;p&gt;This sad math reflects a simple truth - delivering software solutions to hard business problems is, well... hard. Teams lacking sufficient technical skills are obviously doomed from the start. But a respectable lineup of developers merely gets you in the game. Projects making this first cut now must endure an onslaught of other challenges, from ambiguous requirements and unclear priorities to unrealistic schedules, poor communication, insufficient planning, and unmanaged risks. In other words, as a product owner embarking on a new assignment, the biggest threats to your success are not technical problems at all. At Relevance, we understand that software development is mostly a &lt;a href="http://thinkrelevance.com/blog/2012/09/18/the-secrets-of-building-software"&gt;people problem&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is why aside from employing an amazing group of &lt;a href="http://thinkrelevance.com/team/roles/developers"&gt;developers&lt;/a&gt;, &lt;a href="http://thinkrelevance.com/team/roles/designers"&gt;designers&lt;/a&gt;, and &lt;a href="http://thinkrelevance.com/team/roles/architects"&gt;architects&lt;/a&gt;, most Relevance projects receive the direct attention of a Relevance &lt;a href="http://thinkrelevance.com/team/roles/coaches"&gt;coach&lt;/a&gt; to minimize the non-technical risks to your project, and to help great people accomplish great things. &lt;/p&gt;

&lt;p&gt;So what exactly does a coach at Relevance do? A partial answer can be found in an episode of the Relevance &lt;a href="http://thinkrelevance.com/blog/2012/06/19/marc-phillips-podcast-episode-013"&gt;podcast&lt;/a&gt;, but the conversation is sporadically interrupted by loud monkey noises (oddly not present at the time of the original recording). In true agile fashion we shall adapt and repeat, and our answer will focus on &lt;a href="http://gettingresults.com/wiki/Chapter_1_-_Why_Agile_Results"&gt;outcomes rather than activities&lt;/a&gt;. When clients ask us &lt;em&gt;&amp;quot;What is the role of a coach at Relevance,&amp;quot;&lt;/em&gt; we&amp;#39;ve found what they&amp;#39;re really asking is &lt;strong&gt;&lt;em&gt;&amp;quot;How will my project benefit by having a Relevance coach on the team?&amp;quot;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;Saving you time and effort through efficient project management&lt;/h3&gt;

&lt;p&gt;As someone looking for a team to help grow your business, you&amp;#39;ve probably got a big problem, limited budget, and a tight timeline for finding a solution. And most likely you&amp;#39;ve got a lot of other very important things to do each day. &lt;/p&gt;

&lt;p&gt;Once we kick off &lt;a href="http://thinkrelevance.com/blog/2012/10/22/contingent-i0-reducing-the-risk-of-new-projects"&gt;Iteration Zero&lt;/a&gt;, I like to tell clients they are now free to leave the engine room and snuggle comfortably in the captain&amp;#39;s chair. As a busy product owner, having a Relevance coach on the job allows you to focus on the critical role of &lt;em&gt;setting the course&lt;/em&gt; of the ship without the additional burden of monitoring and maintaining the complex propulsion, communication, and navigation systems required to complete your journey.&lt;/p&gt;

&lt;p&gt;As an agile project manager, the Relevance coach saves you time and effort while achieving the necessary goals of transparent metrics, alignment between daily tasks and high-level goals, and protecting the unimpeded progress of the development team.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;quot;But what if I have the project management expertise and time to devote to my project? Would I still want a Relevance coach on the team?&amp;quot;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For some projects, busy clients set broad targets and then connect with the development team for just a few minutes each day, trusting the Relevance coach as their near full time project manager. For others it may be a sliding scale of delegated responsibilities. For the most experienced and available clients, a Relevance coach serves to facilitate critical decisions such as changes to team priorities or core functionality. At these times, a Relevance coach enables the client to participate fully as product &lt;em&gt;owner&lt;/em&gt; rather than project &lt;em&gt;manager&lt;/em&gt;, to become an engaged passenger with someone else at the wheel until the matter is resolved.  &lt;/p&gt;

&lt;p&gt;There are also times where a Relevance coach will serve as proxy for product owners at both office and partner presentations, outlining plans and progress and gathering feedback for the team. Increasingly this role is extending to front line investigator and liaison with customers and executives alike.&lt;/p&gt;

&lt;h3&gt;Providing an objective perspective and minimizing risk&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;quot;I&amp;#39;ve spoken with other software consultancies who don&amp;#39;t have coaches. Are their developers better than yours?&amp;quot;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This isn&amp;#39;t about development expertise; it&amp;#39;s about better overall outcomes. A Relevance coach on your project gives you a team &lt;em&gt;catalyst,&lt;/em&gt; enabling a whole much greater than the sum of its parts. It means someone on your side with a dedicated, independent, and people-focused perspective - looking at the team and release in a different way.&lt;/p&gt;

&lt;p&gt;Gil Broza in &lt;a href="http://www.amazon.com/The-Human-Side-Agile-Deliver/dp/0988001624"&gt;The Human Side of Agile&lt;/a&gt; describes the benefits of an &amp;#39;agile team leader&amp;#39;, though we believe a more accurate title is &amp;#39;agile team enabler&amp;#39;. Broza notes that &amp;quot;by constantly observing the team&amp;#39;s progress and learning about their hurdles, the leader can distinguish patterns, identify root causes, and stop small problems from growing into big ones.&amp;quot; To accomplish this requires taking a birds-eye view of the situation, to focus on the big picture at all times.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;quot;Why shouldn&amp;#39;t one of the developers on the team play this role?&amp;quot;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Relevance developers are certainly &lt;em&gt;capable&lt;/em&gt; of filling this critical role. At issue is whether this is the most cost-effective and efficient method to achieve your goals. Every moment spent by a developer preparing to facilitate a &lt;a href="http://thinkrelevance.com/how-we-work/product_owner#product_owner-retrospectives"&gt; retrospective&lt;/a&gt;, discussing a shift in priorities with you, or evaluating upcoming staffing needs is a moment they are &lt;em&gt;not&lt;/em&gt; delivering awesome software.&lt;/p&gt;

&lt;p&gt;A developer in the role of coach would be by definition a part time responsibility. The &amp;quot;coach hat&amp;quot; and &amp;quot;developer hat&amp;quot; cannot be worn at the same time. To put their coach&amp;#39;s hat on, a developer must temporarily leave the development team. Only computers are designed for &lt;a href="http://en.wikipedia.org/wiki/Computer_multitasking"&gt;multitasking&lt;/a&gt;. Human beings are only capable of &lt;a href="http://www.psychologytoday.com/blog/brain-wise/201209/the-true-cost-multi-tasking"&gt;switch-tasking&lt;/a&gt;, and switching between tasks is expensive. &lt;/p&gt;

&lt;p&gt;Time spent context switching will come directly out of your project budget. Such teams can still be successful, but will have to be less efficient than those with a cleaner separation of roles.&lt;/p&gt;

&lt;p&gt;As noted in &amp;quot;&lt;a href="http://www.amazon.com/Resilience-Why-Things-Bounce-Back/dp/1451683804"&gt;Resilience&lt;/a&gt;&amp;quot; by Andrew Zolli and Ann Marie Healy, such &amp;quot;cognitive diversity&amp;quot; within teams has been shown to consistently achieve better results. Relevance coaches help developers and clients consider a wider range of options, raising previously unseen issues, and helping to guide the team out of jams when they occur. Software projects are inherently risky, and unexpected obstacles can rise up suddenly to block the team. Teams consisting of individuals with similar modes of thinking can excel when the path is smooth, but adding individuals providing alternative views has been shown again and again to catalyze better performing, more &lt;em&gt;resilient&lt;/em&gt; teams that can adjust faster and more effectively to difficult terrain, dramatically lowering the risk to your project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;quot;Why shouldn&amp;#39;t I play this role as the product owner?&amp;quot;&lt;/em&gt;&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;To answer this question, please note that one of the key players on the team is &lt;em&gt;you.&lt;/em&gt; As the Relevance coach identifies strategies for better team performance, this includes an objective view of the actions and interactions between all team members, including the product owner and other client stakeholders at a level that would be extremely difficult through self-reflection alone. Similar to the developer&amp;#39;s dilemma, to become a part time coach necessitates giving up your role as full time product owner. In which capacity would you provide the most value to the project and your business?&lt;/p&gt;

&lt;h3&gt;Stacking the deck in your favor&lt;/h3&gt;

&lt;p&gt;In its simplest form, having a Relevance coach on your project is a really smart and cost effective method of risk mitigation. On most projects I spend a lot of time both asking and answering questions, proposing plans and providing feedback, and uncovering inconsistencies in goals and execution. I facilitate resolution of misunderstandings and help frame difficult decisions. At times I play the role of counselor and trusted advisor to developers and clients alike, serving as both relief valve and sounding board. And I love it. &lt;/p&gt;

&lt;p&gt;In the end, technical difficulties are rarely the cause of project failure. Project failure is really &lt;em&gt;team&lt;/em&gt; failure. Teams are made of individuals, including developers, product owners, and other stakeholders. In theory, if each individual performs perfectly, the input (your problem) should produce the correct output (your solution). But these people are not just boxes on an org chart. Inside those hard candy exteriors each team member has a creamy human middle. Any friction in the system generates heat, and things get sticky. &lt;/p&gt;

&lt;p&gt;Unless sufficient attention is paid to the &lt;em&gt;machinery of the team&lt;/em&gt;, the smooth and continuous flow of information and intentions can become clouded and spotty. When this occurs, even highly skilled teams can become bogged down or burnt out and fail to reach their goals. This is the real secret of project failure, and how a Relevance coach can help &lt;em&gt;your&lt;/em&gt; project be a success.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/87fXAp-QNec" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://thinkrelevance.com/blog/2012/12/24/the-real-secret-behind-project-failure</feedburner:origLink></entry>
  <entry>
    <title>Timothy Baldridge - Podcast Episode 022</title>
    <id>http://thinkrelevance.com/blog/2012/12/12/timothy-baldridge-podcast-episode-022</id>
    <updated>2012-12-12T15:00:00Z</updated>
    <published>2012-12-12T15:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/relevance-llc/~3/eF-lVh8nbSg/timothy-baldridge-podcast-episode-022" />
    <author>
      <name>Craig Andera</name>
      <email>craig@thinkrelevance.com</email>
    </author>
    <content type="html">&lt;p&gt;&lt;img src="http://s3.amazonaws.com/thinkrelevance-podcast/022-timothy-baldridge.jpg" alt="cover art"&gt;&lt;/p&gt;

&lt;p&gt;It may sound trite to say so, but Relevance is the awesome place it is because of the people that work here. So I thought it would be interesting to talk to our newest hire, &lt;a href="http://thinkrelevance.com/team/members/timothy-baldridge"&gt;Timothy Baldridge&lt;/a&gt;, about what it&amp;#39;s like to get hired. He had a lot to say on the subject, and I found it pretty interesting. Just as interesting was finding out more about &lt;a href="https://github.com/halgari/clojure-py"&gt;Clojure-Py&lt;/a&gt;, Timothy&amp;#39;s implementation of Clojure on the Python runtime.&lt;/p&gt;

&lt;p&gt;So please download the &lt;a href="http://s3.amazonaws.com/thinkrelevance-podcast/ThinkRelevance-022-timothy-baldridge.mp3"&gt;episode&lt;/a&gt; and enjoy!&lt;/p&gt;
&lt;p&gt;The show is &lt;a href="http://itunes.apple.com/us/podcast/thinkrelevance-the-podcast/id498067022"&gt;available on iTunes&lt;/a&gt;! You can also subscribe to the podcast using our &lt;a href="http://feeds.feedburner.com/thinkrelevance/podcast"&gt;podcast feed&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can send feedback about the show to &lt;a href="mailto:podcast@thinkrelevance.com"&gt;podcast@thinkrelevance.com&lt;/a&gt;, or leave a comment here on the blog. Thanks for listening!&lt;/p&gt;

&lt;h1&gt;Our Guest, Timothy Baldridge&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://twitter.com/timbaldridge"&gt;@timbaldridge&lt;/a&gt; on Twitter&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/halgari"&gt;On GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;His Relevance &lt;a href="http://thinkrelevance.com/team/members/timothy-baldridge"&gt;profile&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Music&lt;/h1&gt;

&lt;p&gt;Timothy chose &amp;quot;Viva La Vida&amp;quot; by &lt;a href="http://www.coldplay.com/"&gt;Coldplay&lt;/a&gt; as the intro, and &amp;quot;Don&amp;#39;t Be Afraid&amp;quot; by &lt;a href="http://en.wikipedia.org/wiki/Nobuo_Uematsu"&gt;Nobuo Uematsu&lt;/a&gt; to end the show.&lt;/p&gt;

&lt;h1&gt;Links&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/jobs"&gt;Relevance jobs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clojure-conj.org/"&gt;Clojure Conj&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://doeswhat.com/2012/10/16/interview-with-justin-gehtland-relevance/"&gt;Justin Gehtland&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/C_Sharp_%28programming_language%29"&gt;C#&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/halgari/clojure-py"&gt;Clojure-Py&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/naoko-chamberlain"&gt;Naoko Chamberlain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/roles/coaches"&gt;Relevance coaches&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/blog/2010/09/02/remote-pairing"&gt;Remote pairing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tmux.sourceforge.net"&gt;tmux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/stuartsierra/pairhost"&gt;Amazon Pairhost&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.gnu.org/software/emacs/"&gt;Emacs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/stuart-sierra"&gt;Stuart Sierra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.apress.com/9781430272311"&gt;Stuart&amp;#39;s book &amp;quot;Practical Clojure&amp;quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://groups.google.com/forum/?fromgroups#!forum/clojure"&gt;Clojure mailing list&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.infoq.com/interviews/halloway-datomic"&gt;Stu Halloway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.bennorthrop.com/Home/Blog/2007_12_17_unkempt.php"&gt;Programming gods&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/tim-ewald"&gt;Tim Ewald&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.durham-nc.com/"&gt;Durham, NC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.datomic.com/"&gt;Datomic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Pair_programming"&gt;Pair programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/how-we-work"&gt;How We Work&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dev.clojure.org/dashboard.action"&gt;Clojure tickets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/michael-nygard"&gt;Mike Nygard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clojure-conj.org/speakers/nygard.html"&gt;Mike&amp;#39;s talk &amp;quot;Whence Complexity?&amp;quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.wikihow.com/Act-Like-an-Adult"&gt;Act like an adult&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.venablecenter.com/"&gt;Relevance office&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.slideshare.net/estherderby/agile-retrospectives-4976896"&gt;Retrospectives&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/marc-phillips"&gt;Marc Phillips&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.denver.org/"&gt;Denver, CO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.fxva.com/"&gt;Fairfax, VA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/how-we-work/dev_team#/dev_team-fridays"&gt;Fridays (20% Time)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.visitmadison.com/"&gt;Madison, WI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Stand-up_meeting"&gt;Standup meetings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.microsoft.com/en-us/default.aspx"&gt;Microsoft&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/crnixon"&gt;Clinton Dreisbach&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/relevance/diametric"&gt;Diametric&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rubyonrails.org/"&gt;Rails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/yoko-harada"&gt;Yoko Harada&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.infoq.com/author/Rich-Hickey"&gt;Rich Hickey&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/441824/java-virtual-machine-vs-python-interpreter-parlance"&gt;Python Virtual Machine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Compiler"&gt;Compilers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/21934/why-java-and-python-garbage-collection-methods-are-different"&gt;Garbage collection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/clojure/clojurescript"&gt;ClojureScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/richhickey/clojure-clr"&gt;Clojure CLR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/clojure/source/browse/trunk/src/clj/clojure/core.clj"&gt;core.clj&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bright-reflection.blogspot.com/2011/07/jvm-vs-clr-comparative-analysis.html"&gt;JVM vs CLR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nodejs.org/"&gt;node.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/swannodette"&gt;David Nolen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/C_%28programming_language%29"&gt;C&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://llvm.org/"&gt;LLVM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/S-expression"&gt;S-expression&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html"&gt;Objective-C&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hackerschool.com/"&gt;Hacker School&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://numpy.scipy.org/"&gt;NumPy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://peak.telecommunity.com/DevCenter/EasyInstall"&gt;Python Easy Install&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.paulgraham.com/"&gt;Paul Graham&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Lisp_%28programming_language%29"&gt;LISP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Alan_Kay"&gt;Alan Kay&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.paulgraham.com/avg.html"&gt;Profound enlightenment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.haskell.org/haskellwiki/Haskell"&gt;Haskell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clojure-conj.org/speakers/bonnaire-sergeant.html"&gt;Ambrose Bonnaire-Sergeant and Typed Clojure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/clojure/core.logic"&gt;core.logic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ffdistantworlds.com/about"&gt;Final Fantasy music&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Syncopation"&gt;Syncopation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_works_in_irregular_time_signatures"&gt;Odd time meters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=cpbbuaIA3Ds"&gt;Pink Floyd - &amp;quot;Money&amp;quot;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Credits&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/marc-phillips"&gt;Marc Phillips&lt;/a&gt; (&lt;a href="https://twitter.com/turbomarc"&gt;@turbomarc&lt;/a&gt;), production assistance&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thinkrelevance.com/team/members/michael-parenteau"&gt;Michael Parenteau&lt;/a&gt; (&lt;a href="http://twitter.com/parenteau"&gt;@parenteau&lt;/a&gt;), episode cover art&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/relevance-llc/~4/eF-lVh8nbSg" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://thinkrelevance.com/blog/2012/12/12/timothy-baldridge-podcast-episode-022</feedburner:origLink></entry>
</feed>
