Paul Sadauskas

Senior Web Application Architect

Contact Info

Passionate about the craft of creating software

My passion is creating software that is a joy for fellow developers to both use and contribute to. I am motivated to hone my craft of software development, to learn as much as I can about better ways to accomplish complicated projects, and to build tools that are elegant, robust, and reliable.

My full-stack experiences varies from digging into the nitty gritty of kernel stack traces and debating the merits of various Javascript frameworks, and everything in between. As an engineering lead, I'm also capable of recruiting and leading a team of fellow developers and mentoring junior engineers.

Notable Professional Skills

Professional Achievements

Lead Software Architect TextUs

Joined as 3rd engineer on a team that had an existing MVP Rails application.

  • Drastically improved reliability of message delivery by incorporating AWS technologies API Gateway, SNS & SQS, and created Terraform tooling to ensure consistency between Staging and Production.
  • Also improved performance and scalability of message delivery to accommodate customer usage.
  • "Rescued" the existing test suite, improving runtime and reducing failure rate.
  • Implemented best-practices for monitoring and instrumentation, using InfluxDB and Grafana, with Honeybadger for error notifications.

Once it became clear the existing application could not handle the scale we wished to achieve with our new enterprise customers, I spearheaded a greenfield re-write of a replacement Rails application.

  • New app scaled from 1M Messages/day to over 50 Million, and 40,000 daily active users.
  • Expanded use of SQS for job queues to improve application reliability and scalability.
  • Implemented PostgreSQL best-practices: foreign key constraints, custom domains, materialized views. Optimized queries, index usage, and stamping down N+1s.
  • Designed and built Hydra-based API for consumption by our Web UI, Mobile apps and Chrome extension, as well as 3rd-party integrators. Worked closely in conjunction with frontend engineers to develop an API that balanced request count with payload size. Championed use of Hypermedia for the team which delivered many positive benefits.
  • Designed and built integration system for the reliable delivery of Webhooks and 3rd-party API calls in the presence of unreliable customer and partner services.
  • Involved in design and implementation of every other major feature and component.
  • Built infrastructure for deployment, instrumentation and alerting using Heroku, Terraform, InfluxDB, Grafana and Honeycomb.

In addition to the technical work, I also performed duties as Team Lead and occasionally "Acting CTO".

  • Grew engineering team from 4 to 20 consisting of a diverse group of people. Streamlined onboarding, performed 1on1s with the team.
  • I strongly believe in hiring junior engineers and continuing their education. About 1/3 of our engineers were recent graduates of boot camps, often as their first engineering job. Closely mentoring and providing a supportive environment is a key part of this process.
  • Created the technical interview process, which was used to hire most of the team. I performed most of the early interviews, then trained the team to also be able to conduct interviews, and iterate on the interview process.
  • Defined features, scoped product objectives, and collaborated with stakeholders to build a company roadmap.
  • Instilled a culture of positivity and supportiveness, so the team felt comfortable experimenting and learning from each other.
  • Championed and supported Agile methodologies for the team, leading standups and retros. Strong advocate of introspection and continuous improvement of every aspect of building software and teams.

Service Objects With Dry.rb: Monads and Transactions RubyConf Denver

This is a more polished version of the talk I gave at Boulder Ruby.

Service objects are an important tool in your toolbox, and Dry.rb's Transaction library is one of the most powerful, and one of the most magic. It's a "business transaction" DSL, and has error handling as a primary concern. We'll start by exploring Monads in Ruby (they're not scary!). Then we'll see how that simple concept unlocks another level of service objects that are far more robust and testable, and how to wire them all together with Dry::Transaction. Finally we'll touch on extending transactions with custom steps, and how to integrate them into an existing application.

it { should be a_good_talk }; Writing Custom RSpec Matchers Boulder Ruby Group

Writing custom RSpec matchers can be helpful for writing simpler, DRY-er and more descriptive specs. We'll talk about how they're used, how to make them, and some useful ones I've discovered or created myself.

I live-coded this talk, and there was a great discussion afterwards where it was helpful having that coding environment available to show participants.

Better Service Objects with Dry::Transaction Boulder Ruby Group

Service objects are an important tool in your Rails toolbox, and dry-transaction is one of the most powerful, and one of the most complicated. It's a "business transaction" DSL, and has error handling as a primary concern. This talk will give a background of how to use it, how to integrate it with your Rails application, and advanced usage with some custom steps.

Senior Engineer Kapost

  • Architected and implemented an application to collect and present analytics data. Utilized CouchDB and eventually Elasticsearch for analytics storage and aggregation, and SQS for background workers.
  • Transitioned to a DevOps role, assisting other teams in building out multiple apps in a microservices architecture.
  • Built scripts and configs to create a Docker-based development environment to simplify developing against other teams' apps.
  • Collaborated with teams to develop their features and products in a way that integrated well with existing projects.
  • Built Chat-Ops bots to allow team members to inquire about the state of the system, and deploy & provision ad-hoc staging environments.

Senior Engineer RainforestQA

  • Wrote a full-stack Rails application (Postgres, Ruby, CSS, JS) to provide testers with a one-time use email address
  • Added features to the open-source QueueClassic and QueueClassicAdmin gems
  • Troubleshooted performance issues relating to load from a "stampeding herd" effect from testers
  • Prototyped a replacement for a core component of the UI in Ember.js

Senior Engineer Librato

  • Architected and implemented a queue/worker system in Ruby to import users' AWS Cloudwatch data into Librato Metrics
  • Contributed to and coordinated feature development on the Librato open-source client libraries
  • Drove greater adoption of hypermedia concepts in the Librato API, both external and internal
  • Took charge of a website security audit and fixes to user-facing websites and APIs
  • Evaluated various JavaScript frameworks to use in a new frontend dashboard

API Developer GitHub

  • Design and implemented hypermedia APIs for extracted micro-apps to communicate with the main app and each other
  • Made upgrades to various aspects of the GitHub API, and communicated those changes to users
  • Improved tooling for generation of documentation of the GitHub API

Senior Software Engineer LivingSocial

  • Took part in upgrades and enhancements to the email newsletter and notification delivery system
  • As a member of the API team, drove adoption of hypermedia APIs as part of a SOA refactor
  • Helped refactor a large Rails app by following the principles of TDD and Martin Fowler's Refactoring

Senior Software Engineer Strobe

  • Implemented a "ChatOps" continuous deployment system using Campfire and Chef
  • Created from scratch the Chef cookbooks and recipes to deploy the entire Strobe infrastructure to AWS
  • Set up a JenkinsCI cluster for continuous builds of Ruby/Rails, C++ and Clojure applications
  • Assisted other team members in getting their projects in CI and Chef for deployment
  • Helped implement a CDN/Caching proxy for customer assets in Clojure and Riak

Forms Don't Have to be this Complicated Mountain.rb

In this talk, I lament how difficult it is to build complicated nested form in Rails & UJS. I offer a few solutions, including Form Objects. More recently, pure front-end apps in React or Ember have supplanted the need for a comprehensive solution in Rails itself.

How HTTP Already Solved All Your Performance Problems 20 Years Ago MountainWest RubyConf

I describe several of the more powerful features provided by the HTTP protocol, which are supported by most basic HTTP clients in languages' stdlib, but not taken advantage of by most advanced client libraries.

Writing Adapters for DataMapper MountainWest RubyConf

As a member of the core team, I gave a tutorial on how to write custom adapters for the DataMapper ORM. Several adapters for other databases and web services were contributed as a result of this talk.

progress_bar Creator

  • A very simple implementation of a CLI progress bar, similar to the output of cURL
  • Mentored contributors to keep their pull requests small, focused, and well-tested
  • It was originally intended primarily for personal use, but is now a dependency of several popular projects

Resourceful Co-Creator

  • Implementation of a fully RFC2616-compliant HTTP/1.1 client in Ruby
  • Includes support for advanced features of HTTP, including support for redirects and caching with pluggable backends
  • Used to build other abstractions, such as object mappers for REST/Hypermedia APIs

DataMapper Core Team

  • Heavily involved in design and implementation of DataMapper, and preparing for release of 1.0
  • Responded to issues and pull requests, and mentored new developers to get involved
  • Redesigned and implemented DataMapper Adapters interface
  • Designed and implemented Migrations plugin

Merb Contributor

  • Heavily involved in design and implementation of Merb, preparing for release of 1.0
  • Implemented support for conditional GET requests (304 response/Etag)
  • Implemented correct handling of HTTP Accept header including negotiating client and server priorities

Collectd Contributor

  • Contributed the tokyo-tyrant collection plugin
  • Contributed the write-http plugin, which will submit collected measurements via libcurl to an HTTP server

Senior Software Engineer Absolute Performance

  • Rewrote an existing monolithic Perl web application into multiple Rails applications
  • Architected and developed new applications to interact with the main apps by hypermedia APIs
  • Accomplished an order of magnitude improvement in capability by implementation of HTTP caching
  • Revamped procedures to ship and deploy applications in various languages to remote customer sites
  • Implemented new features in various NoSQL databases, TokyoTyrant, MongoDB, and Redis
  • Encouraged the team to adopt automated Unit and Functional testing, as well as agile methods
  • Engaged in continuous deployment on non-cloud physical hardware at various customer locations
  • Invovled as primary architect of all layers of the stack, from Javascript UIs to database schemas

Senior Web Developer InputOutput Unlimited

  • On a contract basis, implemented numerous web applications in PHP and later in Rails
  • Created specifications and designs from (sometimes ambiguous) customer and stakeholder requirements