For as long as we have been a team we've worked with a set of guiding principles. These are not hard and fast rules, but rather a set of informal maxims that help us to make decisions, prioritize our work, and generally ship a ton of quality code. We're here to work hard, make our users happy, and (hopefully) enjoy the process along the way, and we feel that these principles help us make that happen.
Fixing > Complaining
We work in an ever-changing system. Yesterday's awesome work is today's legacy code. Complaining that a piece of code or system doesn't work or isn't correct will not fix it. We are all responsible for this "bad" code which means we're also responsible for making it better.
Helping > Winning
We work and act as a team. As a team, our goal is to push the product, not our own work, forward. Helping a teammate do a better job or solve a tough problem drives us forward; ignoring or magnifying their problems at your own benefit doesn't.
Working > Perfect
Code that works and solves users problems is correct in practice. We opt for shipping a minimal viable product and iteratively improving. We value feedback and learnings from our customers and code that's being exercised in the real world. Experimentation is encouraged and we celebrate proof of concept works, and we value allowing people to fail safely. Part of this mentality is driven by our desire to learn from our experiences.
Small Changes > Big Refactors
Achieving a goal by making incremental improvements will achieve more than a grand rewrite. Consider the entire system to be in a perpetual state of change. We work with the flow of changes. Stopping the world and starting over is not an option.
Understandable Working Code = Best Practice
The only real best practice is the knowledge that best practices change. We strive to make code that works and is parseable by our teammates. We pride ourselves in the ability to explain the ‘why’ of our work.
We are hosted on Amazon Web Services. CentOS is our Linux of choice. We are moving most of our services to Docker, and exploring Kubernetes as a platform. Our web application is actually a collection of services that are mostly written in Ruby. We use the Rails and Sinatra frameworks heavily, but are also fans of Plain Old Ruby Programs and have some services which employ a variety of other Ruby libraries.
We have a RESTful API-centric approach to development and are rapidly moving our client applications (native iOS, mobile web, and desktop web) to becoming strict consumers of this API. Our web application servers use Nginx, Unicorn, and HAProxy to handle requests, and we rely on Memcached, Redis, and PostgreSQL for caching and persistence.
We have a native iOS application and are actively working on modernizing and optimizing our user experience for all flavors of mobile browsers. We're trying to create a responsive, cutting-edge mobile experience for our users and employ a variety of Open Source Objective-C libraries like RESTKit in addition to being fluent in Apple's core iOS SDK. We have a small but growing mobile team that is driving development on the server side with its amazing product ideas and implementations.
We have a large analytics infrastructure that allows developers and product stakeholders to record and measure data over time. We use StatsD, Graphite, and our own Graphiti software to graph and keep track of our core metrics; our analytics team runs KPI queries against a database replica for our business statistics. We're trying to push the envelope with visualization and data recall, giving our investors and product team members insight into the data that comprises our day-to-day business as well as our long-term goals.