I’ve fallen in love with consul. At first glance, it’s a bit like zookeeper or etcd — it handles service discovery, health checking, and even features a very simple k/v store. But consul does much more than merely expose a lovely DNS interface: one of its more powerful features is its ability to do cluster orchestration, efficiently and effectively propagating messages to all nodes. One of my client projects runs on a dozen servers across two applications; here’s how I integrated CircleCI, chef, and consul together to make any GitHub commit run a deploy only to the targeted application, without needing to know any application server’s name or IP address.
It’s been a few years since I last went to Windy City Rails, despite the fact that it’s oh-so-convenient and there are so many high-quality Ruby and Rails developers in Chicago. I decided to go this year and, for those not able to come, provide small synopses of the presentations. So, without further ado, I present: Windy City Rails 2014, Day One.
So you want to become a programmer, huh?
Maybe it’s because President Obama told you to learn computer science, and you’re not gonna argue with the President.
Or maybe it’s because you hunger to make something — a product other people use — and you’re tired of a job where, at the end of the day, you wonder what exactly you did or why it even mattered. And hey, making software is easier and cleaner than making furniture.
But realistically it’s probably because of the money. Glassdoor claims that software engineers make a median salary of $85,000, which is nothing to sneeze at. Even the lowliest programmers can look forward to taking home about $60k, and if you have a talent and drive for programming, then the only limit to your salary is your ambition.
All well and good. But how do you go from a casual smartphone owner and recreational computer user to actually making software? And then how do you turn making software into real money that appears in your wallet and bank account?
After my article on consulting in Rails, easily the most-asked question I received was: “How do I become a programmer, and what do I do when I get there?” No one is born with a keyboard strapped to their hands: every programmer you know learned how to do it. I did too. Here I’ll describe what I found most helpful for getting into programming, how I’d do it again if I had to, and what you should keep in mind if you decide to set off on the programmer’s path.
This post is extremely long. But hopefully by the end of it, you’ll have some clear ideas and inspirations for how to turn yourself into a real, honest-to-goodness programmer.
I don’t usually call out articles on Hacker News for being exceptionally silly — if I did I wouldn’t have the time to write about anything else — but I saw one in particular tonight that bugged me, titled Your Job Is Not To Code. It was filled with the sort of engineering platitudes that one can reliably expect from HN: you must be an engineering ambassador to your company from the strange and incomprehensible Codingverse. It’s up to you to interpret and reinterpret the requirements of your project, hopefully better than its stakeholders, and tell them what they’re doing wrong. Your technical skills must be married to the sort of interpersonal skills that would make ambassadors and diplomats blush.
This is all bunk.
If you’re an engineer, then your job is to code. Your job is to be good at it. No, more than that: your job is to be great at it. Anything less is a disservice to the people who’ve hired you and a disservice to yourself. You should work constantly to succeed at your job. Working towards anything else is a distraction.
As developers, we spend a lot of time in our shells: making them fast and responsive improves our productivity. I play around with a lot of development tools (as I mentioned in a previous post) trying to find the best combination of intelligence, responsiveness, and fun. Recently I was investigating alternatives to oh-my-zsh, which is a wonderful set of Zsh packages but suffers from weird slowdowns and, unfortunately, requires a lot of configuration. I stumbled upon prezto and I love it — originally an optimized fork of oh-my-zsh, it’s now its own project, and it is fast, beautiful, and leverages the full power of Zsh. It looks like this:
You should get it. And when you do, use these configuration settings to make your experience even better.
I’ve been creating a complicated OpsWorks server setup for a client, as I mentioned in my last post, and I’ve been really enjoying the process. OpsWorks, while still a beta service, has a lot to recommend itself: it couples the best parts of chef to the power of the impressive AWS APIs. Using OpsWorks, it’s easy to make processes that seem almost magical.
How magical? Well, imagine super-fast command line deploys, seamless cookbook updates, great chatbot and application integration, then marry all those things to AWS autoscaling via elastic load balancing. One use case for my client: TravisCI automatically creating servers, running remote acceptance tests on them, then destroying them afterwards — all while notifying chatrooms of its progress. Now that’s assurance your code will work in production! Really, the sky’s the limit here for awesome integrations.
I’ve learned a lot in the process of implementing this setup. If you’re looking to give OpsWorks a go for your next project, here’s some hints and tips to make get started on the right path.
I’ve been doing a fair amount of work in Amazon’s OpsWorks, in many ways an elegant service. Once you have a set of chef recipes provisioning properly, you’ll want to create an AMI for the layer in question so that you don’t have to wait through a long setup process again. Unfortunately, doing this in OpsWorks can be frustrating since the instructions for making it happen are scattered across four entirely different documents. For my own sanity I made a checklist of all the steps necessary to create an AMI on an instance store EC2 server: this is that checklist for anyone else who might find it useful.
I’ve had a rash of posts recently about Symonds & Son, and I was intending to write a piece more pertinent to Rails or programming rather than the business side of things… but recently I was approached to do an interview about working with my family. In answering the interviewer’s questions, I thought the results were interesting enough to post on my blog — hopefully I’ll also be able to post the interview itself when it’s completed!
I love trying to improve my development environment. Efficiency is important to me: I spend hours and hours a day programming, and even a 1% or 2% productivity boost would provide a massive time savings over the course of a year. Or, as xkcd so pithily put it:
Of course, I’ve probably obliterated any potential savings by spending so much time experimenting, but now that I’ve done it you don’t have to! Listed here is everything important to me to get my development environment zipping along. Hopefully you’ll be able to find something useful here too that makes your programming experiences a little bit faster.
In my previous post, I told the story of how I accidentally fell into consulting and turned it into a successful business. But what does a successful consulting business — specifically, my successful consulting business — actually look like?
Symonds & Son isn’t named to sound cute and hipstery. I’m the son; I’m in business with my father, and I recently hired my mother to be my assistant and bookkeeper. The company’s name is intended to evoke images of traditional, reliable family businesses, where trust, excellence, and a reputation for quality products are their cornerstones. These companies, traditionally centered around carpentry and other hand-made professions, are my models for how to run Symonds & Son. We are, if you’ll forgive me using the phrase, a bespoke development shop, where our great output and superb relationship with our clients are our highest priorities.
But building my profession into a company — and a company with my parents, no less — hasn’t been an easy road. There have been a lot of compromises we’ve had to make to get this ship sailing straight. Here, I’ll speak to how I made this new parent/child relationship work… and how I hope to continue making it work for years to come.