I am software cultivator with over ten years of professional experience, and a focus on sustainable software development. I specialize in germinating, growing and adapting systems and teams at a steady, dependable pace – reliably delivering value while avoiding burnout. I am also a craftsman who takes pride in my work and constantly strives to improve my skill.
I draw upon a wide range of experience when tackling problems. From realtime embedded signal processors in assembly language, to IP networking middleware in C++, to test automation systems in C# and TCL, to enterprise web apps in Ruby on Rails, to cloud-based developer tools, and dozens more along the way – I bring a broad perspective to the projects I work on.
I’m particularly good with Ruby and Rails. I’ve been developing with Ruby for nearly ten years (yes, it really has been around that long!), and with Rails for three. I’ve also been working with distributed systems in one form or another for most of my career.
I have led and participated in geographically distributed teams since 2007, and I know what it takes to make a dispersed agile team succeed. If you are thinking of tapping into the rich talent pool available to a distributed organization, I can help.
I live and work at home with my beautiful and growing family in South-Central PA. I’m a strong believer in building up the local community. I organize the York Coworking group and am an active member in the Baltimore and Central PA Ruby/Rails community.
Writer, editor, and podcaster building a community around geographically dispersed teams & remote work.
Lead developer for distributed teams developing clinical research management software in Ruby on Rails.
Hey, remember when I said I’d finish Confident Ruby by September 1, 2012? Ha ha! That was a funny joke!
Seriously though, this book has taken much longer than intended, partly as the scope grew, but mostly because of other projects getting in the way. Such as the launch of RubyTapas. I’m hugely appreciative of all the early-access buyers who supported the project and have been patient through this process.
Those early buyers have already heard the news, but now I’m letting the rest of the world know: as of now, Confident Ruby is finally content-complete and entering a Beta phase. That means that while there is plenty of editing, clean-up, and tweaking to do, all the major content (a little over 150 pages’ worth) is now in place.
I intend to spend one month getting Confident Ruby into shape for a final release. At the end of that month, I will be raising the price to $35. Until then, you can still get it for $25. As always, if you don’t have the scratch you can send me a postcard instead.
Curious about what’s inside? The nutshell version is that this is a patterns book, focused on the method level of code. It’s all about how to make methods that are “confident”: that is, they tell a clear, straightforward story without a lot of distracting provisos and digressions. In order to get you from “timid” code to confident code, I lay out 32 patterns for collecting input, delivering output, and handling failure within a method. There’s a strong emphasis throughout on removing the scourge of nil values from code, and replacing them with more semantically meaningful constructs.
Here’s the current table of contents, if you’re curious:
And here’s a video of the talk that started it all:
http://www.youtube.com/watch?v=T8J0j2xJFgQ
And here’s that big friendly “buy now” button again!
On May 22, the 100th episode of RubyTapas will arrive in subscribers’ inboxes and RSS readers, and I’m marking the occasion with a great big giveaway! I’ve got a whole pile of eBooks and other goodies to give out. Check out these prizes, and check back later because I may be adding more before I’m done!
UPDATE: This giveaway is now over. Thanks to everyone who entered, and congrats to the winners!
Everyone who enters will receive a 20% discount for Cloudapp Pro and 10% discount on all AppSignal plans for the first 12 months! Yep, everyone!
One lucky winner will receive:
Two winners will receive this package:
97 more winners will receive the following prizes:
Just fill out the form below! All entries must be submitted by May 21st at 23:59 UTC. I’ll announce the winners on this blog on May 22nd.
At the borders of our systems, mockist testing hits a point of diminishing returns. In this free episode we take a look at when to stop mocking and start integration testing.
Some functions are useful in many different contexts. In this free episode we’ll explore some ways to make them available both to library code and to client code of a library.
I have a few ongoing miniseries in RubyTapas. In this, the second installment of a miniseries chronicling the creation of a Rubygems plugin and an associated server, I touch on a number of topics including acceptance testing, the shellwords standard library, the TDD rhythm, and the DataMapper ORM.
Today’s cautionary episode demonstrates and explains a Hash gotcha that often comes as a surprise.
Does code optimized for RAM usage need to be ugly? Find out, in this free episode of RubyTapas.
Sometimes it’s hard to decide how to handle a failure in a method call. Raise an exception? Return a nil? Log an error? The best choice may differ depending on where the method is being called. In today’s free RubyTapas episode, we look at a technique for deferring the decision about how to deal with a failure to the point when a method is called.
About seven months ago I officially put out my shingle as a consulting pair-programmer. Since then I’ve logged around 250 hours of pair programming with at least 60 different programming partners. Most of that was paid sessions, but I also did one free Open-Source session per week. Until RubyTapas subscriptions started shooting up at the end of last year, pair programming was my primary source of income.
“Consulting pair programmer” isn’t exactly a crowded niche. I know of some other freelance programmers who do a lot of remote pairing, but I’ve yet to hear of anyone else making a living on short (2-hour) sessions with many different clients. I wasn’t at all sure what the response would be like when I started the experiment. I half expected that I’d get an initial burst of interest which would then tail off after a month or two.
In actuality, the response has yet to abate. I’ve had little trouble filling my available time with pairing appointments, and I’m still receiving a steady stream of new inquiries every week. All this from no PR other than some links on my blog and an occasional mention on Twitter or Ruby Rogues.
It’s been a remarkable experience. Getting to see the Ruby world from the perspective of many different programmers with a broad range of experience has been incredibly valuable. Especially as someone who tries to put a lot of educational material out, I can’t think of a better way to get an idea of where people are coming from, and what concepts they have the most trouble with.
It has also been exhausting. As anyone who with pair-programming experience knows, a productive pairing session can leave you much more drained than the equivalent amount of time spent solo coding. Pairing keeps the focus and energy high. Not to mention that when people are paying for my time, I have a strong imperative to be 100% “on” from beginning to end. Some days I did four sessions—that’s four different people, working on four different projects—in a row. Those were exhilarating days, but also some of the most tiring I’ve known in my career.
In late September I launched RubyTapas, my subscription screencast service. Since then it has grown by leaps and bounds. As of today it has well over 1000 subscribers. This has caused a shift in my priorities. I’m no longer a consultant with some products on the side. RubyTapas is my primary source of income, and hence it is now my focus.
The months of transition, during which RubyTapas wasn’t yet big enough to support us, but still required a great deal of time in order to turn out three videos a week, were difficult. Keeping up with enough pairing sessions to pay the bills; spending many hours writing, recording, and editing videos; and oh yeah, also dealing with a new baby with only a tenuous grasp on the concept of “sleep”… let’s just say I didn’t get a lot of rest. We talk about technical debt; I feel like I’ve run up some stress debt which it’s now time to pay down.
Which is why I’ve decided to put my pairing services on hiatus for a while. I’m going to focus on making videos, finishing Confident Ruby, and on my rather full 2013 conference schedule. I’ll obviously be keeping my scheduled appointments, and those of you on my OSS pairing queue: don’t worry, I’ll keep going down the list. But I’m taking down my pairing contact form for now.
There’s a lot I could write about my experiences pairing with so many different developers. I’m not really sure where to start though, so I’d like to open the floor instead. What would you like to know? As they say on Reddit: AMA!
In this episode, Amos King, talks about his experiences working remotely and gives a pretty cool background noise resource for those lonely times.
Amos King (twitter github blog)
In this episode, Amos King, talks about his experiences working remotely and gives a pretty cool background noise resource for those lonely times. Show Notes: Amos King (twitter github blog) 00:39 - Amos King Introduction 01:43 - Commute 03:02 - Asynchronous Communication 04:44 - Backgound Noise 06:25 - Companies & Promoting Remote Work 08:16 - Transitioning into working remotely 13:18 - Amosâ Office 16:21 - Having spare time 17:47 - This Agile Life Podcast
In this episode, J Sherwani and Vishal Kapur talk about Screenhero: a new and convenient collaborative screen sharing application.
Vishal Kapur (twitter github linkedin)
In this episode, J Sherwani and Vishal Kapur talk about Screenhero: a new and convenient collaborative screen sharing application. Show Notes: J Sherwani (twitter linkedin) Vishal Kapur (twitter github linkedin) 01:01 - J Sherwani Introduction 01:35 - Vishal Kapur Introduction 02:17 - Screenhero 02:43 - Presentation Tools vs Collaboration Tools 05:10 - Proxying 05:54 - Inventing Screenhero 08:15 - The Screenhero Team 09:48 - Use Cases 12:49 - Proxying Desktop Audio 13:41 - Feature Requests 15:34 - In The Works/Improving Screenhero 18:33 - Using Screenhero while Collocated 20:31 - Mobile to Mobile App 23:26 - Work for Screenhero!
In this episode, Ernie Miller of LivingSocial, talks about his transition into managing a dispersed team, “Optimizing for Happiness”, and dealing with distraction.
Ernie Miller (twitter github blog)
In this episode, Ernie Miller of LivingSocial, talks about his transition into managing a dispersed team, "Optimizing for Happiness", and dealing with distraction. Show Notes: Ernie Miller (twitter github blog) 00:41 - Ernie Miller Introduction 01:07 - Transition to leading a dispersed team 02:25 - Remote Working Days 03:31 - âOptimizing for Happinessâ 06:52 - Dealing with Recruiters 09:26 - Considering Remote Work 12:02 - Dealing with Distraction 15:25 - Remote Meetings 16:51 - Ernieâs Remote Team
In this episode, Nick Adams of Hudl and remotejobs.co, talks about living and working in Rochester, New York, and starting a remote jobs board for companies dedicated to specifically hiring remote workers and people specifically looking to be them.
Nick Adams (twitter github blog)
In this episode, Nick Adams of Hudl and remotejobs.co, talks about living and working in Rochester, New York, and starting a remote jobs board for companies dedicated to specifically hiring remote workers and people specifically looking to be them. Show Notes: Nick Adams (twitter github blog) 00:37 - Nick Adams Introduction 01:35 - Hudl as a Distributed Team 02:02 - Nickâs history with remote work 04:29 - Tools 07:46 - Challenges of working remotely 09:08 - Making Hudl a dispersed team 09:42 - Living in Rochester, New York 13:21 - remotejobs.co 19:39 - Advice for companies looking to hire remote workers
In this episode, Jonathan Mason, of VersaPay, talks about life living in Victoria, British Columbia, and the importance of documentation and visibility to others while working on a distributed team.
Jonathan Mason (twitter github)
In this episode, Jonathan Mason, of VersaPay, talks about life living in Victoria, British Columbia, and the importance of documentation and visibility to others while working on a distributed team. Show Notes: Jonathan Mason (twitter github) 01:28 - Introduction 02:45 - Life in Victoria 05:55 - VersaPay and itâs distributed team 07:32 - Team Work Process 10:22 - Challenges of working on a remote team 15:01 - In-person Team Interaction
In this episode, Elliot Rodriguez talks about his experiences on a distributed team, overcoming isolation, and being able to work remotely for as long as possible.
Elliot Rodriguez (linkedin)
In this episode, Elliot Rodriguez talks about his experiences on a distributed team, overcoming isolation, and being able to work remotely for as long as possible. Show Notes: Elliot Rodriguez (linkedin) 00:54 - Elliot Rodriguez Introduction 02:04 - Wanting to work from home 05:54 - Working with a distributed team 12:25 - Video Conferencing 13:15 - Overcoming Isolation 14:23 - Ideal Work Environment 16:05 - Sticking with the remote working lifestyle
In this episode, Zee Spencer dives deeply into the remote pair programming aspect of working remotely, covering topics such as pairing pitfalls, remote work station setups, and ways that the process could be improved.
Zee Spencer (twitter github blog Growing Developers Podcast)
In this episode, Zee Spencer dives deeply into the remote pair programming aspect of working remotely, covering topics such as pairing pitfalls, remote work station setups, and ways that the process could be improved. Show Notes: Zee Spencer (twitter github blog Growing Developers Podcast) 00:57 - Zee Spencer Introduction 01:41 - History with Remote Work 05:04 - Pair Programming 11:08 - Pairing Pitfalls 13:28 - Remote Pairing Setup 20:23 - The State of the Art in Pair Programming 22:56 - Dev Bootcamp
In this episode, software engineer Javier Gonel, talks about living and working remotely from Greece and why he enjoys commuting and having the freedom to work from interesting places.
In this episode, software engineer Javier Gonel, talks about living and working remotely from Greece and why he enjoys commuting and having the freedom to work from interesting places. Show Notes: 01:11 - Javier Gonel Introduction 03:37 - Working Remotely 07:19 - Benefits of Working Remotely 08:46 - Enjoying Commuting 09:42 - Working from Interesting Places 13:34 - Advice for people thinking about moving to remote work
In this episode, James Costa and Matt Herron of The Phuse, discuss task management, overlap meetings, and the concept of code audits.
In this episode, James Costa and Matt Herron of The Phuse, discuss task management, overlap meetings, and the concept of code audits. Show Notes: 01:04 - James Costa (twitter blog) Introduction 01:20 - Matt Herron (twitter) 01:31 - The Phuse (site twitter blog dribbble) 02:43 - History of being a remote company 05:54 - Task Management 09:00 - Overlap Meetings 11:00 - In-person Meetings 12:48 - Benefits of having a distributed team 16:27 - Code Audits 18:33 - Distributed working challenges
In this episode, Eric Farkas of TalentSoup, talks dealing with timezone disparities, overcoming cultural differences, and sharing values with others for successful remote work.
In this episode, Eric Farkas of TalentSoup, talks dealing with timezone disparities, overcoming cultural differences, and sharing values with others for successful remote work. Show Notes: 00:37 - Eric Farkas (twitter blog) Introduction 00:59 - Working Remotely 02:31 - Dealing with Timezone Disparities 03:36 - Cultural Differences 05:29 - Working for TalentSoup Remotely 09:40 - Day to Day Life & Communication 13:11 - Yahoo says no to telecommuting 15:02 - Advice for people seeking remote work