What Problem Does a Blockchain Solve?

April 16, 2018

Curious about Bitcoin and blockchains, I read the original paper, and documented what problem a blockchain solves, and if it’s of any use outside decentralized digital currency.

At its core, the blockchain concept described in the Bitcoin whitepaper serves as an immutable trustworthy ledger.

The site walks you through this problem step by step, then applies it to a non-currency use-case.

Running a Static Site with SSL on AWS

February 20, 2018

As I mentioned previously, non-SSL sites are heading toward being marked as security issues by browsers. If you want SSL and full control over your website, including a top-notch CDN, AWS provides the tools you need, and it’s not too hairy to get going. Considering what a nightmare anything SSL usually is, AWS makes it as painless as can be, as long as you are willing to get your feet wet with some infrastructure, and do a bit of manual scripting.

Now using SSL

February 18, 2018

Since Chrome is marking non-SSL sites as insecure soon, I finally got around to moving my site’s hosting from GitHub Pages to AWS. Setting up a static website using CloudFront and S3 is surprisingly easy. I’ll write up how to do it in a future post, but for now, enjoy the sweet security of SSL :)

Explicit Code is Inclusive

February 02, 2018

Python famously holds as a value “Explicit is better than implicit”. This is not something Rubyists (or many functional programmers) value, instead favoring compactness or “elegance”. I believe senior developers undervalue explicit code that uses fewer features than it could. Compact code that uses many language, library, and framework features excludes people from understanding and contributing to it, and I believe this is a serious consideration when writing code. What better judge of a codebase’s maintainability could there be than “fewest concepts needed to understand it”?

How to Travel to San Francisco Every Other Month for Five Years

January 25, 2018

I’ve been traveling to San Francisco every two months (more or less) for the last five years as part of my job. The hardest part used to be the traveling and staying in hotels (now it’s that I pack so much activity into such a small amount of time, I barely see any of my San Francisco friends any more). This is about how to make the travel and hotels suck less, and if you are currently working remotely, or planning to, reducing travel anxiety and hassle should be something you actively address.

Work vs Meta-Work: Delivering the Right Results

January 19, 2018

Engineers often deride anything that’s not writing code as being not “real” work. While this diminishes the contributions of others, and is generally an unhealthy bravado, it is critical to understand the difference between activities that directly solve a problem and those that organize said activities. The later, I call “meta-work” and engineers should be very conscious of spending too much time on it.

Explaining Serverless Architectures

January 11, 2018

I’ve added another “problem” to “What problem does it solve?” about serverless architectures, which I think are the future of distributed systems (though that future isn’t here yet):

The less code you are responsible for running in production, the better. Running an actual server means it’s all on you. Using virtual servers delegates some to your hosting provider. Using a platform-as-a-service like Heroku delegates yet more. A serverless architecture reduces this to what might be the absolute minimum - you are responsible for your code, and everything else is handled by the provider.

There are three big challenges: deployment, vendor lock-in, and testing.

Rails Is More Relevant than Ever

December 11, 2017

In this month’s issue of PragPub, I have an article about Rails, and how it’s still as relevant today as it was when it came out:

What Rails taught us about agility in 2005 is still applicable today. Rails has also kept up with the times, baking in more conventions around common problems, but also adding more technology to help solve them.

At its core, Rails is still an MVC framework serving up server-rendered pages. This core supports features that developers need today, either to capitalize on new techniques in front-end development, or to allow applications to scale as needs change and become complex. Do you need to run code in a background job? Rails has ActiveJob. Do you need to push changes from the server to your users’ browsers via WebSockets? Rails has ActionCable. Do you need to have a fully-interactive front-end, using the latest CSS processors and JavaScript frameworks? Rails has Webpacker, which simplifies Webpack, which makes all that possible and easy.

And there is testing support for all of it, from unit tests to browser-based system tests, so you can confidently ship your entire app, fully tested, whenever you need to make a change.

Read more about the entire issue here.

On Slow Test Suites and CI Servers

November 21, 2017

A few people on Twitter were talking about developers that run their entire test suite only on their continuous integration (CI) server. The idea was that this was a sign of low quality tests, low quality code, or an otherwise bad process. In the past, I felt this way, and “breaking the build” (by checking in code that had failing tests) was viewed as bad. I don’t believe this any longer, and now feel like it’s a critical ability for a high-functioning team to have. Not that it isn’t important to identify low quality tests or code, but what exactly is the value of having a fast test suite?

The JavaScript Ecosystem and Interoperability

October 12, 2017

One of my biggest learnings creating Webpack from Nothing was just how poorly the tools of the JavaScript ecosystem interact and interoperate. Many popular tools are impenetrable monolithic systems that only do half of what you need and are extensible only through dense plugin mechanisms.

The last chapter is an attempt to describe this problem in detail and offer some solutions.

I was surprised at how counter-intuitive each step ended up being—I can totally see why there are so many blog posts describing how to set it up. From a test runner that can’t run tests, to a system that supports presets, but includes none of them, I was faced with many choices along the way, but also faced with completely opaque systems whose behavior and failure modes were unpredictable.

It focuses on Webpack and Karma, which I found very difficult to make work together:

Webpack and Karma’s interoperability is completely opaque to the user. This means that you have no way to know how the tools are working or even observe them working together without debugging into the source code.

If you didn’t make it all the way through the entire Webpack site, this last chapter is worth a read.