The Paperless Post Tech Stack

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

Perfect and "correct" code is only correct in theory. Code that works and solves users’ problems is correct in practice. We opt for shipping a minimal, viable product while iteratively improving.

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.


Back End

Our servers are hosted in a managed colocation setup with secure connections to Amazon's EC2 infrastructure. We use VMWare to virtualize our infrastructure and CentOS is our Linux of choice. 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.

Front End

We're JavaScript junkies. We use jQuery, Sammy.js, and underscore.js to craft large, well-structured JavaScript applications that run major parts of our user experience. We love to have discussions about JS performance, nitpick the use of closures, debate Prototypes vs. Classes, and motivate each other to write the most performant, maintainable JavaScript possible.

Mobile

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.

Data-Driven Development

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.