<?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>malvasia bianca &#187; Programming</title>
	<atom:link href="http://malvasiabianca.org/archives/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://malvasiabianca.org</link>
	<description></description>
	<lastBuildDate>Thu, 18 Mar 2010 05:01:45 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>small steps in haskell</title>
		<link>http://malvasiabianca.org/archives/2009/12/small-steps-in-haskell/</link>
		<comments>http://malvasiabianca.org/archives/2009/12/small-steps-in-haskell/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 06:20:58 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=2638</guid>
		<description><![CDATA[One of my biggest surprises when learning Haskell has been how my typical test-driven development steps fail: it&#8217;s easy to write a couple of tests and get them to pass gracelessly, but surprisingly quickly I run into a test that I can&#8217;t get to pass without actually being smart, forcing me to make a leap [...]]]></description>
			<content:encoded><![CDATA[<p>One of my biggest surprises when <a href="http://www.bactrian.org/~carlton/dbcdb/1257/">learning Haskell</a> has been how my typical test-driven development steps fail: it&#8217;s easy to write a couple of tests and get them to pass gracelessly, but surprisingly quickly I run into a test that I can&#8217;t get to pass without actually being smart, forcing me to make a leap that&#8217;s uncomfortably large from my previous position.</p>
<p>I ran into a situation like that last night, and I decided to try to take that big step apart; here&#8217;s what I ended up with.  The problem in question was exercise 3 on page 84: it told me to print out the first word of each line of its input.  My first two tests were as follows:</p>
<p><code>
<pre>
firstWordsTests =
    TestList["empty" ~: "" @=? firstWords "",
             "one line" ~: "first\n" @=? firstWords "first words\n"]
</pre>
<p></code></p>
<p>which I got passing with this implementation:</p>
<p><code>
<pre>
firstWords "" = ""
firstWords line = head (words line) ++ "\n"
</pre>
<p></code></p>
<p>The third test was where I ran into trouble, though:</p>
<p><code>
<pre>
firstWordsTests =
    TestList["empty" ~: "" @=? firstWords "",
             "one line" ~: "first\n" @=? firstWords "first words\n",
             "two lines" ~: "one\ntwo\n" @=?
                         firstWords "one line\ntwo lines\n"]]
</pre>
<p></code></p>
<p>How can I write a pattern which will match the third case?  Not at all clear to me, but at least it points out the direction I&#8217;m going in: I want to add lines to the test cases until some sort of looping construct falls out.  Given that, let&#8217;s try to refactor against one red bar in a way that brings out the decomposition into lines that&#8217;s latent here.</p>
<p>Fortunately, Haskell has a function <code>lines</code> that transforms a string into a list of the lines making up that string; let&#8217;s rewrite <code>firstWords</code> to use it.  The smallest step that I managed to come up with to do so was this:</p>
<p><code>
<pre>
firstWords input = concatFirstWordsOfLineArray (lines input) where
    concatFirstWordsOfLineArray [] = ""
    concatFirstWordsOfLineArray [line] = head (words line) ++ "\n"
</pre>
<p></code></p>
<p>Which is a larger step than I&#8217;m comfortable with, but at least it&#8217;s small enough conceptually that I don&#8217;t feel like I&#8217;ve leapt into the unknown.  I&#8217;m not sure what to call this sort of transformation&mdash;maybe &#8220;Insert Intermediate List&#8221;?</p>
<p>(Incidentally, the observant reader will note that this transformation isn&#8217;t a refactoring: it preserves the red and green bars, but the nature of the red bar goes from an unexpected result to an exception being thrown.  That&#8217;s okay with me; what I&#8217;m doing is still useful as an <a href="http://www.bactrian.org/~carlton/dbcdb/892/">implementation pattern</a>.  Hmm, maybe I should try writing these transformations up in an Alexandrian style?)</p>
<p>And, after that step, it&#8217;s now obvious how to get my test to pass:</p>
<p><code>
<pre>
firstWords input = concatFirstWordsOfLineArray (lines input) where
    concatFirstWordsOfLineArray [] = ""
    concatFirstWordsOfLineArray [line] = head (words line) ++ "\n"
    concatFirstWordsOfLineArray (line1 : line2 : []) =
        (head (words line1) ++ "\n") ++ (head (words line2) ++ "\n")
</pre>
<p></code></p>
<p>At this point, we have some obvious code duplication; Extract Method turns it into</p>
<p><code>
<pre>
firstWords input = concatFirstWordsOfLineArray (lines input) where
    concatFirstWordsOfLineArray [] = ""
    concatFirstWordsOfLineArray [line] = firstWordLine line
    concatFirstWordsOfLineArray (line1 : line2 : []) =
        firstWordLine line1 ++ firstWordLine line2
    firstWordLine line = head (words line) ++ "\n"
</pre>
<p></code></p>
<p>At which point it&#8217;s pretty obvious that we&#8217;re doing something quite similar to all elements on the list, so we want to transform this into a <code>map</code> plus a subsequent operation.  And, in fact, the subsequent operation is concatenating all of the list elements together; keeping that in mind, we do an Insert Intermediate List on the third case, giving us:</p>
<p><code>
<pre>
firstWords input = concatFirstWordsOfLineArray (lines input) where
    concatFirstWordsOfLineArray [] = ""
    concatFirstWordsOfLineArray [line] = firstWordLine line
    concatFirstWordsOfLineArray (line1 : line2 : []) =
        concat [firstWordLine line1, firstWordLine line2]
    firstWordLine line = head (words line) ++ "\n"
</pre>
<p></code></p>
<p>That makes the structure clear for the third branch, and also makes it obvious that we can write the first two branches the same way:</p>
<p><code>
<pre>
firstWords input = concatFirstWordsOfLineArray (lines input) where
    concatFirstWordsOfLineArray [] = concat []
    concatFirstWordsOfLineArray [line] = concat [firstWordLine line]
    concatFirstWordsOfLineArray (line1 : line2 : []) =
        concat [firstWordLine line1, firstWordLine line2]
    firstWordLine line = head (words line) ++ "\n"
</pre>
<p></code></p>
<p>So now we have our <code>map</code> operation:</p>
<p><code>
<pre>
firstWords input = concatFirstWordsOfLineArray (lines input) where
    concatFirstWordsOfLineArray lines = concat (map firstWordLine lines)
    firstWordLine line = head (words line) ++ "\n"
</pre>
<p></code></p>
<p>(These last three steps seem like they should all go together: Extract Identical List Operation?)</p>
<p>Now the code is looking nice (and, in addition, would pass more tests should we choose to write them), and the challenge turns towards expressing it as tersely and clearly as possible.  First, Replace Unaltered Parameter with Composition to get:</p>
<p><code>
<pre>
firstWords = concatFirstWordsOfLineArray . lines where
    concatFirstWordsOfLineArray lines = concat (map firstWordLine lines)
    firstWordLine line = head (words line) ++ "\n"
</pre>
<p></code></p>
<p>Do it again (throwing a bit of currying into the mix):</p>
<p><code>
<pre>
firstWords = concatFirstWordsOfLineArray . lines where
    concatFirstWordsOfLineArray = concat . (map firstWordLine)
    firstWordLine line = head (words line) ++ "\n"
</pre>
<p></code></p>
<p>And, by now, <code>concatFirstWordsOfLineArray</code> clearly isn&#8217;t pulling its weight, so we Inline Method:</p>
<p><code>
<pre>
firstWords = (concat . (map firstWordLine) . lines) where
    firstWordLine line = head (words line) ++ "\n"
</pre>
<p></code></p>
<p>I still want to make this shorter, which in Haskell land frequently seems to mean using Replace Unaltered Parameter with Composition; to that end, we rewrite the latter definition as</p>
<p><code>
<pre>
firstWords = concat . (map firstWordLine) . lines where
    firstWordLine line = (++ "\n") . (head (words line))
</pre>
<p></code></p>
<p>That lets us turn it into:</p>
<p><code>
<pre>
firstWords = concat . (map firstWordLine) . lines where
    firstWordLine = (++ "\n") . head . words
</pre>
<p></code></p>
<p>at which point we can Inline Method again, and get:</p>
<p><code>
<pre>
firstWords = concat . (map ((++ "\n") . head . words)) . lines
</pre>
<p></code></p>
<p>Which is short, but you have to think a little bit as to what it means; what I&#8217;d like to do is find a way to get the <code>unlines</code> function in there, which is a function that takes a list of strings and concatenates them with newlines between.  The next step in that direction is to realize that <code>map</code> distributes over function composition; so we Distribute Map, giving us</p>
<p><code>
<pre>
firstWords = concat . (map (++ "\n")) . (map (head . words)) . lines
</pre>
<p></code></p>
<p>and, indeed, the first half of that is exactly <code>unlines</code>:</p>
<p><code>
<pre>
firstWords = unlines . (map (head . words)) . lines
</pre>
<p></code></p>
<p>Phew!  The code is now about as terse as I can think of while passing those three tests, and it passes several other new tests that I might think of to boot.  And, as a bonus, this version is clearer than any of its predecessors: we split the input into a list of lines (<code>lines</code>), then we grab the first word out of each of those lines (<code>map (head . words)</code>), then we smoosh all of those lines back together (<code>unlines</code>).  Though, as Bryan pointed out to me, I forgot to write one test (which I&#8217;ll leave as an exercise for the reader), but getting the code to pass that last test was a lot easier in this form than it would have been in forms further up the blog page.  (Bryan also had some suggestions for how I might use QuickCheck instead of HUnit to test this, which I hope to be able to follow up over the coming months.)</p>
<p>If this sounds interesting (or if it sounds bizarre but if the idea of learning Haskell sounds interesting despite my peculiar approach), it&#8217;s not too late to <a href="http://malvasiabianca.org/archives/2009/10/monads-anyone/">join the reading group</a>: none of us are moving at a very fast pace, so it shouldn&#8217;t be much trouble for a newcomer to catch up.</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2009/12/small-steps-in-haskell/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>random links: november 24, 2009</title>
		<link>http://malvasiabianca.org/archives/2009/11/random-links-november-24-2009/</link>
		<comments>http://malvasiabianca.org/archives/2009/11/random-links-november-24-2009/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 04:57:22 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Lean / Agile]]></category>
		<category><![CDATA[Managing]]></category>
		<category><![CDATA[Movies]]></category>
		<category><![CDATA[Music]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Video Games]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=2565</guid>
		<description><![CDATA[
Gerald Weinberg is, sadly, in poor health.

Never tried doing Rock Band vocals this way&#8230;  (Takes 15 seconds or so to actually start.)

(Via @dan_schmidt.)

R.I.P., Brother Blue.  (Via @scottros.)
The difference between motion and action.  (Via @harlan_knight.)
An unforeseen design problem.  (Via @shawnr.)
Nice perspective on slow programming languages.
Glad to see non-Miyazaki Ghibli getting some love.
Some [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://www.caringbridge.org/visit/geraldmweinberg">Gerald Weinberg is, sadly, in poor health.</a></li>
<li>
<p><a href="http://www.youtube.com/watch?v=IoqZwiDU8jg">Never tried doing <cite>Rock Band</cite> vocals this way&#8230;</a>  (Takes 15 seconds or so to actually start.)</p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/IoqZwiDU8jg&#038;hl=en_US&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/IoqZwiDU8jg&#038;hl=en_US&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object>
<p>(Via <a href="http://twitter.com/dan_schmidt/status/5571432258">@dan_schmidt</a>.)</p>
</li>
<li><a href="http://www.wbur.org/2009/11/05/obit-brother-blue">R.I.P., Brother Blue.</a>  (Via <a href="http://twitter.com/scottros/status/5630027908">@scottros</a>.)</li>
<li><a href="http://steveblank.com/2009/11/09/relentless-–-the-difference-between-motion-and-action/">The difference between motion and action.</a>  (Via <a href="http://twitter.com/harlan_knight/status/5734156538">@harlan_knight</a>.)</li>
<li><a href="http://flann4.wordpress.com/2009/11/03/unforeseen-design-problem/">An unforeseen design problem.</a>  (Via <a href="http://twitter.com/shawnr/status/5777217448">@shawnr</a>.)</li>
<li><a href="http://prog21.dadgum.com/52.html">Nice perspective on slow programming languages.</a></li>
<li><a href="http://omohide.com/1402/whisper-of-the-heart-review-article/">Glad to see non-Miyazaki Ghibli getting some love.</a></li>
<li><a href="http://www.skytopia.com/project/fractal/mandelbulb.html">Some great pictures on here.</a>  (Via <a href="http://dubiousquality.blogspot.com/2009/11/friday-links_20.html">Dubious Quality</a>.)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2009/11/random-links-november-24-2009/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>random links: november 8, 2009</title>
		<link>http://malvasiabianca.org/archives/2009/11/random-links-november-8-2009/</link>
		<comments>http://malvasiabianca.org/archives/2009/11/random-links-november-8-2009/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 05:21:58 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Lean / Agile]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[School]]></category>
		<category><![CDATA[Video Games]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=2471</guid>
		<description><![CDATA[
Michael Feathers on testable Java.  Good advice, that is of course relevant far beyond Java.
Quite the Venn diagram. (Via @kateri_t.)

James Paul Gee on games and teaching.


(Via @HackerChick.)  Lots to think about here; I hope the VGHVI folks can help me figure it out.

A remarkable meandering about games, genres, Japan, and countless other things. [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://freepdfhosting.com/5bc82ce737.pdf">Michael Feathers on testable Java.</a>  Good advice, that is of course relevant far beyond Java.</li>
<li><a href="http://1.bp.blogspot.com/_MLXFXcbMy4Q/SsX25Q-0xCI/AAAAAAAACtk/PdZZCMBOB68/s1600/VennDiagram_jesus.gif">Quite the Venn diagram.</a> (Via <a href="http://twitter.com/kateri_t/status/5345672076">@kateri_t</a>.)</li>
<li>
<p><a href="http://www.edutopia.org/digital-generation-james-gee-video">James Paul Gee on games and teaching.</a></p>
<p><object width="400" height="292"><param value="flvPath=http://www.edutopia.org/media/dg/expert_james_gee/expert_james_gee.flv&#038;pPath=http://www.edutopia.org/media/dg/expert_james_gee/expert_james_gee.jpg" name="FlashVars"/><param value="best" name="quality"/><param value="false" name="play"/><param value="http://www.edutopia.org/media/videofalse.swf" name="movie"/><embed id="video_embed" width="400" height="292" type="application/x-shockwave-flash" src="http://www.edutopia.org/media/videofalse.swf" play="false" pluginspage="http://www.macromedia.com/go/getflashplayer" name="video" quality="best" flashvars="flvPath=http://www.edutopia.org/media/dg/expert_james_gee/expert_james_gee.flv&#038;pPath=http://www.edutopia.org/media/dg/expert_james_gee/expert_james_gee.jpg"/><br />
</object>
<p>(Via <a href="http://twitter.com/HackerChick/status/5337221016">@HackerChick</a>.)  Lots to think about here; I hope the <a href="http://vghvinet.ning.com/forum/topics/james-paul-gee-on-games-and">VGHVI folks</a> can help me figure it out.</p>
</li>
<li><a href="http://kotaku.com/5395084/can-videogames-be-our-friends">A remarkable meandering about games, genres, Japan, and countless other things.</a>  (Via <a href="http://twitter.com/stephentotilo/status/5372656012">@stephentotilo</a>.)</li>
<li><a href="http://www.testingreflections.com/node/view/8318">Thoughts on the meaning of maturity.</a>  (Via <a href="http://twitter.com/markhneedham/status/5526463949">@markhneedham</a>.)</li>
<li><a href="http://wordgamesblog.wordpress.com/2009/10/27/quotable-jenova-chen/">Great quote from Jenova Chen.</a></li>
<li><a href="http://www.acidforblood.net/2009/10/uncharted-2-among-thieves.html">I wasn&#8217;t expecting to be so interested in <cite>Uncharted 2</cite>, but there&#8217;s clearly a lot there.</a></li>
<li><a href="http://www.u2shirts.com/mosaic/index.html">Cool use of mosaic images.</a>  (Via <a href="http://www.kelleyeskridge.com/avoidance-behavior/">Kelley Eskridge</a>.)</li>
<li><a href="http://mwclarkson.blogspot.com/2009/10/denouement-of-rings.html">Yeah, why don&#8217;t games have cooldown periods at the end?</a>  (*sob* <cite>Shenmue 2</cite> *sob*.)</li>
<li><a href="http://asknicola.blogspot.com/2009/10/asterix-and-golden-jubilee.html">Asterix is turning 50!</a></li>
<li><a href="http://questionablecontent.net/view.php?comic=1526">For whatever reason, I particularly liked this Questionable Content.</a></li>
<li><a href="http://savetherobot.wordpress.com/2009/11/03/my-first-google-wave-project-the-yo-mama-bot/">Not sure yet what I think about Google Wave, but this opened my eyes a bit.</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2009/11/random-links-november-8-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>we&#8217;re hiring</title>
		<link>http://malvasiabianca.org/archives/2009/11/were-hiring/</link>
		<comments>http://malvasiabianca.org/archives/2009/11/were-hiring/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 05:53:26 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Video Games]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=2453</guid>
		<description><![CDATA[I&#8217;ve been working at Playdom for about a month now, and I&#8217;ve thoroughly enjoyed it so far.  If any of my readers think it might be an interesting place to work as well, I wanted to point out that we&#8217;re hiring.  (In a fairly big way, as the list of positions suggests.)  [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been <a href="http://malvasiabianca.org/archives/2009/09/change-of-scene/">working at Playdom</a> for about a month now, and I&#8217;ve thoroughly enjoyed it so far.  If any of my readers think it might be an interesting place to work as well, I wanted to point out that <a href="http://playdom.com/jobs">we&#8217;re hiring</a>.  (In a fairly big way, as the list of positions suggests.)  Feel free to ask me directly if you have any questions or want me to pass your resume along; you can also apply through the web site.</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2009/11/were-hiring/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>monads, anyone?</title>
		<link>http://malvasiabianca.org/archives/2009/10/monads-anyone/</link>
		<comments>http://malvasiabianca.org/archives/2009/10/monads-anyone/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 04:51:49 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=2435</guid>
		<description><![CDATA[Early in the summer I started going through Real World Haskell; unfortunately, conferences and job changes and other programming side projects kept me busy enough that I stopped reading it after a few chapters.  That&#8217;s calmed down now; and, conveniently, a friend of mine got a copy recently and some others also expressed interest [...]]]></description>
			<content:encoded><![CDATA[<p>Early in the summer I started going through <a href="http://www.bactrian.org/~carlton/dbcdb/1257/"><cite>Real World Haskell</cite></a>; unfortunately, conferences and job changes and other programming side projects kept me busy enough that I stopped reading it after a few chapters.  That&#8217;s calmed down now; and, conveniently, a friend of mine got a copy recently and some others also expressed interest in it.</p>
<p>So we&#8217;re forming a book club.  And I figured a few of my readers might be curious about the language as well.  If you fall into that bucket, let me know and I&#8217;ll add you to the mailing list.</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2009/10/monads-anyone/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>random links: october 27, 2009</title>
		<link>http://malvasiabianca.org/archives/2009/10/random-links-october-27-2009/</link>
		<comments>http://malvasiabianca.org/archives/2009/10/random-links-october-27-2009/#comments</comments>
		<pubDate>Wed, 28 Oct 2009 05:34:02 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Music]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Video Games]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=2421</guid>
		<description><![CDATA[
I&#8217;m kind of thinking I&#8217;m not doing nearly enough to minimize waste.  (Via @littleidea.)
Playing a bigger game.  (Via @DianaOfPortland.)
Luck as a skill.  (Via @superkiy.)
A good list of tech blogs.
This round&#8217;s Pink Tentacle link is an anatomy of folk monsters.

Magnetic Ink:

(Via Dubious Quality.)

And on (rather than just from) Dubious Quality we also have [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://www.chrisjordan.com/current_set2.php?id=11">I&#8217;m kind of thinking I&#8217;m not doing nearly enough to minimize waste.</a>  (Via <a href="http://twitter.com/littleidea/status/4927984657">@littleidea</a>.)</li>
<li><a href="http://www.thelaunchcoach.com/workbook1">Playing a bigger game.</a>  (Via <a href="http://twitter.com/DianaOfPortland/status/4760056691">@DianaOfPortland</a>.)</li>
<li><a href="http://www.telegraph.co.uk/technology/3304496/Be-lucky---its-an-easy-skill-to-learn.html">Luck as a skill.</a>  (Via <a href="http://twitter.com/superkiy/status/4871125510">@superkiy</a>.)</li>
<li><a href="http://www.javaworld.com/community/node/3512">A good list of tech blogs.</a></li>
<li>This round&#8217;s Pink Tentacle link is <a href="http://www.pinktentacle.com/2009/10/anatomy-of-japanese-folk-monsters/">an anatomy of folk monsters</a>.</li>
<li>
<p><a href="http://www.youtube.com/watch?v=me5Zzm2TXh4">Magnetic Ink:</a></p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/me5Zzm2TXh4&#038;hl=en&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/me5Zzm2TXh4&#038;hl=en&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object>
<p>(Via <a href="http://dubiousquality.blogspot.com/2009/10/friday-links_16.html">Dubious Quality</a>.)</p>
</li>
<li>And on (rather than just from) Dubious Quality we also have a <a href="http://dubiousquality.blogspot.com/2009/10/greatest-band-part-one.html">four</a> <a href="http://dubiousquality.blogspot.com/2009/10/greatest-band-part-two.html">part</a> <a href="http://dubiousquality.blogspot.com/2009/10/greatest-band-part-three.html">series</a> <a href="http://dubiousquality.blogspot.com/2009/10/greatest-band-part-four.html">going</a> through the Beatles&#8217; albums.</li>
<li>Speaking of which, Heroine Sheik talks about <a href="http://www.heroine-sheik.com/2009/10/26/beatles-rock-band-and-the-female-gaze/"><cite>Beatles: Rock Band</cite> and the female gaze</a>.</li>
<li>
<p><a href="http://www.youtube.com/watch?v=2lXh2n0aPyw">Some</a> <a href="http://www.youtube.com/watch?v=cbEKAwCoCKw">videos</a> on the power of play:</p>
<p><object width="560" height="340"><param name="movie" value="http://www.youtube.com/v/2lXh2n0aPyw&#038;hl=en&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/2lXh2n0aPyw&#038;hl=en&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"></embed></object><object width="560" height="340"><param name="movie" value="http://www.youtube.com/v/cbEKAwCoCKw&#038;hl=en&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/cbEKAwCoCKw&#038;hl=en&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"></embed></object>
<p>(Via <a href="http://www.evolvingexcellence.com/blog/2009/10/behavior-modification-make-it-fun.html">Evolving Excellence</a>.)</p>
</li>
<li><a href="http://github.com/raganwald/homoiconic/blob/master/2009-10-20/high_anxiety.md#readme">High anxiety.</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2009/10/random-links-october-27-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>random links: october 7, 2009</title>
		<link>http://malvasiabianca.org/archives/2009/10/random-links-october-7-2009/</link>
		<comments>http://malvasiabianca.org/archives/2009/10/random-links-october-7-2009/#comments</comments>
		<pubDate>Thu, 08 Oct 2009 05:26:09 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Music]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Video Games]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=2380</guid>
		<description><![CDATA[Sorry for the delay between posts; Miranda asked recently if she could watch Haibane Renmei (which I highly recommend), so we&#8217;ve spent many of our recent evenings going through that.  And I don&#8217;t have a real post now, either, but I&#8217;ll at least give a link round-up.  (Besides, the Zork walkthrough is much [...]]]></description>
			<content:encoded><![CDATA[<p>Sorry for the delay between posts; Miranda asked recently if she could watch <cite>Haibane Renmei</cite> (which I highly recommend), so we&#8217;ve spent many of our recent evenings going through that.  And I don&#8217;t have a real post now, either, but I&#8217;ll at least give a link round-up.  (Besides, the <cite>Zork</cite> walkthrough is much more awesome than anything I&#8217;m likely to generate myself.)</p>
<ul>
<li><a href="http://www.infoq.com/interviews/armstrong-peyton-jones-erlang-haskell">Joe Armstrong and Simon Peyton Jones discussing Erlang and Haskell.</a>  (Via <a href="http://twitter.com/timbray/status/4462760063">@timbray</a>.)</li>
<li><a href="http://blog.avantgame.com/2009/09/super-better-or-how-to-turn-recovery.html">SuperBetter, Jane McGonigal&#8217;s serious-injury-recovery game.</a>  (Via <a href="http://twitter.com/therealfitz/status/4571680817">@therealfitz</a>.)</li>
<li>
<p><a href="http://www.youtube.com/watch?v=s0LgBUMlvwk"><cite>Elite Beat Agents</cite>, meet <cite>Phoenix Wright</cite>!</a></p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/s0LgBUMlvwk&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=en&#038;feature=player_embedded&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed src="http://www.youtube.com/v/s0LgBUMlvwk&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=en&#038;feature=player_embedded&#038;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="425" height="344"></embed></object>
<p>(Via <a href="http://www.gamesetwatch.com/2009/09/osu_tatakae_phoenix_wright_and.php">GameSetWatch</a>.</p>
</li>
<li><a href="http://www.penny-arcade.com/2009/9/30/light-and-mirror-puzzle-dd/">A light-and-mirror puzzle in a tabletop RPG.</a></li>
<li><a href="http://www.wired.com/wiredscience/2009/09/clouds/">Cloud pictures.</a>  (Via <a href="http://dubiousquality.blogspot.com/2009/10/friday-links.html">Dubious Quality</a>; the <a href="http://dsc.discovery.com/news/2009/09/30/violin-fungus-wood.html">fungus-infected violin</a> link is pretty good, too.)</li>
<li>
<p>A <a href="http://www.youtube.com/watch?v=Yo7nTxFxCaE&#038;feature=player_embedded">music video</a> version of Danc&#8217;s <a href="http://lostgarden.com/2009/10/flash-love-letter-music-video.html">Flash Love Letters</a>.</p>
<p><object width="560" height="340"><param name="movie" value="http://www.youtube.com/v/Yo7nTxFxCaE&#038;hl=en&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/Yo7nTxFxCaE&#038;hl=en&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"></embed></object></li>
<li><a href="http://mitu.nu/2009/10/01/on-existenz-and-immersion-from-the-immersive-fallacy-to-the-immersive-apogee/">Mitu Khandaker on immersion and controllers.</a></li>
<li>
<p><a href="http://5090.fawm.org/songs/4255/">The best <cite>Zork</cite> walkthrough I&#8217;ve ever heard.</a></p>
<p><object type="application/x-shockwave-flash" data="http://flash-mp3-player.net/medias/player_mp3_maxi.swf" width="300" height="25"><param name="movie" value="http://flash-mp3-player.net/medias/player_mp3_maxi.swf" /><param name="bgcolor" value="#ffffff" /><param name="FlashVars" value="mp3=http%3A//geeklovesongs.com/music/Walkthrough.mp3&amp;width=300&amp;height=25&amp;showinfo=1&amp;showvolume=1" /></object>
<p>(Via <a href="http://multiplayerblog.mtv.com/2009/09/30/spoilers-zork-walkthrough-rocks-out/">MTV Multiplayer</a>.)</p>
</li>
<li>
<p><a href="http://www.youtube.com/watch?v=78lbf4ySzA0&#038;feature=player_embedded">And, because I seem to be incapable of doing one of these without some sort of random Japanese offering:</a></p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/78lbf4ySzA0&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=en&#038;feature=player_embedded&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed src="http://www.youtube.com/v/78lbf4ySzA0&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=en&#038;feature=player_embedded&#038;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="425" height="344"></embed></object>
<p>(Via <a href="http://www.pinktentacle.com/2009/10/tarako-kewpie-is-back/">Pink Tentacle</a>, of course.)</p>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2009/10/random-links-october-7-2009/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>random links: september 21, 2009</title>
		<link>http://malvasiabianca.org/archives/2009/09/random-links-september-21-2009/</link>
		<comments>http://malvasiabianca.org/archives/2009/09/random-links-september-21-2009/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 03:53:43 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Music]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Video Games]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=2363</guid>
		<description><![CDATA[
Really, everybody should have their own domain these days.
Rands on Your People.
Cave photos.  (Via 25 Times a Second.)
A handy list of Rails security tips, and a lesson on timing attacks.
Sections.
Tetris meets Magic Eye.  (Via Offworld.)
Being a blogger.
A different look at the Beatles.  (Via @dan_schmidt.)
Two on programming hardware, software, and paradigm evolution: foldl [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://bitworking.org/news/2009/09/dns-number-portability">Really, everybody should have their own domain these days.</a></li>
<li><a href="http://www.randsinrepose.com/archives/2009/09/07/your_people.html">Rands on Your People.</a></li>
<li><a href="http://science.nationalgeographic.com/science/photos/caves-gallery/glacier-caving.html">Cave photos.</a>  (Via <a href="http://25timesasecond.tumblr.com/post/183153949/caves-a-photo-gallery-via-national-geographic">25 Times a Second</a>.)</li>
<li><a href="http://railscasts.com/episodes/178-seven-security-tips">A handy list of Rails security tips</a>, and <a href="http://codahale.com/a-lesson-in-timing-attacks/">a lesson on timing attacks</a>.</li>
<li><a href="http://theweaselking.livejournal.com/3424010.html">Sections.</a></li>
<li><a href="http://3dimka.deviantart.com/art/3D-Stereogram-Tetris-36795242">Tetris meets Magic Eye.</a>  (Via <a href="http://www.offworld.com/2009/09/one-shot-3d-tetris.html">Offworld</a>.)</li>
<li><a href="http://rc3.org/2009/09/20/being-a-blogger/">Being a blogger.</a></li>
<li><a href="http://www.avclub.com/articles/chuck-klosterman-repeats-the-beatles,32560/">A different look at the Beatles.</a>  (Via <a href="http://twitter.com/dan_schmidt/status/3848223012">@dan_schmidt</a>.)</li>
<li>Two on programming hardware, software, and paradigm evolution: <a href="http://research.sun.com/projects/plrg/Publications/ICFPAugust2009Steele.pdf">foldl and foldr are slightly harmful</a>, and <a href="http://blogs.sun.com/jrose/entry/thursday_at_the_summit">flux and stability</a>.  (Via <a href="http://twitter.com/decklin/status/3887313617">@decklin</a> and <a href="http://twitter.com/timbray/status/4082290767">@timbray</a>, respectively.)</li>
<li><a href="http://daringfireball.net/2003/05/the_problems_with_clickthrough">I&#8217;m starting to get won over by the Mac&#8217;s insistence on the primacy of the foreground application.</a></li>
<li><a href="http://www.businessweek.com/technology/content/sep2009/tc20090914_969227.htm">This &#8220;fidelity swap&#8221; idea seems like a useful concept.</a></li>
<li>
<p><a href="http://www.youtube.com/watch?v=86wKWjvUD50">Sometimes I don&#8217;t understand Japan.</a>  (Possibly NSFW.)</p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/86wKWjvUD50&#038;hl=en&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/86wKWjvUD50&#038;hl=en&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object>
<p>(Via <a href="http://twitter.com/kateri_t/status/4090286302">@kateri_t</a>.)</p>
</li>
<li><a href="http://www.dailymail.co.uk/home/moslive/article-1212013/Revealed-The-ghost-fleet-recession-anchored-just-east-Singapore.html">A modern-day ghost fleet.</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2009/09/random-links-september-21-2009/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>experts and expertise</title>
		<link>http://malvasiabianca.org/archives/2009/09/experts-and-expertise/</link>
		<comments>http://malvasiabianca.org/archives/2009/09/experts-and-expertise/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 04:30:48 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=2329</guid>
		<description><![CDATA[I want to talk about a couple of talks I attended at Agile 2009.  Both relate to experts, expertise, and how one develops the latter to become the former.
The first was given by Jon Dahl, on &#8220;Aristotle and the Art of Software Development&#8221;.  You can see video and slides of an earlier delivery [...]]]></description>
			<content:encoded><![CDATA[<p>I want to talk about a couple of talks I attended at <a href="http://www.agile2009.org/">Agile 2009</a>.  Both relate to experts, expertise, and how one develops the latter to become the former.</p>
<p>The first was given by Jon Dahl, on &#8220;Aristotle and the Art of Software Development&#8221;.  You can see <a href="http://rubyconf2008.confreaks.com/aristotle-and-the-art-of-software-development.html">video</a> and <a href="http://www.slideshare.net/jondahl/aristotle-and-the-art-of-software-development-presentation">slides</a> of an earlier delivery of the talk.  (I don&#8217;t think it changed much between deliveries; I also don&#8217;t know how much sense the slides will make out of context.)  He viewed this subject through a lens of ethics: a Kantian view focusing on actions (and, in particular, universal principles motivating them); a Millsian view focusing on outcomes; and an Aristotelian view focusing on actors.</p>
<p>As you might suspect from the title of the talk, Dahl was most taken with the third point of view.  (Which begins about 15 minutes into the video or 70 slides into the deck.)  He presented Aristotle as linking ethics with happiness and a life well lived, and with virtue (in the sense of performing your function well).  Honestly, it may be the case that many of these words had significantly different meanings for Aristotle than they would for us; in particular, Dahl glossed the Greek term that he translates as &#8220;happiness&#8221; as coming from &#8220;good&#8221; plus &#8220;spirit&#8221;; depending on how one takes the compound, I could imagine that as meaning &#8220;one whose spirit is good&#8221;, which makes the idea that ethical people are happy potentially more of a tautology than an an interesting statement.</p>
<p>Leaving these glosses aside: the point is that being good (virtuous) at something is inherent in the people who are good, rather than being rule-based.  Which raises the question: how do you become a virtuous person?  In the talk at Agile 2009, it sounded like at least some of Aristotle&#8217;s answer to that is fatalist: virtuous people are born, not made.  (And&mdash;stop me if you&#8217;ve heard this before&mdash;virtuous people always turn out to be rich non-barbarian males.  Sigh.)  Watching the video of the RubyConf version, though, there&#8217;s a less fatalistic point of view: you gain virtue through practice and through modeling.  So, to become an expert, you should hang out with experts, and practice; as you gain expertise, use your improved understanding to improve both your expert detection and your practice.</p>
<p>In contrast, if you&#8217;re a Kantian, instead of looking for good people, you look out for good principles, and follow them rigorously.  In an Aristotelian point of view (again, with the caveat that it&#8217;s been decades since I&#8217;ve read any Aristotle myself, I&#8217;m just going by the talk), it would be possible to have virtues without formalizing the principles at all; furthermore, Aristotle&#8217;s virtues are means between excesses and defects (see slide 95; this gives me a Buddhist vibe, too), so following rules too strictly may actually be a sign that you&#8217;re straying from virtue.</p>
<p>The other talk was one by Mary Poppendieck on &#8220;Deliberate Practice in Software Development&#8221;.  It discussed the nature versus nurture question of becoming an expert.  My memory of the talk is that she strongly came down on the nurture side of that; rereading the slides, I&#8217;m not sure my memory is correct, but what is correct is that she claimed that nature alone is not enough: the way you get to Carnegie Hall is, indeed, to practice.  Specifically: people need to practice their field for about 10,000 hours before becoming experts; and those who do eventually become experts practice longer and harder than those who don&#8217;t.</p>
<p>This last sentence, of course, doesn&#8217;t settle the nature or nurture debate: it may be that those who aren&#8217;t naturally gifted won&#8217;t become expert violinists no matter how long they practice.  On a more meta level, it may also be the case that, without the appropriate nature, you&#8217;ll find practicing violin for 10,000 hours so offputting that you&#8217;ll give it up long before then.  So it&#8217;s not clear (at least to me) to what extent nature is necessary; it does seem to be the case, however, that nurture (in the form of practicing) is necessary to become an expert, and in fact quite a bit of nurture is.</p>
<p>It&#8217;s not the case, however, that any old 10,000 hours of practice will do.  As the title of the talk says, it should be &#8220;deliberate practice&#8221;, and Poppendieck listed four key factors in making the practice successful: a mentor, a challenge, feedback, and dedication.  You want somebody else to guide you; you don&#8217;t want to be complacent; you want to know how your work is turning out; and, even with that, you need to put in the sweat.  And she gave examples of how you might structure your work to support this.  (Looking at it through a lean viewpoint; the slides don&#8217;t mention them, though the talk may well have, but I&#8217;ll bring up <a href="http://www.bactrian.org/~carlton/dbcdb/1190/">A3 reports</a>.)</p>
<p>I was planning to turn this post into some sort of grand overarching pulling together of the above with some <a href="http://blogs.kent.ac.uk/mik/2009/09/04/quality-oriented-teaching-of-programming/">other</a> <a href="http://www.thedailybeast.com/blogs-and-stories/2009-09-13/the-self-educated-apple-genius/full/">articles</a> that had come across my <a href="http://twitter.com/mfeathers/status/3910830282">twitter</a> <a href="http://twitter.com/michaelbolton/status/3972402902">feed</a>.  But, after listening to Dahl&#8217;s talk again, I&#8217;m having a hard time finding any nice symmetries.  So, I&#8217;ll conclude with talking off the top of my head (as if I ever do anything else!):</p>
<p>Poppendieck&#8217;s recommendations don&#8217;t contradict the Aristotelian point of view: in particular, it sounds like Aristotle would wholeheartedly support having a mentor.  Can we make other links: maybe Mill&#8217;s utilitarian point of view resonates with feedback, for example?  Actually, I&#8217;m surprised at how hard it is to find explicit Kantian resonances with the deliberate practice model; is that a sign of something deep, or is that just a sign that the idea of having principles to guide us is to obvious as to not need stating?  (As a side note, right now I&#8217;m finding the idea of following quite detailed Kantian principles in software development to be <a href="http://www.bactrian.org/~carlton/dbcdb/892/">strangely</a> <a href="http://www.bactrian.org/~carlton/dbcdb/306/">appealing</a>.)</p>
<p>The nature versus practice question is one that I&#8217;m interested in for both personal reasons and parental reasons.  Take the question of how nature affects our practice habits: I&#8217;m a decent musician, but I was never one who was drawn to spend hour after hour after hour in practice rooms honing my art.  I&#8217;m sure I could have become a better musician than I actually am, though I don&#8217;t know where my ceiling would be (if that concept even makes sense), but I do know that doing so would have required quite a bit more desire out of me.  And I certainly support Poppendieck&#8217;s claim that not all practice is created equal: I&#8217;ve seen more than enough of people doing &#8220;practice&#8221; in ways that strike me as noticeably suboptimal.</p>
<p>As for nature and raw talent: I&#8217;ve seen enough exceptional people that I don&#8217;t believe that nature is irrelevant to becoming a world-class expert, from an outside point of view.  But, from an internal point of view, it&#8217;s probably best to pretend that it is irrelevant: Poppendieck&#8217;s deliberate practice recommendations sound pretty solid to me, and I&#8217;m fairly sure that anybody following them and putting in the time would improve anybody&#8217;s skills.  They also suggest a meta-approach: improve your skills at deliberate practice.  Though, of course, you can&#8217;t just do that in isolation: you want to deliberately practice deliberate practice, which (among other things) means actually learning stuff.</p>
<p>Looking at holes in my own practice: of Poppendieck&#8217;s four recommendations, the area where I probably do worst is in finding mentors.  (Indeed, in retrospect I probably should have spent rather more time acting as a mentor while managing the last few years.  Sorry!)  I imagine I shy away from feedback (both giving and receiving), too.</p>
<p>Important stuff; I hope we can all figure this out.</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2009/09/experts-and-expertise/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>multiuser memorization</title>
		<link>http://malvasiabianca.org/archives/2009/09/multiuser-memorization/</link>
		<comments>http://malvasiabianca.org/archives/2009/09/multiuser-memorization/#comments</comments>
		<pubDate>Wed, 09 Sep 2009 04:29:16 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=2323</guid>
		<description><![CDATA[I&#8217;ve been using a program I wrote to help me memorize stuff (mostly Japanese vocabulary) for more than a year now.  And for almost all of that time, I haven&#8217;t modified the program at all: I had plans right from the beginning to add multiuser support (if for no other reason than to make [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been using a program I wrote to help me memorize stuff (mostly Japanese vocabulary) for <a href="http://malvasiabianca.org/archives/2008/08/memory-project-is-deployed/">more than a year now</a>.  And for almost all of that time, I haven&#8217;t modified the program at all: I had plans right from the beginning to add multiuser support (if for no other reason than to make it safely accessible outside my LAN), but ssh tunneling worked well enough for remote access, and in general the program worked fine for my purposes.  (Well enough, in fact, that I have almost 5000 items stored in it!)</p>
<p>Buying an iPod Touch changed that, though.  Once I took a bit of care to add a stylesheet that looked good on the device, I found that it was just as easy to go through my vocabulary on the iPod as it was on the computer, and it was hugely easier to fit the review into spare moments of the day.  So I switched from doing one big review a day to at least three a day, plus a few more when I had spare moments around the house.</p>
<p>So that was a huge help.  I still couldn&#8217;t review vocabulary during spare moments at work, though; and once I got an iPhone, the number of places where I could conceivably review vocabulary but couldn&#8217;t actually do so got even larger!  This made making the program available safely on the internet a lot more urgent.</p>
<p>I ended up using <a href="http://github.com/binarylogic/authlogic/tree/master">authlogic</a> for authentication support; there were a few odd testing issues, but in general it worked quite well.  (I think I&#8217;ve figured out at least one of the testing issues; I hope to have time soon to confirm my hypothesis and submit a patch.)  And once that was in place, adding the general plumbing to link items with users was straightforward.  (And I <a href="http://malvasiabianca.org/archives/2009/09/this-is-why-you-write-the-failing-test-first/">learned something about Rails</a> in the bargain.)</p>
<p>I still don&#8217;t necessarily recommend that anybody else use it.  For one thing, I suspect that the spacing of my review sessions isn&#8217;t optimal: I&#8217;m using exponential spacing more out of optimism than any strong evidence that it&#8217;s the best pattern to use, and in fact I get the feeling that some of my gaps in the months-out range are a little bit off.  And, for another thing, I&#8217;m sure that there are features that I don&#8217;t need that others would find important; I can&#8217;t promise to be able to add them.</p>
<p>I will, however, strongly recommend that, if you have an iPhone or an iPod Touch and are considering using some sort of timed review program, that you don&#8217;t choose a desktop-only solution (unless you have a desktop computer in your bathroom): it makes a <em>huge</em> difference to be able to nibble away at your items when you have free time instead of having to do larger batches at less frequent intervals.  And I hope that I&#8217;ll be able to add feature requests that I deem sensible without making you wait too much; alternatively, I&#8217;m happy to make a Mercurial repository available if you want to tinker with it yourself.  I will also back up your data offsite nightly (though I make no uptime guarantees for the server my program is hosted on: it&#8217;s my home computer, and if something bad happens while I&#8217;m on vacation, it could take a couple of weeks to get it fixed).  And you should be able to export your items / timing information as an XML file at will, if you want to change solutions.  (Though it&#8217;s your problem getting that XML file translated into whatever format the other solution wants!)  Having used it for more than a year gives me confidence that I&#8217;ll remain interested enough that it shouldn&#8217;t disappear for the forseeable future.</p>
<p>So if any of you wants to give it a try, let me know and I&#8217;ll set you up with an account.</p>
<p>Incidentally, I mentioned <a href="http://malvasiabianca.org/archives/2009/06/change-of-focus/">a few months ago</a> that I was feeling a bit swamped with projects and conference prep, and was planning to step back some from my normal blogging schedule.  (Especially the video game related parts of it.)  Fortunately, Agile 2009 is now over (though, don&#8217;t get me wrong, I enjoyed both the preparation and conference very much!), and some of my side projects are winding down, so things should be getting back to normal around here.  In fact, over the last week and a half things have been much more prolific than normal on this blog; I don&#8217;t plan to keep that up, but it is very nice both to have the time and energy to blog like that and to remind myself that I really enjoy doing so.</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2009/09/multiuser-memorization/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>this is why you write the failing test first</title>
		<link>http://malvasiabianca.org/archives/2009/09/this-is-why-you-write-the-failing-test-first/</link>
		<comments>http://malvasiabianca.org/archives/2009/09/this-is-why-you-write-the-failing-test-first/#comments</comments>
		<pubDate>Tue, 08 Sep 2009 03:32:42 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[Lean / Agile]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=2306</guid>
		<description><![CDATA[I finished adding multiuser support to my memory project this weekend.  I&#8217;d added the ability for users to log in and out while I was on vacation this summer, but I hadn&#8217;t actually linked up the users with their lists of items to memorize.
The relevant models are a User model and an Item model. [...]]]></description>
			<content:encoded><![CDATA[<p>I finished adding multiuser support to my <a href="http://malvasiabianca.org/archives/2008/08/memory-project-is-deployed/">memory project</a> this weekend.  I&#8217;d added the ability for users to log in and out while I was on vacation this summer, but I hadn&#8217;t actually linked up the users with their lists of items to memorize.</p>
<p>The relevant models are a User model and an Item model.  A user has_many :items; part of the Item class definition was the following:</p>
<p><code>
<pre>
class Item &lt; ActiveRecord::Base
  ...
  def self.next
    find(:first,
         &#58;order =&gt; "next_review_time",
         :conditions =&gt; pending_item_condition)
  end

  def self.pending_review_count
    count :conditions =&gt; pending_item_condition
  end

  def self.pending_item_condition
    ["next_review_time &lt;= ?", Time.now.utc]
  end
  ...
end</pre>
<p></code></p>
<p>As written, those would, for example, add up the total count of all users&#8217; pending items; I wanted instead to be able to ask those questions on a per-user basis.</p>
<p>The has_many declaration gives me a collection user.items for each user.  And if I pass a block to has_many, I can add methods to that collection; that seemed more stylish than, for example, adding a user parameter to the above methods.  So I modified my User unit tests to make sure that there were items owned by multiple users, and copied over the Item unit tests for the above methods, replacing, e.g. calls to Item.next with calls to user.items.next.</p>
<p>Which I expected to fail, complaining about an undefined method &#8220;next&#8221;.  But not only did the tests not fail for that reason, they in fact passed, ignoring the items for other users!  At first, I assumed I&#8217;d made a mistake in my tests, but no: when I replaced the calls to user.items.next with calls to Item.next, they failed as expected.  So the functionality I wanted really did seem to be working without my having to lift a finger.</p>
<p>But how?  I could imagine some sort of method_missing implementation that forwarded functions on the collection to functions on Item.  But if it were doing that, how was the functionality getting restricted to items owned by the user in question?  I would hope that it wasn&#8217;t doing a broader search in SQL and then subsequently ditching inappropriate items in Ruby; sure enough, a look at the logs shows that the SQL queries that are issued do include the user_id restriction.</p>
<p>I haven&#8217;t verified it yet, but the only hypothesis that I&#8217;ve come up with so far is that the collection objects that are returned by user.items start off life as clones of Item; so they have all of the class methods on Item.  And then some key method (find, say) is overridden so that the user restriction always gets applied, and all other lookup methods are implemented in terms of that key method, so they get the restriction in question for free.</p>
<p>Which, once I thought about it, makes sense.  Consider Item, not as a class but as an object: you can think of it as a collection object, namely the collection of all items.  With that in mind, it makes sense for other objects that are also collections of items to be closely related to it, and if we can express that tight linkage in terms of the implementation, by thinking of Item as the primordial collection of items, so much the better!</p>
<p>An interesting journey.  At first, I thought I must be writing bad tests; then I thought I was seeing magic; and eventually I came around to a realization that what I was seeing made a lot of sense conceptually, so I was happy that I was working with a language and a framework where I could get such sensible behavior for free.  And, no matter what, it was a useful reminder that there&#8217;s a reason why the TDD cycle is red, green, refactor, not just green (with simultaneous test+implementation changes), refactor: if I&#8217;d done the latter, I would have missed a useful learning opportunity.</p>
<p>Though there&#8217;s a postscript to the story.  I&#8217;d learned that my original implementation idea was unnecessary; the question remains, though, whether the original implementation idea was a good one or not.  And, after giving it some thought, I decided that I preferred having these methods in the User model rather than in the Item model.  If I left them in Item, it would be easy to write code representing concepts like &#8220;what&#8217;s the next item that any user will be asked?&#8221; or &#8220;what&#8217;s the total pending item count across all users?&#8221;  Which aren&#8217;t natural questions to ask, so I was setting myself up for bugs by leaving those methods in Item.</p>
<p>So, with my tests in place, I moved them to User:</p>
<p><code>
<pre>
class User &lt; ActiveRecord::Base
  ...
  has_many :items do
    def next
      find(:first,
           &#58;order =&gt; "next_review_time",
           :conditions =&gt; pending_item_condition)
    end

    def pending_review_count
      count :conditions =&gt; pending_item_condition
    end

    def pending_item_condition
      ["next_review_time &lt;= ?", Time.now.utc]
    end
  end
  ...
end</pre>
<p></code></p>
<p>Leaving me where I expected to end up when I began, but having taken a much more interesting route.</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2009/09/this-is-why-you-write-the-failing-test-first/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>random links: september 6, 2009</title>
		<link>http://malvasiabianca.org/archives/2009/09/random-links-september-6-2009/</link>
		<comments>http://malvasiabianca.org/archives/2009/09/random-links-september-6-2009/#comments</comments>
		<pubDate>Sun, 06 Sep 2009 15:00:28 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Lean / Agile]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[School]]></category>
		<category><![CDATA[Video Games]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=2296</guid>
		<description><![CDATA[
I mentioned Roger&#8217;s Operation KTHMA last time, but it&#8217;s actually started now and sounds awesome enough that I&#8217;ll mention it again: day 1, day 2, day 3.
Our whole household was playing Bunni Game: How We First Met last week.  (You should be able to see my world at this link.)
Victorian Homes of the Mission [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li>I mentioned Roger&#8217;s <a href="http://livingepic.blogspot.com/2009/08/cams-3212-greek-historical-writings-as.html">Operation KTHMA</a> last time, but it&#8217;s actually started now and sounds awesome enough that I&#8217;ll mention it again: <a href="http://livingepic.blogspot.com/2009/09/operation-kthma-day-1-as-it-actually.html">day 1</a>, <a href="http://livingepic.blogspot.com/2009/09/operation-kthma-day-2.html">day 2</a>, <a href="http://livingepic.blogspot.com/2009/09/operation-kthma-day-3.html">day 3</a>.</li>
<li>Our whole household was playing <a href="http://lostgarden.com/2009/07/bunni-beta-and-casual-connect.html"><cite>Bunni Game: How We First Met</cite></a> last week.  (You should be able to see my world <a href="http://bunnibunni.com/view.php?user_id=1153461">at this link</a>.)</li>
<li><a href="http://www.casadecrepit.com/archives/001817.html">Victorian Homes of the Mission District</a>, great pictures and commentary.</li>
<li><a href="http://www.developsense.com/2009/08/testing-vs-checking.html">Michael Bolton&#8217;s distinction between testing and checking</a> seems useful.</li>
<li><a href="http://www.newsweek.com/id/214585">100 year old color photos of Russia.</a>  (Via <a href="http://twitter.com/timbray/status/3763445546">@timbray</a>.)</li>
<li><a href="http://lookspring.co.uk/writing/games-that-make-me-cry">Margaret Robertson on games making us cry.</a>  (Via <a href="http://twitter.com/kateri_t/status/3742528586">@kateri_t</a>.)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2009/09/random-links-september-6-2009/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>random links: august 30, 2009</title>
		<link>http://malvasiabianca.org/archives/2009/08/random-links-august-30-2009/</link>
		<comments>http://malvasiabianca.org/archives/2009/08/random-links-august-30-2009/#comments</comments>
		<pubDate>Sun, 30 Aug 2009 16:00:08 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Lean / Agile]]></category>
		<category><![CDATA[Music]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Video Games]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=2246</guid>
		<description><![CDATA[
Tanuki testicle art.

One day in kanban land.
Pixie Driven Development.
A plain-text version of the Declaration of Independence.  (Via Kelley Eskridge.)
Rock Band as a music theory teacher.
Maira Kalman on Thomas Jefferson and Benjamin Franklin.  (Via @bos31337 and The Edge of the American West.)
The red handprints are a particularly nice touch.
Another way to approach poems/stories.
I never [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://www.pinktentacle.com/2009/06/all-purpose-tanuki-testicles-prints-by-kuniyoshi/">Tanuki testicle art.</a></li>
<li>
<a href="http://blog.crisp.se/henrikkniberg/2009/06/26/1246053060000.html">One day in kanban land.</a></li>
<li><a href="http://lizkeogh.com/2009/07/01/pixie-driven-development/">Pixie Driven Development.</a></li>
<li><a href="http://www.freerepublic.com/focus/f-news/911907/posts">A plain-text version of the Declaration of Independence.</a>  (Via <a href="http://www.kelleyeskridge.com/independence/">Kelley Eskridge.</a>)</li>
<li><a href="http://www.brainygamer.com/the_brainy_gamer/2009/08/rock-band-university.html"><cite>Rock Band</cite> as a music theory teacher.</a></li>
<li>Maira Kalman on <a href="http://kalman.blogs.nytimes.com/2009/06/25/time-wastes-too-fast/">Thomas Jefferson</a> and <a href="http://kalman.blogs.nytimes.com/2009/07/30/can-do/">Benjamin Franklin.</a>  (Via <a href="http://twitter.com/bos31337/status/2374301205">@bos31337</a> and <a href="http://edgeofthewest.wordpress.com/2009/07/31/shes-at-it-again/">The Edge of the American West</a>.)</li>
<li><a href="http://brinstar.tumblr.com/post/157003941">The red handprints are a particularly nice touch.</a></li>
<li><a href="http://ludusnovus.net/2009/08/12/silent-conversation-released/">Another way to approach poems/stories.</a></li>
<li><a href="http://forgetomori.com/2009/science/best-optical-illusion-ever-this-year/">I never get tired of seeing new optical illusions.</a></li>
<li><a href="http://news.cnet.com/8301-17938_105-10273119-1.html">Glad to see I won&#8217;t be reverse-polish-deprived when/if my current HP calculator bites the dust.</a></li>
<li>
<p><a href="http://www.youtube.com/watch?v=WfBlUQguvyw">Nice use of webcams:</a></p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/WfBlUQguvyw&#038;hl=en&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/WfBlUQguvyw&#038;hl=en&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object>
<p>(Via <a href="http://twitter.com/garb/status/2484709945">@garb</a>.)</p>
</li>
<li><a href="http://www.dailymail.co.uk/news/worldnews/article-1187338/Off-wall-The-astonishing-3D-murals-painted-sides-buildings-trompe-loeil-artist.html">Trompe l&#8217;oeil murals.</a>  (Via <a href="http://twitter.com/scottmccloud/status/2853609930">@scottmccloud</a>.)</li>
<li>
<p><a href="http://www.youtube.com/watch?v=vdp511xayj0">Japan still gets weirder games than we do.</a>  (Yes, the game apparently involves writing songs which are then sung in game by a polar bear.)</p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/vdp511xayj0&#038;hl=en&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/vdp511xayj0&#038;hl=en&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object>
<p>(Via <a href="http://twitter.com/tinysubversions/status/2874606312">@tinysubversions</a>.)</p>
</li>
<li><a href="http://www.rolcats.com/">Glad the meme still has some life in it.</a></li>
<li><a href="http://www.nytimes.com/2009/08/16/magazine/16beatles-t.html?_r=2&#038;pagewanted=all">I can&#8217;t wait for the <cite>Beatles</cite> game.</a></li>
<li><a href="http://sydneypadua.com/2dgoggles/lovelace-the-origin-2/">The secret history of Ada Lovelace.</a>  (Via <a href="http://twitter.com/elenielstorm/status/3486784082">@elenielstorm</a>.)</li>
<li><a href="http://emshort.wordpress.com/2009/08/23/idea-to-implementation/">Thoughts on the order in which to implement a video game.</a> Interesting how many of the ones that don&#8217;t work seem compatible with agile.  (Via <a href="http://twitter.com/kateri_t/status/3491445391">@kateri_t</a>.)</li>
<li><a href="http://livingepic.blogspot.com/2009/08/cams-3212-greek-historical-writings-as.html">This is going to be awesome.</a>  (Or, maybe, a complete disaster!  I doubt it, though.)</li>
<li><a href="http://www.above49.ca/2009/08/we-need-more-bookmarks.html">Nels chiming in further on the save game issue.</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2009/08/random-links-august-30-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>a taxonomy of boundary objects</title>
		<link>http://malvasiabianca.org/archives/2009/06/a-taxonomy-of-boundary-objects/</link>
		<comments>http://malvasiabianca.org/archives/2009/06/a-taxonomy-of-boundary-objects/#comments</comments>
		<pubDate>Sat, 27 Jun 2009 05:17:55 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Lean / Agile]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=2149</guid>
		<description><![CDATA[The original paper on boundary objects gives a partial taxonomy of boundary objects; given my earlier thought experiment, I thought I&#8217;d see if I could find programming analogues to any parts of their classification.
Star and Griesemer&#8217;s first type of boundary objects are Repositories:
These are ordered &#8216;piles&#8217; of objects which are indexed in a standardized fashion. [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://sss.sagepub.com/cgi/content/abstract/19/3/387">original paper on boundary objects</a> gives a partial taxonomy of boundary objects; given my <a href="http://malvasiabianca.org/archives/2009/06/boundary-objects-and-solid-principles/">earlier thought experiment</a>, I thought I&#8217;d see if I could find programming analogues to any parts of their classification.</p>
<p>Star and Griesemer&#8217;s first type of boundary objects are <strong>Repositories</strong>:</p>
<blockquote><p>These are ordered &#8216;piles&#8217; of objects which are indexed in a standardized fashion.  Repositories are built to deal with problems of heterogeneity caused by differences in unit of analysis.  An example of a repository is a library or museum.  It has the advantage of modularity.  People from different worlds can use or borrow from the &#8216;pile&#8217; for their own purposes without having directly to negotiate differences in purpose.</p></blockquote>
<p>At first, I thought this type was kind of banal, corresponding perhaps to collection objects in software, but now I think it&#8217;s more interesting than that. Reading their description more closely, I don&#8217;t get a collection object vibe: collections in the programs that I write usually contain a quite uniform group of objects, and those objects are used for one or two specific purposes; the above, however, emphasizes heterogeneity and differences in purpose.</p>
<p>That last sentence, in particular, reminds me of mashups; if you combine that with standardized indexing, I&#8217;m getting a very strong RESTful vibe from this.  In a RESTful application, names are key but internal structure can vary from location to location, and outsiders can use standard tools to access the data that the application exposes and borrow it for their ends.</p>
<p>Next in their taxonomy is the <strong>Ideal Type</strong>:</p>
<blockquote><p>This is an object such as a diagram, atlas or other description which in fact does not accurately describe the details of any one locality or thing.  It is abstracted from all domains, and may be fairly vague.  However, it is adaptable to a local site precisely because it is fairly vague; it serves as a means of communicating and cooperating symbolically&mdash;a &#8216;good enough&#8217; road map for all parties.  An example of an ideal type is the species.  This is a concept which in fact described no specimen, which incorporated both concrete and theoretical data and which served as a means of communicating across both worlds.  Ideal types arise with differences in degree of abstraction.  They result in the deletion of local contingencies from the common object and have the advantage of adaptability.</p></blockquote>
<p>My first reaction here was to try to make an analogy with abstract types; indeed, they use the word &#8220;abstracted&#8221; in their second sentence, and I can easily see their species example being used as an example in an OO textbook.  The only thing that gives me some amount of pause when proposing this analogy is their use of it as a talisman communication tool between multiple parties, many of which may turn out to want to know more about the details of the objects in question.</p>
<p>In contrast, in my programming experience, if I have a concrete subclass of an abstract class, it&#8217;s more typical for almost all users to only care about the abstraction, while perhaps only one user cares about the concrete class.  Though, rereading what they say, maybe their species example suggests that the correct analogy to the Ideal Type is to (any sort of) class, with the non-ideal objects being instances, rather than subclasses?  Either way, though, I get the feel that I&#8217;m missing something in the way that I was missing something with my earlier analogy between a Repository and a collection: is there another analogy waiting to be found here that&#8217;s a bit grubbier in the way that the RESTful example is?</p>
<p>Third up are <strong>Coincident Boundaries</strong>:</p>
<blockquote><p>These are common objects which have the same boundaries but different internal contents.  They arise in the presence of different means of aggregating data and when work is distributed over a large-scale geographic area.  The result is that work in different sites and with different perspectives can be conducted autonomously while cooperating parties share a common referent.  The advantage is the resolution of different goals.  An example of coincident boundaries is the creation of the state of California itself as a boundary object for workers at the museum.  The maps of California created by the amateur collectors and the conservationists resembled traditional roadmaps familiar to us all, and emphasized campsites, trails and places to collect.  The maps created by the professional biologists, however, shared the same outline of the state (with the same geo-political boundaries), but were filled in with a highly abstract, ecologically-based series of shaded areas representing &#8216;life zones&#8217;, an ecological concept.</p></blockquote>
<p>This one was hard for me to grapple with.  (And <a href="http://www.deregulo.com/facetation/2004/09/boundary-object-susan-leigh-star-and.html">I&#8217;m not the only one</a>; that link, incidentally, gives references to extensions of this taxonomy.)  Even in the physical world, it&#8217;s a bit hard for me to tell examples of this: is the concept really restricted to large-scale geographic areas?  That seems a bit limiting.</p>
<p>The paper in question discusses the Museum of Vertebrate Zoology at the University of California, Berkeley; is it a boundary object?  I tend to think so: quoting from the definition on page 393,</p>
<blockquote><p>This is an analytic concept of those scientific objects which both inhabit several intersecting social worlds (see the list of examples in the previous section) <em>and</em> satisfy the informational requirements of each of them.  Boundary objects are objects which are both plastic enough to adapt to local needs and the constraints of the several parties employing them, yet robust enough to maintain a common identity across sites. They are weakly structured in common use, and become strongly structured in individual-site use. These objects may be abstract or concrete. They have different meanings in different social worlds but their structure is common enough to more than one world to make them recognizable, a means of translation.</p></blockquote>
<p>And certainly the MVZ is robust enough to maintain a common identity, but it means something different to a postdoc working there, to somebody who has spent her career there, to a visiting researcher, to a university administrator, to an outside funder, to a janitor.  (Indeed, much of the paper is devoted to showing such differences in meanings.)  Given that, I would treat the MVZ as a Coincident Boundary: though not spread over a large-scale geographic area, it&#8217;s still a place which means different but related things to different people.</p>
<p>Which, to be honest, doesn&#8217;t help me directly with finding programming analogies; maybe a function body in the input to a compiler that means different things to the lexer, the parser, the optimizers, the code generator, the debug info generator?  Actually, I think maybe the more important analogy is a bit more conceptual and not internal to programming: maybe we could think of a domain object as an example of a Coincident Boundary that means one thing to a programmer, another thing to a database administrator, a third thing to an system architect, a fourth thing to an XP Customer, a fifth thing to a marketer, a sixth thing to an end user.  I&#8217;m not completely sold on that, but I do think that domain objects are boundary objects of some sort, and they&#8217;re a better fit to Coincident Boundaries than anything else in Star and Griesemer&#8217;s taxonomy.</p>
<p>The last entry in their taxonomy is <strong>Standardized Forms</strong>:</p>
<blockquote><p>These are boundary objects devised as methods of common communication across dispersed work groups.  Because the natural history work took place at highly distributed sites by a number of different people, standardized methods were essential, as discussed above.  In the case of the amateur collectors, they were provided with a form to fill out when they obtained an animal, standardized in the information it collected.  The results of this type of boundary object are standardized indexes and what Latour would call &#8216;immutable mobiles&#8217; (objects which can be transported over a long distance and convey unchanging information).  The advantages of such objects are that local uncertainties (for instance, in the collecting of animal species) are deleted.</p></blockquote>
<p>Class interfaces (whether concrete or abstract) are examples here, as are generalizations such as duck types or the sorts of dependencies that C++ templates impose on their parameter types.  For example, templates don&#8217;t care about the details of an iterator as long as it exposes its increment operator under the name ++, its equality operator under the name ==, and so forth.</p>
<p>Network protocols are another example: indeed, what is better than TCP/IP at ensuring that data &#8220;can be transported over a long distance and convey unchanging information&#8221;?  Stick it on the wire in a Standardized Form, and it will come back out the other end.  We can use our RESTful example from above in this context as well: if you want disparate clients to all be able to talk to each other, it helps a lot if everybody speaks in terms of GET, POST, PUT, and DELETE.</p>
<p>And, as we did with the last example of the taxonomy, we can step away from the code a bit.  An acceptance test is a Standardized Form: if the Customer and the engineers want to agree on what it means to complete that task, it sure helps if they can point to a Standardized Form for specifying that completion, and an acceptance test that both sides can read (and run!) is an excellent form for that agreement to take, for deleting uncertainties.</p>
<p>Interesting stuff.  I&#8217;m curious what other classes of boundary objects people have come up with, and I should probably spend more time thinking about examples outside of the strict domain of code.  And I really like the lens it gives on the messiness, the grunge, the lack of sterility of the RESTful approach: if you pin down enough so that people can talk to each other while leaving enough of the details undetermined so that different groups can use the entity in question for significantly different ends, unexpected synergies can flourish.</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2009/06/a-taxonomy-of-boundary-objects/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>boundary objects and solid principles</title>
		<link>http://malvasiabianca.org/archives/2009/06/boundary-objects-and-solid-principles/</link>
		<comments>http://malvasiabianca.org/archives/2009/06/boundary-objects-and-solid-principles/#comments</comments>
		<pubDate>Wed, 24 Jun 2009 05:13:18 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=2139</guid>
		<description><![CDATA[The following bit from Brian Marick&#8217;s summary of boundary objects caught my eye:
Ivermectin is a popular drug for deworming animals. Onchocerciasis (river blindness) is a chronic illness that&#8217;s a particular burden in sub-Saharan Africa. Since river blindness is caused by a worm susceptible to ivermectin, the manufacturer (Merck) desired to donate ivermectin to fight the [...]]]></description>
			<content:encoded><![CDATA[<p>The following bit from <a href="http://exampler.com/testing-com/writings/marick-boundary.pdf">Brian Marick&#8217;s summary of boundary objects</a> caught my eye:</p>
<blockquote><p>Ivermectin is a popular drug for deworming animals. Onchocerciasis (river blindness) is a chronic illness that&#8217;s a particular burden in sub-Saharan Africa. Since river blindness is caused by a worm susceptible to ivermectin, the manufacturer (Merck) desired to donate ivermectin to fight the disease. That presented some problems. For example, it would not be in Merck&#8217;s interest if the bulk recipients responsible for redistributing ivermectin to people instead resold it into the lucrative veterinary market. On the other hand, it would also not be in Merck&#8217;s interest to tell the recipients (including national governments that are markets for other Merck drugs) that they are not competent or trustworthy enough to receive ivermectin. Merck needed organizational distance.</p>
<p>The solution was for Merck to donate the drug to a non-profit non-governmental organization. An independent expert committee would make the decision about which applicants (both governments and non-governmental organizations) would then receive the drug. This committee is a boundary object. To Merck, it provides distance: Merck donates the drug, reaps the benefits in good will and tax deductions, but is insulated from political repercussions. To the bulk recipients, the committee is the dispassionate judge of applications, end-point of an application process, and advisor during implementation.</p>
</blockquote>
<p>This situation and its solution immediately reminded me of the notion that &#8220;All problems in computer science can be solved by another level of indirection.&#8221;  But it&#8217;s not just that broad aphorism: the example reminds me of Bob Martin&#8217;s SOLID principles in particular.  (The first five principles <a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod">listed here</a>; see also <a href="http://www.hanselminutes.com/default.aspx?showID=163">this Hanselminutes show on the topic</a>.)  I don&#8217;t think all his principles apply to the drug example, but more than one does.</p>
<p>The most obvious example is the Single Responsibility Principle.  Merck is a big company that does lots of things; to handle this problem, they created a separate organization that has only one job, to deal with dispensing ivermectin.</p>
<p>I&#8217;ve squinted at the the Open Closed Principle a few times, and I can&#8217;t see how it applies to this situation &#8211; the types of modification that the OCP is talking about don&#8217;t seem so relevant here.</p>
<p>The Liskov Substitution Principle also doesn&#8217;t seem particularly relevant.  It&#8217;s about base classes and derived classes; the only example of that that I see here is that you could think of the abstract concept of an applicant as a base class, with concrete applicants as derived classes, but that&#8217;s a pretty weak LSP situation: the base class is so abstract, the derived classes are so concrete.</p>
<p>Skipping ahead to D, the base and derived classes are a much better fit for the Dependency Inversion Principle.  In fact, the second paragraph quoted above is all about that principle: rather than having the concrete company Merck deal with concrete recipients of donations of the drug, we introduce multiple abstractions.  From Merck&#8217;s point of view, the NGO is something of an abstraction: as long as Merck knows enough about the NGO to trust that they&#8217;ll do a reasonable job dispensing the drug, it doesn&#8217;t have to worry about the details of the process.  Similarly, from the applicants&#8217; point of view, the NGO is a relatively abstract organization compared to Merck.  (Or is it?  Am I conflating this with the Single Responsibility Principle?  Certainly there are fewer opportunities for linkages between the applicants and the NGO than between the applicants and Merck as a whole.)  From the NGO&#8217;s point of view, the very notion of &#8220;applicant&#8221; is an abstraction placed on real people, real organizations.</p>
<p>Going back to I, the Interface Segregation Principle also seems relevant, though admittedly my justification for it here seems very similar to my justification to the Single Responsibility Principle: the NGO is exactly the interface to Merck for clients who want free ivermectin.</p>
<p>Does this analogy hold up in other examples of boundary objects?  Can we relate the Open Closed Principle and the Liskov Substitution Principle to examples outside of programming?  Can we run our analogy in the other direction, finding properties of boundary objects that suggest principles of good programming?</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2009/06/boundary-objects-and-solid-principles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>random links: june 21, 2009</title>
		<link>http://malvasiabianca.org/archives/2009/06/random-links-june-21-2009/</link>
		<comments>http://malvasiabianca.org/archives/2009/06/random-links-june-21-2009/#comments</comments>
		<pubDate>Sun, 21 Jun 2009 16:24:26 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Lean / Agile]]></category>
		<category><![CDATA[Music]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Video Games]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=2123</guid>
		<description><![CDATA[
Some evidence for anybody curious how well being good at Rock Band drums transfers to real drums.

The neuroscience of illusion; I&#8217;ll embed one of the videos so you can see the kind of thing they&#8217;re discussing.

(Via Kelley Eskridge.)

A pleasant network logic puzzle game.  (Via User Friendly, which makes it essentially impossible to cite them [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://dubiousquality.blogspot.com/2009/05/design-brilliance-and-timing-window.html">Some evidence for anybody curious how well being good at <cite>Rock Band</cite> drums transfers to real drums.</a></li>
<li>
<p><a href="http://www.wired.com/print/science/discoveries/magazine/17-05/ff_neuroscienceofmagic">The neuroscience of illusion</a>; I&#8217;ll embed one of the videos so you can see the kind of thing they&#8217;re discussing.</p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/_qQX-jayixQ&#038;rel=0&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=en&#038;feature=player_embedded&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed src="http://www.youtube.com/v/_qQX-jayixQ&#038;rel=0&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=en&#038;feature=player_embedded&#038;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="425" height="344"></embed></object>
<p>(Via <a href="http://www.kelleyeskridge.com/magic-happens-in-the-brain/">Kelley Eskridge</a>.)</p>
</li>
<li><a href="http://www.gamesforwork.com/games/play-12292-Colourshift-Flash_Game">A pleasant network logic puzzle game.</a>  (Via <a href="http://www.userfriendly.org/links/">User Friendly</a>, which makes it essentially impossible to cite them correctly as a link referrer.)</li>
<li><a href="http://blog.naxos.com/2009/05/19/podcast-the-worlds-largest-instrument-bertolozzis-bridge-music/">Miranda asked me to buy her a copy of Bertolozzi&#8217;s <cite>Bridge Music</cite> about five seconds after the podcast started, and that was before she knew that the sounds the piece uses were actually generated by banging on the Mid-Hudson Bridge.</a></li>
<li><a href="http://fastgames.com/littlewheel.html"><cite>Little Wheel</cite></a>, a short adventure game.  Pleasant enough, and a neat world, but there&#8217;s also some interesting design questions. In particular, should point-and-click adventure games always show you the current clickable objects in a given scene?  (Via <a href="http://multiplayerblog.mtv.com/2009/06/11/little-wheel-the-perfect-flash-adventure-treat/">MTV Multiplayer</a>.)</li>
<li>
<p>Speaking of adventure games, I will link to <a href="http://www.joystiq.com/2009/06/09/interview-tim-schafer-and-the-art-of-selling-out/">this Tim Schafer interview</a> only because of the following quote:</p>
<blockquote><p>My daughter, I think, is going to be very good at playing adventure games, even though she is only a year old. Because she&#8217;ll grab a toy and she&#8217;ll bang it on all of her other toys in the room.  She&#8217;s trying every item in the room with every other item in the room to see if it does something. I was like, &#8220;You are a natural-born adventure game player.&#8221; She doesn&#8217;t steal objects and hide them somewhere on her body, though. In some secret orifice.</p></blockquote>
<p>(Via <a href="http://twitter.com/elenielstorm/status/2134703852">@elenielstorm</a>.)</p>
</li>
<li>
<p>And speaking of children trying things with other things, <a href="http://www.youtube.com/watch?v=Zybl598sK24">interesting testing in a sorting algorithm</a>:</p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/Zybl598sK24&#038;hl=en&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/Zybl598sK24&#038;hl=en&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object>
<p>(Via <a href="http://twitter.com/Vaguery/status/2195384363">@Vaguery</a>.)</p>
</li>
<li>More on the theme of kids: <a href="http://www.figarospeech.com/teach-a-kid-to-argue/">kids and Greek rhetoric</a> (via <a href="http://twitter.com/Adjuster/status/1968205076">@Adjuster</a>) and <a href="http://www.xylocopa.com/product/mad-science-alphabet-blocks">Mad Scientist&#8217;s Alphabet Blocks</a> (via <a href="http://twitter.com/garb/status/1964321554">@garb</a>.)</li>
<li>
<p>Just because I like Flanders and Swann, <a href="http://www.youtube.com/watch?v=mOA_SUKEZRE">a lego take on The Gasman Cometh</a>.</p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/mOA_SUKEZRE&#038;hl=en&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/mOA_SUKEZRE&#038;hl=en&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object>
<p>(Via <a href="http://twitter.com/kateri_t/status/1974990608">@kateri_t</a>.)</p>
</li>
<li><a href="http://dustincurtis.com/dear_dustin_curtis.html">How culture and silos harm design.</a> (Via <a href="http://twitter.com/testobsessed/status/2029486345">@testobsessed</a>.)</li>
<li><a href="http://www.dailymail.co.uk/sciencetech/article-1189877/The-cloud-Meteorologists-campaign-classify-unique-Asperatus-clouds-seen-world.html">Remarkable cloud pictures.</a>  (Via <a href="http://twitter.com/marick/status/2020059306">@marick</a>.)</li>
<li>
<p>Two TDD tweets: <a href="http://twitter.com/KentBeck/status/2010455536">@KentBeck</a> says:</p>
<blockquote><p> francis bacon understood tdd: &#8220;truth emerges more readily from error than confusion&#8221;</p></blockquote>
<p>and <a href="http://twitter.com/mfeathers/status/2048080292">@mfeathers</a> says:</p>
<blockquote><p>TDD is a way of teaching software how to live at the scale of human understanding.</p></blockquote>
</li>
<li><a href="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-06.html#e2009-06-11T20_24_02.htm">Will universities go the way of newspapers?</a>  (Via <a href="http://twitter.com/marick/status/2134680522">@marick</a>.)</li>
<li>
<p><a href="http://www.youtube.com/watch?v=tc_LqIaO2b8">An amazing optical illusion.</a></p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/tc_LqIaO2b8&#038;hl=en&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/tc_LqIaO2b8&#038;hl=en&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
<p>(Via <a href="http://twitter.com/SimonParkin/status/2223036781">@SimonParkin</a>.)</p>
</li>
<li>
<p>I don&#8217;t normally link to ads / corporate videos, but <a href="http://www.youtube.com/watch?v=yqaXxSBZTZc">this one is delightful</a>.  Who is this Takashi Murakami guy?</p>
<p><object width="560" height="340"><param name="movie" value="http://www.youtube.com/v/yqaXxSBZTZc&#038;hl=en&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/yqaXxSBZTZc&#038;hl=en&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"></embed></object>
<p>(Via <a href="http://twitter.com/Iroqu0isP1iskin/status/2120619020">@Iroqu0isP1iskin</a>.)</p>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2009/06/random-links-june-21-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>change of focus</title>
		<link>http://malvasiabianca.org/archives/2009/06/change-of-focus/</link>
		<comments>http://malvasiabianca.org/archives/2009/06/change-of-focus/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 05:22:21 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[GTD]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Japanese]]></category>
		<category><![CDATA[Lean / Agile]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Video Games]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=2102</guid>
		<description><![CDATA[Over the last few weeks, I&#8217;ve been finding enough unusual projects imposing on my time that I think I&#8217;m going to have to shuffle my priorities, albeit temporarily.  I&#8217;ve been wanting to do more programming at home than normal recently: aside from improving the memory project, I want to spend a bit of time [...]]]></description>
			<content:encoded><![CDATA[<p>Over the last few weeks, I&#8217;ve been finding enough unusual projects imposing on my time that I think I&#8217;m going to have to shuffle my priorities, albeit temporarily.  I&#8217;ve been wanting to do more programming at home than normal recently: aside from improving the <a href="http://malvasiabianca.org/archives/2009/05/update-on-learning-japanese-and-memorization/">memory project</a>, I want to spend a bit of time getting back into <a href="http://www.bactrian.org/~carlton/dbcdb/1257/">functional programming</a>.  And then there&#8217;s <a href="http://malvasiabianca.org/archives/2009/04/idea-factory-workshop-at-agile-2009/">conference</a> <a href="http://agileopencalifornia.com/index.php?option=com_content&#038;task=view&#038;id=18&#038;Itemid=45">preparation</a> work on top of that.</p>
<p>Being a good GTD devotee (or a good lean/agile devotee), this means that something has to go.  Fortunately, I&#8217;m actually pretty well on top of things right now&mdash;in particular, my Next Action list is about as short as I can ever remember its being&mdash;so I shouldn&#8217;t have to prune <em>too</em> much; but I have to prune something.  And I&#8217;m certainly not going to take a break from learning Japanese&mdash;in fact, one of the unintended consequences of the memory project has been to make there be pretty serious consequences if I take even a couple of days off from my study.  (One could make a sensible case that I am being a total idiot in subscribing to <a href="http://www.chineseclass101.com/index.php">ChineseClass101</a> right now, however.  Though I certainly don&#8217;t intend to treat that as seriously as I&#8217;m treating learning Japanese.)</p>
<p>So I think my only choice is to cut down on my video game playing for the time being.  Don&#8217;t get me wrong: I&#8217;m not going to stop completely, you&#8217;ll still find me every Thursday evening at the <a href="http://malvasiabianca.org/archives/2009/05/come-play-games-with-us/">VGHVI play nights</a>, and I&#8217;ll keep up with <a href="http://brainygamer.websitetoolbox.com/">VGC</a> activities.  I imagine I&#8217;ll do some playing and blogging outside of that, too, but for those of you who read this blog for game-related content, don&#8217;t be surprised if there are relatively slim pickings here for a while.</p>
<p>But don&#8217;t unsubscribe, either!  In particular, my conference activities won&#8217;t continue forever, so by the fall I should be back to normal.  Heck, I might even be back to normal after Agile 2009&mdash;I certainly want to find time in early September to play <a href="http://www.thebeatlesrockband.com/">a certain game</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2009/06/change-of-focus/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>update on learning japanese and memorization</title>
		<link>http://malvasiabianca.org/archives/2009/05/update-on-learning-japanese-and-memorization/</link>
		<comments>http://malvasiabianca.org/archives/2009/05/update-on-learning-japanese-and-memorization/#comments</comments>
		<pubDate>Sat, 30 May 2009 05:32:55 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Japanese]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=2067</guid>
		<description><![CDATA[It&#8217;s been ages since I blogged about learning Japanese, so I figured I&#8217;d give y&#8217;all an update.  I finished the textbook I was using last November, which raised the question of what to do next.  I have some manga around and even a couple of collections of essays/stories, but I wasn&#8217;t sure I&#8217;d [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been ages since I blogged about learning Japanese, so I figured I&#8217;d give y&#8217;all an update.  I finished the <a href="http://www.bactrian.org/~carlton/dbcdb/784/">textbook</a> I was using last November, which raised the question of what to do next.  I have some manga around and even a couple of collections of essays/stories, but I wasn&#8217;t sure I&#8217;d be up for them just yet.  So, on a friend&#8217;s suggestion, I subscribed to a series of children&#8217;s books!  The friend in question is an American with a Japanese wife, and they subscribed to the books for their kids; based on his description, they sounded delightful, and I&#8217;m certainly not too proud to read books targeted at two-year-olds.</p>
<p>Actually, I subscribed to several of <a href="http://www.fukuinkan.co.jp/magazine.php">the company&#8217;s series</a>: I was pretty sure that the lowest level they offered was too basic for me, but the next five levels (going from 2-year-old through 6-year-old) all seemed plausible.  So I subscribed to all five, planning to unsubscribe from the lower levels as I got more confident.  In fact, I subscribed to them several months before I finished the textbook, so I had a backlog built up before I started reading any of them.</p>
<p>So I started working through my backlog of the 2-to-4-year-old fiction level, こどものとも年少版.  (Which means something like &#8220;child&#8217;s friend early years edition&#8221;?)  It was surprisingly hard, in some ways harder for me than later levels: it uses an awful lot of onomatopoeia (which Japanese uses much more than English in general), and I&#8217;m fairly sure that some of the speech forms are somewhat nonstandard parents-talking-to-kids forms rather than what I&#8217;d learned in grammar books.  Fortunately, the books were totally charming, and while I wouldn&#8217;t want all books to be as repetitive as those ones are (a lot of doing the same thing on different pages with different numbers or colors or animals or whatever), it really helped me to have the same sentence structure and half of the same words to cling to while figuring out the rest of what&#8217;s on the page.  And I&#8217;ve gotten a lot better at reading books in that series over the intervening months; the onomatopoeia words are even starting to stick.</p>
<p>Once I made it through my backlog of books at that level, I started on the next level: ちいさなこどものとも (little science&#8217;s friend?), nonfiction for 3-5 year olds.  This was a great level for me: the sentences didn&#8217;t have the word usage quirks that previous level had, and the sentences were a bit more interesting while still not requiring me to look up an overwhelming number of words.</p>
<p>About a month ago, I made it through my backlog of those (I&#8217;d been reading one every weekend), and moved up to the next level.  It&#8217;s called こどものとも年中向き (child&#8217;s friend targeted at intermediate years?), and is fiction for 4-5 year olds.  And I&#8217;m enjoying the transition: the books are a bit longer than previous volumes (28 pages instead of 24 with more words to a page), but my practice from previous levels is paying off, as is my memorization practice, so they&#8217;re not taking too long.  I&#8217;ve only read three books from that level so far, but they&#8217;re really quite varied: one was a regular story that confused my a lot until I realized that some of the word endings were in regional dialect; one consisted of scenes from a train station that might have fit better in the science series; and one was a counting/animal story that, honestly, probably would have fit better at an earlier level.</p>
<p>I&#8217;ve subscribed to but not started reading two more levels after that (one nonfiction, one fiction, both going through age 6); for now, I&#8217;m staying subscribed to the earlier levels, but I imagine at some point I&#8217;ll unsubcribe to those and add a subscription to something still more advanced.  Also, for what it&#8217;s worth, all of the levels I&#8217;m subscribed to are kana-only, so my kanji practice isn&#8217;t paying off here yet.  Though it&#8217;s paying off in other areas: for example, it&#8217;s kind of weird looking over at the spines of my Japanese go books and realizing that I actually recognize most of the characters I see there, even the non-go-specific ones.</p>
<p>I&#8217;m still listening to <a href="http://www.japanesepod101.com/index.php">JapanesePod101</a>, of course (incidentally, they just added a <a href="http://www.chineseclass101.com/index.php">Chinese sister site</a>, if you&#8217;re interested in learning Mandarin), and I&#8217;m spending a lot of time (almost certainly an unproductive proportion of time) memorizing vocabulary in general and Kanji in particular.  In particular, I basically haven&#8217;t skipped a day using my <a href="http://malvasiabianca.org/archives/2008/08/memory-project-is-deployed/">memory program</a> since it went live almost 10 months ago.  (I usually use it during my lunch break at work.)</p>
<p>Which has been an interesting experience: in particular, at first, I ignored some of Wozniak&#8217;s suggestions, and I&#8217;ve learned that I was wrong to do so.  To be clear, I don&#8217;t claim to be following any of his algorithms at all&mdash;I&#8217;m sticking with the algorithm I <a href="http://malvasiabianca.org/archives/2008/06/memory/">outlined here</a>&mdash;but there are recommendations he makes that would apply to my algorithm that I ignored.  In particular, he <a href="http://www.supermemo.com/english/ol/sm4.htm">suggests</a> a floor of 1.3 for the exponent; initially, I figured I&#8217;d put in a floor of 1.0 instead.  But, after a few months, that turned out not to work at all: it was taking more and more time each day to review stuff because, once an item got tagged as &#8220;most difficult&#8221; (not too hard with kanji), I&#8217;d review it every single day for a month, and that clogged up fast.  So I bumped the floor up to 1.2, and things got better; I then figured I should stop reinventing the wheel and bumped it up to 1.3, and I&#8217;m glad I did.</p>
<p>I&#8217;m also doing a better job now of following his suggestion of breaking up items into small chunks to memorize.  Before, I would list all of the readings of a Kanji as one item: e.g. for the question 問 I would list the answer &#8220;もん、と（い）question, problem; と（う）matter, care about&#8221;.  But now I break that up into three pairs: Q: 問, A: もん question, problem; Q: 問い, A: とい question, problem; Q: 問う, A: とう matter, care about.  That has several advantages: individual items are smaller (as Wozniak recommends), I naturally focus more on the readings that are harder for me to remember, and I&#8217;m testing myself on something that actually matters when reading instead of an abstract skill.  (I.e. I will encounter 問う when reading, but I will never be in a situation where it matters if I can list all the endings that you can stick after the Kanji 問.)  In particular, the previous method wasn&#8217;t good at training me to tell whether, say, 上る was the reading のぼる or あがる.  (It&#8217;s the former, the latter is written 上がる.)</p>
<p>Also, I made another Japanese-specific change while breaking up the kanji into multiple questions: I started writing the On readings (derived from Chinese) in katakana and the Kun (native Japanese) readings in hiragana.  (So the answer to 問 is really モン.)  It&#8217;s actually usually pretty obvious whether a reading is On or Kun, so that&#8217;s not important from a memorization point of view, but it meant that every day I was exposed to hundreds of katakana characters, so my katakana recognition speed has increased dramatically.  (Incidentally, if any of you are learning Japanese, a recommendation: learn how to use your keyboard input method.  Under Linux, you can convert a word to katakana by hitting F7; under OSX, by hitting control-k.)</p>
<p>Another surprise: I&#8217;d sort of assumed that some sort of geometric series magic would mean that I would be able to keep adding items to the database without increasing the amount of time I need to spend reviewing each day.  Which, if you think about it for a minute, isn&#8217;t the case at all: e.g. if all items are at exponent 2 and I never make a mistake, then every day I need to review all the items I added yesterday, all the items added 2 days ago, all the items added 4 days ago, all the items added 8 days ago, all the items added 16 days ago, etc., and the growth here is unbounded.  (Or rather, is bounded only by my lifespan!)  I don&#8217;t think this is a <em>big</em> problem, but it might be; it does suggest that if I have too many items with small exponents then I&#8217;m in trouble.  I hope that that problem will naturally ease: there&#8217;s a limit to the number of Kanji I have to memorize (I&#8217;m almost halfway through the official common usage Kanji list), and as I start reading more, I&#8217;ll get exposed to vocabulary more frequently in other contexts, which should manifest itself by the vocabulary seeming easier from the program&#8217;s point of view.  We&#8217;ll see how it goes; if it gets too bad, I&#8217;ll cut down on the forced memorization and spend more of my time just reading and not worrying much about words I don&#8217;t know.</p>
<p>I had plans to quickly spiff up this application and make it multiuser, but that didn&#8217;t happen: basically, it became useable shockingly quickly, and I really didn&#8217;t have much of an impetus to improve it past that stage.  It&#8217;s amazing what I&#8217;ve managed to leave out: for example, I assumed that I would have to implement a search functionality early on.  But part of the basic Rails CRUD functionality is a URL that lists all the items, and combining that with browser search still works acceptably for search even though I&#8217;ve got over 3000 memory items listed.  Or I assumed that I would have to secure it (and probably naturally add multiuser functionality as part of that) to get it useable while at work or travelling, but ssh tunnelling to an unsecure deployment was working fine for me until I got my new iPod and wanted to be able to use the program from the iPod&#8217;s web browser.</p>
<p>That&#8217;s changing now: aside from the iPod issue, I&#8217;ve recently gotten a bit frustrated with some UI elements, Miranda has shown some curiosity in using the program, and I just finished reading the paper version of the third edition of the <a href="http://www.bactrian.org/~carlton/dbcdb/1232/">Rails book</a>.  So now I&#8217;m pretty excited to start up my tinkering again!  And in fact I started that last weekend (I continue to be impressed at how easy it is to write functional tests in Rails, incidentally), and I plan to continue with that on future weekends until the program looks/works a lot better.  So: Jim and Praveen, I apologize for the delays, I&#8217;ll have a multiuser version available soon if you&#8217;re still interested!  And anybody else who is interested, let me know; I&#8217;ll announce it here when it&#8217;s ready for use by people other than myself.</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2009/05/update-on-learning-japanese-and-memorization/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>routinization, inscription, and facts</title>
		<link>http://malvasiabianca.org/archives/2009/05/routinization-inscription-and-facts/</link>
		<comments>http://malvasiabianca.org/archives/2009/05/routinization-inscription-and-facts/#comments</comments>
		<pubDate>Tue, 26 May 2009 03:50:05 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[Lean / Agile]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Video Games]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=2016</guid>
		<description><![CDATA[I can&#8217;t say I&#8217;ve internalized (routinized? inscribed?) Latour&#8217;s Laboratory Life yet, but in the mean time I present you with three quotes on routinization, inscription, and facts:
To counter these catastrophic possibilities, efforts are made to routinise component actions either through technicians&#8217; training or by automation.  Once a string of operations has been routinised, one [...]]]></description>
			<content:encoded><![CDATA[<p>I can&#8217;t say I&#8217;ve internalized (routinized? inscribed?) Latour&#8217;s <a href="http://www.bactrian.org/~carlton/dbcdb/1236/"><cite>Laboratory Life</cite></a> yet, but in the mean time I present you with three quotes on routinization, inscription, and facts:</p>
<blockquote><p>To counter these catastrophic possibilities, efforts are made to routinise component actions either through technicians&#8217; training or by automation.  Once a string of operations has been routinised, one can look at the figures obtained and quietly forget that immunology, atomic physics, statistics, and electronics actually made this figure possible.  Once the data sheet has been taken to the office for discussion, one can forget the several weeks of work by technicians and the hundreds of dollars which have gone into its production.  After the paper which incorporates these figures has been written, and the main result of the paper has been embodied in some new inscription device, it is easy to forget that the construction of the paper depended on material factors.  The bench space will be forgotten, and the existence of laboratories will fade from consideration.  Instead, &#8220;ideas,&#8221; &#8220;theories,&#8221; and &#8220;reasons&#8221; will take their place.  Inscription devices thus appear to be valued on the basis of the extent to which they facilitate a swift transition from craft work to ideas.  The material setting both makes possible the phenomena and is required to be easily forgotten.  Without the material environment of the laboratory none of the objects could be said to exist, and yet the material environment very rarely receives mention.  It is this paradox, which is an essential feature of science, that we shall now consider in more detail. (p. 69)</p></blockquote>
<blockquote><p>The production of a paper depends critically on various processes of writing and reading which can be summarised as literary inscription.  The function of literary inscription is the successful persuasion of readers, but the readers are only fully convinced when all sources of persuasion seem to have disappeared.  In other words, the various operations of writing and reading which sustain an argument are seen by participants to be largely irrelevant to &#8220;facts,&#8221; which emerge solely by virtue of these same operations.  There is, then, an essential congruence between a &#8220;fact&#8221; and the successful operation of various processes of literary inscription.  A text or statement can thus be read as &#8220;containing&#8221; or &#8220;being about a fact&#8221; when readers are sufficiently convinced that there is no debate about it and the processes of literary inscription are forgotten.  Conversely, one way of undercutting the &#8220;facticity&#8221; of a statement is by drawing attention to the (mere) processes of literary inscription which make the fact possible. (p. 76)</p></blockquote>
<blockquote><p>A fact only becomes such when it loses all temporal qualifications and becomes incorporated into a large body of knowledge drawn by others.  Consequently, there is an essential difficulty associated with writing the history of a fact: it has, by definition, lost all historical reference. (p. 106)</p></blockquote>
<p>Can we profit from focusing on objects/processes that &#8220;facilitate a swift transition from craft work to ideas&#8221;?  I spent a few pleasant hours this afternoon doing some Rails programming; that framework shines because of the small amount of craft work necessarily to see a manifestation of your ideas.  Does a software framework count as an &#8220;inscription device&#8221;?  Does a programming language?  Does a compiler, an interpreter?  If not, is there some generalization of that concept that we can use here?</p>
<p>Agile processes value a swift transition between the programmer&#8217;s craft work and the Customer&#8217;s ideas.  (A transition in both directions, I should add.)  What are the inscription devices here?  Ironically, one of the key mechanisms that agile uses to speed this transition is to remove certain inscription devices, or at least inscriptions, in favor of people talking directly to each other.</p>
<p>Can we relate tests to inscriptions and inscription devices?  Test runs can certainly lead to thousands, millions of inscriptions over the course of a day; most of those inscriptions are internal, in that the software is noting that an assertion passed, but I label them as inscriptions nonetheless.  They&#8217;re a very good form of persuasion; if you&#8217;re on a project where test runs act as a reliable safety net, then your worry level decreases, you can treat the software&#8217;s behavior as a &#8220;fact&#8221;, and spend time in idea land.  Until, of course, a test failure (or, much worse, a failure that your tests didn&#8217;t catch) undercuts your software&#8217;s facticity.</p>
<p>I&#8217;ve been pretty obsessed with <a href="http://www.bactrian.org/~carlton/dbcdb/1190/">A3 reports</a> for the last few months, which are certainly a form of inscription.  And one of the strengths of the process is the extent to which the A3 report <em>doesn&#8217;t</em> serve as a source of persuasion, the extent to which the &#8220;sources of persuasion seem to have disappeared&#8221;: if the process is doing well, it&#8217;s a summary of facts to which all participants agree.  Or have the sources of persuasion disappeared?  Perhaps better to say they&#8217;ve been distilled down to a trace, as with a scientific paper; I don&#8217;t want to underestimate the importance of that trace.</p>
<p>I don&#8217;t suppose I can relate this to video games somehow?  One issue that I struggle with, especially in <a href="http://www.bactrian.org/~carlton/dbcdb/1101/">games with a large variety of techniques to reach a goal</a>, is how to internalize the various gameplay options that are available to me.  Most of the time, I end up leaning on a few standard ways of progressing through a game&#8217;s levels; I suspect my experience would be richer if I had a broader tapestry of &#8220;facts&#8221; to choose from in the form of live tactical (or, better yet, strategic) options.  What can games do to help me reach this state?  What inscriptions can they present me with to ease this journey?  How can I modify my own play styles to reach this state?</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2009/05/routinization-inscription-and-facts/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>jobs and roles</title>
		<link>http://malvasiabianca.org/archives/2009/04/jobs-and-roles/</link>
		<comments>http://malvasiabianca.org/archives/2009/04/jobs-and-roles/#comments</comments>
		<pubDate>Sun, 19 Apr 2009 05:11:51 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Managing]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Video Games]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=1939</guid>
		<description><![CDATA[One of my goals in going to GDC was to get a feel for what the industry is like on the inside.  I think I succeeded in that, to some extent; what I wasn&#8217;t expecting, however, what that I&#8217;d learn so much about what I like about my current job, and about things to [...]]]></description>
			<content:encoded><![CDATA[<p>One of my <a href="http://malvasiabianca.org/archives/2009/02/gdc-recommendations/">goals</a> in going to GDC was to get a feel for what the industry is like on the inside.  I think I succeeded in that, to some extent; what I wasn&#8217;t expecting, however, what that I&#8217;d learn so much about what I like about my current job, and about things to keep in mind whether or not I eventually move professionally in a game-related direction.</p>
<p>The talk that did the most to crystallize these thoughts was the <a href="http://malvasiabianca.org/archives/2009/03/gdc-2009-friday/">Harmonix one</a>.  The speaker started the talk off by addressing the issue that everybody at the company has an idea of how the games should work, should evolve; rather than treating this as an imposition (how dare those programmers tell the designers what the game should be like!), they apparently treat this as an opportunity, a resource.  This doesn&#8217;t mean that they let everybody go off and stick their own ideas into the game&mdash;indeed, most of the talk was about addressing that tension, about how to get a coherent game in the face of so many cooks.  But what it made me realize is: I&#8217;m totally one of those people who has opinions about everything, and who gets unhappy if his opinions get brushed off.  (I&#8217;m quite happy to have my opinions argued against and discarded after due consideration, though!)  So I&#8217;d better spend my time working at companies like Harmonix.</p>
<p>And that has nothing to do with the video game industry: on any but the smallest project, there will be multiple voices that want to be heard, that (in my opinion) deserve to be heard.  One of the reasons why I&#8217;ve stayed with my current job for so long (coming up on six years!) is that I&#8217;ve never (or at least rarely) felt that my voice wasn&#8217;t heard: people have given my ideas due consideration, and a reasonable number of them have been adopted by the project.  (And a reasonable number have been discarded, too.  That&#8217;s okay.  Incidentally, none of what I&#8217;m saying here should be taken as arguing against the agile idea that there&#8217;s a Customer who ultimately decides what goes into the project: I have nothing against somebody other than myself having final authority over certain decisions, I just want those decisions to be made after appropriate <a href="http://malvasiabianca.org/archives/2009/03/agile-politics-of-nature/">Consultation</a>.)</p>
<p>This also shed some light on the sort of organizational role that I&#8217;d prefer.  For the last four and a half years, if I&#8217;m counting correctly, I&#8217;ve been managing people, but I&#8217;ve maintained a job label that puts me in Sun&#8217;s engineering track rather than it&#8217;s manager track.  And this isn&#8217;t just a conceit: I will immodestly suggest that I know the details of our product&#8217;s code as well as anybody, and I&#8217;ve touched the code quite regularly over the course of those years.  (And continue to do so: some of the back story behind <a href="http://malvasiabianca.org/archives/2009/04/inbox-zero-and-technical-debt/">my last post</a> is my thinking that I should increase my technical efforts in certain areas.)</p>
<p>This puts me in an uncomfortable position career-wise: I like what I&#8217;m doing now, with a foot in the programming world and a foot in the managerial world, and I&#8217;m all-too-well aware that the vast majority of jobs out there make you choose the one or the other.  And I won&#8217;t rule out the possibility that I&#8217;ll eventually leave the programming world entirely&mdash;in particular, I&#8217;m getting more and more curious about how organizational change works, which fits better in the managerial world.  (This is one of the ways in which my current job continues to hold my interest: over the last half-year or year, I&#8217;ve gotten to talk to more people in other parts of the organization, and started thinking about how we might do things differently.)</p>
<p>But, for the time being, I think the main aspect that I like about being a manager is that it makes it a bit easier for my voice to be heard, about the organization of the team as well as the organization of the code.  And this brings me back to the thoughts at the start of this blog post: I&#8217;m pretty sure that I&#8217;d be happy in any sort of position where my thoughts were heard, irrespective of whatever formal power my position within the organization gave me.  So I shouldn&#8217;t be thinking about being a manager versus being an individual contributor: from the former, I should take the idea that I want to be heard, and from the latter I should take the idea that I want to be in touch with the beauty of the details of what I&#8217;m working on.  And wherever that leads me is okay.</p>
<p>Back to GDC and the video game industry: in the <a href="http://www.brainygamer.com/the_brainy_gamer/2009/04/brainy-gamer-podcast-postgdc-edition.html">GDC Confab</a>, Michael asked me if I was thinking of entering the gaming industry; my answer was that I wasn&#8217;t sure, and one big worry I had was the industry&#8217;s belief that it&#8217;s appropriate to force people to work extremely long hours.  (I didn&#8217;t have <a href="http://malvasiabianca.org/archives/2009/03/gdc-2009-thursday/">anything to say at the time</a> about the &#8220;But What I Really Want to Do Is Make Games&#8221; panel, but one of the comments that&#8217;s stuck with me was a panelist saying, basically, games journalists are already used to working ridiculous hours, so that&#8217;s a way in which they fit right into the game development world!)  I don&#8217;t think that&#8217;s a good way to produce software in general&mdash;I&#8217;m pretty sure I can&#8217;t maintain disciplined, creative thoughts on one project for more than 40 hours a week&mdash;but even if it were, I&#8217;m not so obsessed with my career that I&#8217;m willing to let it dominate all other aspects of my life, my family in particular.  I&#8217;ve recently heard the statistic claimed that the average amount of time people spend in the game development industry as a whole is five years, while I&#8217;ve already been at a single job for longer than that; the humane working conditions are a big part of that, and any industry would have a hard time learning and growing if it churns through its workers as quickly as the games industry apparently does.</p>
<p>It is certainly the case, however, that a lot of what I saw at GDC excited me.  People were talking about all sorts of interesting things, things that I don&#8217;t necessarily get a chance to think about so much in my current job.  And its artistic nature is a big draw for me: I&#8217;d like to work on something beautiful, something that nourishes my soul.  Though, to be sure, code can be beautiful and nourish my soul, even if the beauty is hidden within the product: it may well be the case that I&#8217;d get more out of revealing the beauty hidden within some of our code at work than working on something more overtly artistic!  Also, working on games would be a change of pace, which I like; I&#8217;m sure the fact that my role at work has changed significantly every year or two is one of the big reasons why I&#8217;m still there.  (And has been changing again over the last year, the last few months, even seeing the seeds of new ideas over the last couple of weeks.)</p>
<p>If I had to say what sort of position appeals to me most right now, here&#8217;s a stab at what my list would look like:</p>
<ul>
<li>I&#8217;d be getting my hands dirty with software</li>
<li>but would be able to think and talk about aspects of the product beyond just the code</li>
<li>(and have people listen to me!)</li>
<li>including the structure of the organization.</li>
<li>(Said organization would ideally be small,</li>
<li>and in particular I&#8217;d be on a small team.)</li>
<li>That structure would be an agile one</li>
<li>or, better/broader yet, a lean one,</li>
<li>including working at a Sustainable Pace.</li>
<li>(Working close to home would be good, too.)</li>
<li>The product would be a work of art</li>
<li>(a game would be nice),</li>
<li>working on it would nourish my soul.</li>
<li>And I&#8217;d be learning something new,</li>
<li>both technologically</li>
<li>and at a domain level.</li>
</ul>
<p>Which is a lot to ask for.  (But if there are any companies in Mountain View using agile methods to write soul-nourishing games in Erlang, please get in touch!)  In the mean time, I&#8217;m doing pretty well on that checklist right now&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2009/04/jobs-and-roles/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
