<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Andrew Birkett's blog</title>
	<atom:link href="http://www.nobugs.org/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.nobugs.org/blog</link>
	<description>Thoughts of a software engineer</description>
	<lastBuildDate>Tue, 22 Dec 2009 22:50:35 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Royal Institution Christmas Lectures, take one</title>
		<link>http://www.nobugs.org/blog/archives/2009/12/22/royal-institution-christmas-lectures-take-one/</link>
		<comments>http://www.nobugs.org/blog/archives/2009/12/22/royal-institution-christmas-lectures-take-one/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 22:49:29 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.nobugs.org/blog/?p=346</guid>
		<description><![CDATA[When I visited the Royal Institution in London recently, there was obviously something &#8216;going on&#8217; in the building.  After checking out the official exhibit in the basement, I explored the building by following the staircase up past an interesting succession of portraits.  I could hear a professional sounding talk coming from somewhere, and [...]]]></description>
			<content:encoded><![CDATA[<p>When I visited the Royal Institution in London recently, there was obviously something &#8216;going on&#8217; in the building.  After checking out the official exhibit in the basement, I explored the building by following the staircase up past an interesting succession of portraits.  I could hear a professional sounding talk coming from somewhere, and saw several stressed stagehands running from a room packed with scientific props to a door leading to a backstage area.</p>
<p>This, then, would be the world-famous Royal Institution Christmas Lectures!  They&#8217;re now being shown on TV as I speak.  I didn&#8217;t want to get in the way of the stagehands and their precious cargo, and so I beat a hasty retreat back downstairs.</p>
<p>However, I noticed today that the RI website says that the christmas lectures are held at 6pm.  But I visited there at around 3pm.  So how come I managed to overhear a lecture?</p>
<p>Turns out, these slick tv productions don&#8217;t &#8220;just happen&#8221;.  I found an article by a previous xmas lecturer which <a href="http://www.biochemistry.org/Portals/0/Education/Christmas%20lecturer.pdf">explain the painful reality</a>.  Each lecture is preceded by at least a gruelling day and a half of rehearsals and planning.  It&#8217;s more like a stage show than a simple lecture &#8211; the cameras, sound guys, lighting and stagehands all need to figure out what they&#8217;ll be doing and when they&#8217;ll be doing it.  And the lecturer needs to figure out where to look, who to talk to *and* remember their words!  Seems like working with children &#038; animals is the least of their troubles.</p>
<p>Having watched the first lecture on TV now, I&#8217;m left wondering how they got two donkeys up to the lecture theatre.  Did they walk up the stairs?  Do they have a lift &#8211; and, if so, would you get into a lift with two donkeys?!</p>
<p>And so I leave the Royal Institution, home of Michael Faraday and Humphry Davy, by contemplating the deepest question of science:  Donkeys and staircases.  Staircases and donkeys.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nobugs.org/blog/archives/2009/12/22/royal-institution-christmas-lectures-take-one/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Technical debt (or, mortgages in Haskell)</title>
		<link>http://www.nobugs.org/blog/archives/2009/11/17/technical-debt-or-mortgages-in-haskell/</link>
		<comments>http://www.nobugs.org/blog/archives/2009/11/17/technical-debt-or-mortgages-in-haskell/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 01:05:39 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[haskell]]></category>

		<guid isPermaLink="false">http://www.nobugs.org/blog/?p=326</guid>
		<description><![CDATA[I recently got fed up trying to understand my mortgage using excel.  After twenty minutes guddling with cells and individual values, I felt the need to create higher-level abstractions such as &#8220;mortgage&#8221; and &#8220;payment strategy&#8221;.  I also wanted to create a list of possible repayment strategies and easily compare them to see how [...]]]></description>
			<content:encoded><![CDATA[<p>I recently got fed up trying to understand my mortgage using excel.  After twenty minutes guddling with cells and individual values, I felt the need to create higher-level abstractions such as &#8220;mortgage&#8221; and &#8220;payment strategy&#8221;.  I also wanted to create a list of possible repayment strategies and easily compare them to see how it affects the loan duration and total interest payed.  This is possible in excel, but no fun.</p>
<p>So, fast-forward to the end of an evening&#8217;s hacking with Haskell. I now have <a href="http://www.nobugs.org/developer/hmortgage/Mortgage.hs">hmortgage</a>, a EDSL for expressing payment strategies and code which will expand out a mortgage into monthly steps, like this:</p>
<pre>
We are looking at loan of £1000.00 at 5.0% over 10y, which has required monthly payment of £10.58
Baseline:
        Total interest: £272.97 Total payments: £1272.97 Duration=10y 1m
Overpayment scenario "2 pm, 200 initial":
        Total interest: £132.09 Total payments: £1132.09 Duration=6y 3m
        Compared to baseline: interest=£-140.88, payments=£-140.88, duration=-3y 10m
For month 1, balance: £1000.00 -> £791.58       (interest: £4.16, payment: £212.58)
For month 2, balance: £791.58 -> £782.29        (interest: £3.29, payment: £12.58)
For month 3, balance: £782.29 -> £772.96        (interest: £3.25, payment: £12.58)
For month 4, balance: £772.96 -> £763.60        (interest: £3.22, payment: £12.58)
</pre>
<p>ie. if you overpay by £2 each month, and pay an initial lump sum of £200, you&#8217;ll save about £140 overall and will repay the mortgage nearly 4 years early.</p>
<p>There&#8217;s a few points of haskelly interest in this code, mostly inspired by stuff I read a few years ago &#8211; behaviors in FRP, and SPJ&#8217;s &#8220;composing contracts&#8221; paper.</p>
<h3>Combinators for payment strategies</h3>
<p>I have a few primitive payment strategies, which can be combined into more complex strategies:</p>
<ul>
<li>monthlyPaymentsOf (100 Pounds)
</li>
<li>lumpSumOf (100 Pounds)
</li>
<li>lumpSumOf (100 Pounds) `after` (1 Year)
</li>
<li>monthlyPaymentsOf (100 Pound) +. (lumpSumOf (100 Pounds) `after` (1 Year))
</li>
</ul>
<h3>Shallow embedding of DSL</h3>
<p>The dsl is a shallow embedding; it represents the monthly payment plan as a function from month-number to the payment amount, ie. Integer -> Currency.  There&#8217;s a problem with this approach &#8211; the only thing you can do with a function is apply it to some arguments.  This is fine for finding the payment for a particular month, but I would also like to derive a textual description of the payment plan &#8211; which isn&#8217;t possible with functions.</p>
<p>From stuff I&#8217;ve read previously, I think my two options are:</p>
<ol>
<li>Lisp-like: Represent the payment schedule as data (ie. like an AST) and provide an eval function.  This allows introspection into structure of the payment schedule.  Code is data, data is code.
</li>
<li>Arrow-like: The payment strategy could be a tuple of the function and a textual description.  When strategies are combined, the combinator would merge the textual descriptions as well as producing new combined functions.  I&#8217;m not totally convinced that the english language is &#8216;compositional&#8217; in this way though &#8211; it might end up with really clumsy phrasing.
</li>
</ol>
<h3>Crazy Lennart-inspired postfix operators</h3>
<p>Initially, the only way I had to create a &#8216;Currency&#8217; value was via the &#8216;pounds&#8217; function.  In haskell, the function precedes the argument, hence it looks like &#8220;pounds 20&#8243;.  The source code would read nicer if I could write this as &#8220;20 pounds&#8221; like we do in english.  I didn&#8217;t think this was possible in Haskell.</p>
<p>Then I remembered seeing Lennart Augustsson&#8217;s crazy embedding of <a href="http://hackage.haskell.org/package/BASIC">BASIC into Haskell</a>.  In particular, he had code which looked like this:</p>
<pre lang="haskell">
runBasic $ do
  10 PRINT "HELLO"
  20 END
</pre>
<p>How the heck does that parse?  It&#8217;s using &#8216;do&#8217; notation, so &#8220;20 END&#8221; must have a type in the Monad class.  But, as I understood things, &#8220;x y&#8221; means &#8220;apply the (function) value x to value y&#8221;.  And &#8220;20&#8243; doesn&#8217;t look much like a function to me.</p>
<p>Digging into the source, I found this:</p>
<pre lang="haskell">
-- 10 END
instance Num (END -> Expr a) where
    fromInteger i c = ...
</pre>
<p>Hmm, interesting.  This is saying that (some) function type can be treated as if it is &#8220;number like&#8221; and provides a mechanism for converting integer literals in source code to that type.  I hadn&#8217;t fully appreciated this, but the Haskell Report <a href="http://www.haskell.org/onlinereport/basic.html#numeric-literals">says</a> that numeric literals aren&#8217;t quite as literal as I expected &#8211; the literal integer value gets passed through &#8216;fromInteger&#8217; and can therefore be made into any Numeric type.</p>
<p>So this code really says &#8220;Hey ghc, if you come across a &#8220;42&#8243; in the source code, you can turn that into a function if you need to&#8221;.  In the BASIC example, the next thing on line 20 is &#8220;END&#8221;, a constructor for the type also called END.  So, ghc will be looking to turn &#8220;42&#8243; into something that can be used as a function taking an argument of type END, and so it&#8217;ll call this instance of fromInteger.</p>
<p>Hurrah, I can use the same &#8216;trick&#8217; to make my currencies look nicer:</p>
<pre lang="haskell">
data MONEY = Pounds | Pence

instance Num (MONEY -> Currency) where
  fromInteger i Pounds = C (i * 100)
  fromInteger i Pence = C i
</pre>
<p>Now I can say &#8220;42 Pounds&#8221; or &#8220;23 Pence&#8221;.  The &#8220;42&#8243; will become a function with type MONEY -> Currency.  The &#8220;MONEY&#8221; type is really just a tag &#8211; used to choose the parse but that&#8217;s it.  The Pounds/Pence tags force the appropriate overloading of fromInteger to be chosen, and this will construct a Currency value (represented as number of pence, and using a simple wrapper constructor called C).</p>
<p>Is this better, or just &#8220;clever&#8221;?  I&#8217;m not sure yet.  It&#8217;s certainly easier to read.  But I feel I&#8217;ve taken a step away from &#8220;pure haskell&#8221; into a slightly weird world.  Still, if I were writing in lisp, I wouldn&#8217;t think twice about doing this kind of thing.</p>
<h3>The actual app</h3>
<p>Shocker, I&#8217;ve produced an app which is actually useful to me in &#8220;teh real world&#8221;.   I have a big TODO list of stuff which will fit nicely into the app &#8211; time-varying interest rates, inflation predictions and NPV calculations.  None of  which, of course, I will ever actually get around to adding.  But it&#8217;s still useful in its present state, so a win!</p>
<p>Here&#8217;s what the &#8220;summary&#8221; view says &#8211; it omits the montly breakdown and instead reports the overall savings possible via the different payment strategies:</p>
<pre>
We are looking at loan of £1000.00 at 5.0% over 10y, which has required monthly payment of £10.58
Baseline:
        Total interest: £272.97 Total payments: £1272.97 Duration=10y 1m
Overpayment scenario "2 pm, 200 initial":
        Total interest: £132.09 Total payments: £1132.09 Duration=6y 3m
        Compared to baseline: interest=£-140.88, payments=£-140.88, duration=-3y 10m
Overpayment scenario "2 pm only":
        Total interest: £216.50 Total payments: £1216.50 Duration=8y 1m
        Compared to baseline: interest=£-56.47, payments=£-56.47, duration=-2y
Overpayment scenario "200 initial":
        Total interest: £163.52 Total payments: £1163.52 Duration=7y 8m
        Compared to baseline: interest=£-109.45, payments=£-109.45, duration=-2y 5m
Overpayment scenario "400 initial":
        Total interest: £87.73 Total payments: £1087.73 Duration=5y 6m
        Compared to baseline: interest=£-185.24, payments=£-185.24, duration=-4y 7m
Overpayment scenario "200 after 2y":
        Total interest: £191.42 Total payments: £1191.42 Duration=7y 10m
        Compared to baseline: interest=£-81.55, payments=£-81.55, duration=-2y 3m
Overpayment scenario "400 after 2y":
        Total interest: £137.90 Total payments: £1137.90 Duration=5y 10m
        Compared to baseline: interest=£-135.07, payments=£-135.07, duration=-4y 3m
</pre>
<p>Eep, it&#8217;s 01:30 .. how did that happen?  Stoopid jetlag &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nobugs.org/blog/archives/2009/11/17/technical-debt-or-mortgages-in-haskell/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>DRM fail</title>
		<link>http://www.nobugs.org/blog/archives/2009/11/11/drm-fail/</link>
		<comments>http://www.nobugs.org/blog/archives/2009/11/11/drm-fail/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 01:03:24 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.nobugs.org/blog/?p=324</guid>
		<description><![CDATA[I recently got the NASA When We Left Earth DVDs, and I thought &#8220;great, I&#8217;ll be able to watch them during my Seattle trip&#8221;.  So, I put them into the hotel DVD player tonight .. and got a &#8220;cannot play&#8221; error.  Arg, the dvd&#8217;s will be region 2 (europe) and the player is [...]]]></description>
			<content:encoded><![CDATA[<p>I recently got the NASA <a href="http://dsc.discovery.com/tv/nasa/nasa.html">When We Left Earth</a> DVDs, and I thought &#8220;great, I&#8217;ll be able to watch them during my Seattle trip&#8221;.  So, I put them into the hotel DVD player tonight .. and got a &#8220;cannot play&#8221; error.  Arg, the dvd&#8217;s will be region 2 (europe) and the player is region 1 (US).  So, despite this being a completely legal, paid for copy of the DVDs which I brought with me, I cannot watch them!   Grr!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nobugs.org/blog/archives/2009/11/11/drm-fail/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sleepy in Seattle</title>
		<link>http://www.nobugs.org/blog/archives/2009/11/09/sleepy-in-seattle/</link>
		<comments>http://www.nobugs.org/blog/archives/2009/11/09/sleepy-in-seattle/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 01:36:45 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.nobugs.org/blog/?p=321</guid>
		<description><![CDATA[What does one do to stay awake in Seattle after getting up at 3am, 14 hours of travelling and an 8 hour timezone shift?  In my case, grab a coffee (how native) and head to the awesome Seattle Public Library.  Without much of a plan, apart from staying awake.  As it turns [...]]]></description>
			<content:encoded><![CDATA[<p>What does one do to stay awake in Seattle after getting up at 3am, 14 hours of travelling and an 8 hour timezone shift?  In my case, grab a coffee (how native) and head to the awesome Seattle Public Library.  Without much of a plan, apart from staying awake.  As it turns out, I randomly stumbled upon an archive of Communications of the ACM dating back to the very first edition, in 1958.</p>
<p>1958 was a strange old world.  Things considered newsworthy: buying a new computer (as in, &#8216;Foo University has purchased an IBM 456 with 2048 bytes of memory&#8217;), upgrading the memory in your existing computer (particularly when you are building said memory from scratch yourself).  Other articles included puzzles similar to chess end-games &#8211; ie. implement [trivial operation] using only 6 bytes of IBM xyz machine code but without using any jump operations.</p>
<p>I skipped forward to November 1976, the month I was born.   An article by Jim Gray on db locking in which it&#8217;s necessary to define the term &#8216;transaction&#8217; explicitly.  The previous month, there&#8217;s an early paper about texture mapping by Jim Blinn with lots of pretty pictures.  Again, it&#8217;s enlightening to see &#8216;basic&#8217; stuff being laboriously explained .. for example, why you get aliasing effects if you sample the texture naively.  But wasn&#8217;t &#8220;basic stuff&#8221; back then; it was the frontier of knowledge.</p>
<p>Only the flight across, I was reading a biography of <a href="http://en.wikipedia.org/wiki/Oliver_Heaviside">Oliver Heaviside</a>.  The book covers both his physics work and also the world, time and society that he lived in.  In particular, it&#8217;s fascinating to read about how resistant (sic) &#8220;practical&#8221; electrical engineers were to the new-fangled mathematics-wielding theoreticians who had started to dominate the field.  There were many vocal engineers who were quite sure that they didn&#8217;t need &#8220;all that maths stuff&#8221;.  </p>
<p>For every success story celebrated and enshrined in today&#8217;s textbooks, there were many other forgotten voices arguing <i>against</i> that viewpoint in the publications of the day.  I&#8217;m sad that almost every textbook I read at university missed out all of this rich tapestry &#8211; instead they provided a neatly cut-and-dried distillation, devoid of any human context.   To me, real science was. and presumably still is, a process of muddling around in a sea of uncertainty and conflicting schools of opinion.  I seemed to learn about the abstract scientific method (very useful!) but not so much about the day-to-day struggles of real scientists.  Much later, I found my way to <a href="http://en.wikipedia.org/wiki/The_Structure_of_Scientific_Revolutions">Thomas Kuhn</a> and biographies of Faraday, Maxwell, Boltzmann, etc.  And there I found a much more interesting picture, crucially explaining the ideas in their original context.</p>
<p>So it&#8217;s nice to be able to go back to the original sources and imagine what it might&#8217;ve been like to be a &#8216;computer person&#8217; in 1958 .. to see what kind of ideas were thinkable in that time, to see who was prodding at the boundaries, and to see how much is recognizable today.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nobugs.org/blog/archives/2009/11/09/sleepy-in-seattle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Coders at Work</title>
		<link>http://www.nobugs.org/blog/archives/2009/10/28/coders-at-work/</link>
		<comments>http://www.nobugs.org/blog/archives/2009/10/28/coders-at-work/#comments</comments>
		<pubDate>Wed, 28 Oct 2009 21:41:29 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.nobugs.org/blog/?p=316</guid>
		<description><![CDATA[The coders who are interviewed in &#8220;Coders at Work&#8221; all have interesting opinions, but it&#8217;s the recurring themes which have really grabbed me.
The first theme is that all of these people are humans.  They&#8217;re might all be famous for doing X, but hardly any of them set out consciously to do X, and none [...]]]></description>
			<content:encoded><![CDATA[<p>The coders who are interviewed in <a href="http://www.amazon.com/gp/product/1430219483?ie=UTF8&#038;tag=nobugs-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=1430219483">&#8220;Coders at Work&#8221;</a> all have interesting opinions, but it&#8217;s the recurring themes which have really grabbed me.</p>
<p>The first theme is that all of these people are humans.  They&#8217;re might all be famous for doing X, but hardly any of them set out consciously to do X, and none of them did what they did because they knew it&#8217;d lead them to where they are today.  When you read about how they got into their area, the recurring themes are serendipity and &#8220;I did it because it was fun&#8221;.  As Simon Peyton Jones says explicitly, the important thing is just getting started &#8211; because once you get started there&#8217;s a million interesting things you could play with.  I don&#8217;t want to downplay the cool stuff some of these guys have done, but it&#8217;s hugely enlightening to hear them talk in their own words and hear how &#8220;normal&#8221; they all are.</p>
<p>The other theme I noticed is that everyone lives in their own little niche.  Very few people in the book seem to have a broad overview of computing and how it&#8217;s changed over the decades.  In particular, you can see how people&#8217;s thinking is constrained by either the era in which they learned about computers, or by the particular area that they&#8217;ve specialized in.  It&#8217;s refreshing to hear Simon Peyton Jones say that he doesn&#8217;t really have a deep understanding of OO programming, because he&#8217;s basically not done that much of it &#8211; he doesn&#8217;t knock it, either.  It&#8217;s weird to hear Peter Deustch describe his dream language without him knowing that these ideas have already been tried in Haskell.  It&#8217;s interesting to hear people who are famous as being &#8216;lisp guys&#8217; or &#8217;smalltalk guys&#8217; knocking &#8216;their own&#8217; language.  And it&#8217;s amazing to see the split between low-level and high-level thinkers.  I&#8217;m biased, because I&#8217;m into programming languages, but few people commented on the extent to which your Preferred Language affects your modes of thinking &#8211; although the results are plain to see.</p>
<p>Finally, this book made me realise that I&#8217;ve been in this game for quite a long time now (I&#8217;m only 32!).  Enough time for entire chapters of knowledge to have come and gone.  Programming in assembler, gone!  Well not totally; still useful for compiler backends, security exploits and such like.  Manual memory allocation, gone!  Well not totally, there&#8217;s still kernel development and embedded stuff.  Segmented memory models, gone but back for a wee while with PAE. Implementing primitive datastructures, largely done for you! C++, gone (for me at least)!  I spend so much time getting really good at it too, hmmph.  I respect it for what it is, but there are much nicer ways to spend your life.</p>
<p>But that&#8217;s all fine.  Technology reflects the era that it was born in.  C made sense when memory was expensive and CPUs slow.  Now virtual memory and VM&#8217;s make sense.  When resources were sparse, conceptual clarify was sacrificed to gain performance.  Now we usually don&#8217;t need to make that sacrifice.  The abstractions which made sense for a 1990&#8217;s desktop GUI app aren&#8217;t the ones you need for a 2009 network-based distributed system.</p>
<p>Is history important?  Only partly, I think. The high level lessons are certainly important, but the details aren&#8217;t.  Do you need to be able to code up a red/black tree today?  No.  But I think a developer should have a deep appreciation for the distinction between interface and implementation &#8211; and you should understand how the implementation choices can affect you (as a user).  Do you need to understand low level hardware/assembler?  No, but the concepts and solutions which crop up at that level crop up elsewhere too, so it&#8217;s certainly not wasted knowledge.  Do you need to learn smalltalk?  Only really to learn the &#8216;lessons of smalltalk&#8217; &#8211; to see what you can do with a reflective, late-bound, heavily interactive system.</p>
<p>All in all, I&#8217;m whimsical about the amount of technology water that&#8217;s passed under my particular bridge.  Easy come, easy go, I am not the sum of my knowledge.  I&#8217;m happy to keep absorbing new fun stuff as times change and mostly I&#8217;m quite happy to see the back of the declining technologies anyway!  It&#8217;s comforting in a way to see that there&#8217;s no real wizards out there, there&#8217;s just people hacking away on stuff that they think is cool and being ready to recognize the insights and the epiphanies when they come by.  Evolution (and some marketing $$$s) usually takes care of picking out those solutions which are suited to the present environment.  And there&#8217;s always the interesting &#8220;superior but ignored&#8221; technologies hovering around in the wings.</p>
<p>Computing has only really been around for one lifetime.  Most of the first-generation guys are still alive.  It&#8217;s interesting to hear some of them reflecting on a life spend involved in this area.  I guess I&#8217;m taking a moment to reflect on where I am.</p>
<p><a href="http://www.amazon.com/gp/product/1430219483?ie=UTF8&#038;tag=nobugs-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=1430219483">&#8220;Coders at Work&#8221;</a>: loving it</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nobugs.org/blog/archives/2009/10/28/coders-at-work/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
