Fog Creek

dev.life – Interview with Richard Schneeman

In dev.life, we chat with developers about their passion for programming: how they got into it, what they like to work on and how.

Today’s guest is Richard Schneeman, a Software Engineer at Heroku, who is a Rails contributor and co-organizer of the Keep Ruby Weird conference. He also created Code Triage, a tool that encourages you to contribute to open source projects and help out maintainers. There’s more on his blog.


Richard Schneeman
Location: Austin, TX, US
Current Role: Software Engineer at Heroku

How did you get into software development?

I got my first real computer when I was 8, I spent hours installing DOS games, my favorites were “Star Wars: Rebel Assault” and the “Kings Quest” series. I dabbled with HTML and CSS in the Geocities days but wasn’t really interested. The first programming language I ever tried was QBasic. I’ve heard it said that you’ll never learn to use an object-oriented language correctly if your first language was BASIC. The QBasic language taught me a ton about logic and flow but did make learning Ruby, my current language of choice, a bit difficult. I still remember when I first discovered methods in another language. I thought “wow, it’s like a named GOTO”. My experience with QBasic also lead me to believe that all programming was inherently difficult and insanely slow, so I decided that it wasn’t for me.

I went to school at Georgia Tech where I had to use MATLAB for my Mechanical Engineering degree. The procedural nature matched perfectly with QBasic and I was happily writing methods that were hundreds of lines long. It wasn’t until the Sophmore-junior year that I became interested in building dynamic web apps. I asked a friend who was a CS major “how would you build a site like Digg”, he looked into it and apparently they used something called “Ruby on Rails”. I must have gone through a half dozen books just trying to get Ruby installed on my windows machine. The first version I got running was 0.9. From there I slowly fell in love with the Ruby language, it was so expressive and powerful. What would have taken me 10 lines to do in QBasic or MATLAB was a one liner in Ruby. It felt right.

I dabbled in building web apps for a few years, eventually graduated and got a job at National Instruments where one of the core tenets is learning by teaching. I took that lesson and started offering free Rails courses through a student organization at the University of Texas. That little trick worked. I leveled up on my programming game and got some attention from the Austin developer community. I got my first job programming at a company called Gowalla after they saw some videos I posted online from the course. I haven’t quit writing Ruby professionally since.

kingsQuest

Tell us a little about your current role

I work in the “Language Team” at Heroku. If you’re not familiar with Heroku, we are a platform that lets you automatically provision and deploy a running version of your web app in minutes instead of hours. Each language we support has at least one dedicated employee. Together with Terence Lee, we maintain the Ruby language experience for the platform. This means we maintain the Ruby buildpack which is responsible for detecting and installing your Ruby version as well as dependencies. We also write and edit platform documentation, answer escalated customer support tickets and advise on best practices. In essence, we’re responsible for making sure anyone using Ruby on the platform is having a good experience.

We also work with external libraries to solve problems upstream. Most commonly for me this means working in Rails. Recently I’ve been increasingly interested in performance and memory consumption, I’ve spent a good amount of time reading performance textbooks, and writing tooling to help me benchmark performance and memory issues. Most recently I was able to squeeze out a 10% performance improvement in Rails for my test case.

When I’m not putting out fires or working with open source: I enjoy going to conferences to meet Ruby developers face-to-face. To date, I’ve spoken at 24 conferences in 12 countries, I’m still waiting for someone to throw a “Ruby Antartica” conference.

I’m currently organizing a conference in Austin at the end of October called Keep Ruby Weird. But in general, I like to think of ways to empower or enhance other developers. My two longest-term projects are codetriage.com and docsdoctor.org. The focus is to give every developer the visibility and motivation to get involved in open source. Codetriage helps you get involved with a repo’s issues and pull requests while DocsDoctor helps you find easy documentation patches that you could submit. Contributing to open source doesn’t have to be a full-time job and every little bit adds up.

For something more recent, I wrote a project for fun that involves a Ruby program parsing it’s own source code to find performance optimizations. The goal of the project is to find areas where a string literal could be frozen, the project is appropriately named let_it_go. It’s not terribly practical, but I learned a bunch while writing it. I think it’s a good practice to program things when you get the itch, even if they’re not obviously useful. As children we learn when we play, as adults we stop playing and we stop learning as rapidly. While working on this project, I ran into 2 different things that are currently impossible to do in Ruby, which was definitely a challenge. I reached out to the community at large through Stack Overflow (issue 1, 2). I found experts who had written blog posts about those aspects of Ruby and contacted them directly via twitter. I also used ‘git blame‘ to see who wrote some of the code involved and reached out to them. Basically, I was looking for anyone with more experience than me.

After getting confirmation of what was possible and not, I was able to blend techniques to build a working prototype. Sometimes the best way to move forwards is to figure out all the things you can’t do.

macError

When are you at your happiest whilst coding?

I’m the happiest when I’m in the shower thinking about all the code I’m about to write. I usually get really psyched up and write a bunch of code right after. I love the feeling when I’ve got a coffee at my side, headphones turned up, and I know exactly what I need to do to solve a problem I’ve been working on.

I get really excited about optimizing performance and experiences. I get frustrated very easily, so anytime I can use programming to take away my frustration is a golden opportunity. I love adding constructive errors to projects. I hate when something fails, and it takes me hours to figure out what went wrong when the program easily could have told me.

I also enjoy deep diving into large libraries using only Ruby, for which the Method class is really useful. I write little mini journal entries to myself as if I’m an archeologist discovering ancient methods and classes. At the end I often find the bug I’m looking to fix and I understand that system much better.

What is your dev environment?

My editor is Sublime Text 2. I sometimes teach, so I try to use the same tools as my students. I use a MacBook Air 13″. GitX is my guilty pleasure for viewing unmerged git changes. I abuse Evernote like crazy, I store scripts, notes, todo’s and benchmark results. I don’t think I could program without it. I use Dropbox to store presentations when I’m traveling. This one time in Japan I spilled coffee all over my computer and had to run to the Apple Store in Ginza to get a new one. I’ve been paranoid ever since. Dash is great for viewing docs without an internet connection. I like collaborative editing of non-code writing with Draft.

I work remotely, so I mostly code sitting on a couch or on a stool in my kitchen. I’ve got a coffee addiction, I have to cut myself off at 2 pm or I won’t be able to fall asleep. I’ve got really large ears, so most headphones are uncomfortable. I use Sennheiser HD 280 PRO at home and Bose QuietComfort 20i when I’m traveling.

Locally I use chruby, which is a minimal Ruby version switcher. To install rubies either I use ruby-install or compile manually. Iterm 2 is my terminal of choice. I also love bundler. When I’m flying ‘$ bundle install –local‘ is my personal hero. When I’m debugging gems ‘$ bundle open ‘ is super fast. Even when I’m pushing my own gems to rubygems.org I’m able to use the bundle tasks and ‘$ bundle exec rake release‘ to tag, push, and release my gem all at once.

I’m able to do most of my work locally when I need to get on another machine I use and Heroku’s ‘$ heroku run bash‘ which gives me an ephemeral remote session. When I need to modify scripts remotely I use Vim paired with Heroku Vim. I also find Heroku’s metrics dashboard really useful in high-level performance debugging.

What are your favorite books or resources about development?

I really like Ruby Weekly for keeping a pulse on what’s new in Ruby. I’ve really enjoyed Sam Saffron’s blog for some really good memory profiling and debugging. Recently I’ve been digging into Operating System Concepts which has helped merge some of my practical performance optimizing experiences with some OS theory I missed out by not getting a CS degree. Probably my favorite Ruby book would be Metaprogramming Ruby which really helped me solidify many of the core concepts and architectural underpinnings of Ruby.

What technologies are you currently trying out or want an excuse to try?

I know that Go and Elixir right now are really popular among Rubyists. I’ve been going trying to go the other way on the programming abstraction tree by getting better at C. I met Joel Scotkin at Devs Love Bacon 2013 who talked about autonomous rocket-powered landers. When asked what amazing language powered the company’s creations, he answered that it was good old-fashioned C. I find the language very understandable and extremely fast. I’ve been increasingly interested in getting into developing in the MRI Ruby interpreter which is written in C too.

When not coding, what do you like to do?

I’ve been going cable boarding at Quest ATX. Cable boarding is like wakeboarding without a boat. I’m just learning how to do some jumps off the teflon coated “kickers”. I’ve also been enamored by woodworking, I built a dining room table:

workedTable

Right now I’m into hand tools and doing most of the work in my backyard. Building physical things with my hands brings me some peace and balance after spending the whole day wrapped up in my own mind. I just got off of paternity leave and I’ve been enjoying watching my son grow. Right now we’re working on holding eye contact and smiling.

What advice would you give to a younger version of yourself starting out in development?

I wish I could have told myself to get involved with the community way earlier. The “Austin on Rails” group has a “socialization practice” after meetings which is shorthand for going to hang out at a bar. I went to meetings for years before I thought I was “good enough” to go to the socialization section. I was somehow convinced that people would grill me about my programming knowledge and unveil my status as a “non-professional” coder. When I went for the first time, I met really great people who were warm and welcoming. Since then, the community has been a constant source of strength.

 

Thanks to Richard for taking the time to speak with us. Have someone you’d like to be a guest? Let us know @FogCreek.

Recent dev.life Interviews

Saron Yitbarek
Saron Yitbarek
Allie Schwartz
Allie Schwartz
Lindi Emoungu
Lindi Emoungu
Jude Allred
Jude Allred