<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
 
 <title>Jason Rudolph</title>
 
 <link href="http://jasonrudolph.com/" />
 <updated>2013-02-07T08:57:22-05:00</updated>
 <id>http://jasonrudolph.com/</id>
 <author>
   <name>Jason Rudolph</name>
   <email>jason@jasonrudolph.com</email>
 </author>

 
 <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/jasonrudolph" /><feedburner:info uri="jasonrudolph" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-sa/3.0/" /><logo>http://creativecommons.org/images/public/somerights20.gif</logo><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fjasonrudolph" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fjasonrudolph" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Fjasonrudolph" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/jasonrudolph" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fjasonrudolph" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fjasonrudolph" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fjasonrudolph" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.addtoany.com/?linkname=Jason%20Rudolph&amp;linkurl=http%3A%2F%2Ffeeds.feedburner.com%2Fjasonrudolph&amp;type=feed" src="http://www.addtoany.com/addfr-b.gif">Add to Any Feed Reader</feedburner:feedFlare><entry>
   <title>As Creative As We Make Time to Be</title>
   <link href="http://feedproxy.google.com/~r/jasonrudolph/~3/rZ8T5NOaLsE/" />
   <updated>2013-01-23T00:00:00-05:00</updated>
   <id>http://jasonrudolph.com/blog/2013/01/23/as-creative-as-we-make-time-to-be</id>
   <content type="html">&lt;p&gt;Our creative products represent the best ideas we've had &lt;em&gt;so far&lt;/em&gt; — the best ideas available to us based on the &lt;em&gt;time and space we've allowed for creativity&lt;/em&gt; so far.&lt;/p&gt;

&lt;p&gt;If we want our creative output to represent the best ideas we're capable of producing — as opposed to merely the strongest idea we thought of this morning — it's up to us to operate in a way that allows our best ideas to form.
It turns out that their ability to form is dependent both on the way we approach our creative work &lt;em&gt;and&lt;/em&gt; on the way we spend our time between periods of focused creative work.&lt;/p&gt;

&lt;p&gt;Over the past year, my creative artifacts (e.g., prose, presentations, code) have benefited from that realization.
And in large part, I credit that realization (and my specific techniques for acting on it) to the insight offered by these gentlemen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.jayfields.com/2012/05/is-productivity-killing-your-creativity.html"&gt;Jay Fields: Is Productivity Killing Your Creativity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.brainpickings.org/index.php/2012/04/12/john-cleese-on-creativity-1991/"&gt;John Cleese: On Creativity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lindsredding.com/2012/03/11/a-overdue-lesson-in-perspective/"&gt;Linds Redding: A Short Lesson in Perspective&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Each of these items is worth absorbing in its entirety.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=rZ8T5NOaLsE:gpQzlYhvf-U:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=rZ8T5NOaLsE:gpQzlYhvf-U:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?i=rZ8T5NOaLsE:gpQzlYhvf-U:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jasonrudolph/~4/rZ8T5NOaLsE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jasonrudolph.com/blog/2013/01/23/as-creative-as-we-make-time-to-be/</feedburner:origLink></entry>
 
 <entry>
   <title>ClojureScript: 4 Things That Might Worry You, but Shouldn't</title>
   <link href="http://feedproxy.google.com/~r/jasonrudolph/~3/djbSsoiYgXc/" />
   <updated>2012-09-11T00:00:00-04:00</updated>
   <id>http://jasonrudolph.com/blog/2012/09/11/clojurescript-4-things-that-might-worry-you-but-should-not</id>
   <content type="html">&lt;p&gt;When I first considered taking ClojureScript for a spin, there were several things that gave me pause:
"What's the debugging experience like?"
"How often am I going to find a problem in my app, only to discover that it's actually a bug in ClojureScript?"
And so on.&lt;/p&gt;

&lt;p&gt;I was new to ClojureScript (and fairly new to Clojure at the time as well), so I didn't take these things lightly.
Once I got started, I was pleasantly surprised with the results.
The actual experience wasn't just better than I expected; the actual experience was pretty darn good.&lt;/p&gt;

&lt;p&gt;If you're on the fence about giving ClojureScript a shot, I hereby present: &lt;em&gt;4 things that might worry you, but shouldn't&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;Debugging&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;My Worry&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ClojureScript compiles [1] to JavaScript.
Any error that occurs will be reported to me as JavaScript; probably as &lt;em&gt;horribly obfuscated JavaScript&lt;/em&gt;.
How am I going to trace that error back to the root cause in my ClojureScript code?
Will I even have a fighting chance? [2]&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My Experience&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Finding the &lt;em&gt;ClojureScript&lt;/em&gt; code that produced a &lt;em&gt;JavaScript&lt;/em&gt; error is straightforward and reasonably fast.
Despite coming to ClojureScript with little Clojure experience, it has never taken me more than 60 seconds to go from
A) seeing a JavaScript stack trace in the browser to
B) identifying the exact culprit inside my ClojureScript code.
And on average, it's much faster than that.&lt;/p&gt;

&lt;p&gt;When an error occurs, the console shows you the error and the file where the error occurred.
When you click on the filename in the console, it takes you directly to the JavaScript line that generated the error.
(Sounds familiar, right? Browsers have worked this way for an Internet eternity or two.)&lt;/p&gt;

&lt;p&gt;For me, the surprise came when I viewed the compiled JavaScript.
It provides all the clues you need to quickly identify the source of the problem.
For starters, the first line of the file tells you the exact ClojureScript namespace that produced the error.
Armed with that context, you're ready to look at the line of JavaScript that gave you the error.
And as it turns out, that JavaScript looks &lt;em&gt;similar enough&lt;/em&gt; to your ClojureScript code that you can perform the mental mapping between the two without much effort. [3]&lt;/p&gt;

&lt;p&gt;The following screenshots illustrate this workflow.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://jasonrudolph.com/resources/201209-cljs-debugging-1.png"&gt;&lt;img src="http://jasonrudolph.com/resources/201209-cljs-debugging-1-thumb.png" title="Step 1 - Observe error" alt="Step 1 - Observe error" /&gt;&lt;/a&gt;
&lt;a href="http://jasonrudolph.com/resources/201209-cljs-debugging-2.png"&gt;&lt;img src="http://jasonrudolph.com/resources/201209-cljs-debugging-2-thumb.png" title="Step 2 - Trace it back to your ClojureScript code" alt="Step 2 - Trace it back to your ClojureScript code" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;API Stability&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;My Worry&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ClojureScript is barely &lt;a href="https://twitter.com/jasonrudolph/status/226271633181143040"&gt;a year old&lt;/a&gt;. [4]
I'll bet the dev team is still rapidly evolving the API.
I don't want to have to fix my app every time I upgrade to each and every point release of ClojureScript.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My Experience&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ClojureScript benefits from the stability of &lt;em&gt;Clojure's&lt;/em&gt; API.
I've upgraded the same app to new releases of ClojureScript several times.
Only once did an upgrade require changes to my application code, and even then, &lt;a href="https://github.com/jasonrudolph/one-rep-max/commit/014f8d71a99353b2b0b8490c262eea8de69a3ca3"&gt;those changes were minor syntax tweaks&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Quality&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;My Worry&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Did I mention how young ClojureScript is?
I'm okay with "leading edge," but am I prepared for the &lt;em&gt;bleeding&lt;/em&gt; that goes with "bleeding edge?"
Do I really want to be the guinea pig for some bug-ridden alpha software?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My Experience&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ClojureScript is quality software with a responsive dev team.
In eight months of working with ClojureScript, and through several ClojureScript upgrades, I've only been impacted by a single bug.
I reported that issue on the mailing list at 7:30pm on a Monday night.
Figuring that I wouldn't hear anything until the morning, I decided to go grab some dinner, and then work on something else.&lt;/p&gt;

&lt;p&gt;Enter &lt;a href="https://twitter.com/swannodette"&gt;David Nolen&lt;/a&gt;.
Fortunately for me, David hates dinner, and he hates software bugs even more.
So for him, 7:30pm seems like a perfectly reasonable time to be churning through JIRA tickets.
Clearly my expectations were too low; David wasn't going to let me wait 16 hours for a reply.
Instead, he fixed the issue, &lt;a href="https://github.com/clojure/clojurescript/commit/9319579"&gt;committed it&lt;/a&gt;, and &lt;a href="https://groups.google.com/d/msg/clojure-dev/I2T5Nn7gu3Q/pwpCe2IvBxEJ"&gt;replied&lt;/a&gt;—in just 42 minutes.&lt;/p&gt;

&lt;p&gt;I've &lt;em&gt;paid&lt;/em&gt; good money for support nowhere near as responsive as this!&lt;/p&gt;

&lt;h2&gt;Performance Profiling and Tuning&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;My Worry&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What the heck am I going to do when I discover that part of my app is too slow?
I'm pretty sure there are zero ClojureScript performance profiling tools out there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My Experience&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;While you're unlikely to find a ClojureScript-specific perf tool, the &lt;a href="https://developers.google.com/chrome-developer-tools/docs/cpu-profiling"&gt;Google Chrome profiling tools&lt;/a&gt; give you what you need. [5]&lt;/p&gt;

&lt;p&gt;Eventually, part of my ClojureScript app became slow—unusably slow.
The Chrome profiling tools helped me track down the bottleneck. [6]
The screenshot below describes the process.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://jasonrudolph.com/resources/201209-cljs-performance-profiling.png"&gt;&lt;img src="http://jasonrudolph.com/resources/201209-cljs-performance-profiling-thumb.png" title="ClojureScript Performance Profiling" alt="ClojureScript Performance Profiling" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Runtime Tooling in General?&lt;/h2&gt;

&lt;p&gt;Debugging and performance profiling are two specific worries I had.
In each case, the existing JavaScript runtime tools were sufficient for satisfying my ClojureScript needs.
(And in both cases, I already had those tools installed—they are &lt;em&gt;built-in to the browser&lt;/em&gt;!)&lt;/p&gt;

&lt;p&gt;The landscape of JavaScript runtime tooling extends well beyond these two examples.
Is other runtime tooling similarly applicable for ClojureScript development?
Perhaps.
Where there's a runtime tool for doing &lt;em&gt;x&lt;/em&gt; with JavaScript, it might just be a decent tool for doing &lt;em&gt;x&lt;/em&gt; with ClojureScript as well.&lt;/p&gt;

&lt;h2&gt;What, me worry?&lt;/h2&gt;

&lt;p&gt;I approached ClojureScript expecting each of these things to be a source of pain.
Thankfully, I was wrong.
If any of them have caused you to think twice about giving ClojureScript a try, I contend that they shouldn't.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2&gt;Notes&lt;/h2&gt;

&lt;p&gt;[1] "&lt;a href="http://en.wikipedia.org/wiki/Transpile"&gt;Transpiles&lt;/a&gt;" if you're nasty.&lt;/p&gt;

&lt;p&gt;[2] Of course, this concern is not unique to ClojureScript. It's a longstanding worry for languages that compile to JavaScript (and probably for most other compilation targets throughout the history of computing).&lt;/p&gt;

&lt;p&gt;[3] I suspect that one day—perhaps &lt;a href="https://twitter.com/swannodette/status/241671008438849537"&gt;very soon&lt;/a&gt;—we'll have &lt;a href="http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/" title="Introduction to JavaScript Source Maps - HTML5 Rocks"&gt;source maps&lt;/a&gt; for ClojureScript.
When that day comes, we'll look back on the current workflow as "The Olden Days of ClojureScript Debugging."
You know: when we used to walk 7 miles in the snow, uphill both ways, in order to track down the source of an error.
But in all seriousness, while I look forward to having source maps for ClojureScript, the debugging experience &lt;em&gt;is&lt;/em&gt; sufficient without them.&lt;/p&gt;

&lt;p&gt;[4] Actually, my initial worry dates back to early 2012, when ClojureScript was even newer. Do I really want to dive head first into a six-month-old language?&lt;/p&gt;

&lt;p&gt;[5] Safari, Firefox (via Firebug), and Internet Explorer offer similar functionality.&lt;/p&gt;

&lt;p&gt;[6] It turns out that you probably don't want to construct a 30 kB string (30 kB!) for &lt;em&gt;every single event&lt;/em&gt; that fires inside your app.&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thanks&lt;/strong&gt; to &lt;a href="https://twitter.com/brentonashworth"&gt;Brenton Ashworth&lt;/a&gt;, &lt;a href="https://twitter.com/stuartsierra"&gt;Stuart Sierra&lt;/a&gt;, and &lt;a href="https://twitter.com/levanderhart"&gt;Luke VanderHart&lt;/a&gt; for reading drafts of this post.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=djbSsoiYgXc:mNntGPqNg3s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=djbSsoiYgXc:mNntGPqNg3s:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?i=djbSsoiYgXc:mNntGPqNg3s:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jasonrudolph/~4/djbSsoiYgXc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jasonrudolph.com/blog/2012/09/11/clojurescript-4-things-that-might-worry-you-but-should-not/</feedburner:origLink></entry>
 
 <entry>
   <title>ClojureScript Experience Report: Resources</title>
   <link href="http://feedproxy.google.com/~r/jasonrudolph/~3/e-2YhiieoE4/" />
   <updated>2012-08-17T00:00:00-04:00</updated>
   <id>http://jasonrudolph.com/blog/2012/08/17/clojurescript-experience-report-resources</id>
   <content type="html">&lt;p&gt;Thanks to everyone who came out to the &lt;a href="http://www.meetup.com/TriClojure/events/71707312/" title="A ClojureScript Experience Report -  The Triangle Clojure Users Group (Durham, NC) - Meetup"&gt;Triangle Clojure Users Group&lt;/a&gt; for my talk last night.
It was great to see all the &lt;a href="https://twitter.com/rippinrobr/statuses/236276363064127490"&gt;enthusiasm for ClojureScript&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For those that want to dig in further, here are the resources I mentioned:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jasonrudolph/one-rep-max"&gt;One Rep Max&lt;/a&gt; — an open source ClojureScript app; the source of the experience behind this "experience report"

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jasonrudolph/one-rep-max/blob/ca4d600/doc/network-architecture.png"&gt;Network architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raw.github.com/jasonrudolph/one-rep-max/b16c82e/doc/create-set-event-flow.png"&gt;A sample event flow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clojurescriptone.com/" title="ClojureScript One Guide"&gt;ClojureScript One&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://clojurescriptone.com/documentation.html#one.dispatch" title="ClojureScript One Documentation - one.dispatch"&gt;one.dispatch&lt;/a&gt; — event dispatching library&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/brentonashworth/one/wiki/Design-and-templating"&gt;Design mode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/levand/domina"&gt;Domina&lt;/a&gt; — DOM manipulation library&lt;/li&gt;
&lt;li&gt;Converting from JSON to Clojure data and vice versa

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/clojure/clojurescript/blob/r1450/src/cljs/cljs/core.cljs#L6587"&gt;&lt;code&gt;js-&amp;gt;clj&lt;/code&gt;&lt;/a&gt; (from cljs.core)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jasonrudolph/one-rep-max/blob/5090de2/src/app/cljs/one/repmax/util.cljs#L5"&gt;&lt;code&gt;clj-&amp;gt;js&lt;/code&gt;&lt;/a&gt; (from &lt;a href="https://twitter.com/ibdknox"&gt;Chris Granger&lt;/a&gt;'s &lt;a href="https://github.com/ibdknox/fetch"&gt;fetch&lt;/a&gt; library)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ohpauleez/shoreleave"&gt;Shoreleave&lt;/a&gt; — up-and-coming collection of ClojureScript libraries&lt;/li&gt;
&lt;li&gt;&lt;a href="http://shop.oreilly.com/product/0636920025139.do" title="ClojureScript: Up and Running — By Stuart Sierra and Luke VanderHart"&gt;ClojureScript: Up and Running&lt;/a&gt; — soon-to-be-beta book from &lt;a href="https://twitter.com/stuartsierra"&gt;Stuart Sierra&lt;/a&gt; and &lt;a href="https://twitter.com/levanderhart"&gt;Luke VanderHart&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=e-2YhiieoE4:XiHeSEPFPms:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=e-2YhiieoE4:XiHeSEPFPms:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?i=e-2YhiieoE4:XiHeSEPFPms:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jasonrudolph/~4/e-2YhiieoE4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jasonrudolph.com/blog/2012/08/17/clojurescript-experience-report-resources/</feedburner:origLink></entry>
 
 <entry>
   <title>Programming Achievements: How to Level Up as a Developer</title>
   <link href="http://feedproxy.google.com/~r/jasonrudolph/~3/_dtrLsGlGS8/" />
   <updated>2011-08-09T00:00:00-04:00</updated>
   <id>http://jasonrudolph.com/blog/2011/08/09/programming-achievements-how-to-level-up-as-a-developer</id>
   <content type="html">&lt;p&gt;How does a good developer become a great developer?&lt;/p&gt;

&lt;p&gt;Forget greatness for a moment: How does a decent developer become a good developer?&lt;/p&gt;

&lt;p&gt;There is no definitive path from Step 1 to Step &lt;em&gt;n&lt;/em&gt;.
Heck, it's not even clear what Step &lt;em&gt;n&lt;/em&gt; is.
And as logically-minded developer types, the lack of a well-defined route can make for a daunting journey from novice to master.&lt;/p&gt;

&lt;p&gt;I've spent a fair bit of time over the last few years bumping up against this conundrum.
What's next?
How do I go from being a good developer to a being &lt;em&gt;really&lt;/em&gt; good developer?&lt;/p&gt;

&lt;h2&gt;What Does Success Look Like?&lt;/h2&gt;

&lt;p&gt;I do my best work when I have a goal with clear, measurable criteria for success.
For example, I want to run a 5-minute mile.
Okay. That's easy to measure, and success is well-defined.
I can figure out how fast I can run a mile now, and the Web is full of advice and training programs for getting faster.
I can choose a training program, work hard, and I can be confident that I'll eventually get where I want to be.
And it's so wonderfully measurable that, every week, I'll know just how close I am to my ultimate goal.&lt;/p&gt;

&lt;p&gt;But how do you measure whether you've attained the rank of "really good developer?"
In short, you can't.
That goal, as stated, is too subjective, too vague, and is simply not measurable.
So how do we find something that &lt;em&gt;is&lt;/em&gt; measurable?&lt;/p&gt;

&lt;p&gt;Much like the goal of wanting to run a 5-minute mile, we can start by looking at where we are as a programmer versus where we want to be.
What experiences has a 5-minute-mile runner exposed himself to that a 10-minute-mile runner is lacking?
What experiences has the master programmer benefited from that the novice programmer is missing?
It's the &lt;strong&gt;experiences&lt;/strong&gt; that matter.&lt;/p&gt;

&lt;p&gt;We've all had specific experiences that clearly advanced our skills as developers.
We've learned a new language that exposed us to a new way of thinking.
Or we crafted the perfect design, only to watch it unveil its gross imperfections in the harsh realities of a production environment.
And we became better programmers because of it.
Some experiences equip you with new techniques.
Others expose you to anti-patterns...and allow you to understand &lt;em&gt;why&lt;/em&gt; they are anti-patterns.
It's these experiences that teach you, that influence your thought process, that influence your approach to problems, that improve your designs.
And conveniently, it's simple to measure whether you've gained a particular experience.
(It might be fun to think of them as &lt;em&gt;achievements&lt;/em&gt;.)&lt;/p&gt;

&lt;p&gt;So it took a while, but I'm becoming more comfortable with the immeasurability of my pending goal: earning the rank of "really good developer."
If such a developer earns this distinction because of his experiences, then maybe we can still have a well-defined path marching in the general direction of "really good developer" and beyond.
I suspect that path looks something like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identify the experiences that advance a person as a developer.&lt;/li&gt;
&lt;li&gt;Select a particular experience to pursue.&lt;/li&gt;
&lt;li&gt;Pursue that experience to completion.  (Achievement unlocked!)&lt;/li&gt;
&lt;li&gt;Reflect on that experience. Really soak it in. [A]&lt;/li&gt;
&lt;li&gt;Return to Step 2, this time selecting a new experience.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;And what better way to get started with Step 1 than to crowdsource it?
Here's a first cut at a list of programming achievements, loosely organized into groups. [B]
I'll offer multiple ways for you to chime in with your thoughts at the end.&lt;/p&gt;

&lt;h2&gt;Achievements&lt;/h2&gt;

&lt;p&gt;&lt;img src="http://jasonrudolph.com/resources/201108-programming-badges.png" title="Programming Achievement Badges (by Michael Parenteau)" alt="Programming Achievement Badges (by Michael Parenteau)" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learn a variety of &lt;a href="http://en.wikipedia.org/wiki/Programming_paradigm" title="Programming paradigm - Wikipedia"&gt;programming paradigms&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write a program in assembly language&lt;/li&gt;
&lt;li&gt;Write an application in a functional language&lt;/li&gt;
&lt;li&gt;Write an application in an object-oriented language&lt;/li&gt;
&lt;li&gt;Write an application in a prototype-based language&lt;/li&gt;
&lt;li&gt;Write an application in a logic programming language&lt;/li&gt;
&lt;li&gt;Write an application using the Actor model&lt;/li&gt;
&lt;li&gt;Write an application in Forth [C]&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Experience the ins and outs of programming for different platforms:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write a nontrivial web app&lt;/li&gt;
&lt;li&gt;Write a nontrivial desktop app&lt;/li&gt;
&lt;li&gt;Write a nontrivial mobile app&lt;/li&gt;
&lt;li&gt;Write an embedded app&lt;/li&gt;
&lt;li&gt;Write a realtime system&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Enhance your understanding of the building blocks that we use as developers:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write a networking client (e.g., HTTP, FTP)&lt;/li&gt;
&lt;li&gt;Write a device driver&lt;/li&gt;
&lt;li&gt;Write a B-tree database&lt;/li&gt;
&lt;li&gt;Wrap an existing library to provide a better (more pleasant) user experience&lt;/li&gt;
&lt;li&gt;Write an application or framework that provides a plugin model&lt;/li&gt;
&lt;li&gt;Write a testing framework&lt;/li&gt;
&lt;li&gt;Write a programming language&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Enlighten yourself with koans, katas, and the wisdom of ages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complete five &lt;a href="http://en.wikipedia.org/wiki/Kata_(programming)" title="Kata (programming) - Wikipedia"&gt;code katas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Complete the &lt;a href="http://sett.ociweb.com/sett/settJan2011.html" title="Learning Programming Languages with Koans - Object Computing, Inc."&gt;programming koans&lt;/a&gt; for a language that you want to learn&lt;/li&gt;
&lt;li&gt;Attend a &lt;a href="http://coderetreat.com/" title="Code Retreat with Corey Haines"&gt;code retreat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Read &lt;a href="http://mitpress.mit.edu/sicp/" title="SICP web site"&gt;SICP&lt;/a&gt; and complete all the exercises&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Program in the open:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contribute to an open source project&lt;/li&gt;
&lt;li&gt;Have a patch accepted&lt;/li&gt;
&lt;li&gt;Earn commit rights on a significant open source project&lt;/li&gt;
&lt;li&gt;Publish an open source project&lt;/li&gt;
&lt;li&gt;Perform a &lt;a href="http://thinkrelevance.com/blog/2007/04/03/twir.html" title="Refactotum"&gt;Refactotum&lt;/a&gt; of an open source project&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Learn by teaching others [D]:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Present a lightning talk&lt;/li&gt;
&lt;li&gt;Present at a local user group&lt;/li&gt;
&lt;li&gt;Present at a conference&lt;/li&gt;
&lt;li&gt;Deliver a training course&lt;/li&gt;
&lt;li&gt;Publish a tutorial&lt;/li&gt;
&lt;li&gt;Publish a constructive code review of an open source project&lt;/li&gt;
&lt;li&gt;Write a programming book&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;About the Achievements&lt;/h2&gt;

&lt;p&gt;Now, let's go meta for a moment. Note that each of these achievements is measurable.
Each one is Boolean: you've either completed it or you haven't.
For example, it's hard to measure whether you've learned a functional language, but it's easy to know whether you've written an app in a functional language.
The latter is observable. Measurable. Boolean.
This measurability applies, quite intentionally, to all of these achievements.&lt;/p&gt;

&lt;p&gt;Admittedly, the measurability isn't perfect.
Consider the achievement of presenting at a conference: you could certainly do a half-assed job just to say you've earned this achievement.
But if you're reading this post, I assume you want to be excellent.
You know that it's lame to phone it in just to cross an item off the list.&lt;/p&gt;

&lt;h2&gt;Since We're Talking About Improvement ...&lt;/h2&gt;

&lt;p&gt;Since we're talking about improvement, what would you change about this list?&lt;/p&gt;

&lt;p&gt;The list is available as a &lt;a href="https://gist.github.com/1133830#file_programming_achievements.md" title="Programming Achievements Gist"&gt;gist&lt;/a&gt; on GitHub.
Feel free to fork it and add more achievements.
(Make sure they're measurable.)&lt;/p&gt;

&lt;p&gt;Or, fork it and mark off the achievements you've already conquered.
You might even flag the one that you're currently working on. (For example, check out these forks from &lt;a href="https://gist.github.com/1134309"&gt;Justin Blake&lt;/a&gt;, &lt;a href="https://gist.github.com/1134276"&gt;Pierre Chapuis&lt;/a&gt;, and &lt;a href="https://gist.github.com/1134044"&gt;Yann Esposito&lt;/a&gt;.) [E]&lt;/p&gt;

&lt;p&gt;Or just sound off in the comments:
What experiences have made you a better developer?
And what achievement will you unlock next?&lt;/p&gt;

&lt;hr /&gt;

&lt;h2&gt;Notes&lt;/h2&gt;

&lt;p&gt;[A] I can't emphasize Step 4 enough.
To get the most out of each achievement, you owe it to yourself to pause and reflect on the experience before you move on to the next one.
Introspect.
Ask yourself what you learned.
Take the time to write down those thoughts.
And even better still, share them with someone else and see how your learnings compare to other people who've also earned this achievement.&lt;/p&gt;

&lt;p&gt;[B] It's interesting to see some aspect of this achievement-based model at work on &lt;a href="http://coderwall.com/achievements"&gt;coderwall.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;[C] Forth is essentially its own paradigm.&lt;/p&gt;

&lt;p&gt;[D] This quote comes to mind: "Whoever teaches learns in the act of teaching ..." — Paulo Freire&lt;/p&gt;

&lt;p&gt;[E] Nathan Hwang has &lt;a href="http://thenoviceoof.github.com/level-up/" title="Nathan Hwang: Leveling up as a developer Log"&gt;developed&lt;/a&gt; and &lt;a href="https://github.com/thenoviceoof/level-up"&gt;open sourced&lt;/a&gt; a tool for visualizing and tracking your journey through these achievements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Updated 8/9/2011 4:32pm UTC&lt;/strong&gt; - Added links to example forks of the achievement list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Updated 11/27/2011 8:10pm UTC&lt;/strong&gt; - Added links to Nathan Hwang's contributions.&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thanks&lt;/strong&gt; to &lt;a href="http://twitter.com/parenteau" title="Michael Parenteau"&gt;Michael Parenteau&lt;/a&gt; for providing the artwork for this post.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thanks&lt;/strong&gt; to &lt;a href="http://michaelnygard.com/" title="Michael Nygard"&gt;Michael Nygard&lt;/a&gt;, &lt;a href="http://vanderburg.org/blog" title="Glenn Vanderburg"&gt;Glenn Vanderburg&lt;/a&gt;, &lt;a href="http://alan.dipert.org/" title="Alan Dipert"&gt;Alan Dipert&lt;/a&gt;, and &lt;a href="http://twitter.com/_vojto" title="Vojtech Rinik"&gt;Vojtech Rinik&lt;/a&gt; for providing feedback on drafts of this post.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=_dtrLsGlGS8:Htzof9dGvX8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=_dtrLsGlGS8:Htzof9dGvX8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?i=_dtrLsGlGS8:Htzof9dGvX8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jasonrudolph/~4/_dtrLsGlGS8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jasonrudolph.com/blog/2011/08/09/programming-achievements-how-to-level-up-as-a-developer/</feedburner:origLink></entry>
 
 <entry>
   <title>Helpful Resources For Upgrading to Rails 3.1</title>
   <link href="http://feedproxy.google.com/~r/jasonrudolph/~3/MBEP3AZF9YQ/" />
   <updated>2011-06-06T00:00:00-04:00</updated>
   <id>http://jasonrudolph.com/blog/2011/06/06/helpful-resources-for-upgrading-to-rails-3-1</id>
   <content type="html">&lt;p&gt;The first &lt;a href="http://weblog.rubyonrails.org/2011/5/22/rails-3-1-release-candidate" title="Riding Rails: Rails 3.1: Release candidate"&gt;Rails 3.1 release candidate&lt;/a&gt; has been out for a couple weeks now, and the official release of 3.1.0 can't be far behind.&lt;/p&gt;

&lt;h2&gt;Upgrading To Rails 3.1&lt;/h2&gt;

&lt;p&gt;I upgraded a Rails 3.0 app to 3.1 this past weekend, and all in all, it was a pretty smooth process.  Along the way, I was grateful to discover a few helpful posts from developers that had already made this journey.  If you're getting ready to upgrade an existing app to Rails 3.1, or if you just want to get a feel for what to expect, I recommend checking out these write-ups.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://railsapps.github.com/installing-rails-3-1.html" title="Read This Before Installing Rails 3.1"&gt;Read This Before Installing Rails 3.1 (Daniel Kehoe)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://davidjrice.co.uk/2011/05/25/how-to-upgrade-a-rails-application-to-version-3-1-0.html" title="David Rice - How to Upgrade to Rails 3.1.0"&gt;How to Upgrade to Rails 3.1.0 (David Rice)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.akitaonrails.com/2011/05/31/migrating-my-blog-over-to-rails-3-1-beta" title="Migrating my blog over to Rails 3.1 beta - AkitaOnRails.com"&gt;Migrating My Blog over to Rails 3.1 Beta (Fabio Akita)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://moocode.com/posts/1-deploying-a-rails-3-1-application-to-production"&gt;Deploying a Rails 3.1 Application to Production (Richard Taylor)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://railscasts.com/episodes/282-upgrading-to-rails-3-1" title="RailsCasts - #282 Upgrading to Rails 3.1"&gt;Upgrading to Rails 3.1 (RailsCasts)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;More Rails 3.1 Resources&lt;/h2&gt;

&lt;p&gt;If you're already up to speed on all the new features in Rails 3.1, then you're ready to give the upgrade a shot.&lt;/p&gt;

&lt;p&gt;Still here?  Well, I'm guessing that means you want to spend a bit more time wrapping your head around what's new in Rails 3.1, and &lt;em&gt;then&lt;/em&gt; you'll be ready for the upgrade.  Good news: you've got quite a few resources to lean on:&lt;/p&gt;

&lt;h3&gt;The Big Picture&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://guides.rubyonrails.org/3_1_release_notes.html" title="Ruby on Rails Guides: Ruby on Rails 3.1 Release Notes"&gt;Rails 3.1 Release Notes (RailsGuides)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://weblog.rubyonrails.org/2011/8/31/rails-3-1-0-has-been-released" title="Riding Rails: Rails 3.1.0 has been released!"&gt;Rails 3.1 Announcement and Overview (Aaron Patterson)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://railscasts.com/episodes/265-rails-3-1-overview" title="RailsCasts - #265 Rails 3.1 Overview"&gt;Rails 3.1 Overview (RailsCasts)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/958283" title="Gist (from Ryan Bates) cataloging the changes between Rails 3.0 and Rails 3.1 beta"&gt;Changelog between 3.0 and 3.1 (Ryan Bates)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Individual Features&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Asset Pipeline

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://guides.rubyonrails.org/asset_pipeline.html" title="Ruby on Rails Guides: Asset Pipeline"&gt;Asset Pipeline Documentation (RailsGuides)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=cGdCI2HhfAU" title="RailsConf 2011, David Heinemeier Hansson Keynote - The Asset Pipeline and Our Post-Modern, Hybrid, Javascript Future"&gt;The Asset Pipeline and Our Post-Modern, Hybrid, Javascript Future (DHH's Keynote at RailsConf 2011)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://railscasts.com/episodes/279-understanding-the-asset-pipeline" title="RailsCasts - #279 Understanding the Asset Pipeline"&gt;Understanding the Asset Pipeline (RailsCasts)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;HTTP Streaming

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://weblog.rubyonrails.org/2011/4/18/why-http-streaming" title="Riding Rails: Why HTTP Streaming?"&gt;Why HTTP Streaming? (Xavier Noria)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://railscasts.com/episodes/266-http-streaming" title="RailsCasts - #266 HTTP Streaming"&gt;HTTP Streaming (RailsCasts)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CoffeeScript

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://railscasts.com/episodes/267-coffeescript-basics" title="RailsCasts - #267 CoffeeScript Basics"&gt;CoffeeScript Basics (RailsCasts)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://coffeescript.org" title="CoffeeScript"&gt;Official CoffeeScript Documentation (coffeescript.org)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Sass

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://railscasts.com/episodes/268-sass-basics" title="RailsCasts - #268 Sass Basics"&gt;Sass Basics (RailsCasts)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sass-lang.com/" title="Sass - Syntactically Awesome Stylesheets"&gt;Official Sass Documentation (sass-lang.com)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://edgerails.info/articles/what-s-new-in-edge-rails/2011/05/06/reversible-migrations/index.html" title="Edge Rails.info :: Reversible Migrations"&gt;Reversible Migrations (Rohit Arondekar)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://weblog.rubyonrails.org/2011/4/21/jquery-new-default" title="Riding Rails: jQuery: New Default"&gt;jQuery as the New Default JavaScript Library (Xavier Noria)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://edgerails.info/articles/what-s-new-in-edge-rails/2011/04/21/activerecord-identity-map/index.html" title="Edge Rails.info :: ActiveRecord Identity Map"&gt;ActiveRecord Identity Map (Josh Kalderimis)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Party On, Dudes&lt;/h2&gt;

&lt;p&gt;If Rails 3.1 has piqued your curiosity, it's definitely worth a quick spike to try out an upgrade.  Just create a branch and give it a shot.  After all, you wrote all those tests for a reason, right?  Take Rails 3.1 for a spin, and let your test suite tell you where things need to be patched up.  What have you got to lose?  &lt;a href="http://www.youtube.com/watch?v=WVXGC896Jdw" title="YouTube - Bill and Ted's Excellent Adventure - The Future Council"&gt;Party on, Dudes!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Updated 8/27/2011&lt;/strong&gt; - Added links to the asset pipeline docs from Ryan Biggs and the new RailsCasts episode on "Understanding the Asset Pipeline."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Updated 9/6/2011&lt;/strong&gt; - Added link to the new RailsCasts episode on "Upgrading to Rails 3.1."  Added link to the official Rails 3.1.0 release announcement and release notes.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=MBEP3AZF9YQ:1R5K5NN7g2I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=MBEP3AZF9YQ:1R5K5NN7g2I:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?i=MBEP3AZF9YQ:1R5K5NN7g2I:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jasonrudolph/~4/MBEP3AZF9YQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jasonrudolph.com/blog/2011/06/06/helpful-resources-for-upgrading-to-rails-3-1/</feedburner:origLink></entry>
 
 <entry>
   <title>Now Available: Getting Started with Grails, Second Edition</title>
   <link href="http://feedproxy.google.com/~r/jasonrudolph/~3/T9Ar9jTjECM/" />
   <updated>2010-02-08T00:00:00-05:00</updated>
   <id>http://jasonrudolph.com/blog/2010/02/08/getting-started-with-grails-second-edition</id>
   <content type="html">&lt;p&gt;&lt;a href="http://www.infoq.com/minibooks/grails-getting-started" title="InfoQ: Getting Started with Grails, Second Edition"&gt;&lt;img src="/resources/201002-gswg2-cover.jpg" alt="Getting Started with Grails, Second Edition" title="Getting Started with Grails, Second Edition" style="float: left; padding-right: .5em;" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first edition of &lt;em&gt;Getting Started with Grails&lt;/em&gt; was &lt;a href="/gswg_reviews.html"&gt;well received&lt;/a&gt;.
Matt Raible even dubbed it
&lt;a href="http://raibledesigns.com/rd/entry/book_reviews_getting_started_with" title="Raible Designs | Reviews: Getting Started with Grails"&gt;"the perfect book to learn the basics of Grails quickly."&lt;/a&gt;
But technology moves fast, and Grails has certainly been no exception.
Much has changed since the days of Grails 0.3—the then-current version of Grails in January, 2007.
So when Scott Davis offered to bring &lt;em&gt;Getting Started with Grails&lt;/em&gt; up to date, who was I to say "No?"&lt;/p&gt;

&lt;p&gt;Today, Scott and I are pleased to announce that the &lt;a href="http://www.infoq.com/minibooks/grails-getting-started" title="InfoQ: Getting Started with Grails, Second Edition"&gt;second edition of &lt;em&gt;Getting Started with Grails&lt;/em&gt;&lt;/a&gt; is now available as a &lt;a href="http://www.infoq.com/minibooks/grails-getting-started" title="InfoQ: Getting Started with Grails, Second Edition"&gt;free PDF&lt;/a&gt; [1].  Or, for those that prefer the crisp feel of the printed page, the &lt;a href="http://www.lulu.com/content/7868425" title="lulu.com - Getting Started with Grails, Second Edition"&gt;paperback version&lt;/a&gt; is available as well.&lt;/p&gt;

&lt;p&gt;In addition to being the &lt;strong&gt;first book fully compatible with &lt;a href="http://www.grails.org/1.2+Release+Notes" title="Grails - 1.2 Release Notes"&gt;Grails 1.2&lt;/a&gt;&lt;/strong&gt;, the second edition expands on the coverage of the first edition.  You'll find entire new sections tackling a variety of key topics from plugins, to codecs, to services, and more.  And thanks to the testability improvements introduced in Grails 1.1, you'll also find an increased emphasis on testing.&lt;/p&gt;

&lt;p&gt;Still here?  What are you waiting for?  &lt;a href="http://www.infoq.com/minibooks/grails-getting-started" title="InfoQ: Getting Started with Grails, Second Edition"&gt;Grab the book&lt;/a&gt; and get started.  We hope you enjoy it!&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;[1] InfoQ requires that you register before you can download the PDF, but registration is free and only takes a moment.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=T9Ar9jTjECM:1MZ0NGQ8pBA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=T9Ar9jTjECM:1MZ0NGQ8pBA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?i=T9Ar9jTjECM:1MZ0NGQ8pBA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jasonrudolph/~4/T9Ar9jTjECM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jasonrudolph.com/blog/2010/02/08/getting-started-with-grails-second-edition/</feedburner:origLink></entry>
 
 <entry>
   <title>Live JavaScript TDD Action Coming to raleigh.rb</title>
   <link href="http://feedproxy.google.com/~r/jasonrudolph/~3/S2ZZImZ82hw/" />
   <updated>2009-07-15T00:00:00-04:00</updated>
   <id>http://jasonrudolph.com/blog/2009/07/15/live-javascript-tdd-action-coming-to-raleighrb</id>
   <content type="html">&lt;p&gt;Next week at raleigh.rb, &lt;a href="http://tech.hickorywind.org/" title="HickoryTech"&gt;Larry Karnowski&lt;/a&gt; and I are pairing up for a round of live test-driven JavaScript development with &lt;a href="http://github.com/relevance/blue-ridge" title="github.com/relevance/blue-ridge - JavaScript BDD Rails Plugin"&gt;Blue Ridge&lt;/a&gt;. Come see how easy and natural it can be to give your JavaScript code the testing love it deserves.&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://www.meetup.com/raleighrb/calendar/10355088/" title="The Raleigh-area Ruby Brigade July Meeting - Javascript Testing in Rails: Fast, Headless, In-browser. Pick Any Three. [Larry Karnowski &amp;amp; Jason Rudolph]"&gt;meetup&lt;/a&gt; is at 7 PM on Tuesday, July 21.  Hope to see you there!&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=S2ZZImZ82hw:pPKstXKKRho:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=S2ZZImZ82hw:pPKstXKKRho:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?i=S2ZZImZ82hw:pPKstXKKRho:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jasonrudolph/~4/S2ZZImZ82hw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jasonrudolph.com/blog/2009/07/15/live-javascript-tdd-action-coming-to-raleighrb/</feedburner:origLink></entry>
 
 <entry>
   <title>Git Up! 10 Reasons to Upgrade Your Old Git Installation</title>
   <link href="http://feedproxy.google.com/~r/jasonrudolph/~3/9hymiLsmXfA/" />
   <updated>2009-05-27T00:00:00-04:00</updated>
   <id>http://jasonrudolph.com/blog/2009/05/27/git-up-10-reasons-to-upgrade-your-old-git-installation</id>
   <content type="html">&lt;p&gt;Git has seen a huge influx of newcomers over the past year.  Many folks installed Git as they read through their first tutorial, got it working, and are still using that same trusty installation today.  But rest assured, Git has not been standing still.&lt;/p&gt;

&lt;p&gt;If you installed Git a year ago (perhaps when Rails made the move in April of last year), you would've grabbed v1.5.5. The Git team has cranked out &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.5.6.txt" title="Git 1.5.6 Release Notes"&gt;five&lt;/a&gt; &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.6.0.txt" title="Git 1.6.0 Release Notes"&gt;feature&lt;/a&gt; &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.6.1.txt" title="Git 1.6.1 Release Notes"&gt;releases&lt;/a&gt; &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.6.2.txt" title="Git 1.6.2 Release Notes"&gt;since&lt;/a&gt; &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.6.3.txt" title="Git 1.6.3 Release Notes"&gt;then&lt;/a&gt;, full of usability improvements, a few new tricks, and, of course, numerous bug fixes.  So it's time for some spring cleaning of your dusty old Git installation.&lt;/p&gt;

&lt;p&gt;If you're not yet sportin' the 1.6.3 hotness, here are ten reasons to Git up!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://flickr.com/photos/midnight-digital/1878360316" title="Image courtesy of Midnight Digital (flickr.com/midnight-digital)"&gt;&lt;img src="http://jasonrudolph.com/resources/20090527-git-up.png" title="Image courtesy of Midnight Digital (flickr.com/midnight-digital)" alt="Git Up!" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Everyone's crazy-fast VCS is even faster: &lt;code&gt;git clone&lt;/code&gt; and &lt;code&gt;git merge&lt;/code&gt; have been rewritten in C. [&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.5.6.txt" title="Git 1.5.6 Release Notes"&gt;1.5.6&lt;/a&gt;] [&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.6.0.txt" title="Git 1.6.0 Release Notes"&gt;1.6.0&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Viewing your staged changes no longer requires a cheatsheet in order to remember the command: &lt;code&gt;git diff --staged&lt;/code&gt; serves as a substantially-more-obvious synonym to &lt;code&gt;git diff --cached&lt;/code&gt;.  [&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.6.1.txt" title="Git 1.6.1 Release Notes"&gt;1.6.1&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Stashes always remember where they came from and make it easy to get back there: &lt;code&gt;git stash branch &amp;lt;branchname&amp;gt; [&amp;lt;stash&amp;gt;]&lt;/code&gt; creates a new branch starting at the commit at which the stash was created, checks out the branch, and applies the stash. The stash is guaranteed to apply cleanly, no matter how much the rest of your fast-movin' repo has changed. [&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.6.0.txt" title="Git 1.6.0 Release Notes"&gt;1.6.0&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you mistype a command, Git offers a helping hand: Clippy says, "It looks like you're trying to use SVN." [&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.6.1.txt" title="Git 1.6.1 Release Notes"&gt;1.6.1&lt;/a&gt;]&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; $ git stat
 git: 'stat' is not a git-command. See 'git --help'.

 Did you mean this?
     status
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Branch navigation adopts basic filesystem navigation idioms: Use &lt;code&gt;git checkout -&lt;/code&gt; to return to the last branch you were on. [&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.6.2.txt" title="Git 1.6.2 Release Notes"&gt;1.6.2&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A visualization of the ancestry tree is available without having to leave your terminal: &lt;code&gt;git log --graph&lt;/code&gt; outputs hot ASCII graph pr0n in full technicolor. [&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.5.6.txt" title="Git 1.5.6 Release Notes"&gt;1.5.6&lt;/a&gt;] [&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.6.3.txt" title="Git 1.6.3 Release Notes"&gt;1.6.3&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt; &lt;a href="http://jasonrudolph.com/resources/20090527_git_log_graph_output.png" title="Full color visualization of the ancestry tree using 'get log --graph'"&gt;&lt;img src="http://jasonrudolph.com/resources/20090527_git_log_graph_output_thumb.png" alt="Full color visualization of the ancestry tree using 'get log --graph'" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Getting a quick, lean log from the command line now requires less typing (and no forced compliments). &lt;code&gt;git log --oneline&lt;/code&gt; replaces the need to use its older, more verbose cousin, &lt;code&gt;git log --pretty=oneline --abbrev-commit&lt;/code&gt;. [&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.6.3.txt" title="Git 1.6.3 Release Notes"&gt;1.6.3&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;del cite="http://jasonrudolph.com/blog/2009/05/27/git-up-10-reasons-to-upgrade-your-old-git-installation/#comment-11129831" datetime="2009-06-20T15:00:00EDT"&gt;Speaking of things that are easier to type, reaching all the way over to hold down that cockamamie Shift key is hard work. Give yourself a break: If you're on OS X, you no longer need to type "HEAD"; "head" works just the same. [&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.5.6.txt" title="Git 1.5.6 Release Notes"&gt;1.5.6&lt;/a&gt;]&lt;/del&gt; &lt;strong&gt;UPDATE&lt;/strong&gt; - As much as I enjoy that vacation from the Shift key, &lt;a href="http://jasonrudolph.com/blog/2009/05/27/git-up-10-reasons-to-upgrade-your-old-git-installation/#comment-11129831" title="Git Up! 10 Reasons to Upgrade Your Old Git Installation - Comment from Junio Hamano (gitster)"&gt;apparently it is unintended behavior and "may even be considered a bug."&lt;/a&gt;  (Thanks to Junio Hamano for providing the inside scoop.) Allow me to present an alternate: Tidying up your list of remote branches is now possible with a single command: &lt;code&gt;git remote update --prune $remote&lt;/code&gt; fetches updates for the named &lt;code&gt;$remote&lt;/code&gt; repository (e.g., "origin") and prunes any stale tracking branches that you have lying around for that &lt;code&gt;$remote&lt;/code&gt; repo. [&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.6.3.txt" title="Git 1.6.3 Release Notes"&gt;1.6.3&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Searching for content no longer means scanning line after line to locate the matching text: &lt;code&gt;git grep&lt;/code&gt; now highlights the matches in color. [&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.6.3.txt" title="Git 1.6.3 Release Notes"&gt;1.6.3&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt; &lt;a href="http://jasonrudolph.com/resources/20090527_git_grep_output.png" title="Colorized output of 'git grep'"&gt;&lt;img src="http://jasonrudolph.com/resources/20090527_git_grep_output_thumb.png" alt="Colorized output of 'git grep'" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The science of Branchology added a few handy new instruments: Use &lt;code&gt;git branch --no-merged&lt;/code&gt; to list the branches that have not yet been merged into the current branch. Use &lt;code&gt;git branch --merged&lt;/code&gt; to see just the opposite. [&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.5.6.txt" title="Git 1.5.6 Release Notes"&gt;1.5.6&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;And this is by no means an exhaustive list.  An upgrade from v1.5.5 to v1.6.3 includes well over 100 improvements.  While no one of these improvements is revolutionary, they each make this awesome VCS just a tad nicer.  And collectively, they make it well worth the upgrade.&lt;/p&gt;

&lt;p&gt;So what are you waiting for?  Invest five minutes right now to &lt;a href="http://git-scm.com/download" title="Git - Fast Version Control System"&gt;upgrade&lt;/a&gt;.  C'mon.  You're sittin' around reading blogs.  What &lt;em&gt;else&lt;/em&gt; have you got to do?  Git up!&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Notes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're on OS X, I recommend using MacPorts for quick and easy upgrades.  Let &lt;a href="http://robsanheim.com/2009/01/14/upgrading-git-via-macports/" title="Panasonic Youth &amp;#8211; Upgrading git via MacPorts"&gt;Rob Sanheim show you the way&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Image courtesy of &lt;a href="http://flickr.com/photos/midnight-digital" title="Flickr: midnight-digital's Photostream"&gt;Midnight Digital (flickr.com/midnight-digital)&lt;/a&gt;. [&lt;a href="http://creativecommons.org/licenses/by-nc-sa/2.0/" title="Creative Commons &amp;mdash; Attribution-Noncommercial-Share Alike 2.0 Generic"&gt;Creative Commons License&lt;/a&gt;]&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=9hymiLsmXfA:u_w9moi0o1Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=9hymiLsmXfA:u_w9moi0o1Y:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?i=9hymiLsmXfA:u_w9moi0o1Y:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jasonrudolph/~4/9hymiLsmXfA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jasonrudolph.com/blog/2009/05/27/git-up-10-reasons-to-upgrade-your-old-git-installation/</feedburner:origLink></entry>
 
 <entry>
   <title>RailsConf 2009: JavaScript Testing in Rails Projects. No, Seriously!</title>
   <link href="http://feedproxy.google.com/~r/jasonrudolph/~3/MZsjdiiwYKY/" />
   <updated>2009-03-24T00:00:00-04:00</updated>
   <id>http://jasonrudolph.com/blog/2009/03/24/railsconf-2009-javascript-testing-in-rails-projects-no-seriously</id>
   <content type="html">&lt;p&gt;Going to RailsConf in Las Vegas this year?  &lt;a href="http://tech.hickorywind.org/" title="HickoryTech"&gt;Larry Karnowski&lt;/a&gt; and I are presenting a session on &lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/8013" title="JavaScript Testing in Rails: Fast, Headless, In-Browser. Pick Any Three"&gt;giving your JavaScript code the testing love it deserves&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/8013" title="JavaScript Testing in Rails: Fast, Headless, In-Browser. Pick Any Three -- RailsConf 2009 - O'Reilly Conferences, May 04 - 07, 2009, Las Vegas, NV"&gt;&lt;img src="http://jasonrudolph.com/resources/200903-railsconf-2009.png" alt="RailsConf 2009" /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our talk is on Tuesday, May 5 at 1:50 PM in Ballroom B.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;JavaScript Testing in Rails: Fast, Headless, In-Browser. Pick Any Three.&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;
You wouldn’t consider developing a Rails application without having a solid test suite for your Ruby code, but you’ve somehow convinced yourself to cross your fingers and look the other way when it comes to JavaScript. It doesn’t have to be that way. In this session, you’ll learn how to apply test-driven and behavior-driven development to your unobtrusive JavaScript code in a Rails-friendly manner.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Hope to see you there!&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=MZsjdiiwYKY:OgZe9zm_ypg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=MZsjdiiwYKY:OgZe9zm_ypg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?i=MZsjdiiwYKY:OgZe9zm_ypg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jasonrudolph/~4/MZsjdiiwYKY" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jasonrudolph.com/blog/2009/03/24/railsconf-2009-javascript-testing-in-rails-projects-no-seriously/</feedburner:origLink></entry>
 
 <entry>
   <title>Developer Day: Evolving Your Git Workflow, and Much More</title>
   <link href="http://feedproxy.google.com/~r/jasonrudolph/~3/t7XcF3MId9c/" />
   <updated>2009-03-12T00:00:00-04:00</updated>
   <id>http://jasonrudolph.com/blog/2009/03/12/developer-day-evolving-your-git-workflow-and-much-more</id>
   <content type="html">&lt;p&gt;Next Saturday, March 21, &lt;a href="http://www.viget.com/" title="Web Strategy, Web Design, Web Development, and Web Marketing at Viget Labs"&gt;Viget Labs&lt;/a&gt; and &lt;a href="http://thinkrelevance.com/" title="Relevance: Agile Development, Consulting and Training"&gt;Relevance, Inc.&lt;/a&gt; are presenting &lt;a href="http://developer-day.com/" title="Developer Day - Durham, NC - March 21st, 2009"&gt;Developer Day&lt;/a&gt;, a one-day conference representing a veritable cornucopia of high-tech awesomeness.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://developer-day.com/" title="Developer Day - Durham, NC - March 21st, 2009"&gt;&lt;img src="http://jasonrudolph.com/resources/200903-developer-day.png" alt="200903 Developer Day" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's the rundown:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Staying current with the ever-evolving technological possibilities can be challenging, but you love trying. Why? Because you’re a fantastic web developer who loves building things, (and, frankly, that's just how you roll).&lt;br/&gt;&lt;br/&gt;
Which is why this conference is perfect for you.&lt;br/&gt;&lt;br/&gt;
Hear eight presentations given by active practitioners on topics ranging from JavaScript and Scala to Rails performance and security. Each is tailored to give you insight into various topics that may positively influence how you work, regardless of your specialization.&lt;br/&gt;&lt;br/&gt;
So, come meet cool people, eat some lunch (from local Durham restaurants), and give yourself the day to learn and participate in several great discussions — all for the low, low price of $50.&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;I'll be speaking about taking your &lt;a href="http://git-scm.com/" title="Git - Fast Version Control System"&gt;Git&lt;/a&gt;-fu to the next level.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Evolving Your Git Workflow&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;
Git has attracted many developers away from various centralized source control tools, but it’s easy to find yourself using Git like a slightly-better variant of your old VCS. “You don’t even have to be online to commit. Cool!” That’s a nice touch, but Git has way more to offer, and by picking up a few intermediate and advanced Git techniques, you can save a ton of time (and sanity) for yourself and your team.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Check out the &lt;a href="http://developer-day.com/" title="Developer Day - Durham, NC - March 21st, 2009"&gt;site&lt;/a&gt; for registration and full details. Hope to see you there!&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=t7XcF3MId9c:UeAw8ggCq1s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=t7XcF3MId9c:UeAw8ggCq1s:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?i=t7XcF3MId9c:UeAw8ggCq1s:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jasonrudolph/~4/t7XcF3MId9c" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jasonrudolph.com/blog/2009/03/12/developer-day-evolving-your-git-workflow-and-much-more/</feedburner:origLink></entry>
 
 
</feed>
