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 (now part of LHH), 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.
Cloudflare | A capable CDN and a vital layer of protection against DDoS attacks. | |
CSS3 | Because looking good is half the battle! | |
Docker | A powerful tool for deploying web applications reliably and quickly. (This site is deployed using Docker Compose.) | |
Elasticsearch / OpenSearch | 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! | |
JavaScript | A flexible language, essential for any modern web app. ES6 (plus lodash to fill in some utility functions) makes JavaScript coding pretty enjoyable. | |
Jest | A fast and effective JavaScript unit testing library. | |
Jira | A quality tool for organizing software teams. I like Jira so much that I use it to plan and track work on my personal projects! | |
Lodash | Lodash brings a lot of the conciseness, convenience, and clarity that I love about Ruby to the front end. | |
NodeJS | Node and its package managers and frontend libraries are essential parts of the modern web stack. | |
PostgreSQL | A fast, rock-solid, open source, and richly featured SQL database. | |
React | Declarative, reactive rendering and component-based development make React a superior alternative to direct DOM manipulation for client-side applications of more than trivial complexity. | |
Redis | A fast, in-memory database. | |
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? | |
Tailwind CSS | A utility-first CSS framework that makes styling quick and easy. | |
TypeScript | The guarantees provided by types reduce the likelihood of bugs and enable tooling that can make the development process relatively efficient and even enjoyable compared to more dynamic languages. | |
VueJS | A great framework for building front-end UX with a great supporting ecosystem. I hope that its popularity continues to grow. |
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:
*Google login required
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.
:before
pseudo-elements keep the snakes' pupils directed
toward the apple at all times
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%.
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.
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.)Email: [email protected]
LinkedIn: /in/davidrunger
GitHub: @davidrunger
Blog: my tech blog