A picture of me

About me

I'm a full stack web developer.

I love the Ruby programming language, the Rails web development framework, and the RSpec testing library. These are well-designed tools with strong supporting ecosystems that allow me to work efficiently and to have fun doing it.

I have been a support engineer at CommonLit, a software engineer and support engineer at Hired, a web development boot camp teaching assistant at App Academy, a high school math teacher, a public bus driver, and a long haul truck driver.

Skills

Babel Allowing us to safely use modern JavaScript features.
Confluence / JIRA A quality tool for organizing an agile team.
CSS3 Because looking good is half the battle!
Dokku Dokku An open-source alternative to Heroku. (This site runs on Dokku!)
Elasticsearch Elasticsearch A fast, powerful, and flexible search backend.
Git The standard in version control.
GitHub Where software teams and the open source community collaborate. GitHub Actions are great!
Heroku Doing (some of) the devops, so you don't have to.
HTML5 The building block of the Internet!
Jasmine I love testing, and Jasmine is a great JavaScript testing framework.
JavaScript A flexible language, essential for any modern web app. ES6 (plus lodash to fill in some utility functions) makes JavaScript coding pretty enjoyable.
jQuery DOM querying and manipulation made easy, with a huge plugin ecosystem.
Lodash Lodash Lodash brings a lot of the concision, convenience, and clarity that I love about Ruby to the front end.
NodeJS The JavaScript ecosystem is a bit too "Wild West" for my taste, but Node and its ecosystem are essential parts of the modern web stack.
PostgreSQL A fast, rock-solid, open source SQL database.
React Declarative rendering, component-based development, and one-way data flow make React a superior alternative to direct DOM manipulation for moderately (or highly) complex client-side apps.
Redis A fast in-memory database.
RSpec RSpec I love testing, and RSpec makes tests readable and easy to write.
Ruby Ruby was designed for developer happiness, and it shows!
Ruby on Rails A web-development framework with a great ecosystem that makes development fast and fun. Rails's ActiveRecord ORM is superb.
Sass It's in the name - syntactically awesome style sheets. Why write CSS when you can write Sass? :)
TypeScript I'm relatively new to TypeScript, but I can already see that it reduces the likelihood of shipping frontend bugs.
VueJS VueJS is a great library for building front-end UX, and it has a great supporting ecosystem. I hope that its popularity continues to grow.
Webpack A versatile and powerful build tool for all-things client-side. Hot code reloading really enhances the development experience.

Projects

DavidRunger.com

Rails 7, Vue 3

You are here, at davidrunger.com! This is a playground for me to experiment with various web technologies, and where I host various apps that I have built for myself and my family:

  • Groceries* - the collaborative family grocery list, built to be mobile-friendly for use on-the-go
  • Workout* - an app for tracking workouts over time, and to stay on-pace within a workout
  • Logs* - track whatever you want with various log types (text, number, duration, and/or counter)
  • Quizzes* - a multi-person quiz app that uses ActionCable websockets for real-time interactivity
  • Check-ins* - track how well your emotional needs are being met in your marriage/relationship

*Google login required

Tech

  • A Rails 7 backend serves various Vue 3 front-end apps built with Pug templates, ES6, and Sass.
  • The app's 2,500+ lines of Ruby code are 100% covered by tests written with RSpec.
  • The primary database is PostgreSQL, plus some use of Redis, and Memcached for cacheing.
  • Pinia provides client-side state management.
  • The excellent Vite Rails gem, in conjunction with Vue and Pinia, provides sub-second hot module replacement (HMR) in development, creating an efficient and enjoyable workflow. Vite Rails also bundles the application's JavaScript and CSS for production. (I believe that Vite Rails is an underappreciated gem, and the premier solution for JavaScript management in the Rails ecosystem at this time, better than any of the options mentioned here. Hats off to the developer, Máximo Mussini!)
  • Google OAuth provides convenient and secure sign-in.
  • GitHub Actions provides continuous integration (CI) testing and linting, as well as continuous deployment (CD) via integration with Dokku on a DigitalOcean host.
  • A custom-built, pallets-based, parallelized test runner workflow executes only the tests and other checks that are needed for any given PR, making development and deployment as fast as possible while ensuring application stability.
  • A custom-built, ferrum-based prerendering system captures and then serves a static HTML version of the JavaScript-based homepage, allowing me to enjoy the developer-friendly ergonomics of a Vue-based workflow in development, while still serving a simple HTML page in production for optimal rendering performance and search engine optimization.
  • Ruby code is linted by RuboCop, JavaScript by ESLint, and stylesheets by Stylelint. Brakeman checks for Rails security issues, and DatabaseConsistency and Immigrant help to ensure that the database is well-structured.
  • Basscss provides CSS utility classes, so a lot of styling can be done quickly and cleanly within the markup itself.
  • JsRoutes allows the use of Rails named routes / path helpers on the client-side, too! :)
  • Element Plus provides aesthetic and ready-to-use Vue UI components.
  • Plus... Vue Router client-side routing, Sidekiq background jobs, Flipper feature flags, Devise authentication, Active Admin admin backend, Draper decorators, Pundit authorization, alba model-to-JSON serialization, Action Mailer outbound emails, Action Mailbox inbound emails, Rails encrypted credentials, runger_actions form objects / command objects, Skedjewel Sidekiq job scheduling, PaperTrail model change tracking, Rack::Attack IP blocking and request throttling, Bullet eager-loading enforcement, Lefthook git hook management, Gitleaks secret protection, AWS S3 blob storage, Rollbar error tracking, and Percy visual diff monitoring!

Serpent.js

jQuery, object-oriented JavaScript
Serpent Game

Serpent is twice as fun as classic Snake. At least, there are twice as many players! Each snake can be toggled between human or AI control, so you can play against the computer or a friend. Or just watch two AIs play each other. Or see whether your right or left hand is smarter. Controls allow for customizing the game speed and board dimensions.

Tech

  • Efficiently manipulates the DOM, allowing for large game boards and unreasonably high game speeds
  • Trigonometry and :before pseudo-elements keep the snakes' pupils directed toward the apple at all times

SimpleCov::Formatter::Terminal

Ruby
SimpleCov::Formatter::Terminal

Having good test coverage is important to me. It lowers the chance of shipping bugs and makes it possible to update dependencies with confidence and without manual testing.

However, I couldn't find a way to get quick, detailed feedback about my app's code coverage while working on tests — so I wrote SimpleCov::Formatter::Terminal. It prints line-by-line code coverage information to the terminal after every test run, and includes info about branch coverage, as well, making it easy to see where test coverage is missing, and to add tests covering the uncovered code.

Thanks to dog-fooding SimpleCov::Formatter::Terminal on itself, I'm easily able to keep its code coverage at 100%.

Skedjewel

Crystal
skedjewel.yml

DavidRunger.com has some Sidekiq jobs that I want to run at various scheduled intervals. There are some great add-on gems that provide this functionality, like sidekiq-scheduler, but I wanted something that wasn't so dependent on Sidekiq internals.

Thus, partially as an excuse to try out the Crystal programming language, I wrote a simple job runner in Crystal called skedjewel, which I use to execute scheduled Sidekiq jobs for DavidRunger.com. I love the small memory consumption of the compiled skedjewel Crystal binary, since memory is a precious resource on my small DigitalOcean droplet.

Assorted Gems

Ruby

Below are some of the Ruby gems that I've written.

  • runger_actions: The missing piece of Rails! Organize and validate the actions of your Rails application with this combined form object / command object.
  • shaped: Validate the shape of Ruby objects (hashes, arrays, and more). This is a dependency used in runger_actions (mentioned just above).
  • fcom: A CLI tool for parsing git history. I use this regularly.
  • rspec_performance_summary: Find low-hanging / high-impact opportunities to speed up your test suite by printing the execution time of your slowest RSpec examples.
  • schedjewel: Execute Sidekiq jobs on a schedule. (This is essentially a Ruby version of the Crystal skedjewel project mentioned above.)