<?xml version="1.0" encoding="UTF-8"?>
<!--Generated by Squarespace V5 Site Server v5.13.166 (http://www.squarespace.com) on Wed, 19 Jun 2013 11:38:37 GMT--><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>Rails Test Prescriptions Blog</title><link>http://www.noelrappin.com/railsrx/</link><description></description><lastBuildDate>Fri, 14 Jun 2013 14:02:23 +0000</lastBuildDate><copyright></copyright><language>en-US</language><generator>Squarespace V5 Site Server v5.13.166 (http://www.squarespace.com)</generator><item><title>State of The MSTWJS Union, June 2013</title><category>mstjs</category><dc:creator>Noel Rappin</dc:creator><pubDate>Fri, 14 Jun 2013 14:01:49 +0000</pubDate><link>http://www.noelrappin.com/railsrx/2013/6/14/state-of-the-mstwjs-union-june-2013.html</link><guid isPermaLink="false">1418891:16854822:33902362</guid><description><![CDATA[<p>Here is the state of the <em>Master Space and Time With JavaScript Union</em> as a I currently understand it. </p>

<p>First, you can, you know, <a href="http://www.noelrappin.com/mstwjs">buy the book</a>. Please.</p>

<p>An update to the Ember book should be going out next Monday or so. It has about 10-15 page chapter walking through a routing example with outlets and nested routes and the like. That&#8217;s puts the Ember PDF at just over 90 pages (including the back matter and contents and stuff), which compares favorably with the lengths of the other three books (97, 97, and 120, I think).</p>

<p>I think there are still a few things missing from the Ember book.</p>

<ul>
<li>More on views and handlebar helpers</li>
<li>Ember data details</li>
<li>Ember-testing details</li>
<li>Anything else the Ember team adds before 1.0 (async routing, for example)</li>
<li>I&#8217;d like to deal with some real-world examples, at least briefly, of things like authentication</li>
</ul>

<p>This points to a final page count roughly in the range of the backbone book, about 120 pages or so. Actually, probably more. Sheesh.</p>

<p>What&#8217;s tricky about this is that ember-data and ember-testing are still not quite done enough to write about them without risking throwing everything out and starting over, so it&#8217;s hard to give a final schedule. </p>

<p>The other books are quiet at the moment, though the Backbone book could stand an edit.</p>

<h2>Thinking Ahead</h2>

<p>Meantime, there&#8217;s a slow but steady trickle of requests for a MSTWJS Book 5: Angular. (A five part trilogy would make me feel like Douglas Adams)…</p>

<p>I&#8217;m genuinely not sure if I&#8217;m going to do this. The considerations are:</p>

<p>Opportunity. There&#8217;s clearly some space here for a book that really explains Angular. According to a Twitter poll &#8212; which I&#8217;m sure is totally reliable &#8212; the overwhelming majority of existing MSTWJS customers would expect to pay for a Book 5. This actually goes a long way toward making me think this is worth my time. Writing tech books is kind of a hobby for me, but I&#8217;d still like to feel that I can make a little bit of money from them.</p>

<p>On the other hand, I&#8217;ve been working on this book for two years now. That&#8217;s a long time in Internet years, and doing an Angular version probably means another three to six months of work. There are other things I want to write, and it wouldn&#8217;t kill me to blog regularly again. (Actually, that implies that I once blogged regularly, which is not really true.) I really want to do this project book, and I&#8217;m starting to feel like I have new things to say about testing.</p>

<p>Anyway, right now I&#8217;m thinking that I&#8217;ll at least play with Angular a bit to see if I have any affinity for the tool at all. If I hate working with it, I&#8217;m not writing about it. If it passes that hurdle, then we&#8217;ll see.</p>

<p>If I do it, the likely scenario would be &#8212; don&#8217;t hold me to this, I&#8217;m just thinking out loud:
* Priced at $7 or $9 based on length
* Existing 4 book bundle owners would get a discount, possibly a limited time discount depending on what I can do via DPD.
* At that point, new customers would get a five book bundle. I might raise all prices at that point &#8212; the hypothetical five book bundle would be nearly 600 pages. Not sure what that pricing looks like yet. $9 per book with a $25 bundle is one possibility.</p>

<p>Please let me know if you have thoughts about this &#8212; my perception of people&#8217;s willingness to buy an Angular book in this series is a major factor in whether I do it. </p>

<p>And, oh yeah, <a href="http://www.noelrappin.com/mstwjs">buy the book</a>. </p>

<p>Thanks.</p>
]]></description><wfw:commentRss>http://www.noelrappin.com/railsrx/rss-comments-entry-33902362.xml</wfw:commentRss></item><item><title>Status Update</title><category>Self Publishing</category><category>mstjs</category><category>self promotion</category><dc:creator>Noel Rappin</dc:creator><pubDate>Sat, 20 Apr 2013 19:10:17 +0000</pubDate><link>http://www.noelrappin.com/railsrx/2013/4/20/status-update.html</link><guid isPermaLink="false">1418891:16854822:33415873</guid><description><![CDATA[<p>It&#8217;s been well over a month since the last official update to <a href="http://www.noelrappin.com/mstwjs"><em>Master Space and Time with JavaScript</em></a>, and since I was hoping to get updates out more-or-less weekly, it&#8217;s probably a good idea to check in and let you know what&#8217;s going on. (Could be worse, though, I&#8217;m still hoping to post my top 10 books I read list. From 2011.)</p>

<p>All of the MSTWJS customers out there have been either very patient in waiting for the next update, or you are completely disengaged. Personally, I&#8217;m choosing to assume patient. </p>

<p>I am continuing to work on the book, it&#8217;s just slowed down quite a bit. The next update will most likely be sometime after <a href="http://www.railsconf.com">RailsConf</a> &#8212; ideally sometime in the week or so following. So by, say, May 10th. I post this date publicly to increase the chance that I&#8217;ll actually hit it.</p>

<p>There are a few reasons why the book&#8217;s progress has slowed.</p>

<p>To some extent, it&#8217;s a deliberate slowdown so I don&#8217;t have to rewrite the thing a dozen times. Yes, Ember is in an API freeze, but they are still adding new things that preserve compatibility, and Ember-data is decidedly not in an API freeze. Just in the last week or so, integration testing tools are starting to emerge &#8212; see <a href="http://discuss.emberjs.com/t/working-on-a-testing-guide-was-detailed-ember-js-testing-example">this discussion</a> for details. Honestly, the fact that I had to throw my hands up over integration testing in the last update was very disappointing, and I&#8217;d very much like to get that working in the example.</p>

<p>There&#8217;s also been some fumbling about what I want to cover in the rest of the book and how I want to get there. This one, I think I&#8217;m getting a handle on. </p>

<p>I also got busy. For example, I&#8217;ve been starting this weekly <a href="http://www.tablexi.com/blog/category/xi-to-eye/">sort-of-screecast series for Table XI called XI to eye</a>. I&#8217;ve never done anything like it, but I&#8217;m pleased with how this is going. There are five so far, you can see them all at <a href="http://www.tablexi.com/blog/category/xi-to-eye/">http://www.tablexi.com/blog/category/xi-to-eye</a>. Please do check them out. </p>

<p>I&#8217;m also doing two sessions at <a href="http://www.railsconf.com">RailsConf</a> &#8212; a normal session <a href="http://railsconf.com/2013/talks%23talk-5">comparing rich client MVC with the 37Signals Basecamp approach</a> and <a href="http://railsconf.com/2013/talks%23talk-65">an intro track session</a> on testing complex systems. More on those next week, but I&#8217;m excited for both of them. </p>

<p>There&#8217;s also been some laziness, and some lack of momentum caused by the combination of the previous points. </p>

<p>Still, hoping that this will move a little more rapidly in May &#8212; we&#8217;re now coming on the two-year anniversary of me starting the project (though I suppose I&#8217;d be done if I hadn&#8217;t decided to pick up Ember as a topic), and I&#8217;m certainly ready to move on. (I have some idea what my upcoming writing projects will be, just not sure which one I want to tackle next.</p>

<p>Thanks for your patience, if you are enjoying the book more will be coming &#8212; there will also be another errata catch up on the first three books. Please do help spread the word, or maybe <a href="http://www.noelrappin.com/mstwjs">buy it yourself</a>.</p>
]]></description><wfw:commentRss>http://www.noelrappin.com/railsrx/rss-comments-entry-33415873.xml</wfw:commentRss></item><item><title>Announcing Ember! Master Space and Time With JavaScript Book 4</title><category>JavaScript</category><category>Self Publishing</category><dc:creator>Noel Rappin</dc:creator><pubDate>Mon, 21 Jan 2013 14:57:46 +0000</pubDate><link>http://www.noelrappin.com/railsrx/2013/1/21/announcing-ember-master-space-and-time-with-javascript-book.html</link><guid isPermaLink="false">1418891:16854822:32605303</guid><description><![CDATA[<p>You have no idea how happy I am to announce that Book 4 of <em>Master Space and Time with JavaScript: Ember</em> is now on sale. You can buy it at <a href="http://www.noelrappin.com/mstwjs">http://www.noelrappin.com/mstwjs</a></p>

<p>It&#8217;s not done, of course. But it&#8217;s off to a good start, and I think it&#8217;s going to be great. Here&#8217;s the state of the world:</p>

<ul>
<li><p>Release 1 of the Ember book is $7, just like its recent siblings. The four book bundle is still $15.</p></li>
<li><p>Release 1 is about 20 pages of content (plus the same intro, acknowledgments, and so on). It covers setting up the Time Travel app with an Ember front end, then the basic concepts involved in getting data from the server, displaying it to the browser and responding to actions. We basically end at a chapter break, so it&#8217;s a contained example, though obviously the rest of the book will take it farther. </p></li>
<li><p>The code is written against Ember 1.0pre4, which means its current as of yesterday. </p></li>
<li><p>Unlike some of the other betas, this one has been reviewed by a few people, including people who know more about Ember than I do, so I&#8217;m pretty happy with how it&#8217;s going so far.</p></li>
<li><p>We don&#8217;t cover testing yet (in part because the framework does so much that there isn&#8217;t much logic to test yet). It&#8217;s coming, though. Trust me.</p></li>
<li><p>The plan is for basically weekly releases until done.</p></li>
<li><p>I don&#8217;t know how long this is going to get &#8212; to some extent it&#8217;s going to depend on the reception, more sales = more encouragement to write. It will be at least in the 100is page range as the previous books. If it gets much longer than that, I may raise the price at that time.</p></li>
</ul>

<p>That&#8217;s the scoop. Buy it: <a href="http://www.noelrappin.com/mstwjs">http://www.noelrappin.com/mstwjs</a>, enjoy it, spread the word. </p>

<p>Thanks</p>
]]></description><wfw:commentRss>http://www.noelrappin.com/railsrx/rss-comments-entry-32605303.xml</wfw:commentRss></item><item><title>State of My Stuff, January, 2013</title><category>Self Publishing</category><category>self promotion</category><dc:creator>Noel Rappin</dc:creator><pubDate>Mon, 07 Jan 2013 14:41:02 +0000</pubDate><link>http://www.noelrappin.com/railsrx/2013/1/7/state-of-my-stuff-january-2013.html</link><guid isPermaLink="false">1418891:16854822:32488452</guid><description><![CDATA[<p>The state of the Noel Rappin publishing &#8212; I can use the word &#8220;empire&#8221;, right?</p>

<h2>MSTWJS 3: Backbone</h2>

<p><em>Master Space and Time With JavaScript, Book 3: Backbone</em> is draft complete as of today&#8217;s release except for a page or so of summary at the end, which I will probably wait to write until the Ember chapter is complete. </p>

<p>The next release will be an edit pass, to clean up typos and bad sentences, smooth over the explanation, fix errata and generally polish stuff. I haven&#8217;t done any of this on the book yet, so it&#8217;s possible there will be some bigish changes depending on what I think is going on.</p>

<p>Any further releases will be errata and cleanup based.</p>

<h2>MSTWJS 4: Ember</h2>

<p>I&#8217;m starting to get actual questions about the Ember version.</p>

<p>In the wake of the Ember team getting their newest router API into master, and also updating a lot of their documentation, I&#8217;ve broken ground on this one and am moving forward.</p>

<p>I will release this in a pretty early state, I imagine, and continue with the weekly updates until it&#8217;s through, which I expect will be on the order of ten weeks. Ish.</p>

<p>I have two criteria for the initial release. The first is that I need the example in the book to go far enough to display some things on the screen and show off some event and property processing. Secondly, I have a couple of people who have volunteered to sanity check the book, and I&#8217;d like at least one of them to sign off on it before anything insane I write is exposed to the general public. So, optimistically, Jan 14, but maybe a week or two after.</p>

<h2>MSTWJS 1 and 2</h2>

<p>I do have some standing errata that have been reporting. I would expect not to see an actual update until after the Ember book is on sale, not least because then the update email can be used to tell all the free book one customers that the Ember book exists.</p>

<h2>Next Projects</h2>

<p>So, I do know what my next project is going to be, I&#8217;m planning on self publishing it. It&#8217;ll be Ruby and testing based, but I don&#8217;t plan to start on it until after the Ember book is out in the wild. I came up with an outline while I was waiting for the Ember team, but now that I they look solid, I want to get that out first.</p>
]]></description><wfw:commentRss>http://www.noelrappin.com/railsrx/rss-comments-entry-32488452.xml</wfw:commentRss></item><item><title>More Lessons Learned</title><category>Me</category><dc:creator>Noel Rappin</dc:creator><pubDate>Thu, 27 Dec 2012 15:01:17 +0000</pubDate><link>http://www.noelrappin.com/railsrx/2012/12/27/more-lessons-learned.html</link><guid isPermaLink="false">1418891:16854822:32276375</guid><description><![CDATA[<p>Last year, when Obtiva was purchased by Groupon, I wrote a <a href="http://www.noelrappin.com/railsrx/2011/9/6/what-i-learned.html">"what I learned"</a> post talking about things I thought I came to understand about software projects after working on a bunch of them. Now that I've moved on from Groupon, I started to think about what, if anything, I learned while I was there. </p>

<p>I keep coming back to three different things -- this is a more personal set of lessons than the last batch, so maybe they'll be less generally useful. Maybe not, though. Think of it as a little long-term career management advice.</p>

<p>These are all things that I think I kind of knew going in, but there's knowing something and <em>knowing</em> something, know what I mean?</p>

<p>Also -- nothing here is meant to say anything against Groupon Engineering -- I freely admit that what I'm talking about are issues of me managing my life and time.</p>

<h2>Coding is the Input to Everything I Do</h2>

<p>I like coding. (I thought I'd start with something controversial…) I like it a lot. That said, I've never been the guy who needed hours more coding in his week above and beyond work. For most of my professional career, my personal projects have been writing projects. And while I love to continually learn new things, it's been a long time since I felt the need to forgo sleep to do so.</p>

<p>Groupon was the first time in my professional career where coding was not a primary responsibility -- my primary responsibility was organizing training. And I'll stipulate that I went into it eyes open. It sounded pretty good. No coding project deadlines, and I love to teach. A room of students who have to listen to me sounds good. </p>

<p>At first, I was actively building the curriculum, that was pretty good. Then there was less curriculum work to, and in for reasons that I don't really need to detail, the things asked of me became a lot more administrative. The point is that as I got further away from everyday coding, I felt like I got less good at all kinds of things that I want to be good at. I didn't have interesting problems to blog about, I wasn't learning new things as much. I felt less credibility as a teacher and speaker as I got a little removed from practice. Combine this with my occasional tendency toward impostor's syndrome, and things got less fun quickly.</p>

<p>There were options available to me at Groupon that I chose not to take for reasons good and bad. The main point for me is that by the time I realized what I was losing, it was hard for me to feel like I could get it back. The point for you, I guess, is to be confident in knowing what you like to do and what parts of your work are satisfying. Know what you need to have as your inputs to be successful over the long term.</p>

<h2>Big Companies are not Small Companies.</h2>

<p>I know, duh.</p>

<p>I've joked for years about "big company problems" vs. "small company problems". In a small company you have to maintain the CI server yourself. In a big company, there's a whole IT department, but it takes you six months to requisition a CI server. (True story, at Motorola. Also they told me the CI server was causing too much network traffic, and did I have to run it after <em>every</em> checkin.)</p>

<p>There are two structural issues at big companies that have tended to drive me batty. The first -- that people are often making decisions about other people who they don't know and only have a dim idea of what they do -- was not a major issue for me at Groupon. The second -- that big companies tend to encourage people to specialize -- decidedly was.</p>

<p>I want this post to be about me, not about them. So here's a related story: when I first entered the job market, I wound up with two serious offers, salary identical. One of them was at Nokia, for an R&amp;D department in Boston where I would have done usability research tangentially related to what I had been doing as a grad student. The other was what we'd now call a small web consulting shop, 12 people or so separated between two cities. I'd never done any web programming. They had done only a little bit more (they thought of themselves as documentary filmmakers by trade). When I went for my interview, the CEO of the company was vacuuming the floor of their 2-person Boston office.</p>

<p>Obviously I went with the tiny company, which even as I type this sounds kind of insane. And while I'd love to say something self-serving about how I picked the job that scared me, I don't think that's true (both jobs scared me). I do think, though, that I was excited by the prospect of doing a lot of different things. Which I did, the job turned out to be a kind of immersion in the entire lifecycle of software projects in the way that pouring ice water on somebody's head is kind of a way to get their attention. </p>

<p>Ever since, I've been happiest when I've been able to do all kinds of different things on a regular basis. Big companies, of course, tend to specialize because they need to, and because they can. Once you have 200 developers, suddenly you can spare somebody to be full-time in charge of improving training. (Well, almost full-time…) Which sounded great, for a while, but then, see point #1. I flatter myself that I do a lot of things well, and whether that's true or not, I still want to try to do a lot of things. </p>

<h2>Introversion and local maxima</h2>

<p>This one is a little tricky and it's really a personal anti-pattern. </p>

<p>Look, I'm in introvert in the <a href="http://www.theatlantic.com/magazine/archive/2003/03/caring-for-your-introvert/302696/">classic definition</a>. Every time I've taken a Myers-Briggs test, I bury the needle for I and N. On a day to day basis, one thing this means is that, while I usually like my co-workers (and my Obtiva/Groupon collegues are an outstanding group of people), I'll often choose, say, eating at my desk over going up to a group in the lunchroom and joining up with a group of people. </p>

<p>On a related note, for most of my last six to nine months or so at Groupon I was a team of one. Then the person I reported to left, and I wasn't even reporting to anybody else in Chicago. I swear this is true -- I was literally sitting in a corner with nobody on my two orthognal sides. I'm saying I was a little isolated. I'm also saying that of course I could have handled it better. That's part of my point -- one thing I learned is that what seemed like the best thing to do on a day to day basis, ended up being isolating in the long term. I would be able to go large chunks of a day without interacting with co-workers. Even a staggering introvert like myself has limits. </p>

<h2>What does it mean?</h2>

<p>Dunno. Just being a self-indulgent blogger. I expect most of you to read this, roll your eyes and say "Duh."</p>

<p>I do know that I've spent most of my six weeks at Table XI coding and helping run a small web project. I know it feels great even when it gets weird. It feels like I'm using muscles that got a little rusty. (I'd have some technical blog posts for you, but I'm backed up with <a href="http://www.noelrappin.com/mstwjs">the book</a>. Coming, I promise.</p>

<p>Table XI provides lunch in house every day, which makes it a lot easier to actually talk to co-workers. Which is good. (I realize this lunch thing sounds totally insane to a significant percentage of you. I'm okay with that.) During my first week, I had a meeting where we planned out what kinds of things would happen as part of my first few months. One of my cards was "do something new". I don't know exactly what yet, but it's important to me to keep moving forward.</p>

<p>Thanks for listening, I hope you will, to paraphrase Tom Lehrer, find this valuable in bizzarre set of circumstances some day.</p>
]]></description><wfw:commentRss>http://www.noelrappin.com/railsrx/rss-comments-entry-32276375.xml</wfw:commentRss></item><item><title>Leprechauns and Unicorns of Software</title><category>software</category><dc:creator>Noel Rappin</dc:creator><pubDate>Wed, 05 Dec 2012 14:33:15 +0000</pubDate><link>http://www.noelrappin.com/railsrx/2012/12/5/leprechauns-and-unicorns-of-software.html</link><guid isPermaLink="false">1418891:16854822:31688465</guid><description><![CDATA[<p>Something like 25 years ago, Bill James wrote an essay asserting that one difference between smart and dumb baseball organizations was that dumb organizations behaved as thought Major League talent was normally distributed on a standard bell curve, and smart organizations knew that talent is not (it&#8217;s the far end of a bell curve).</p>

<p>Hold that thought.</p>

<p>So I just finished reading Laurent Bossavit&#8217;s self published book <a href="https://leanpub.com/leprechauns"><em>The Leprechauns of Software Engeneering</em></a>, which I recommend quite highly. Bossavit looks at some of Software Engineering&#8217;s core pieces of received wisdom: that there is a 10x productivity difference between developers, that the cost of change rises exponentially over the course of a project. The kind of thing that all of us have heard and said dozens of times.</p>

<p>Bossavit does an interesting thing. He goes back to the original papers, sometimes wading through a maze of citations, to find the original source of these claims and to find out what empirical backing they may have. Turns out the answer is &#8220;basically none&#8221;. One by one, these claims are shown to be the result of small sample sizes, or no sample, or other methodological problems. They&#8217;ve become authoritative by force of repetition. (Which doesn&#8217;t mean they are wrong, just that we don&#8217;t know as much as we think we do.) </p>

<p>If you are like me, which is to say you are fascinated by the idea of empirical studies of software, but deeply skeptical of the practice, this book will take your head to some fun places.</p>

<p>The Bill James analogy, for example. What James is talking about is that in order to accurately value what you have, you need some idea of the context in which it occurs. In the baseball example, to know how to value a player who hits ten home runs (which we&#8217;ll pretend is average, for the sake of oversimplification), it&#8217;s helpful to have a good sense of how many players are out there who are capable of hitting twelve, or eight. If you erroneously assume that there are fewer players capable of hitting eight home runs then ten home runs, then some bad management decisions are in your future. Specifically, you&#8217;ll overvalue your ten home run player (or more likely, overpay for somebody else&#8217;s ten home run player, when your own eight home run player is a fraction of the cost.)</p>

<p>I&#8217;m wary of taking this analogy too far, not least because it doesn&#8217;t necessarily reflect well on my overeducated typing fingers. There are all kinds of reasons to think that the curved for web developers is different than for baseball players. We don&#8217;t have a good idea of what the distribution curve of productivity is for developers, even if we had a good idea of productivity is (we don&#8217;t) or a way of measuring it (ditto) or any idea of how individuals improve or decline based on teams (guess what). That said, I do not think that I have been on an actual team where people were genuinely 10x better than other people. (Total newbies notwithstanding, I guess). Ten times is a lot of times, that&#8217;s one person&#8217;s week being another person&#8217;s half-day. Sustainably. </p>

<p>But see what I did there? I palmed a card. I said that newbies don&#8217;t count in my personal recollection of my teams productivity. Why not? For a good reason &#8212; I don&#8217;t think the productivity of somebody in intense learning mode has a lot to tell me about how software teams work. But that&#8217;s my decision, and it&#8217;s subjective, and suddenly I&#8217;m deciding which of my hypothetical data &#8220;really counts&#8221; and which doesn&#8217;t. That&#8217;s a normal process, of course, but it&#8217;s not How Science Is Supposed To Work. In reality, I&#8217;m already skeptical of the 10x finding, and pulling newbies out moves the data in a way I&#8217;m comfortable with, so I&#8217;m not likely to examine that decision too closely. (See Bias, Confirmation.)</p>

<p>I spent about five years reading and writing social science academic work, and if there&#8217;s one thing I learned it&#8217;s to  always be skeptical of any finding that confirms the author&#8217;s preconceptions. (See also: <a href="http://www.amazon.com/Mismeasure-Man-Revised-Expanded/dp/0393314251">Stephen Jay Gould&#8217;s <em>The Mismeasure of Man</em></a> &#8212; well worth your time if you deal with data.) Data is complicated, any real study is going to generate a ton of it, and seemingly trivial decisions about how to manage it can have dramatic effects on the perceived results. </p>

<p>I spent a lot of time researching education, which shares with software engineering the idea that individual performance is much harder to measure, or even to define, than you might assume at first glance. Empirical education studies tend to fall into one of two groups:</p>

<ol>
<li>A study under very controlled lab conditions, where the researcher is claiming that a clear data result is applicable to the larger world.</li>
<li>A study in the real world, with messier data, where the researcher is claiming that there is an effect and that it as because of some specific set of clauses.</li>
</ol>

<p>Both studies are problematic &#8212; the first kind often have small or non-representative subjects, the second kind is often a long-term study of one group with real questions as to whether the result is at all reproducible. On top of which you have the Hawthorne Effect (any group that knows it is being observed tends to increase performance no matter what the intervention is) and the effect whose name I can never remember where the more attention is paid to a specific metric the less reliable that metric becomes as a proxy for overall performance. </p>

<p>Or, looking at this another way… I got in a conversation at SCNA this year about why SCNA talks so rarely have empirical results about the value of the software techniques discussed. My kind of glib answer was that we&#8217;re all a little afraid that empirical results wouldn&#8217;t support the value we perceive in what me might call the &#8220;SCNA way&#8221;. By which I partially mean that we&#8217;re afraid that a badly-designed study might suggest that, say, Test-Driven Development had little or no value, and we&#8217;d all have to expend energy dealing with it. (But of course, I&#8217;d say that any such study is badly-designed, because of confirmation bias.)</p>

<p>But I also mean, I think, that I&#8217;m not interested in that kind of empirical testing and as interesting as I find the pursuit, I have little confidence that it will have much relevance to my day-to-day work. Agile methods, TDD, what we call &#8220;good&#8221; coding practices make my job easier and more sane. I have my own experience to draw on for that &#8212; which I realize is not science, but it&#8217;s working for me. Asking them to be proven to be the most efficient way to design software seems like impossible icing on the cake. For me, it&#8217;s enough that the methods I favor seem to result in saner, more pleasant work environments. It&#8217;s weird to simultaneously be interested in empirical results in my field, and yet at the same time feel they are utterly separated from what I do, but that&#8217;s where I am.</p>
]]></description><wfw:commentRss>http://www.noelrappin.com/railsrx/rss-comments-entry-31688465.xml</wfw:commentRss></item><item><title>What's Up?</title><category>Me</category><dc:creator>Noel Rappin</dc:creator><pubDate>Thu, 15 Nov 2012 14:52:35 +0000</pubDate><link>http://www.noelrappin.com/railsrx/2012/11/15/whats-up.html</link><guid isPermaLink="false">1418891:16854822:30782593</guid><description><![CDATA[<p>Oh yeah, things happening&#8230;</p>

<h2>Got A New Job, Got A New Office</h2>

<p>First off, I&#8217;ve started a new job as a Senior Developer and Agile Coach at <a href="http://www.tablexi.com">Table XI</a>, putting me back in the realm of small, Chicago-based consulting companies. Very exited, Table XI seems like a great place so far. Hoping to do new things, challenge myself, and learn.</p>

<h2>Book Update</h2>

<p>Most importantly, you can still <a href="http://www.noelrappin.com/mstwjs">buy it</a>.</p>

<p>It&#8217;s going slowly but steadily, thanks for asking. I&#8217;m determined to start releasing weekly even if it means that I cut off the book in mid-sentence. Hoping that will start next Monday. The remaining Backbone chapter is something like 1/3 to 2/5 done. </p>

<p>Next up, Ember. I was already placed on <a href="http://blog.remarkablelabs.com/2012/11/11-emberjs-resources-to-get-you-started">a blog post of Ember.js resources</a>, which is quite flatteringly optimistic given that the Ember stuff doesn&#8217;t technically exist yet. A couple of members of the Ember team have reached out and offered some technical assistance, all of which is very nice, and motivating, and terrifying. </p>

<p>Anyway, the Ember stuff is going to be interesting because, first off, Ember is still a rapidly moving target. I had hoped they&#8217;d have locked down a 1.0 API by now, but given the comments made on <a href="http://javascriptjabber.com/034-jsj-ember-js/">the recent JS Jabber podcast</a>, it looks like we still have some movement coming. Also, it seems as though the nature of Ember implies a more complex example to really show it off. Still hopeful that I&#8217;ll be able to start pushing out Ember content in December, though. </p>

<h2>Cons</h2>

<p>The <a href="http://windycityrails.org/videos2012/#2">video from WindyCityRails</a> is now up, as well as <a href="https://speakerdeck.com/noelrap/testing-should-be-fun">the slides from the evolutionary decendent of the talk from RailsConf</a> &#8212; the RailsConf video should be up in a couple of days. There&#8217;s a blog post in progress exploring the common theme of those talks, as well as a couple of speakers at SCNA who came at similar themes.</p>
]]></description><wfw:commentRss>http://www.noelrappin.com/railsrx/rss-comments-entry-30782593.xml</wfw:commentRss></item><item><title>Velocity, Agile Estimation, And Trust</title><category>Agile</category><dc:creator>Noel Rappin</dc:creator><pubDate>Fri, 26 Oct 2012 16:15:11 +0000</pubDate><link>http://www.noelrappin.com/railsrx/2012/10/26/velocity-agile-estimation-and-trust.html</link><guid isPermaLink="false">1418891:16854822:30100263</guid><description><![CDATA[<p><a href="http://www.twitter.com/cmaxw">Charles Max Wood</a> posted this on Twitter:</p>

<blockquote class="twitter-tweet"><p>Am I misunderstanding agile? or is it inappropriate to try to peg velocity?</p>&mdash; Charles Max Wood (@cmaxw) <a href="https://twitter.com/cmaxw/status/261822726455558145" data-datetime="2012-10-26T13:32:57+00:00">October 26, 2012</a></blockquote>

<script src="http://www.noelrappin.com//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-in-reply-to="261839765861695489"><p>@<a href="https://twitter.com/noelrap">noelrap</a> They’re telling us we behind on the sprint. My understanding of agile is velocity is set by team pace, not wishful thinking.</p>&mdash; Charles Max Wood (@cmaxw) <a href="https://twitter.com/cmaxw/status/261860818159796225" data-datetime="2012-10-26T16:04:18+00:00">October 26, 2012</a></blockquote>

<script src="http://www.noelrappin.com//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-in-reply-to="261839765861695489"><p>@<a href="https://twitter.com/noelrap">noelrap</a> You can push for deadlines, but you can’t tell us that we’re behind on the sprint just because we’re not going to achieve velocity.</p>&mdash; Charles Max Wood (@cmaxw) <a href="https://twitter.com/cmaxw/status/261861036766941184" data-datetime="2012-10-26T16:05:10+00:00">October 26, 2012</a></blockquote>

<script src="http://www.noelrappin.com//platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>After trying like six times to fit my response in a tweet, I gave up and remembered that I had this web site where once upon a time I wrote things that were more than 140 characters.</p>

<p>Disclaimer: I have no idea how Charles&#8217; team is working and what might have been said in planning meetings or anything else. </p>

<p>That said, here&#8217;s what I think.</p>

<p>The goal of agile project management is accepting the inevitability of change through continual feedback, continual improvement, and a realistic sense of progress. In an agile project, things that are hard when done in bulk &#8212; testing, integration, estimating &#8212; are done continually, in smaller pieces, to reduce complexity and risk. </p>

<p>Yes, in a functional agile project, velocity is set by team pace. Ideally, you had a meeting at the beginning of the sprint where you estimated velocity based on past performance, and determined the stories you hope to get done based on point estimates of the stories and that velocity. (Point estimates, remember, are measures of complexity, not time…)</p>

<p>It&#8217;s possible to be behind in a sprint, in some sense, if it doesn&#8217;t look like you are going to complete the agreed upon stories. For example, a story may turn out to be way more complex then estimated. Or a bug may have turned up. (Although agile point estimates are robust against bugs as long as bug fixes remain a roughly consistent percentage of your time). </p>

<p>Remedies for this problem might include changing the point value of a story when new information is determined, splitting the story, lowering velocity estimates going forward, moving a story to the next sprint. Retrospective meetings are a great place for trying to figure out why a story was mis-estimated.</p>

<p>However, trying to assess the state of the project in the middle of a sprint can be a little misleading. There can be a kind of optical illusion if a lot of stories start at the same time, where progress is being made but not booked because the stories aren&#8217;t finished. (Sometimes this means you need more granular stories.) Often, it&#8217;s helpful to organize the daily standup by outstanding story to give visibility to how stories are moving.</p>

<p>Charles is right that one of the points of Agile project management is not to work by wishful thinking of when you hope things will get done. If a story is more complex than we thought, then it just is, and you need to adjust to that by dealing with the software triangle &#8212; change scope, change time, change budget.</p>

<p>Granted #1: This requires a fair amount of trust between the team and the management that when the devs say something is taking longer than expected, that&#8217;s assumed to come from a place of expertise, not ignorance. You build trust by being right, and admitting it when you are not right.</p>

<p>Granted #2: Velocity and story points are robust against underestimating, as long as you are consistent. What will happen is that your velocity will settle at a point that factors in the overestimate. However, if specific stories or types of stories are continually taking more time than expected, it&#8217;s worth trying to figure out why. If for one reason or another, you aren&#8217;t the expected velocity isn&#8217;t being allowed to settle to a new state, that&#8217;s where the wishful thinking comes in. (Although if your actual velocity is continually dropping, that indicates a problem, too.)</p>

<p>Granted #3: Sometimes there are really are business needs for particular deadlines. That doesn&#8217;t change the laws of software physics, but it does determine what a reasonable response is from the team.</p>

<p>Okay, that&#8217;s more than 600 words, and I don&#8217;t know if I&#8217;ve answered the question.</p>

<ul>
<li>In an agile project, velocity should be related to past performance, not hoped-for results.</li>
<li>If velocity is being determined top down &#8212; for example just trying to determine the velocity by guessing total story points in the project divided by sprints before deadline &#8212; that&#8217;s not really in the spirit of the thing.</li>
<li>It&#8217;s possible to miss expectations for a sprint, but the appropriate response to that is usually not &#8220;type faster&#8221;.</li>
<li>This all critically depends on trust between the project managers and engineers. </li>
</ul>

<p>Wow, it&#8217;s been a while since I blasted out a blog post that quickly. Felt good. Hope this helps.</p>
]]></description><wfw:commentRss>http://www.noelrappin.com/railsrx/rss-comments-entry-30100263.xml</wfw:commentRss></item><item><title>Functions that return functions are the luckiest functions in the world</title><category>JavaScript</category><dc:creator>Noel Rappin</dc:creator><pubDate>Tue, 25 Sep 2012 15:48:17 +0000</pubDate><link>http://www.noelrappin.com/railsrx/2012/9/25/functions-that-return-functions-are-the-luckiest-functions-i.html</link><guid isPermaLink="false">1418891:16854822:29329141</guid><description><![CDATA[<p>Here&#8217;s some JavaScript:</p>

<pre><code>var foo = function(a, b) { return a * b };

var bar = function(func) {
  return function() {
    return func.apply(this, arguments)
  };
};

baz = bar(foo);
console.log(baz(2, 3));
</code></pre>

<p>What we have here is a function, <code>bar</code>, that both takes a function as an argument and returns a function as it&#8217;s result. It&#8217;s transforming the function passed to it into a different function.</p>

<p>Okay, that&#8217;s cool in kind of an abstract way, but so what? Let&#8217;s play around with function that take and return functions to show off some potentially useful tricks.</p>

<p>I&#8217;ll note right here up top, that there are more complex, fully featured, and robust versions of all the things I&#8217;m showing here. I&#8217;m just playing with functions.</p>

<p>We can add diagnostics.</p>

<pre><code>var foo = function(a, b) { return a * b };

var trace = function(func) {
  return function() {
    console.log("calling " + func);
    console.log(new Error("normal trace").stack);
    return func.apply(this, arguments)
  };
};

foo = trace(foo);
console.log(foo(2, 3));
</code></pre>

<p>All the <code>trace</code> function is doing here is logging a couple of things before actually calling the function &#8212; namely, it&#8217;s printing the function body (JavaScript doesn&#8217;t have a consistent way to get the function&#8217;s name), and a stack trace. The console output is:</p>

<pre><code>calling function (a, b) { return a * b }
Error: normal trace
  at file:///Users/nrappin/Dropbox/coderx/blog/functions.html:8:17
  at file:///Users/nrappin/Dropbox/coderx/blog/functions.html:15:13
</code></pre>

<p>Okay, that&#8217;s kind of neat. You can also tweak it to do something like a Jasmine spy object, but it takes some object manipulation. Here we really start to take advantage of the fact that JavaScript functions are basically just JavaScript objects.</p>

<pre><code>var foo = function(a, b) { return a * b };

var spy = function(func) {
  var returnFunc = function() {
    returnFunc.timesCalled += 1;
    returnFunc.args.push(arguments);
    return func.apply(this, arguments);
  }
  returnFunc.timesCalled = 0;
  returnFunc.args = [];
  return returnFunc;
};

foo = spy(foo);

console.log(foo(2, 3));
console.log(foo.timesCalled);
console.log(foo.args)
</code></pre>

<p>Same basic idea here, except we&#8217;re doing some dancing with scope to make sure we have access to all the variables we want to, when we want them. Specifically, rather than just returning an anonymous function, we&#8217;re giving it the name <code>returnFunc</code>.  Inside the funtion body of <code>returnFunc</code>, we&#8217;re accessing properties of the <code>returnFunc</code> functional object itself. Specifically we&#8217;re incrementing a counter and adding to a list of called arguments.</p>

<p>After we define the function, we initialize the <code>timesCalled</code> and <code>args</code> properties, and return our functional object. This works because we can access properties of the functional object inside the function itself, which seems weird, but makes more sense if you think of it just as an ordinary object accessing other properties of the same object.</p>

<p>Here&#8217;s a related example &#8212; in this case, our function object has its own methods.</p>

<pre><code>var benchmark = function(func) {
  var returnFunc = function() {
    returnFunc.startDate = Date.now();
    result = func.apply(this, arguments);
    returnFunc.endDate = Date.now();
    return result
  }
  returnFunc.elapsedTime = function() {
    return returnFunc.endDate - returnFunc.startDate;
  };
  return returnFunc;
}

foo = benchmark(foo);
console.log(foo(2, 3));
console.log(foo.elapsedTime());
</code></pre>

<p>In this one, we&#8217;re running the inner function surrounded by time stamps, and we&#8217;re adding a function to the function object, which again, seems weird. At the end, we can query a benchmarked function as to how long it takes. (Yes, I realize that the dev tools allow you to do this.)</p>

<p>Here&#8217;s one that might be more practical. <em>Memoizing</em> is the act of caching the results of function calls so that you don&#8217;t need to re-evaluate an expensive computation.</p>

<pre><code>var memoize = function(func) {
  var returnFunc = function() {
    argsToCheck = (JSON.stringify(arguments));
    if (returnFunc.cache[argsToCheck]) {
      return returnFunc.cache[argsToCheck];
    } else {
      result = func.apply(this, arguments);
      returnFunc.cache[argsToCheck] = result;
       return result;
    }
  }
  returnFunc.cache = {};
  return returnFunc;
}

foo = memoize(foo);
console.log(foo(2, 3));
</code></pre>

<p>In this case, we hold on to the functional argument as before, but when we call the memoized function, we first compare the argument list against a cache. We&#8217;re using the JSON string version of the argument list, so we do have that conversion overhead. If this particular argument list has already been called, then we return the result of the previous call without recalculating. If not, we calculate the function, and place the result in the cache. So, our first call to <code>foo</code> in the example places <code>(2, 3)</code> in the cache, but the second call would retrieve it, to avoid that very expensive multiplication.</p>

<p>This is the beginning of manipulating functions in JavaScript &#8212; functional programming in general is a big topic, but worth looking at. Adapting a functional style where side effects and mutable state are downplayed in favor of manipulating functions, can really pay off in less complexity in your code.  </p>

<p>Like this? You might like my book <a href="http://www.noelrappin.com/mstwjs">Master Time and Space With JavaScript</a>, free sample available, and $15 for the whole thing.</p>
]]></description><wfw:commentRss>http://www.noelrappin.com/railsrx/rss-comments-entry-29329141.xml</wfw:commentRss></item><item><title>Master Space And Time Status Update</title><category>Self Publishing</category><category>mstjs</category><dc:creator>Noel Rappin</dc:creator><pubDate>Fri, 14 Sep 2012 14:06:29 +0000</pubDate><link>http://www.noelrappin.com/railsrx/2012/9/14/master-space-and-time-status-update.html</link><guid isPermaLink="false">1418891:16854822:28869729</guid><description><![CDATA[<p>Here&#8217;s a quick status update on <a href="http://www.noelrappin.com/mstwjs">Master Space and Time With JavaScript</a>, book 3&#8230;</p>

<p>Short version: expect an early beta of about 1/3 of the book to be out in about a week.</p>

<p>Longer version:</p>

<p>Work is proceeding steadily, the current draft of just hit 30 pages toward a target of around 90, though about 10 of that is the same intro and outro that the other books have, so it&#8217;s more like 20 pages toward a target of 80. </p>

<p>The structure of Book 3 is one chapter on replacing the existing app homepage with a very simple Backbone clone, then another chapter building a different page using Backbone that has more events and more complexity, then a third chapter talking about communication between Backbone and the server, and anything else that comes up. The exact division between the second and third chapters may change.</p>

<p>I will release the first beta when the first chapter is draft complete &#8212; this will be rougher than the other books because it hasn&#8217;t gone through rounds of review and editing, but I like how it&#8217;s going. I also need to clear through reported errata on the first two books, and probably clean up the landing page in expectation of doing another marketing push. </p>

<p>Thanks for being patient and for your great feedback.</p>

<p>Oh, and you can still <a href="http://www.noelrappin.com/mstwjs">buy it</a>!</p>
]]></description><wfw:commentRss>http://www.noelrappin.com/railsrx/rss-comments-entry-28869729.xml</wfw:commentRss></item></channel></rss>