<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Rails Test Prescriptions Blog</title>
	<atom:link href="http://railsrx.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://railsrx.com</link>
	<description>Keeping Your Application Healthy Since 2008</description>
	<lastBuildDate>Fri, 24 Feb 2012 21:36:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='railsrx.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Rails Test Prescriptions Blog</title>
		<link>http://railsrx.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://railsrx.com/osd.xml" title="Rails Test Prescriptions Blog" />
	<atom:link rel='hub' href='http://railsrx.com/?pushpress=hub'/>
		<item>
		<title>Control Your Development Environment And Never Burn Another Hamburger</title>
		<link>http://railsrx.com/2012/02/17/control-your-environment/</link>
		<comments>http://railsrx.com/2012/02/17/control-your-environment/#comments</comments>
		<pubDate>Fri, 17 Feb 2012 19:26:39 +0000</pubDate>
		<dc:creator>noelrap</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://railsrx.com/?p=439</guid>
		<description><![CDATA[Everything I know about the world of fine dining I know from watching Top Chef and from eating at Five Guys. But I do know this: chefs have the concept of mise en place (which does not mean Mice In Place), which is the idea that everything the chef is going to need to prepare [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=railsrx.com&amp;blog=10160445&amp;post=439&amp;subd=railsrx&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Everything I know about the world of fine dining I know from watching <em>Top Chef</em> and from eating at Five Guys. But I do know this: chefs have the concept of <em>mise en place</em> (which does not mean Mice In Place), which is the idea that everything the chef is going to need to prepare the food is done ahead of time and laid out for easy access. The advantages of having a good <em>mise en place</em> include time savings from getting common prep done together, ease of putting together meals once the prep is done, ease of cleanup. Again, I have no idea what I&#8217;m talking about, but it seems like the quality and care that a chef puts into their <em>mise en place</em> has a direct and significant benefit on how well they are able to do their job.</p>
<p>You probably know where I&#8217;m going with this, but I&#8217;m becoming increasing convinced that one of the biggest differences between expert and novice developers is control over the environment and tools they use. I came to this the hard way &#8211; for a long time I was horrible about command lines, it was actually something that kept me away from Rails for a little bit. It&#8217;s not like I&#8217;m Mr. Showoff Bash Script guy these days, but I know what I need to know to make my life easier. </p>
<p>Let me put it another way. Once upon a time I read a lot of human factors kind of materials. I don&#8217;t remember where I read it, but I read once about an expert short-order cook at a burger joint. His trick was that he would continually shift the burgers to the right as he cooked them, such that by the time they got to the end of the griddle, they were done. Great trick (though admittedly you need to be a bit of an expert to pull it off). Not only did the cook know when things were done without continually checking, but it was easy to put on a burger that needed a different amount of doneness simply by starting it farther left along the griddle.</p>
<p>What does that mean? </p>
<p>The name of the game in being an expert developer is reducing cognitive load. </p>
<p>Try and list all the things you need to keep in your head to get through your day. Think about all the parts of that you could offload onto your environment, so that you can see them at a glance, like the short order cook, and not have to check. What are the repetitive tasks that you do that can be made easier by your environment? What can you do so that your attention and short-term memory, which are precious and limited, are focused on the important parts of your problem, and not on remembering the exact syntax of some git command.</p>
<p>This is not about which editor you use, but it is about picking an editor because you like it and understand how to customize it, not because all the cool kids use it. If you are going to use Vim, really learn how to use Vim &#8211; it&#8217;s not <em>that</em> hard. But if you use Vim, and don&#8217;t learn the Vim features that actually make it useful, then it&#8217;s not helping you, and it&#8217;s probably hurting you. Is Vim (or TextMate, or whatever) making your life easier or not? Vim drives me nuts, but I&#8217;ve seen people fly supersonically on it.</p>
<p>I&#8217;m getting a little cranky about seeing people&#8217;s environments &#8211; I&#8217;m not normally a big Your Doing It Wrong kind of guy, but, well, I&#8217;m getting a little bit cranky.</p>
<p>If you&#8217;re doing web development, there are probably three things that you care about at any given time: your text editor, a command line, and a web browser. Every man, woman, and child developer at my fine corporation has a laptop along with a second monitor that is larger than a decent surfboard. If you can&#8217;t see at least two of those three things at all times, try and figure out how much time you spend flipping between windows that you could be seeing together. If you are running Vim in a terminal in such a way that you can never see an editor and a command line at the same time, I think you can probably do better.</p>
<p>If you use Git, for the love of God, please put your <a href="http://railstips.org/blog/archives/2009/02/02/bedazzle-your-bash-prompt-with-git-info/">git branch and status in your shell prompt</a>. RVM status, too. And it&#8217;s not hard to add <a href="http://www.codethatmatters.com/2010/01/git-autocomplete-in-mac-os-x/">autocompletion of Git branches</a>, too. Or, go all the way to <a href="https://github.com/robbyrussell/oh-my-zsh">zsh</a>, which has fantastic autocompletion. Again, reducing cognitive load &#8211; you can see your environment without checking, you can type complex things without knowing all the syntax.</p>
<p>Use a clipboard history tool. I use <a href="http://www.alfredapp.com/">Alfred</a>, which is generally awesome as a launcher and stuff, but it&#8217;s not the only one. </p>
<p>Use some tool that converts frequently used text to shorter easier to remember text. Shell aliases do this, I also use <a href="http://smilesoftware.com/TextExpander/">TextExpander</a>, which has the advantage that TextExpander shortcuts are usable in SSH sessions.</p>
<p>The thing is, I don&#8217;t know what the most important advice is for you. You need to be aware of what you are doing, and strangely, lower your tolerance to your own pain. What do you do all the time that is harder than it needs to be? Is there a tool that makes it easier or more visible? How hard would it be to create or customize something? Are you the cook who can look at the griddle and know exactly when everything will be done, or are you the guy constantly flipping burgers to check?</p>
<br />Filed under: <a href='http://railsrx.com/category/uncategorized/'>Uncategorized</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/railsrx.wordpress.com/439/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/railsrx.wordpress.com/439/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/railsrx.wordpress.com/439/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/railsrx.wordpress.com/439/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/railsrx.wordpress.com/439/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/railsrx.wordpress.com/439/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/railsrx.wordpress.com/439/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/railsrx.wordpress.com/439/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/railsrx.wordpress.com/439/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/railsrx.wordpress.com/439/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/railsrx.wordpress.com/439/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/railsrx.wordpress.com/439/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/railsrx.wordpress.com/439/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/railsrx.wordpress.com/439/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=railsrx.com&amp;blog=10160445&amp;post=439&amp;subd=railsrx&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://railsrx.com/2012/02/17/control-your-environment/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6b767d8a4c9910e007c122d81eb4de73?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">noelrap</media:title>
		</media:content>
	</item>
		<item>
		<title>iaWriter and iCloud, You Know, In The Cloud</title>
		<link>http://railsrx.com/2012/01/04/iawriter-and-icloud/</link>
		<comments>http://railsrx.com/2012/01/04/iawriter-and-icloud/#comments</comments>
		<pubDate>Wed, 04 Jan 2012 15:15:11 +0000</pubDate>
		<dc:creator>noelrap</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://railsrx.com/?p=435</guid>
		<description><![CDATA[If I don’t write about iOS editors every few months, then it&#8217;s harder for me to justify continuing to mess around with them&#8230; The thing that&#8217;s changed my editor use in the last couple of months is iaWriter Mac and iOS adding iCloud support, even more deeply integrated than Apple&#8217;s own applications. iaWriter is the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=railsrx.com&amp;blog=10160445&amp;post=435&amp;subd=railsrx&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>If I don’t write about iOS editors every few months, then it&#8217;s harder for me to justify continuing to mess around with them&#8230;</p>
<p>The thing that&#8217;s changed my editor use in the last couple of months is iaWriter Mac and iOS adding iCloud support, even more deeply integrated than Apple&#8217;s own applications. iaWriter is the first writing program I use to move to the iCloud future (though there are some games and other programs that also sync via iCloud already).</p>
<p>At a technical level, the integration is fantastic. In iaWriter, iCloud shows up as a storage location, on par with internal iPad and Dropbox storage. If you are just using the iPad version then there is not much difference between iCloud and Dropbox. iCloud saves automatically, but Dropbox lets you use subfolders. (As a side note, iaWriter has improved its Dropbox sync from “show-stoppingly bad” to “works with a couple of annoyances”, the main annoyance being that it doesn&#8217;t remember your place in the Dropbox file hierarchy.)</p>
<p>Where the iCloud thing gets really cool is if you are running iaWriter on both iPad and Mac. On iaWriter Mac, you get a command in the file menu for iCloud, which has a sublisting of all the files iaWriter is managing in iCloud, along with commands to move the current file to or from iCloud.</p>
<p>When you make a change to an iCloud file (on the Mac side, an explicit save, on the iPad side an automatic local save), it is automatically sent to iCloud and pushed to the other site. No different from Dropbox, you say. True, except that the iCloud sync behaves much better if a file is simultaneously open in both apps. The changes just appear in the other app. You can put the iPad and Mac next to each other and go back and forth between the two with only a very slight pause while they sync up.</p>
<p>I haven’t quite gotten that level of integration from Dropbox. In particular, if a Lion-aware app has Dropbox change the file behind its back, the original Mac file continues to be displayed with a filename indicating that it is a deleted version. You then need to close the Mac file and reopen it. I&#8217;m not sure I&#8217;ve seen an iOS editor that polls Dropbox for changes, though one of the auto-sync ones (Elements, WriteRoom) might.</p>
<p>This may seem esoteric, but since I tend to have several blog posts on progress in open windows on my laptop, I do wind up regularly using the iPad to edit an open file. The iaWriter iCloud sync is noticeably less annoying.</p>
<p>It&#8217;s not all sweetness and light, especially if you are a really heavy creator of text files. There is no such thing as a folder in iCloud land, which will eventually become an organizational problem. Worse, there&#8217;s an implied lock-in to using iCloud that seems to miss the point of using text files in the first place.</p>
<p>When you move a file to iCloud from the Mac, it moves the file to the iCloud hidden directory, which I think is somewhere in the <code>library</code> directory. Although it doesn&#8217;t technically vanish from your hard drive &#8211; if you can find the file, you can open it in another application (for what it&#8217;s worth, the Alfred launcher can find the files), the clear intent is that the file is in a place not to be touched by applications other than iaWriter.</p>
<p>On the iPad side, the situation is worse. If a file is in iaWriter&#8217;s iCloud storage than no other iPad app can see it. (To be fair, it is relatively easy for iaWriter to move a file from iCloud to Dropbox from either device.) I don&#8217;t know if sharing files between applications will be possible when more applications support iCloud, or whether iCloud is strictly sandboxed.</p>
<p>And hey, for a lot of things, this limitation isn&#8217;t an issue. If you are using a tool with its own format, then it is less of an issue that other applications can&#8217;t see it. Even with something like text, if you aren&#8217;t the kind of crazy that needs to open a file in a gajillion different editors, you are probably okay. If you are using text specifically because it&#8217;s easy to move around between different programs, and you have a workflow where a file will commonly be touched by different apps, then iCloud is going to get in your way a little. </p>
<p>As for me, the iCloud support has made me use iaWriter more often for blogs and short notes. (Though I still use Textastic for more structured stuff on iPad.) I always liked iaWriter, but for a while it was just really bad at sync compared to other iOS editors. So, despite some quibbles about what happens in iCloud when I have dozens of files that I want to share among different apps, right now, the sync is good enough to make it valuable.</p>
<br />Filed under: <a href='http://railsrx.com/category/uncategorized/'>Uncategorized</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/railsrx.wordpress.com/435/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/railsrx.wordpress.com/435/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/railsrx.wordpress.com/435/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/railsrx.wordpress.com/435/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/railsrx.wordpress.com/435/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/railsrx.wordpress.com/435/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/railsrx.wordpress.com/435/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/railsrx.wordpress.com/435/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/railsrx.wordpress.com/435/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/railsrx.wordpress.com/435/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/railsrx.wordpress.com/435/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/railsrx.wordpress.com/435/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/railsrx.wordpress.com/435/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/railsrx.wordpress.com/435/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=railsrx.com&amp;blog=10160445&amp;post=435&amp;subd=railsrx&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://railsrx.com/2012/01/04/iawriter-and-icloud/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6b767d8a4c9910e007c122d81eb4de73?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">noelrap</media:title>
		</media:content>
	</item>
		<item>
		<title>Getting Back to Smalltalk</title>
		<link>http://railsrx.com/2011/12/29/getting-back-to-smalltalk/</link>
		<comments>http://railsrx.com/2011/12/29/getting-back-to-smalltalk/#comments</comments>
		<pubDate>Thu, 29 Dec 2011 15:53:12 +0000</pubDate>
		<dc:creator>noelrap</dc:creator>
				<category><![CDATA[Smalltalk]]></category>

		<guid isPermaLink="false">http://railsrx.com/?p=428</guid>
		<description><![CDATA[This week I wound up trying to put together a sample “real-world” problem suitable for use in an automated web thing aimed at potential new hires. Of course, any actual “real-world” problem would be have too many extraneous details to make it suitable given the constraints of the web thing, but trying to create the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=railsrx.com&amp;blog=10160445&amp;post=428&amp;subd=railsrx&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>This week I wound up trying to put together a sample “real-world” problem suitable for use in an automated web thing aimed at potential new hires. Of course, any actual “real-world” problem would be have too many extraneous details to make it suitable given the constraints of the web thing, but trying to create the illusion of real-world-ness was kind of fun.</p>
<p>Since this seemed like sort of a weird way to spend a day or two, I decided to make it weirder by implementing both my solution to the problem and the code to generate test data in a language I don’t use every day. Just for the heck of it, I picked Smalltalk (Specifically, <a href="http://www.pharo-project.org/home">Pharo</a>), the first time I’ve written Smalltalk code in anger for… hmm. Let’s see… I wrote <a href="http://www.amazon.com/Squeak-Open-Personal-Computing-Multimedia/dp/0130280917">the intro chapter to this</a> in about 2000, and even then it had been a couple of years since I really wrote something in Smalltalk. (For the record, my other choice was Clojure, but I seem to have some weird mental block about getting started on a Clojure project. Someday soon, though.)</p>
<p>Anyway, Smalltalk was interesting because the environment is so different from anything else going and because I really haven’t used it in so long, I was curious to see whether my reactions to the Smalltalk environment would be any different given how long it’s been. For example, the last time I worked in Smalltalk, SUnit and TDD wasn’t a thing.</p>
<p>Overall, successful experience. I was able to actually write the program. It probably took me a little longer than it would have in Ruby, just because I was a bit rusty and the Pharo UI was a little unfamiliar. But it works, and most of the code isn’t bad – it got a little ragged toward the end. Here are a few random notes about the experience:</p>
<h2 id="languagestructure">Language Structure</h2>
<p>Whatever the line between a “scripting” language and a “normal” language is, Smalltalk is on the “not a scripting language” side of it. Smalltalk is very much a purist language with a small, consistent syntax, and not a lot of the sugar that you get used to in the Ruby/Python/Perl neighborhoods. Method names tend to be longish, and although the environment encourages short methods, basically there’s more typing in Smalltalk than in the equivalent Ruby.</p>
<p>Smalltalk was created almost completely outside the C/C++/Java family of programming languages, which combined with its pure structure makes it feel somewhat alien. And I say that as somebody who likes Smalltalk and genuinely enjoyed working in the environment.</p>
<p>For example:<br />
* The first element of an array is index 1, not index 0. Which, honestly, makes more sense.<br />
* Smalltalk doesn’t have operator precedence, and is evaluated strictly left-to-right, so a mathematical expression like <code>2 + 3 * 4</code> will not give you the result you would get in, say, every other programming language ever.<br />
* Smalltalk doesn’t use the dot-notation for method calls, instead, the dot is a statement separator. It has keyword arguments, as later borrowed by Objective-C. Strings are single quotes, double quoted strings are comments.</p>
<p>Then you get other things like all the boolean and loop logic being managed by the library rather than the syntax. Really, the only thing the syntax manages in Smalltalk is order of operations and a very small amount of literal syntax. There’s a rich set of collection classes, and the names and classes are just slightly off from what you are used to. Takes some immersion to get the feel.</p>
<h2 id="workflow">Workflow</h2>
<p>The other really unfamiliar thing about Smalltalk is the environment and workflow. Smalltalk source isn’t normally kept in files. Instead, you run a binary image of all the code in the Smalltalk environment. If I’m remembering correctly, a Smalltalker working on multiple projects would have a separate image for each project. (There are mechanisms for teams working together, but I don’t think they are very standard, and I’m not all that familiar with them.)</p>
<p>The thing about Smalltalk is that you are <em>always</em> inside the environment. The idea, for example, that Ruby is super-flexible in what it allows you to do at run-time is a trivial point in Smalltalk. Everything is at run-time, because the phone call is coming from inside the house, so to speak. <em>Of course</em> you can create classes and methods at run-time. If you couldn’t, the whole system would be unworkable.</p>
<p>The image contains your code, the entire Smalltalk system, and the state of all the objects therein. Smalltalk typically also has a mechanisms for export/import of source, and also for internal version control. I think it’s fair to say that dealing with the workspace is at best counterintuitive when you are used to dealing with text editors and files.</p>
<p>Your main interface with the Smalltalk system is the code browser, which allows you to view any class and method in the system. One method at a time. Quick Quiz – what’s the Smalltalk keyword to define a method? Trick question. Smalltalk doesn’t have one. Smalltalk just knows that the things you type into the code browser are methods, and the first line of a method is its name. Code browsers are very neat, but again, using them effectively is a skill – a big step is realizing you can have more than one of them open at a time.</p>
<p>What’s interesting to me are the places where the Smalltalk environment is still ahead of my regular code environments, and where it’s behind. On the plus side:</p>
<ul>
<li>When you save a Smalltalk method, the code browser verifies that it’s syntactically correct before allowing the save. If you are calling a method or using a variable that doesn’t exist, you have to okay it – in some circumstances, you even have the ability to create the method or variable as part of the save process.</li>
<li>The browser has easy access to all old versions of a method that you are looking at.</li>
<li>It’s very easy to see places that might call the method you are writing.</li>
<li>The browser also has some powerful refactoring functionality built in.</li>
<li>Integration is amazing, since everything is running. To give one example, the code browser knows which methods are SUnit tests, and they display in the browser with a red/yellow/green/gray indicator of their current state (error/failure/success/not run). Individual tests can be run separately easily in the browser, and since they environment is already loaded, the tests run in an eye blink.</li>
<li>On a related note, the debugger is famously awesome. From a breakpoint, you can see the state of all variables, edit values, edit code, all nice and easy.</li>
<li>You also can create workspaces, which are just blank code windows that you can execute arbitrary snippets in, like a iRb loop, but a bit more flexible.</li>
</ul>
<p>But there are some missing pieces:</p>
<ul>
<li>The code editor itself isn’t as powerful as you are used to if you’ve been using Vim or TextMate or, hell, anything. I’m a big “typing is not the bottleneck” kind of guy, but still, I would have loved some macros or snippets or something.</li>
<li>The one-method on display per code browser limitation is, well, limiting. You can have multiple code browsers open, but that takes up a lot of real estate. Tabbed browsers, split windows, that kind of thing would be kind of nice.</li>
<li>Intellectually I know that it’s really hard to lose changes in a Smalltalk image, but it still feels fragile to me not to have files readable by an external tool. <strong>UPDATE: </strong>I could have been clearer about this. Smalltalk doesn&#8217;t save changes in the image as such, instead it saves all your changes and lets you play changes back. I was trivially able to recover about 30 minutes of work after a Pharo crash, simply because all the changes were recorded and easily placed back in the image. The Smalltalk setup is effective, but feels different from the way I tend to think about their projects.</li>
</ul>
<p>One interesting feature of the browser based editing environment is that it’s very easy to create a new method that is based on an existing method. You don’t even have to cut and paste, just browse to the existing method, change its name and save. Smalltalk will create a new method based on the new name.</p>
<p>This is very nice from a getting code in the system standpoint, but it seems to have the side effect of encouraging more duplication in the system than I might be otherwise comfortable with. The effect is confounded by the fact that you can only see one method at a time in the browser, making it difficult to scan for duplication.</p>
<p>What’s not getting across here is how smooth the workflow in the small is when you really get the rhythm going. It’s an environment that really suits a “make a small change, evaluate the change” process. In some ways, it’s not surprising that the test-first movement would have gotten serious momentum in Smalltalk, test-first is just a formalization of the way a good Smalltalk programmer interacts with the system. Plus, I’m a purist in so many ways, and even though the code takes a little getting used to, I like the way it turns out.</p>
<p>So, successful test. Would try again. I still want to try something with Seaside one of these days just to see what that’s like.</p>
<br />Filed under: <a href='http://railsrx.com/category/smalltalk/'>Smalltalk</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/railsrx.wordpress.com/428/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/railsrx.wordpress.com/428/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/railsrx.wordpress.com/428/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/railsrx.wordpress.com/428/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/railsrx.wordpress.com/428/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/railsrx.wordpress.com/428/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/railsrx.wordpress.com/428/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/railsrx.wordpress.com/428/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/railsrx.wordpress.com/428/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/railsrx.wordpress.com/428/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/railsrx.wordpress.com/428/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/railsrx.wordpress.com/428/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/railsrx.wordpress.com/428/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/railsrx.wordpress.com/428/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=railsrx.com&amp;blog=10160445&amp;post=428&amp;subd=railsrx&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://railsrx.com/2011/12/29/getting-back-to-smalltalk/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6b767d8a4c9910e007c122d81eb4de73?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">noelrap</media:title>
		</media:content>
	</item>
		<item>
		<title>Things that Should Be Metaphors, Part 1</title>
		<link>http://railsrx.com/2011/12/02/things-that-should-be-metaphors-part-1/</link>
		<comments>http://railsrx.com/2011/12/02/things-that-should-be-metaphors-part-1/#comments</comments>
		<pubDate>Fri, 02 Dec 2011 21:26:02 +0000</pubDate>
		<dc:creator>noelrap</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://railsrx.wordpress.com/?p=422</guid>
		<description><![CDATA[I present to you two things that sound like they should be metaphors for project issues. Except for two things: They are real I have no idea what they might be metaphors for The Library Book Priority Conundrum I read a lot. In general, I purchase books I&#8217;m very excited about reading, and books that [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=railsrx.com&amp;blog=10160445&amp;post=422&amp;subd=railsrx&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I present to you two things that sound like they should be metaphors for project issues. Except for two things:</p>
<ol>
<li>They are real</li>
<li>I have no idea what they might be metaphors for</li>
</ol>
<h2 id="thelibrarybookpriorityconundrum">The Library Book Priority Conundrum</h2>
<p>I read a lot. In general, I purchase books I&#8217;m very excited about reading, and books that I&#8217;m less sure about I check out from my local library. The problem is that I always have more books than time to read, and the library books have the nasty property that the library expects them back sooner or later. </p>
<p>The practical effect is that aside from a few books that are &#8220;drop everything&#8221; when they come out, I&#8217;m forever reading library books first, before the books I&#8217;ve purchased, because they will go back home, where as the books I own I get to keep. </p>
<p>Since I&#8217;ve already said that I&#8217;m usually more excited about the books I&#8217;ve purchased and get to keep, this is clearly not optimal. But even knowing this problem, I book I actually purchased (<em>Ganymede</em> by Cherie Priest) has been waiting behind a bunch of library books (<em>That is All</em> by John Hodgman, <em>Kingdom of the Gods</em> by N. K. Jemisin, among others). Okay, those books are great too. But still&#8230;</p>
<h2 id="thelastclementineproblem">The last clementine problem</h2>
<p>I go to the grocery store and buy a bag of clementines. Because they are yummy and easier to peel than grapefruits. Every bag has one or two clementines that are clearly a little less good than the others, so naturally I wait to eat those last. However, since as the clementines get yuckier they become less desirable than anything else in my kitchen, I don&#8217;t eat them at all. The result is that I don&#8217;t eat the last few clementines, because the pretzels are more enticing. I don&#8217;t get new clementines, because I already have clementines, and I don&#8217;t throw out the bad clementines until they are well and truly no longer food. The upshot is that I can go weeks without clementines, even though I like them. </p>
<br />Filed under: <a href='http://railsrx.com/category/uncategorized/'>Uncategorized</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/railsrx.wordpress.com/422/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/railsrx.wordpress.com/422/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/railsrx.wordpress.com/422/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/railsrx.wordpress.com/422/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/railsrx.wordpress.com/422/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/railsrx.wordpress.com/422/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/railsrx.wordpress.com/422/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/railsrx.wordpress.com/422/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/railsrx.wordpress.com/422/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/railsrx.wordpress.com/422/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/railsrx.wordpress.com/422/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/railsrx.wordpress.com/422/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/railsrx.wordpress.com/422/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/railsrx.wordpress.com/422/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=railsrx.com&amp;blog=10160445&amp;post=422&amp;subd=railsrx&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://railsrx.com/2011/12/02/things-that-should-be-metaphors-part-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6b767d8a4c9910e007c122d81eb4de73?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">noelrap</media:title>
		</media:content>
	</item>
		<item>
		<title>Ten Things That Drive Me Crazy About Conference Talks, And How To Avoid Them</title>
		<link>http://railsrx.com/2011/11/02/ten-things-that-drive-me-crazy-about-conference-talks-and-how-to-avoid-them/</link>
		<comments>http://railsrx.com/2011/11/02/ten-things-that-drive-me-crazy-about-conference-talks-and-how-to-avoid-them/#comments</comments>
		<pubDate>Wed, 02 Nov 2011 23:02:32 +0000</pubDate>
		<dc:creator>noelrap</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://railsrx.com/?p=418</guid>
		<description><![CDATA[If I&#8217;m counting right, Ruby Midwest is my fifth conference this year, which is I guess one of the perks of having an employer that likes being involved in the community. It&#8217;s great &#8211; I like meeting all the smart people involved with Ruby, I learn things, and sometimes people ask me to sign my [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=railsrx.com&amp;blog=10160445&amp;post=418&amp;subd=railsrx&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>If I&#8217;m counting right, Ruby Midwest is my fifth conference this year, which is I guess one of the perks of having an employer that likes being involved in the community. It&#8217;s great &#8211; I like meeting all the smart people involved with Ruby, I learn things, and sometimes people ask me to sign my book. (Okay, that happened once. Still, that&#8217;s more than zero.)</p>
<p>At the risk of shooting myself in the foot forty-eight hours before I go give my own talk, here&#8217;s a list I compiled for a lightning talk at a recent Groupon Geekfest, entitled <em>10 Things That Drive Me Crazy About Conference Presentations</em>. I offer it with love and respect. I also note that I&#8217;ve committed at least five of these, and will probably commit at least one of them on Friday when I go on at Ruby Midwest.</p>
<p>Here&#8217;s the big takeaway: if you are going to the trouble of delivering a live presentation, you need to think of it as a performance, and you need to offer something to the audience that they wouldn&#8217;t be able to get from watching the slides.</p>
<p>Coincidentally, Merlin Mann covers similar points from a different perspective on <a href="http://5by5.tv/b2w/38-sorry-you-can-t-have-a-candle">a recent Back to Work Podcast</a>. A lot of good advice there.</p>
<p>Hey, I&#8217;m not perfect at this, and posting this pretty much guarantees an epic failure on Friday, but maybe this will help you.</p>
<p>Here&#8217;s my list:</p>
<h2 id="underprepared">1. Underprepared</h2>
<p>Do I need to explain this one? Generally my marker here is if the speaker seems surprised by the content of their slides, they are probably underprepared. This isn&#8217;t just stumbling around, though. To me it also applies to things like not seeming to know why you are giving the talk, or what you want me, the viewer, to understand when you are done. </p>
<p>If you can&#8217;t answer the questions &#8220;Who am I aiming this talk at&#8221;, &#8220;What is the one thing those people should leave this talk thinking&#8221;, and &#8220;Why is this story going to be compelling to those people&#8221;, you are underprepared.</p>
<p>Being nervous is a separate, but related issue. The best fix for presentation nerves that I know of is practice.</p>
<h2 id="overprepared">2. Overprepared</h2>
<p>Yes, it is possible to be overprepared for a presentation. The symptom of this is usually a word for word script that the presenter is reading from, and not paying attention to the audience. The problem, though, is that your talk is brittle, and you won&#8217;t be able to adjust to an unexpected audience or environment.</p>
<h2 id="hiding">3. Hiding</h2>
<p>Most of these conferences are in rooms that are not designed for a performance by a single speaker. Think about a comedy club. The stage is small, not very high, and it&#8217;s in the middle. The audience is close together and close to the stage. This is a good environment for a performance.</p>
<p>Picture a hotel ballroom. The speaker is often set up in a corner, frequently behind a podium. The audience is often ten or fifteen feet away, and there is often a lot more space than people. That&#8217;s a hard way to go.</p>
<p>Don&#8217;t hide behind the podium. Move around. My biggest regret of the whole conference year was not insisting on a body mike at a conference, and having to give a talk from behind a podium. Own the space. You want people focusing on you first and the slides second.</p>
<h2 id="notinteracting">4. Not interacting</h2>
<p>A related point. Pay attention to the audience. In a tech conference situation, you are competing with everybody&#8217;s laptop and phone, which is to say you are competing with the entire Internet. Can you be more interesting than the entire Internet? At least for a few minutes?</p>
<p>People will pay attention to you as a speaker if they think you are paying attention to them. &#8220;[Insert Town] audiences are the greatest audiences in the world&#8221; is a huge performing cliché. You know why? Because it works. Anything that gets people involved gives them a little investment in paying attention. </p>
<p>When I was in college, I&#8217;d start stand-up sets by coming out with a tape recorder holding it up and explaining that I was recording the performance for my mother, and I&#8217;d really appreciate it if the audience could give me one big laugh. Cheesy? Practically coated in cheddar. Effective? Yes.</p>
<h2 id="mytoolisgreat">5. &#8220;My Tool Is Great&#8221;</h2>
<p>This is a type of talk that bugs me. I gave one like this once, and it bugged me when I gave it. Define a problem. Don&#8217;t talk about any general part of the problem, just talk about your awesome tool that nobody else is using and why it&#8217;s awesomeness is overwhelming. Frequently, this involves ignoring any other way of solving the problem.</p>
<h2 id="mycompanyisgreat">6. &#8220;My Company Is Great&#8221;</h2>
<p>Oy. This one usually goes like this: </p>
<p>&#8220;At my company we have the perfect process. We never have meetings. In fact, if more than two people show up in the same room, we beat them with sticks. We deploy once every microsecond, and everybody can ask for a deploy, including the people at the company across the hall. We exist in a state of perfect harmony. If you are not like us, your company is substandard. Is that why you are sad? Join us.&#8221;</p>
<p>It&#8217;s a bit much, and I say that speaking as somebody who has generally been proud to identify with the companies I&#8217;ve worked for. What&#8217;s usually missing is a) the context of why good processes have taken hold at your company and b) what those of us who are not blessed can do to make progress toward Nirvana.</p>
<h2 id="trendyslides">7. Trendy Slides</h2>
<p>A personal pet peeve, and I don&#8217;t expect this to bother you as much as it bothers me. In a way, this is another standup thing. It&#8217;s easy to get a laughter from an audience without actually being clever. You can shock them, you can flatter them. </p>
<p>For me &#8211; and I think I may be alone in this &#8211; putting the latest meme in your presentation just because it&#8217;s there is in the same category. It&#8217;s quick, easy, the audience will react, but ultimately it&#8217;s a distraction from what you are trying to. Remember, you want the audience to focus on you, not the slides.</p>
<p>That said, it is possible to add a meme or something cleverly. It&#8217;s just that the bar is pretty high.</p>
<h2 id="illegibleslides">8. Illegible slides</h2>
<p>Let&#8217;s make this simple: every word on your slides that is communicating information needs to be clearly legible from 50 feet away, period. The body text on the presentation I&#8217;m giving friday is 96 points. With the exception of a few code slides, there are fewer than 15 words on a slide &#8211; this is a performance, not an eye exam.</p>
<p>Dark text on light background is usually more visible in a projector context than light text on a dark background.</p>
<h2 id="notknowingtheaudience">9. Not knowing the audience</h2>
<p>This comes in a couple of forms. </p>
<ul>
<li>Not knowing that your audience may have a different expertise or knowledge level than you expect.</li>
<li>Not realizing that people in the audience may be different in general, and have different reference points, or different standards of what is uncomfortable or offensive. They may have genders or nationalities different from your own. That doesn&#8217;t mean you have to be bland, but it does mean you need to be aware that there&#8217;s a wider world out there.</li>
</ul>
<h2 id="incompletelistsoften">10. Incomplete lists of ten</h2>
<br />Filed under: <a href='http://railsrx.com/category/uncategorized/'>Uncategorized</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/railsrx.wordpress.com/418/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/railsrx.wordpress.com/418/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/railsrx.wordpress.com/418/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/railsrx.wordpress.com/418/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/railsrx.wordpress.com/418/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/railsrx.wordpress.com/418/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/railsrx.wordpress.com/418/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/railsrx.wordpress.com/418/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/railsrx.wordpress.com/418/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/railsrx.wordpress.com/418/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/railsrx.wordpress.com/418/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/railsrx.wordpress.com/418/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/railsrx.wordpress.com/418/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/railsrx.wordpress.com/418/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=railsrx.com&amp;blog=10160445&amp;post=418&amp;subd=railsrx&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://railsrx.com/2011/11/02/ten-things-that-drive-me-crazy-about-conference-talks-and-how-to-avoid-them/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6b767d8a4c9910e007c122d81eb4de73?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">noelrap</media:title>
		</media:content>
	</item>
		<item>
		<title>Stevenotes</title>
		<link>http://railsrx.com/2011/10/06/stevenotes/</link>
		<comments>http://railsrx.com/2011/10/06/stevenotes/#comments</comments>
		<pubDate>Fri, 07 Oct 2011 04:43:48 +0000</pubDate>
		<dc:creator>noelrap</dc:creator>
				<category><![CDATA[Apple]]></category>

		<guid isPermaLink="false">http://railsrx.com/?p=413</guid>
		<description><![CDATA[I wasn&#8217;t going to write this, because it&#8217;s not like the Internet has a dearth of people writing about Steve Jobs who never knew him or interacted with him in any way. I wrote it anyway. I&#8217;ve watched the first few minutes of the keynote introducing the iPhone several times. It amazes me &#8211; both [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=railsrx.com&amp;blog=10160445&amp;post=413&amp;subd=railsrx&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I wasn&#8217;t going to write this, because it&#8217;s not like the Internet has a dearth of people writing about Steve Jobs who never knew him or interacted with him in any way. I wrote it anyway.</p>
<p>I&#8217;ve watched the first few minutes of <a href="http://devour.com/video/steve-jobs-introduces-the-iphone/">the keynote introducing the iPhone</a> several times. It amazes me &#8211; both as a seminal moment of technology and as a presentation. Jobs starts of by saying he&#8217;s been looking forward to this day for two-and-a-half years, and that he&#8217;s been fortunate to work on multiple &#8220;revolutionary&#8221; products in his career. </p>
<p>He says that &#8220;Today, we&#8217;re introducing three revolutionary products&#8221; &#8211; remember this part?:</p>
<ul>
<li>&#8220;A widescreen iPod with touch controls&#8221; &#8211; he says, and the crowd goes nuts.</li>
<li>&#8220;A revolutionary mobile phone&#8221; &#8211; the crowd goes berserk, this is what they came for.</li>
<li>&#8220;A breakthrough internet communications device&#8221; &#8211; polite applause, but really, nobody knows what the hell he&#8217;s talking about.</li>
</ul>
<p>He repeats the phrases, makes it clear that he&#8217;s talking about one device, &#8220;and we are calling it&#8230; iPhone&#8221;. Then he shows a gag picture of an old iPod with a rotary dial, and it&#8217;s funny &#8211; not a phrase normally associated with Jobs&#8217; keynotes.</p>
<p>It&#8217;s a fantastic performance. Here&#8217;s the thing&#8230; People went crazy for the iPod and phone parts. Almost five years later, there&#8217;s no doubt that that part that nobody got at first &#8211; the internet communicator &#8211; is far and away the most revolutionary part of the iPhone experience. I had a phone in my pocket before 2007. I had an iPod in my pocket before 2007. The biggest change to my behavior from the iPhone is the way I can access the Internet from my pocket. (Yes, I know there were mobile phones that could connect to the Internet before the iPhone. I even used some. It wasn&#8217;t the same thing in an way.)</p>
<p>Which makes me wonder, why describe the device as an &#8220;internet communicator&#8221; at all, let alone have it as the last part of the description? I mean, it&#8217;s nice to have three beats in description, but the build from iPod (yay!) to phone (YAY!) to &#8220;Internet communicator&#8221; (huh?) is certainly weird. I assume that the &#8220;Internet communicator&#8221; part is there because somebody &#8211; presumably Jobs &#8211; felt that it was going to be important. Placed it last because it was most important. Even if nobody else realized that yet.</p>
<p>It&#8217;s been interesting to see how Jobs has been described in media reports, and how none of the descriptions quite fit. &#8220;Inventor&#8221;, &#8220;pioneer&#8221;, &#8220;visionary&#8221;, &#8220;technology titan&#8221;. They all have a grain of truth, but it&#8217;s almost impossible to imagine a short phrase that could encapsulate exactly what Jobs&#8217; role was in all of these revolutionary products. At this point, the glib, writerly thing to do would be to claim that &#8220;Internet communicator&#8221; is the phrase that fits. It&#8217;s tempting, but kind of forced. </p>
<p>I used to say this: &#8220;Apple is a long-range experiment in how much people will pay for good design. And the answer is not much&#8221;. I said this for <em>years</em>, probably first around 1994. It&#8217;s become less and less true over the past few years, not because Apple is any less a design experiment, but because the audience has finally caught up with them and more and more people have been willing to pay for devices that are well designed. Jobs was the curator of that design sense, and that design sense has shaped the tools I use and the way I live and work. </p>
<br />Filed under: <a href='http://railsrx.com/category/apple/'>Apple</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/railsrx.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/railsrx.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/railsrx.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/railsrx.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/railsrx.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/railsrx.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/railsrx.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/railsrx.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/railsrx.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/railsrx.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/railsrx.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/railsrx.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/railsrx.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/railsrx.wordpress.com/413/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=railsrx.com&amp;blog=10160445&amp;post=413&amp;subd=railsrx&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://railsrx.com/2011/10/06/stevenotes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6b767d8a4c9910e007c122d81eb4de73?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">noelrap</media:title>
		</media:content>
	</item>
		<item>
		<title>Coming Soon: Getting Things Done In JavaScript</title>
		<link>http://railsrx.com/2011/09/14/getting-things-done-soon/</link>
		<comments>http://railsrx.com/2011/09/14/getting-things-done-soon/#comments</comments>
		<pubDate>Wed, 14 Sep 2011 14:14:46 +0000</pubDate>
		<dc:creator>noelrap</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[Jasmine]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Me]]></category>

		<guid isPermaLink="false">http://railsrx.com/?p=409</guid>
		<description><![CDATA[Okay, the blog has been very quiet for the last month or so. Please be polite and pretend you noticed. I&#8217;ve alluded online to a new book one or two places and now I think it&#8217;s far enough along that I can mention it in public without being too scared. Let&#8217;s do this Q&#38;A style, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=railsrx.com&amp;blog=10160445&amp;post=409&amp;subd=railsrx&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Okay, the blog has been very quiet for the last month or so. Please be polite and pretend you noticed. I&#8217;ve alluded online to a new book one or two places and now I think it&#8217;s far enough along that I can mention it in public without being <em>too</em> scared.</p>
<p>Let&#8217;s do this Q&amp;A style, call it an infrequently asked question list…</p>
<h4 id="q:whatsthenewbook">Q: What&#8217;s the new book?</h4>
<p>A: Great question. The working title is <em>Getting Things Done In JavaScript</em>. That may not be the final title. My proposed titles, <em>Enough JavaScript to Get By</em> and <em>JavaScript for People who Hate JavaScript</em> were (rightly) deemed unsuitable.</p>
<h4 id="q:okay.thatsthetitle.whatsthebook">Q: Okay. That&#8217;s the title. What&#8217;s the book?</h4>
<p>A: Here are some excerpts from my proposal:</p>
<ul>
<li>
<p>The intended audience are developers used to doing back-end development, probably but not necessarily in Rails, who are increasingly asked to move functionality to the client, and are not familiar with the best JavaScript tools available for the job.</p>
</li>
<li>
<p>This book is aimed at developers who are explicitly working on front ends for web applications and looking for guidance on how to approach the simple parts first and the complex parts as needed. In my head, this is triangulated with three non-JavaScript books that I think are around that level: Beck&#8217;s <em>Smalltalk Best Practice Patterns</em>, Olsen&#8217;s <em>Eloquent Ruby</em>, and Valim&#8217;s <em>Crafting Rails Applications</em>.</p>
</li>
<li>
<p>Everything is test-driven. This book will contain more Jasmine than a Disney princess convention.</p>
</li>
</ul>
<p>Does that help? Put another way, it&#8217;s the JavaScript book I wanted to hand our last apprentice when he asked for a good guide to JavaScript. Another way I&#8217;ve described the audience is people who have poked at JavaScript a few years ago, just got back into it, and aren&#8217;t quite sure why everything is an anonymous function these days. I&#8217;ve also called it <em>JavaScript: An Idiosyncratic Guide</em>, as in the thing you use after you have the information in the definitive guide.</p>
<h4 id="q:whyabookonjavascript">Q: Why a book on JavaScript?</h4>
<p>A: Because I was a guy who poked at JavaScript a few years ago, just got back into it, and wasn&#8217;t quite sure why everything is an anonymous function these days…</p>
<p>Well, that&#8217;s part of it. I felt like it was an area where I had something to offer, and where I could leverage the time that I had spent getting back into the latest and greatest JavaScript tools and make it easier for others to do the same. </p>
<h4 id="q:whencanibuyit">Q: When can I buy it?</h4>
<p>A: The initial draft is maybe 1/3 done. Ish. The hope is to get it available in beta sometime in November, and given the schedule that Pragmatic likes for books these days, to have the final come out something like January. That&#8217;s still an aggressive schedule, and I&#8217;m probably just a smidge behind, but I have a decent idea where I want it to go, and I&#8217;m making steady progress.</p>
<h4 id="q:whatsactuallyinthebook">Q: What&#8217;s actually in the book?</h4>
<p>A: The outline is still a bit in flux, but the basic idea is to take a pure server-side application and bit-by-bit move features to the client-side in a slow and not-even-a-single-tiny-bit-contrived way. The JavaScript topics are largely focused on creating what passes for objects, so there&#8217;s discussion of the object model, functions and scope, and the like &#8211; it&#8217;s not (at least at the moment) a tutorial on the basics of JavaScript. There&#8217;s a lot of jQuery, and a lot of Jasmine, and there will also be jQuery UI, jQuery Mobile, and Backbone.</p>
<p>That&#8217;s the story. Coming soon to a theater near you. Hope you like it.</p>
<br />Filed under: <a href='http://railsrx.com/category/books/'>Books</a>, <a href='http://railsrx.com/category/jasmine/'>Jasmine</a>, <a href='http://railsrx.com/category/javascript/'>JavaScript</a>, <a href='http://railsrx.com/category/me/'>Me</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/railsrx.wordpress.com/409/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/railsrx.wordpress.com/409/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/railsrx.wordpress.com/409/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/railsrx.wordpress.com/409/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/railsrx.wordpress.com/409/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/railsrx.wordpress.com/409/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/railsrx.wordpress.com/409/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/railsrx.wordpress.com/409/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/railsrx.wordpress.com/409/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/railsrx.wordpress.com/409/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/railsrx.wordpress.com/409/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/railsrx.wordpress.com/409/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/railsrx.wordpress.com/409/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/railsrx.wordpress.com/409/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=railsrx.com&amp;blog=10160445&amp;post=409&amp;subd=railsrx&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://railsrx.com/2011/09/14/getting-things-done-soon/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6b767d8a4c9910e007c122d81eb4de73?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">noelrap</media:title>
		</media:content>
	</item>
		<item>
		<title>What I Learned</title>
		<link>http://railsrx.com/2011/09/06/what-i-learned/</link>
		<comments>http://railsrx.com/2011/09/06/what-i-learned/#comments</comments>
		<pubDate>Tue, 06 Sep 2011 12:10:58 +0000</pubDate>
		<dc:creator>noelrap</dc:creator>
				<category><![CDATA[Me]]></category>
		<category><![CDATA[Projects]]></category>

		<guid isPermaLink="false">http://railsrx.com/?p=406</guid>
		<description><![CDATA[As you may have heard, Obtiva got bought by Groupon. I&#8217;ve been traveling a bunch, so this coming week is my first full week in the Groupon office post-transition. And, well, someday maybe I&#8217;ll write retrospectively about Obtiva, but today isn&#8217;t that day. I&#8217;ll probably write about what I&#8217;m going to be doing at Groupon, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=railsrx.com&amp;blog=10160445&amp;post=406&amp;subd=railsrx&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>As <a href="http://www.groupon.com/blog/cities/we-call-it-grouptiva-groupon-acquires-obtiva/">you may have heard</a>, Obtiva got bought by Groupon. I&#8217;ve been traveling a bunch, so this coming week is my first full week in the Groupon office post-transition. And, well, someday maybe I&#8217;ll write retrospectively about Obtiva, but today isn&#8217;t that day. I&#8217;ll probably write about what I&#8217;m going to be doing at Groupon, but today isn&#8217;t that day, either.</p>
<p>Instead, I realized that month marks four years since I left Motorola and became a Rails consultant. In that time, I worked, for some definition of worked, on over a dozen projects and probably watched at least another dozen from down the hall.</p>
<p>I must have learned something, right?</p>
<p>I finished out this post, so I guess that means that yes, I do think I learned something. Here are a dozen or so oversimplified, fortune cookie-esque things that I think I learned in the last four years. Some of these are probably blog posts in their own right, which I may get to one of these days.</p>
<ul>
<li>
<p>It&#8217;s a hallmark of successful engineering teams that they understand that if you do not need to make a decision, then you need to not make a decision. That&#8217;s sometimes called &#8220;preserving ambiguity&#8221;, and I remember from back in my days studying engineering education that it&#8217;s a hallmark of successful engineering teams across disciplines. </p>
</li>
<li>
<p>One reason why preserving ambiguity is necessary is that if you get too concrete too soon, then early decisions have a kind of gravity that makes it hard to escape them even when it&#8217;s best to explore the problem space more fully. A couple of times in the last four years, clients have come in with polished visual designs, and even if the layout and structure doesn&#8217;t work at all from a functionality or usability standpoint, it&#8217;s hard to escape the concreteness of the design to find a better design or a better definition of the project.</p>
</li>
<li>
<p>There&#8217;s very little that damages a team dynamic more quickly than trying to measure and compare individual contributions. (Technically, I learned this one at Motorola, but it still applies&#8230;) On a larger project, measuring subteam contributions also qualifies as problematic. </p>
</li>
<li>
<p>One thing you absolutely must have when coming out of your initial project meetings is a list of things that are not part of your project. Again, a common client pattern was trying to be the &#8220;YouTube of X&#8221; <em>and</em> the &#8220;Facebook of X&#8221; <em>and</em> the &#8220;Twitter of x&#8221;. Pick something to do well and do it well. </p>
</li>
<li>
<p>You can&#8217;t escape the software triangle, of scope, budget, and schedule. Keeping a project on track means saying &#8220;this is out of scope&#8221;, or &#8220;okay, we can do this, but that means something else needs to move out of scope&#8221;. </p>
</li>
<li>
<p>Hiring is so, so important. I once heard it said that the secret weakness of Agile was that one sociopath could ruin an entire project. That doesn&#8217;t mean &#8220;just hire your friends&#8221;, but it does mean that being able to work as part of a team is important. </p>
</li>
<li>
<p>If the business/management team and the development team trust each other, than almost any process works. If they don&#8217;t, almost nothing can fix it. One advantage of Agile methods is they provide a lot of quick, easy, and early opportunities for each side to show trustworthiness. (There&#8217;s definitely a longer post in this one&#8230;)</p>
</li>
<li>
<p>Because, ultimately, for a lot of our clients, working with developers is like going to the mechanic. When the mechanics say that the fitzelgurbber has been gazorgenplatzed, and it&#8217;s 500 bucks, do you trust them? Why or why not? How do you apply that back to your day job?</p>
</li>
<li>
<p>The development team&#8217;s job in an Agile project is to honestly estimate the cost of things, it&#8217;s the business team&#8217;s job to honestly estimate the value. Don&#8217;t cross those streams. It&#8217;s bad.</p>
</li>
<li>
<p>Agile is about managing change, not continuous change. If anybody on your project tries to justify a change with something like &#8220;we&#8217;re agile, we can change anything whenever we want&#8221;, run for the hills.</p>
</li>
<li>
<p>I didn&#8217;t say this, but I remember hearing it a few years ago. The right amount of process is just a little bit less process than you need. In other words, the slight chaos from too little process is much preferable to the overhead of too much process.</p>
</li>
<li>
<p>Look, I&#8217;ll admit that those of us that identify as software craftsmen sometimes get overly precious with our naming conventions and of course delivering business value is the number one priority. That said, if you are on a project and are being told to do less than your best work for the good of the project (by not testing, or by incurring too much technical debt), that should at the very least be alarming. </p>
</li>
<li>
<p>Pair programming has more overhead than is often acknowledged in Agile literature. I find that, especially on a small team, keeping a pair in sync time-wise is very hard. That said, I don&#8217;t have a better solution for code review yet.</p>
</li>
</ul>
<p>Can&#8217;t wait to see what I learn this year. A lot of new stuff for me, should be interesting.</p>
<br />Filed under: <a href='http://railsrx.com/category/me/'>Me</a>, <a href='http://railsrx.com/category/projects/'>Projects</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/railsrx.wordpress.com/406/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/railsrx.wordpress.com/406/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/railsrx.wordpress.com/406/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/railsrx.wordpress.com/406/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/railsrx.wordpress.com/406/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/railsrx.wordpress.com/406/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/railsrx.wordpress.com/406/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/railsrx.wordpress.com/406/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/railsrx.wordpress.com/406/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/railsrx.wordpress.com/406/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/railsrx.wordpress.com/406/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/railsrx.wordpress.com/406/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/railsrx.wordpress.com/406/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/railsrx.wordpress.com/406/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=railsrx.com&amp;blog=10160445&amp;post=406&amp;subd=railsrx&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://railsrx.com/2011/09/06/what-i-learned/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6b767d8a4c9910e007c122d81eb4de73?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">noelrap</media:title>
		</media:content>
	</item>
		<item>
		<title>Bill James, Sabermetrics, and You, or At Least Me</title>
		<link>http://railsrx.com/2011/08/31/bill_james/</link>
		<comments>http://railsrx.com/2011/08/31/bill_james/#comments</comments>
		<pubDate>Wed, 31 Aug 2011 13:57:41 +0000</pubDate>
		<dc:creator>noelrap</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[Me]]></category>

		<guid isPermaLink="false">http://railsrx.com/?p=400</guid>
		<description><![CDATA[I was a nerdy kid. I suppose that isn&#8217;t much of a surprise, given how I turned out. But in those pre-computer days, I was nerdy about math and baseball. I was the kind of kid that kept a daily log of my batting statistics in the recess kickball games. So you can imagine my [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=railsrx.com&amp;blog=10160445&amp;post=400&amp;subd=railsrx&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I was a nerdy kid.</p>
<p>I suppose that isn&#8217;t much of a surprise, given how I turned out. But in those pre-computer days, I was nerdy about math and baseball. I was the kind of kid that kept a daily log of my batting statistics in the recess kickball games. </p>
<p>So you can imagine my surprise and happiness when this image appeared in Sports Illustrated, in May 1981. I was ten:</p>
<p><a href="http://railsrx.files.wordpress.com/2011/08/james.png"><img src="http://railsrx.files.wordpress.com/2011/08/james.png?w=300&#038;h=253" alt="Bill James in Sports Illustrated" title="james" width="300" height="253" class="alignnone size-medium wp-image-401" /></a></p>
<p>The man in the foreground is Bill James, who would soon go on to be one of the most influential baseball writers of the last thirty years. At the time, though, he was self-publishing his baseball book to a small but fiercely loyal group of fans, one of whom actually wrote the SI article.</p>
<p>In the background, on the scoreboard, was one of James&#8217; inventions &#8211; a formula called Runs Created that purported to be the most accurate way to measure a baseball player&#8217;s contributions.</p>
<p>Okay, I&#8217;m getting carried away. The relevant point is that I was dazzled enough by the original article to start looking for James&#8217; annual book once he started getting published and distributed nationally. As I said, I was young, and the books cost like seven dollars of my own money, so this was kind of a big deal.</p>
<p>I got lucky in my choice of baseball writers. Not only was James iconoclastic and funny, but he was very good at explaining his methods. And I don&#8217;t mean that he was good at explaining the math &#8211; James is the first to admit that he is no mathematician (admittedly joking, he once described the &#8220;standard deviation&#8221; of batting average as &#8220;about what your standard deviant would hit&#8221;). James&#8217; skill was in explaining why he did his experiments in a particular way. In a very real way, the most important things I learned about how science works were from reading Bill James.</p>
<p>In, I think, the first book of James&#8217; that I read, he responds to criticism of earlier work:</p>
<blockquote>
<p>“Journalists start with the answer&#8230; [Sabermetrics] starts with the question”</p>
</blockquote>
<p><em>Sabermetrics</em>, by the way, was the word that James coined for the search for objective knowledge about baseball &#8211; &#8220;saber&#8221; from SABR, the Society for American Baseball Research&quot;.</p>
<p>In other words, where a journalist would start with &#8220;Derek Jeter should be in the Hall of Fame&#8221;, James would start with &#8220;Should Derek Jeter be in the Hall of Fame?&#8221;, and not in the lazy-local-news-headline way where you know from the question where the answer is. More likely, James would start with &#8220;What kind of player is in the Hall of Fame? Does Derek Jeter meet that standard?&#8221; </p>
<p>I suspect that this distinction is obvious to most of you reading this (though it&#8217;s easy to find places in our public discourse where nobody seems to understand it.) But it was a big deal to 12-year-old me.</p>
<p>Later, I remember an epic dismantling of the phrase “Pitching is 75% of Baseball”, starting with wondering what that even meant, and then going one by one through the things that would be implied of that statement was true, determining that none of them actually were, and eventually concluding that even the baseball traditionalists who were fondest of the claim didn&#8217;t act in any way consistent with actually believing it. I can still quote large chunks of that one.</p>
<p>Some quotes didn&#8217;t really become meaningful to me until I started writing myself:</p>
<blockquote>
<p>“One of the operating assumptions of this book is that you either own McMillan’s Baseball Encyclopedia or don’t care what it has to say. In either case, you don’t need me to tell you what an outfielder’s assist totals are”</p>
</blockquote>
<p>I&#8217;ve used some variant of that comment for every book I&#8217;ve written (though it didn&#8217;t always make into the final version). I&#8217;ve also used in when reviewing books. It&#8217;s a really useful way to think about your audience, to realize that you can assume knowledge of or disinterest in certain information.</p>
<p>Another quote that was big with me when I used to read academic papers all the time, but that I also keep in mind when I write.</p>
<blockquote>
<p>“This isn’t a bull session, this is science. I only write like it’s a bull session because I don’t like how scientists write”</p>
</blockquote>
<p>James is always been a little cranky on the subjects of professionalism and expertise, which he sees as often being used as nothing barriers to keep out the riff-raff.</p>
<blockquote>
<p>“When you write something it is either true or false and being an expert or not being an expert has nothing to do with it”</p>
</blockquote>
<p>What&#8217;s really stuck with me, though is the way James went about seeking more objective knowledge. The process was simple.</p>
<ul>
<li>Ask a question.</li>
<li>Determine something that is observable that would be true if the answer to the question is true.</li>
<li>Use small, empirical measurements. James is the king of quick-and-dirty measurements that favor ease of calculation and understanding over multi-digit precision.</li>
<li>Compare similar items that differ in one aspect. In the mid 80-s James was more excited about a method to measure how similar two players were than almost anything else, because it allowed him to create controlled studies.</li>
<li>Follow the data. You probably won&#8217;t learn what you expect. Respect the data and respect its limitations.</li>
</ul>
<p>If you are interested in James&#8217; baseball work, the best introduction right now is probably the <a href="http://www.amazon.com/Bill-James-Historical-Baseball-Abstract/dp/0743227220/">Historical Baseball Abstract</a>, which is an overview of both his statistical methods and his historical interests. A more biographical look at his effects can be found in <a href="http://www.amazon.com/Moneyball-Michael-Lewis/dp/0393338398/">Moneyball, by Michael Lewis</a>, which is about how the Oakland A&#8217;s applied James-style methods to actually win games. It&#8217;s a great non-fiction narrative, and Lewis is, as far as I can tell, unusually factually accurate.</p>
<p>James&#8217; most recent book is <a href="http://www.amazon.com/Popular-Crime-Reflections-Celebration-Violence">Popular Crime</a>, which is not about baseball, but rather a historical overview of crime stories that become pop-culture touchstones, and also the books that have been written about them. It&#8217;s cranky, scattershot, obsessive, and hard to put down.</p>
<br />Filed under: <a href='http://railsrx.com/category/books/'>Books</a>, <a href='http://railsrx.com/category/me/'>Me</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/railsrx.wordpress.com/400/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/railsrx.wordpress.com/400/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/railsrx.wordpress.com/400/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/railsrx.wordpress.com/400/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/railsrx.wordpress.com/400/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/railsrx.wordpress.com/400/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/railsrx.wordpress.com/400/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/railsrx.wordpress.com/400/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/railsrx.wordpress.com/400/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/railsrx.wordpress.com/400/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/railsrx.wordpress.com/400/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/railsrx.wordpress.com/400/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/railsrx.wordpress.com/400/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/railsrx.wordpress.com/400/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=railsrx.com&amp;blog=10160445&amp;post=400&amp;subd=railsrx&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://railsrx.com/2011/08/31/bill_james/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6b767d8a4c9910e007c122d81eb4de73?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">noelrap</media:title>
		</media:content>

		<media:content url="http://railsrx.files.wordpress.com/2011/08/james.png?w=300" medium="image">
			<media:title type="html">james</media:title>
		</media:content>
	</item>
		<item>
		<title>Red Buttons, The Uncanny Valley, And BDD Workshops</title>
		<link>http://railsrx.com/2011/08/15/red-buttons-the-uncanny-valley-and-bdd-workshops/</link>
		<comments>http://railsrx.com/2011/08/15/red-buttons-the-uncanny-valley-and-bdd-workshops/#comments</comments>
		<pubDate>Mon, 15 Aug 2011 16:06:44 +0000</pubDate>
		<dc:creator>noelrap</dc:creator>
				<category><![CDATA[Me]]></category>

		<guid isPermaLink="false">http://railsrx.com/?p=395</guid>
		<description><![CDATA[I want to tell you about LoneStar RubyConf and how my session went and all that, but first I want to tell you this seemingly unrelated story. Once upon a time, my Senior undergraduate project was an educational software tool I built to teach fractions to elementary school students. (To give you the time frame [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=railsrx.com&amp;blog=10160445&amp;post=395&amp;subd=railsrx&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I want to tell you about <a href="http://lonestarrubyconf.com/">LoneStar RubyConf</a> and how my session went and all that, but first I want to tell you this seemingly unrelated story.</p>
<p>Once upon a time, my Senior undergraduate project was an educational software tool I built to teach fractions to elementary school students. (To give you the time frame here, it was written in Visual Basic 1 on Windows 3, and I had to ship my own desktop to the school to ensure that they&#8217;d have something I could run it on. Also, I travelled to the school via dinosaur.) Anyway, the metaphor for the program was slices of pizza, and at the beginning of the game, the student saw an uncut pizza on the screen. Times being what they were, I was using the VB graph library to draw the &#8220;pizzas&#8221;, so a new pizza was represented by a red 3D pie chart, which means it basically looked like a red cylinder.</p>
<p>The first student sits down and starts clicking on the pizza like there&#8217;s no tomorrow. I immediately realize that the red cylinder that I had set up to be a pizza looked like a huge red button right in the middle of the screen. I couldn&#8217;t possibly have given it more focus &#8211; honestly, it looked like it might launch missiles or something. And I know, that even though I had never thought of it in that way, that every student is going to do the same thing and that I&#8217;m going to spend my day telling people not to click on the pizza. Which is what happened. And I felt like an idiot &#8211; how could I not have seen it before?</p>
<p>Which brings us to my workshop at LSRC, &#8220;Correctness is only a side effect: Improving your life with BDD&#8221;. Here was the plan:</p>
<ul>
<li>
<p>I wanted the workshop to have kind of a code retreat kind of flavor, where the attendees would be able to focus on the pure process without regard for real-world constraints.</p>
</li>
<li>
<p>The idea was that there would be a hands-on code problem, some discussion of how that was done via BDD based on the student&#8217;s concerns, then some prepared material based on the topic. </p>
</li>
<li>
<p>The extended example was some kind of restaurant recommendation system, where each restaurant would have a score based on, at first, just ratings, then cuisine, price, location, and so on. The plan was to build up an increasingly complicated score function than show the process of using BDD to refactor it to it&#8217;s own scoring engine.</p>
</li>
</ul>
<p>Well, that didn&#8217;t work out. Some of it did. The prepared material was decent &#8211; I&#8217;ve used a lot of it before. A couple of other things happened, of which the most interesting was how the attendees interacted with the problem.</p>
<p>I started by presenting the problem and mentioning that we were going to be focusing on testing a <code>score</code> method, because that was where the interesting logic to test was going to be. We walked through the failing test for initial conditions, did the method returning a literal to make the test pass, forcing a dynamic method with another failing test. So far, it seems to be going smoothly from my point of view. This was quite an advanced group of students &#8211; often when I do these workshops at regional conferences, the attendees are on the newer side, but this group was experienced, knowledgable, and already largely bought into the idea of BDD. (Based on earlier experiences, I had pitched the material maybe a little to beginnery for the crowd, causing me to worry if I was presenting any useful information to them at all). </p>
<p>Soon it&#8217;s time to break out for the first hands-on example, which is adding some new features to the score function. And the conversation went something like this: (I&#8217;m compressing this a bit for dramatic effect&#8230;)</p>
<p>Me: And the task is to make recommendations based on cuisine and price. You can do this by filtering a list of restaurants, or, I&#8217;d recommend trying to do it by modifying the score function.</p>
<p>Clever Attendee: How do we store the list of restaurants?</p>
<p>Me: Oh. Um. I don&#8217;t really care. In a real system the framework would manage that. You can explicitly pass an array of restaurants if you want, or just test the score function for a single restaurant.</p>
<p>Clever Attendee: Okay. But how should I store the list of restaurants?</p>
<p>Which was my red button moment. <strong>Of course</strong> somebody coming to this problem for the first time would want to know how things were stored. Of course a person who didn&#8217;t know what I had planned for the rest of the day would worry about that. </p>
<p>And I realized that I had landed in the uncanny valley of example problems &#8211; close enough to realistic for people to care about practical concerns, but not specified enough for those concerns to be nicely handled. And I missed it because I was fixated on how I would test the <code>score</code> method. </p>
<p>We worked through it, though, and even did another round of examples using mock objects to fake out a location service. Still, we weren&#8217;t able to get anywhere near my plan of building up a complex system via BDD. Again &#8211; my fault for not getting the example right &#8211; the attendees were all great.</p>
<p>Ironically, I think I could have gotten away with it if the example was in print, where I would been able to just work through the changes in the score example.</p>
<p>Toward the end of the day, I kind of got the feeling that everybody, including me, was a little frustrated, so I just came out and said it. &#8220;I think the prepared material has been fine, but I don&#8217;t think the example has really worked. Would anybody mind trying a more abstract, code kata-like problem via BDD as the last example.&#8221; Everybody pretty much unanimously picked the abstract example, and so we pivoted to the <a href="http://rubylearning.com/blog/2010/09/30/the-testing-mindset/">abstract problem</a> that I wrote for Ruby Learning a little bit ago. People seemed to work on that enthusiastically.</p>
<p>In the end, I think I provided value for everybody that was there, many attendees said nice things. But I&#8217;m annoyed with myself that I wasn&#8217;t able to deliver everything I wanted to. </p>
<p>Lessons for next time:</p>
<ul>
<li>For this workshop, it seems likely that a well-specified but abstract problem is going to be better than a less-specified but nominally real-world problem. I think if I did this next time, we&#8217;d build up a simple game.</li>
<li>The content of any workshop like this is always dependent on the attendees needs. As the presenter, I have to be paying attention to how people seem to be doing. As the attendee, you should feel free to let the presenter know what you are hoping to get out of the session and if it&#8217;s working for you. </li>
</ul>
<p>So, thanks to those of you that came out &#8211; you were great, I hope you learned something, and I appreciate they way you helped me improve my teaching skills. But I really hope you learned useful stuff, too.</p>
<br />Filed under: <a href='http://railsrx.com/category/me/'>Me</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/railsrx.wordpress.com/395/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/railsrx.wordpress.com/395/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/railsrx.wordpress.com/395/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/railsrx.wordpress.com/395/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/railsrx.wordpress.com/395/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/railsrx.wordpress.com/395/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/railsrx.wordpress.com/395/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/railsrx.wordpress.com/395/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/railsrx.wordpress.com/395/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/railsrx.wordpress.com/395/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/railsrx.wordpress.com/395/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/railsrx.wordpress.com/395/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/railsrx.wordpress.com/395/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/railsrx.wordpress.com/395/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=railsrx.com&amp;blog=10160445&amp;post=395&amp;subd=railsrx&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://railsrx.com/2011/08/15/red-buttons-the-uncanny-valley-and-bdd-workshops/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6b767d8a4c9910e007c122d81eb4de73?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">noelrap</media:title>
		</media:content>
	</item>
	</channel>
</rss>
