My Ideal Stack

By Joe Hicks, 2021-04-03

My ideal stack starts at Google Domains, for everything I do with domain names. Google sets a new standard for what services should be included for your money.

Then we go through the Internet tubes to reach "my" network and hardware team at DigitalOcean. They know how to deliver the cloud features everyone needs, in a simple package that saves me time!

Even though I've used many Linux distros, I use Ubuntu almost exclusively because of the community support and user-friendly tools (like ufw). I also favor keeping apps up-to-date, and Ubuntu 20 comes with unattended upgrades pre-configured for automatic security updates.

I use both of the most trusted servers on the web: nginx and apache2, sometimes together. Nginx is my go-to for load balanced or reverse-proxy setups, but apache is extremely performant AND super convenient whenever you get to use htaccess files. Long story short, apache's mod_php is more robust than fpm, and can sometimes perform faster by eliminating the reverse-proxy communication. Luckily Let's Encrypt has a version of certbot for both!

For any performance-critical applications or distributed workloads, I like to use a redis server to keep session data in memory. It's also easily configurable to get the steady performance you need. I'm interested to try a redis cluster, but in my experience I've never had a single redis server cause a problem!

I almost always use the trusted mysql database for storage, but I've adapted to other systems like mongodb, mssql, and db2. I embraced mysql 8 completely, making adjustments where needed to accomodate apps designed for mysql 5.

Nodejs and npm are always at the latest version because I strictly use them for build tools. Ryan Dahl knew he pushed people like me away from server-side javascript with the design of Nodejs and the implementation of npm. I carefully watched for the release of his followup project, Deno, and am now giving server-side javascript a fair chance using the Deno runtime.

Deno is also a part of my research for how I'm going to build on my previous API framework and give it next-level performance AND developer experience. Other contenders are the extremely enjoyable Go language, and the php extension Swoole.

I like to run all supported versions of php on a server via fpm, and keep custom platforms up-to-date with the latest. Last fall we hit a huge milestone with php 8.0 - don't get left behind!

Running all versions of PHP allows me to be flexible with hosting requirements for apps. Websites that rely on a CMS platform and many plugins are notoriously difficult to keep on the latest version of anything.

My favorite app platform is one that was custom-made for its purpose (even better if by me :D). But these also commonly come with a framework, something like codeigniter, laravel, or yii.

A CMS is important for enabling marketing to publish quickly, and I have come to embrace Craft CMS as the best CMS platform I have had the pleasure of using. In its simplest case, Craft gives you complete content structure freedom and an extremely easy way of getting it into your templates. For devs considering it, the free version is enough to get any project started, and the multi-user license is cheap enough if the project becomes successful.

That brings us to the front-end, and there is no contest in tech here. I fell in love with Vue.js for its ideal syntax and incrementally adoptable framework. The famous single-file components and build tools for static web apps make it a joy to use. I'm a fan of minimalism, building up only the features you need, so the official Vue ecosystem alone is my ideal front-end anymore.

My approach to animation is CSS-first, perferring the performance of native browser transitions. I usually add custom javascript and canvas elements where needed to achieve more intelligent effects. I recognize the need to master a 3d animation framework if my career ever leans toward front-end development, and I've experimented with two of the best: babylon.js and three.js

For local development, I tend to use Windows, but moving to Ubuntu full-time has been extremely tempting. I use WSL for SSH and some CLI tools, but that's all. After extensive experimentation, I've decided no local VMs ever perform to my liking, as least when dealing with files on your windows machine (WSL and Docker are no exception). I tend to use VirtualBox for running apps, and sometimes I use remote dev servers, such as with my cloud hosting provider. I use docker when a project requires it, but in general I prefer robust servers over disposable ones.

I could probably recommend some 3rd party APIs that can really help power your application, but those are very specific to the needs of your project. My only rule is that you have to be very careful before designing an application that relies on someone else's product to stay functioning. Be sure that you want to share in all of that company's success AND failures.

That about covers it! Did you catch the theme? My ideal stack requires a careful balance of reliability AND cutting edge. I love new technology, I strive to master my craft, and I rely on the things that have proven themselves trustworthy throughout my career.