Before coming to CommerceHub, I spent nine years—my entire career, starting as an intern—as a firmware engineer in a hardware-centric world. Since joining the Hub, I’ve learned an incredible amount about the world of software engineering. As I come up on my one-year anniversary at CommerceHub, it seems like a good time to reflect on and share some of what I’ve learned during my time here.
I started out with a bit of Java 5 knowledge from almost a decade ago. In short order, I came up to speed on Java 7, learned Groovy (and how easy it is to abuse Groovy), and started getting comfortable with Java 8. Along the way I became familiar with JAX-RS for making RESTful APIs in Java, JDBC and JDBI for working with databases, and the Spring Framework for dependency injection. I learned how to write unit tests with JUnit and Hamcrest matchers, how to use REST-assured for testing REST services, and how to do behavior-driven development, with Gherkin for feature description and Cucumber for verification.
Across various languages and projects, I’ve brushed up on design patterns like the builder pattern, the factory pattern, and the command pattern. I’ve learned how to employ fluent programming, reactive programming (with both observables and actors), and functional programming techniques, and even picked up some lambda calculus.
Working as part of a DevOps team, I learned about more than just programming. I learned about Chef, how to use it, and how to create my own cookbooks for configuration management, picking up a bit of Ruby along the way. I learned to use Serverspec and RSpec with Test Kitchen for testing cookbooks, and even how to create my own RSpec matchers and Serverspec resources. I learned how to use Vagrant to quickly spin up a virtual machine, and learned to use Docker to quickly deploy an application in a container.
I learned how a team can employ continuous integration and continuous deployment with automated acceptance testing using both Jenkins and Bamboo to maintain high-quality code with a short release cycle and a quick feedback loop.
And this is just the tip of the iceberg. Among countless others, the list of things I’ve learned about this year also includes Dropwizard, Grails, Grafana, Dropwizard Metrics, box and whisker plots, JFrog Artifactory, and Java annotation processing.
Beyond specific tools, techniques, and technologies, the most important thing by far that I’ve learned this year is what modern-day software engineering looks like (at least, one example of it). Software engineering is more than just designing systems and writing code. I knew that in theory but didn’t know what it looked like in practice.
Software Engineering at CommerceHub looks like cross-functional teams sitting together in open, modern, collaborative workspaces, with daily standups that keep everyone on the same page. It looks like dashboards with health checks and metrics and data-driven action. It looks like DevOps, with engineers who take ownership of the code they produce and responsibility for releasing and maintaining it in production. It sometimes looks like PagerDuty blowing up your phone at three o’clock in the morning. It also looks like bubble-hockey tournaments in the game room, company outings to the trampoline park, pumpkin-carving contests, and chili cookoffs. But above all, it looks like a team dedicated to the craft of software development.
This may sound like a lot to learn in just one year, but my CommerceHub story is unexceptional. Everybody I’ve worked with at the Hub is constantly learning, constantly growing, constantly pushing the limits. I can assure you it is not the result of high-pressure demands from micromanagers, or dark hours spent toiling over dusty books or abstruse reference manuals. It’s the result of a supportive team built around mentoring, which values continuous improvement and learning for its own sake. A team not satisfied with mere success, but committed to excellence, with eyes set firmly on the future.