Replanted
Tags
Big changes have recently happened in my life. After living in Dallas for more than 20 years, I've moved more than 3200 kilometers away to Seattle a.k.a The Emerald City. Nestled in between rivers, tributaries, and sprawling forests, it's a biome unlike the flat plains of the Texas panhandle. Away from family and many friends, I'm in unfamiliar waters physically, professionally, and socially. But I've learned to swim in the past. I can relearn how to do it.
New site
Purpose
This site will serve as a conduit to discuss technical topics, philosophy, and books I have read/plan on reading/will read, as a mechanism for me to learn more about web development, and as a conduit for creative expression. I express myself creatively through making electronic music, but hopefully this site can serve as a bridge to explore more visual art mediums and to talk about art, design, and architecture.
I don't plan on it being solely a site to showcase my professional portfolio. Public speaking is not a core strength of mine, though it is a skill I very much need to develop. My thoughts tend to be much more coherent when written down, so this site will serve as a conduit for me to express myself to the world.
Why a redesign?
My old site ran on a Linode instance and utilized the ssg5 static site generator. The web server utilized was nginx and had auto-renewing certificates through LetsEncrypt.
These tools are very very nice and well designed. ssg5 is simple, builds upon tried and true Unix utilities, yet is powerful enough to allow people to make awesome websites like this one. nginx is a tried and true web server with a good set of features and extensive documentation. LetsEncrypt is a force for good in this world that makes available tools that people can use to help make the web a safer place.
It was a simple setup on the surface, but there was always the hassle of always keeping everything up to date. Both packages and OS updates need to be done regularly and timely, especially when there are critical security fixes out. I'm sure there is a way to automate the deployment of new Linux images through Linode (though on first glance the process appears to be very manual) and something like Ansible or Chef could help out, but then there would be another large dependency in the mix to worry about.
I wanted to redesign my site in such a way that I could focus more on writing and creating rather than maintaining infrastructure. I already deal with that in my day job and I aim to learn more about good system administration and DevOps practices through setting up my own home network, and eventually a homelab.
I also wanted a simple, modern CI/CD workflow to push updates to the site. I've been spoiled by Amazon's sophisticated CI/CD tooling and it's made me realize how important it is to have a workflow where developers can quickly make changes to code, have it reviewed, automatically have the changes be picked up by the deployment pipeline, automated code checks performed, test suites ran, and artifacts built and released to all sorts of destinations (from thousands of machines, to a single consuming downstream package). Developing without automated CI/CD tooling seems like playing roulette; rolling dozens of dice on whether your code gets deployed correctly or whether you accidentally released code with hard coded credentials present.
With the old setup, there was no way to update the site without ssh'ing into the box and doing a git pull
from say Github. It's not expected that the CI/CD workflow I choose will have all the features of a Big Tech internal version, but I need one. The good news is that Deno has good support for Github Actions, and Github Actions has more than enough features to support my initial needs.
A really nice setup that a lot of people use to host static sites is simply uploading assets to AWS S3, use AWS Route 53 for managing domains and pointing them to S3 buckets, and AWS CloudFront as a CDN. All assets, from HTML to images and more can simply reside in S3 buckets. No need to spin up a Linux or BSD machine and run an HTTPS server. The folks at AWS take security seriously and one can restrict access to their S3 buckets and DNS records through AWS IAM. Simple, secure, and reasonably fast. Another cool workflow is simply hosting everything through Github pages, which has the nice benefit that all changes pushed to the remote repo automatically translate to changes on the site. However, in the future I may want to add more dynamic elements to my site (such as WebGL) which would likely require Javascript or WASM to accomplish.
Web development seems to be currently experiencing a golden age, with new CSS frameworks like Tailwind allowing people to easily create beautiful sites, WebGL and WASM pushing web browser graphics forward, slick new Javascript frameworks, and sleek new serverless platforms like Cloudflare Workers taking off. I used to malign the fact that modern websites tend to be bloated, pulling in so many megabytes of assets to clients. But with the increased emphasis on server side rendering, it's possible to quickly create amazing user experiences without compromising on performance (which in of itself is a huge feature). Not everyone in the world is privileged in having fast and dependable internet so we developers have to be cognizant of their situations.
So, I need an easy and secure update mechanism to push changes quickly to my site, support for Javascript and Typescript, some kind of service that manages the nitty gritty of authentication, TLS certificate issuing and renewal (though to be fair LetsEncrypt makes this super simple to do on your own), hosting, CDN setup, and other infrastructure management. This led me to use ...
Deno
Deno is Node.js but better. Both were created by the same person, Ryan Dahl, but Deno came later and attempted to rectify the mistakes made with Node.js. It's written in Rust, and though it does use V8 underneath which is a massive C++ codebase, they have a good security posture with features such as a permissions system so that apps can be run only with the minimum required capabilities. They have a modern and easy to use method for managing package dependencies. There are nice goodies such as deno task
which makes implementing custom tooling for large projects a joy. Deno makes working with Typescript and Javascript more enjoyable and tolerable.
Fresh is a web framework that integrates with Deno. It has modern features, intuitive page routing, and by default renders all content server side before delivering it to users, with the ability to specify which interactive components need to be constructed client side. Javascript and Typescript web frameworks are created constantly and React is the industry standard, but Fresh gets the job done, is enjoyable to use, and isn't nearly as complex to develop with compared to React and some other frameworks. I know I'm getting locked into the Deno ecosystem, but I'm starting to like it here :)
Tailwind
Fresh supports Tailwind out of the box. It's popular, has lots of features, and is nice to use. I don't have too much experience with CSS frameworks, but it gets the job done. It'll stay in my toolbox.
Cloudflare
Cloudflare Images is a nice, simple service. You can upload images through their dashboard and they give you options to strip metadata out. Variants allow images to be resized before they are sent over the wire to clients. It generates URLs for each image and variant combination making it easy to integrate images in Markdown files. The pricing for storing the images with them is $5 per 100,000 images and for serving them it is $1 per 100,000 images delivered, which is not bad. I only plan on using Cloudflare Images to store content for my blog posts and even if my blog becomes popular, it's not like it would get millions of visits per week. It's easy to use, can scale, cheap (for now), and provides just enough features for embedding images in my blog.
Theme
The color theme of this blog is called Nord Theme. I like this theme and have used it before in some text editors I use. For me it instills a sense of calm and helps me focus. It also reminds me of the Pacific Northwest with its greenery, overcast skies for the majority of the year, and vast bodies of water. Not too harsh on the eyes and leans towards being a darker theme without compromising on color; perfect for reading text at any hour of the day.
New job
The Spheres is one the most famous office buildings in the world. Strolling through it, one finds hundreds of gorgeous plant species, taken from places like Borneo, Brazil, and Peru to name a few. I guess it's a good metaphor for Amazon, a place where thousands of talented and unique people from all over the world are bunched together to create dazzling products and services that delight customers. Bezos naming the company Amazon was a self fulfilling prophecy, one that actually expanded from simply describing the vast selection of products hosted on Amazon.com, and now describes the ever constant expansion of the rainforest into our daily lives.
Working at Amazon is experiencing sensory overload everyday. The service stack at Amazon is the software equivalent of standing in the middle of St. Peter's Basilica: incredibly baroque and massive in scale. Java code is not as dazzling as the beautifully crafted sculptures housed within the basilica, but it is what I have to stare at all day rather than the Madonna della Pietà . Look hard enough, and you'll see remnants of Perl code and critical internal services that have been running unchanged for years.
The pitch of the org that I am in is that we are actively writing a new chapter in Amazon's software development history. As how Amazon moved from a ginormous C++ monolith known as Obidos, (a binary so large that at one point it supposedly couldn't compile on 32-bit architectures as there simply weren't enough memory addresses available), we are trying to abstract and decouple the idea of regional compute on behalf of Amazon's internal services. My team will specifically help service owners focus on building features as we build tools to take care of the undifferentiated complex work of optimally routing endpoint requests across regions.
So much complexity. It's tempting to want to just start over and redesign everything from scratch, but where even are the mouths on this beast? We are actively laying down track that this 1000 car train is riding on, creating and scaling hacks and tools that leverage everything from obscure features of DNS to the new hotness that are LLMs. Automation and new tools are the only way to accomplish this mission, to drill through the layers upon layers upon layers of abstraction poured over the years by so many developers.
The mission is inspiring. It's hard to find other places where even new grads can get to touch and influence the traffic of massive stacks serving millions upon millions of customer requests. Super cool mission, but the tech being used to implement all of this is, well, rock solid but not all too exciting. DNS is incredible, a foundational pillar of the Internet, and constantly improved upon, so I need to dive deeper into it. But DNS has been around for decades and I'm not at the point where I can help author RFCs. Java has been around for decades and though the developer experience has improved over the years by adding things like streams, I still encounter daily uses of factory classes and NullPointer
exceptions. There are teams at Amazon using new tools such as Rust to build next generation databases and compute solutions. However, most internal services at Amazon still use Java so it's best our team focuses on helping those services first before moving on to others.
On the other hand, my appreciation of the Java language and the power of the JVM has increased. Java's concurrency support is excellent as the standard library has a collection of nice concurrent data structures and there is active development on a lightweight "virtual threads" runtime. Java streams are nice to work with and they make me want to work with more functional languages like Clojure.
Beyond
I see my work here as a personal education in writing high quality, performant, and scalable services. I'm learning more about concurrent programming, performance profiling, networking, and good development practices. I've enjoyed using nice CI/CD pipelines, code review tools, build systems, and more. Staying a few years is enough, as there are more important things to do in this world than simply writing Java code all day.
Always room for improvement
Any experienced front-end developer would probably reel back in horror once they gaze upon the code that underlies this new website. Any experienced writer, both literary and technical, would find my writing amateurish and possibly even formulaic. That's ok If you don't put your work out into the world, it's like it never existed in the first place. You'll never get feedback from more knowledgeable people. We all have to start somewhere and all that matters is that little by little we improve ourselves everyday in some way :)