Over the past three weeks I’ve begun my apprenticeship at thoughtbot. The apprenticeship lasts until the end of March. I’m joined by designers Paul Webb and Edwin Morris, and fellow coder apprentice Alex Patriquin. Each of us is assigned to a mentor, who makes sure we absorb as much as possible of the thoughtbot way of doing things and achieve our specific goals. For me, the apprenticeship is a couple of things: it’s a chance to work in coder nirvana (TDD, heavy refactoring, bookshelf full of great literature, 5-minute meetings, pair programming, investment days, open source - the works), and it’s a chance to vastly increase my Rails skills in a bootcamp-style training environment.
My head is swimming with new knowledge. I entered this state the first day, and I’ve been there constantly for the past three weeks. Each evening I ride the T home with my poor neurons about to burst with new activity. At night while I sleep my brain indexes all this new knowledge, and the next day I dive in again. If you’ve ever read Ender’s Game, it’s sort of like Battle School for Geeks.
Let’s get specific. This list is long because I’ve been truly busy. In the past three weeks I have:
Did I mention I’ve been busy? That’s just the first three weeks - and I’ve got ten weeks left. I feel excited, involved, and challenged in a completely invigorating way. The team here is universally smart and helpful, and while I’m here I simply can’t help but get better by osmosis at what I do. This is the most fun I’ve had in an office in a long time.
For more information about this program, and to sign up to sponsor a pool of apprentices, visit apprentice.io
More later on,
Josh just dropped some sweet, sweet ZSH knowledge. I spend a lot of time in the directories under $HOME/thoughtbot/ and $HOME/src, and to get there I type (for example) cd ~/thoughtbot/hoptoad. There is a better way!
First, add this to your ~/.zshrc and source it:
setopt auto_cd
cdpath=($HOME/thoughtbot $HOME/src)
Obviously, use different paths in cdpath depending on which directories you cd into a lot.
Now let’s try it out:
$ cd rspec-core # Autocompleted from rspe<TAB>
$ pwd
/Users/gabe/src/rspec-core
$ cd hoptoad
$ pwd
/Users/gabe/thoughtbot/hoptoad
Seriously, check out your coworkers’ dotfiles. It can improve your workflow efficiency by an order of magnitude. Like most of the Thoughtbot crew, Josh keeps his dotfiles on Github.
The first time you push a git branch to a remote, you have to be explicit the first time:
git push origin my-branch-name
Every time after that, a simple git push will work fine. But there’s a ~/.gitconfig setting that will let you just git push without needing that initial explicitness:
[push]
# Push current branch even if you've never pushed it before
default = current
You might want to take a look at my gitconfig for more tips.

Today is my last day as an apprentice at thoughtbot. I am incredibly sad to be leaving but, at the same time I am jazzed about all the new stuff I learned this summer. I thought I would share a few things learned about what my role was and how to get the most possible value out of an apprenticeship on my way out the door.
Apprenticeship is a way to learn about being a professional software developer. Specifically, it is a way to learn to be like the most skilled software developers you can find. It involves seeking out good teachers, and taking opportunities to learn by working alongside them. It is the first step on the road toward becoming a different kind of software professional—one who wants to be more than just competent.
—Apprenticeship Patterns by David H. Hoover and Adewale Oshineye (a great book for any apprentice)
At thoughtbot my role as apprentice has meant that I worked on client and internal projects. It was nothing like most internships: the only time I got coffee it was for myself. Shipping code every day, even to production. I was able to learn about the real world problems developers face and how professionals like the folks at thoughtbot go about solving them.
An apprenticeship doesn’t need to be formal. Go to developer events (if you’re in Boston checkout Boston.rb) and make friends with developers. Once you are close with them ask them to take a look at some code, ask if they’ll sit down and pair with you on something you’re working on. Contribute to open source and learn from the comments on your pull requests (thoughtbot has some great projects to get started on).
My first few days at thoughtbot I posted every question I had in the campfire chat. Why not? I had all these great developers around me I should ask them for help. Then one day my mentor Harold posted the guide to asking smart questions (I think lgtfy also showed up a few times). While it may be true that there’s no such thing as a stupid question don’t waste your mentor’s time, google it first.
One day I asked Harold if I could pair with him. He responded, “Don’t ask just come sit down”. Ever since whenever I wasn’t sure what to do I would sit down and pair with Harold. I think that I will miss that more than anything else. I learned about some crazy vim keybindings, about elegant code, and about how to test drive development. Sitting next to Harold and watching him code led me to ask questions I didn’t know I had and taught me new things about Ruby and Javascript.
One thing they do religiously at thoughtbot is feature-branch code reviews. This meant that every line of code I wrote was looked at by other developers. This not only caught my mistakes, it also taught me about best practices and refactorings.
If you ever have an opportunity like the one thoughtbot offered me, don’t hesitate, take it. This summer has been amazing, every day I wrote code I couldn’t have written the day before. I also got an inside look at the way software gets built. I now understand user stories, TDD, wire-framing and a myriad of other things.
It’s been a pleasure working here.
Over and out.