Default values for hashes in Ruby

I was recently working on some code that involved hashes of arrays. As I was reading through some behaviors of Hash in the Ruby docs, I was delighted to see that you could pass an object to and it would be the default value returned when you tried accessing a key in a hash that didn’t exist.

So, let’s try this out a little bit!

2.1.1 :002 > arrays[:colors] << :blue
 => [:blue] 
2.1.1 :003 > arrays[:colors] << :red
 => [:blue, :red] 
2.1.1 :004 > arrays[:colors]
 => [:blue, :red] 

Looks like it’s working! Let’s use another key.

2.1.1 :005 > arrays[:shapes] << :quadrilateral
 => [:blue, :red, :quadrilateral] 

Wait, whaaaa? Let’s see how my :colors array is doing:

2.1.1 :006 > arrays[:colors]
 => [:blue, :red, :quadrilateral] 

Oh, no! What is going on with this hash?

2.1.1 :007 > arrays
 => {} 

Okay, let’s read those Ruby docs more closely:

new → new_hash
new(obj) → new_hash
new {|hash, key| block } → new_hash

Returns a new, empty hash. If this hash is subsequently accessed by a key that doesn't correspond to a hash entry, the value returned depends on the style of new used to create the hash. In the first form, the access returns nil. If obj is specified, this single object will be used for all default values. If a block is specified, it will be called with the hash object and the key, and should return the default value. It is the block's responsibility to store the value in the hash if required.

There are two subtle things at play here. First off, giving hashes a default value doesn’t mean that anything is stored in the hash when you try to access a nonexistent key. That explains why my arrays hash is still empty even after I’m shoveling things onto arrays. This is sensible default behavior; a hash could grow without bound if by default a new value got added to a hash whenever it was accessed by a nonexistent key.

The second subtlety here is a reminder that in Ruby, objects are mutable. We are providing the hash a single object instance (in this case, a new empty array) that is returned as the default value when you try to access a key in the hash that doesn’t exist. If I change that array by appending things to it, I’ll still get back that same array object in the future when I access the hash by a nonexistent key.

I want the hash to work so that when I access a nonexistent key, I get back a new empty array, and that array is added to the hash. We can do this by passing a block to

2.1.1 :008 > groups = {|hash, key| hash[key] = []}
 => {} 
2.1.1 :009 > groups[:colors] << :red
 => [:red] 
2.1.1 :010 > groups[:colors] << :blue
 => [:red, :blue] 
2.1.1 :011 > groups[:shapes] << :octagon
 => [:octagon] 
2.1.1 :012 > groups
 => {:colors=>[:red, :blue], :shapes=>[:octagon]} 

I’ve been using Ruby for years and I lost at least an hour recently because I wasn’t accounting for this subtle behavior.


Channeled Procrastination

This was originally published on Carbon Five’s blog


I procrastinate.

In high school it was a huge issue for me, because as a high schooler I was still inexperienced at it. I frequently found myself in last-minute mode, moving swiftly from one self-induced crisis to another.

College wasn’t any better. The assignments were more spread out, but the due dates tended to be final due dates, whereas in high school there were usually several interim deadlines for milestones.

Constantly having a lot of irons in the fire was a persistent source of low-key anxiety for me throughout high school, but in college I came to terms with the fact that I am never going to have a truly clean slate during the semester. That to-do list will never be empty, and I stopped letting it be a source of anxiety.

Instead, I started leveraging my procrastination strategically. If I am feeling like procrastinating on some task, I just procrastinate. That’s what Nike means when they say “Just do it,” right?

Instead of hating myself for lacking discipline and focus, I pick from a buffet of other things that need my attention. And then later on I’ll go and do the thing I originally wanted to do, only now this time I’ll do a better job because my mind’s in the right space to do the work. If the due date creeps up and I still haven’t been motivated to do it, the looming deadline usually is motivation enough, and I get my task done. The only difference: I didn’t spend the whole time feeling bad for procrastinating.

If I need something done by the 30th and I finish it on the 10th, that task isn’t somehow more done just because I finished it earlier. You don’t save any money paying a credit card bill 2 weeks before the due date instead of on the due date. So who cares if you did it at the last minute?

Common wisdom is that procrastination is a character flaw; that if you procrastinate it’s because you’re lazy or something. But what good does it do to think that? If you treat your procrastination as a prioritization tool, you can get more done and you won’t be agonizing over your work.

There are lots of characteristics that benefit from not being seen as a character flaw. Are you forgetful? Set up infrastructure and other things around you to help you remember things. Are you prone to making a costly typo when deploying some new code to a server? Automate it with a script that validates things to make sure you didn’t make a stupid mistake.

Now, while everyday procrastination can be innocent enough, keep an eye on your procrastinating, because persistent procrastination can be a symptom of psychological issues. If you are not usually prone to procrastination and you find yourself doing it more recently (or if you’re procrastinating on things you usually don’t procrastinate on), that could also be a symptom of something deeper going on emotionally. Some good first steps to help understand your feelings and behaviors better include journaling, talking to an insightful and supportive friend, and talking to a therapist.

With that, I’ll get back to the the task I was putting off!


ARKit and the taller skyscraper

Having seen some of the apps that were put into the App Store this week with ARKit support, it really hearkened back to an analogy Steve Jobs loved to make when OS X was first being developed.

Building software, he opined, was a bit like building a skyscraper. There’s a certain number of floors that you can build on your own before the whole thing collapses under its own weight. At a certain point it just gets too complex for you or your team.

But with good APIs (such as the ones OS X provided), you still can build that same number of floors, but with the help of those great APIs, you are already many floors higher when you first start building. 

ARKit perfectly embodies this principle. A few years ago, building your own AR system was a ton of work and was hard to get right. But since Apple has included AR APIs in its SDK, you now get AR for free. 

That suddenly means that a ton of little apps can now be made and have AR as part of them, when they wouldn’t have been practical to build at all before. Adding an AR component to a simple game? Easy! Want to make a tape measure app that lets you measure things around you? Now that’s easy to do with AR.

I don’t think AR is going to be a revolutionary change to how everything in mobile apps works. But it’s now within easy reach of every iOS app developer who wants to try something with it. Investment in these APIs give Apple incredible long-term advantages that are hard for competitors to catch up with.

You Don’t Need To Be First

“Guys, it’s crunch time.”

You feel dead inside as you process the words.

“We’re gonna need to be doing some late nights here for awhile. We need this done by July 16 or… ” he trails off.

“or it won’t be done by July 16,” you think to yourself.

So one late night you’re eating pizza with the project manager and you ask, “why the rush?”

“Well, our competitor is working on this thing too, and if they come out with it first then they’re going to win this whole market and we won’t have a future.”

“Of course,” you respond after looking up from your Blackberry. “I’ll stop messing around on MySpace and get to work.”

You open up Rhapsody to find some music to jam to, then you fire up WordPerfect and finish up with the report you promised to get done.

Yep, you think to yourself. We better get this project off the ground first or no one will ever use it, like when that one company tried making their own version of Hydrox. What were those called? Oh, yeah, Oreos.

Aaron’s Simple Guide To Security

Ben grossblatt cybersecurity jpg

There’s a lot of hysteria going on about cybersecurity as of late. Even President Trump knows the importance of “the cyber.” In theory, cybersecurity is really scary because there are a lot of moving parts involved and vulnerabilities are everywhere. However, a lot of recent high-profile breaches were a lot more old-fashioned in nature: someone got a hold of someone’s password.

By doing a handful of simple things you can be protected from a lot of potential attacks.

You don’t need to be good with computers for decent security to be within your reach, nor should you have to be. You aren’t expected to be a locksmith just to secure your home and your belongings. Why should your digital belongings be any different?

More and more of the important things in your life aren’t physical things, but digital ones. Keeping this secure isn’t just for paranoid delusional nerds. You have something to lose. David Brooks put it best:


Privacy is important to the development of full individuals because there has to be an interior zone within each person that other people don’t see. There has to be a zone where half-formed thoughts and delicate emotions can grow and evolve, without being exposed to the harsh glare of public judgment. There has to be a place where you can be free to develop ideas and convictions away from the pressure to conform. There has to be a spot where you are only yourself and can define yourself.


This isn’t going to make your digital life NSA-grade, but if you follow all these guidelines you’ll probably be fine.


Most of the time, when someone says “my Facebook got hacked!” what they really mean is “someone guessed my Facebook password” (which is a polite translation of “I had a shitty Facebook password”) or “someone tricked me into giving them my Facebook password” or “I use the same password on every site and somebody got my password from another site and tried the same one on Facebook and they got into my account!”

Good passwords are the foundation of good digital security.

Live by these password rules:

  • Every login you have should use a completely different password (don’t just use simple variations of one password!). If some rinky-dink company you have an account with (like, I don’t know, Sony) has hackers making off with your password, it’s not as big of a deal because it’s only good on that one site.
  • You should pick good passwords. Good passwords are lengthy and have a lot of entropy (think of entropy in terms of a rubik’s cube. If you have solved it and all sides are solid, that’s low entropy. If you have it all scrambled that’s high entropy). aaaaaaa isn’t particularly high entropy but 1 award for my pony Isabella is quite good. A lot of sites force you to include numbers and symbols in your password and that’s great, but a password that is a long phrase is as hard to guess as a short password made of cryptic numbers, letters and symbols. If a site says your password can be up to 32 characters long, make it 32 characters long. It’ll be that much harder for hackers to guess.
  • Use fake answers to security questions, and keep a record of your fake answers. The answer to a security question is as good as a password, so make sure that your answers aren’t things others can find out about you easily. I use random phrases as answers to security questions and keep track of those in a password manager. Your mother can’t change her maiden name, so don’t use her real one as your security answer!

There’s no way you can remember all those passwords. You need a password manager.

I have logins for HUNDREDS of sites, and I actually know maybe half a dozen of the passwords for them. My password manager knows all, and it keeps them in a securely encrypted virtual vault.

Password managers used to be a tool for nerds like me who have a ton of logins. Nowadays that’s pretty much everyone. They work on your computer and on your phone/tablet, and they have the added bonus of saving you from typing in repetitive information in forms on the web.

I use 1Password on my Macs and iOS devices. It’s cheap and totally worth it. If you’re more of a tightwad you can use iCloud Keychain (assuming you use Safari). Lastpass works well too (and is free, and is available on virtually all platforms).

A password manager takes some getting used to but it’s worth getting into the habit.

One very important note: Your password vault’s password needs to be REALLY good. Pick a long one that is super hard to guess (but make sure it’s easy to type on your phone! 

don’t get phished

“So Aaron, what’s the easiest way for a hacker to get my password?”

“You’ll voluntarily give it to them.”


Yep, hackers don’t need to build some sophisticated computing cluster to break past a firewall. Instead, they rely on the biggest security hole of all: the humans that use these secure systems.

It’s surprisingly easy to harvest users’ passwords by sending them official-looking emails that lead to fake web pages that make you think you’re logging into a real site. It’s gotten even more targeted nowadays, too. There might even be people trying to phish you at work, convincing you to share some proprietary company information.

Be suspicious of emails telling you that you need to verify stuff. Be suspicious of an email from Amazon or eBay telling you that you just bought some expensive item you didn’t buy.

If the email is from a site you use and it’s suspicious looking, don’t click a link in the email. Instead, go to your browser and log directly into that web site, then deal with the matter from there.

Always double check URLs in your browser’s address bar to make sure you’re on the site you expect to be on.

Get in the habit of always using your password manager to log into sites. If you think you’re on Target’s web site, but you’re actually on, your password manager won’t fill in your login.

If your web browser tells you that it might be a phishing site, believe it.

Ad Blocking

I recommend that you equip all your web browsers with ad blocking extensions.

There are ethical issues for sure. Most of the sites you use serve ads to pay their bills and using an ad blocker is kind of like leeching off of them.

The problem is that most sites don’t directly control the ads that appear on their pages. Instead they let a complex series of shady middlemen manage these ads, and as a result, a lot of otherwise reputable sites have lately been feeding you shady ads and sometimes malware.

Ghostery goes a long way to protecting you; it blocks hundreds of trackers. I also recommend AdBlock Plus and uBlock Origin.

If you’re on iOS you can get ad blocking now too; as of iOS 9 Apple had added the ability to develop content blocking extensions for Safari. They’re super fast and they make Safari load pages a lot faster!

Nowadays a lot more sites try to detect if you’re using an ad blocker and will bug you about if if they think you’re using one. Wired won’t even let you read the article. If you land on a page like that, don’t whitelist the site like it asks you to. Instead, just open that page in an incognito window. In iOS you can also press and hold the refresh button to reload the page without content blockers.

As an aside, I strongly recommend that you find sites that make cool stuff and support them. Spend the $10 on YouTube Red and enjoy ad-free videos without guilt. Pay for a news site subscription. Patronize people on Patreon. There’s stuff on the web worth giving your support to, and if more people start paying creators with cash dollars, we won’t be expected to pay for stuff with our eyeballs.

Maintenance and Security Updates

OS updates don’t just give you the latest emoji; they usually include security fixes, and they’re an important way to protect yourself! Always install your security updates promptly. 

I recommend iOS over Android to all friends, not just because iOS is so much nicer overall, but because security updates on Android are a total crapshoot. If you insist on using Android, I recommend using the Google-branded phones. Google-branded Android phones get Android updates the soonest. 

Most modern web browsers are very aggressive about updating themselves and that’s a good thing; don’t try to stop your browser from updating. Most people are doing a lot of their computing inside of a web browser and so that makes your browser a big attack vector. 


I think the above steps are essential, but there are a handful more things you can do to make yourself just a little more secure.

On iOS if you set a six-digit passcode, all the data on your phone is encrypted with a strong key, and iOS works really hard to prevent people from guessing your passcode by brute force. (And to be clear here, that hard work on iOS’s part is the really important part here, otherwise a six-digit passcode is laughably inadequate. Do not let this give you the impression that six numbers makes a good password for your other accounts.)

You should absolutely have a passcode on your iPhone/iPad.

On OS X you can enable FileVault, which encrypts your entire hard drive. You should have FileVault enabled, but make sure you keep the recovery key in a safe place. When it’s on you won’t really see any difference in how your Mac works. It’s great.

Windows offers full-disk encryption as well.

If you want some more security for your accounts, Two Factor Authentication is a great thing to add. With 2FA, your password alone doesn’t get you access to your account; you also provide an extra six-digit code that changes frequently to get into your account. 1Password can work with these. I recommend turning on Two Factor Authentication for your iCloud account or your Google account.

I could go on, but this is a good start. If security interests you, you should dig into it more!

This stuff is important

Maybe you live in a home in a pretty safe neighborhood. Not much crime is happening around you, and you feel nice and safe. 

Being just a regular average Joe on the internet you might think you’re also in a safe internet neighborhood and that no one’s gonna hack your account. After all, why would they?

On the internet, we’re all living in the unsafe neighborhood. On the internet you’re just as accessible as any other citizen on the internet. Your private photos are on the same iCloud as all the celebrities whose private photos got leaked awhile back. You’re the same one phone call or email away from some scammer who tries to get you to install some app that watches everything happening on your computer.

I don’t secure my digital belongings because I’m a computer enthusiast; I secure them because they’re mine. You don’t leave your car unlocked on a busy street because “you’re not a car guy.”

Security habits benefit everyone, and I believe they should be accessible to everyone, whether you’re the President, some CEO, or a high schooler named Jessica.

Bose QC35 headphones: finally!

I’ve long been on the quest for the perfect pair of headphones suitable for using for work and pleasure. For the past year or so I’ve settled on Beats Studio Wireless headphones as my “good enough” headphones that get the job done because they offer two things I find essential: 1) they’re wireless, and 2) they offer active noise cancellation. 

While my Beats headphones were getting repaired awhile back I took to using my Bose QC3 headphones, a fantastic pair of on-ear, noise cancelling headphones, and I was a bit surprised to remember just how good Bose’s noise canceling technology is (after all, they invented the category). Due to a very luckily timed tweet Bose caught wind of my desires and they were kind enough to send me a pair of QC35s which they released last Sunday (full disclosure: Bose gave me these; they aren’t a review unit).

Thumb IMG 0109 1024

I plugged them in to charge them up (silly superstition of mine that I like to give brand new stuff a full charge before using) and I put them on and powered them on. They were easily paired with my iMac and I was off to the races.

I didn’t want to post knee-jerk impressions so I have held off, using these over the past few days to really get a sense of what they are like to use, and I have to say, I’ve never been more impressed by a pair of headphones.

Mind you, I’m not an audiophile; most of the things I’m looking for in a pair of headphones are convenience features, and I’m not listening to music to really appreciate every single detail of a song with perfect fidelity; I’m usually using headphones because I work in an open-plan office with a bunch of other folks and I want to provide some sense of isolation to help me concentrate, and I want to enjoy sound that is relatively high quality. Of course, I assume that if you’re reading a post about Bose headphones you aren’t the type to snub your nose at them anyway, so you’re probably going to be fine. I know that Bose stuff may not be an audiophile’s dream but they do a great job of making quality sound equipment for the mass market.

Noise Cancellation

The noise cancellation on these is remarkable. I’ve used the Bose QC15s and the Bose QC3 and have always found their noise cancelling to be quite good, but the QC35 uses Bose’s latest tech, incorporating microphones both inside and outside of the cup to vastly improve noise cancellation performance. And it makes a huge difference. I feel like I’m the only person in the room when I’m listening to music with these on. I can’t hear my coworkers typing on their clicky keyboards or chatting or laughing. It’s really quite fantastic.

Compared with my Beats headphones, Bose’s acoustic noise canceling is wildly better. In particular, I appreciate that on the Bose headphones I don’t hear my pulse echoing when no music is playing (something that will drive you nuts if you just want to enjoy the noise cancelling without any music playing).


Being wireless might just seem like a box to check off in a features list, but to really do it well takes a lot more than that. The QC35s will pair nice and easily with Bluetooth. You can pair the headphones to up to eight different devices and the headphones can be connected to two devices at once (though audio will only come through on one device at a time). These aren’t the first headphones to offer this kind of functionality, but allowing you to control it via an iOS app means that for the first time in my life I’ve been able to use wireless headphones with two devices at once without it being a huge pain in the neck. It’d be super cool if they offered an OS X app for doing this, but I can live without that, especially given that one of my connected devices is bound to be an iOS device anyway.

Example of this multi-connect functionality in action: You’re at your desk, listening to music on your computer, when you get a phone call. You pause the music and answer your phone, carrying on the conversation all through the headphones. When you’re off the call, you play the music again and you’re right back to where you were. 

If you’re actively listening to sound on one device and the other starts playing something, you won’t hear it until you stop sound on your current device, which is a smart behavior; you don’t want your phone hijacking your headphones just because someone is calling.

Sound quality is excellent. I know Bluetooth headphones get a bad rap for having poor audio quality but in the past couple of years I think they’ve crossed the “good enough” threshold for 98% of consumers. Music sounds clear and detailed, with a decent (but not overpowering) amount of bass. The noise canceling helps you appreciate your music even more because less of it gets drowned out by outside noises. You’ll be able to keep your music at a quieter level while still blocking out the environment around you.

Bose prides themselves on reducing what they refer to as the “electronic noise floor;” that is, that soft buzzing sound you can hear when the headphones are on but nothing is playing. My Beats Studio Wireless headphones have a particularly noisy buzz that makes them seem cheap, but the QC35s don’t exhibit this at all. If there is any buzz it’s totally inaudible for me.

Bluetooth performance overall is great. I can freely move around at my desk without causing so much as a jitter with the sound. I’ve had audio skip on me a bit on my iPhone and iPad, but I believe in these cases the devices were at fault; it could either be related to being connected to two devices at once, or it could be just that iOS skipped the audio for a fraction of a second when notifications came in or I switched apps. I spent awhile using these with my iOS devices and the issue was rare and nothing to write home about.

Battery Life

I have been using these headphones since Wednesday, which means two and a half full workdays plus a couple hours this afternoon, and I didn’t charge until last night when I still had about 15% left. Bose rates these as offering 20 hours of battery life and I think in practice they perform even better.

If you want to go wired you can enjoy twice as much battery life. Having the wired option is nice on these headphones; if you want to use someone else’s device or share the headphones quick it saves you from needing to go through the Bluetooth pairing process for just a quick listen on another computer. If this were my ideal pair of headphones I’d also be able to plug it in via USB and have it be a USB audio device, letting me charge and listen to high quality audio. Another day, maybe…


Bose put an incredible amount of thought and effort into this. While my personal favorite form factor is the on-ear design (found in the discontinued QC3 but still available in their spiritual successor headphones, the SoundLink on-ear wireless headphones), the QC35s are building on years of experience making comfy headphones. The materials feel light but premium, and the ear cups feel soft and easily fit around my ears. They don’t make my ears feel too warm or sweaty either. They’re very easy to wear all day.

Conclusion: Buy

Again, audio purists would probably reject headphones like this outright; acoustic noise cancelling and Bluetooth have both traditionally been considered things that adulterate the sound. But as I said, purists probably don’t care how good these are and they probably aren’t reading this.

The people who are reading this are most likely people who want a quality pair of headphones that sound great, are comfortable and convenient to use, and can provide you with a little sound isolation in a noisy environment. I’m confident that the QC35s are the best headphones for that job. Bose may not have been the first to put noise canceling Bluetooth headphones on the market, but they are for sure the first ones to do it right.

My favorite things: iKlear cleaning products

If you’ve ever worked in the same office as me you may know that I have a sort of… obsession with keeping glass screens completely pristine. My favorite (and only) tool for this job is iKlear’s suite of cleaning products. 

They’re the only thing that keeps my Apple stuff looking incredible, the stuff doesn’t smell of volatile chemicals, and the material of the cloths included work incredibly well. The iKlear kits include a blue chamois microfiber cloth good for surfaces and matte LCDs and this gray microfiber cloth said to be anti-bacterial and recommended for use on glass.

I use these for everyday electronics cleaning, cleaning my glasses, and removing sticker residue from my laptop when I get rid of stickers.

Thoughts on Swift going open-source

Swift going open-source today is for sure exciting news, but we need to temper our expectations for what that means for the language. For sure it’s better to see an open-source Swift than a closed-source one, but merely being open-source isn’t a panacea for Swift.

Lest you think I’m just being a pessimist, Objective-C is open-source for decades, yet the only people using it to build real apps are building them on Apple-owned platforms.  Despite the language’s merit, it’s risky to build your software or your own framework with a language whose roadmap is entirely dictated by another company. This is why many incredibly popular frameworks are built on languages that aren’t primarily associated with a particular company’s platform (for instance, this is why you don’t often see OS X apps written with Mono, or Windows apps written in Objective-C.

Outsiders could now theoretically contribute to an open-source Swift, but that’s almost certainly not going to happen. Typically in the past Apple has worked on open-source work in secret, then released it all to the public once it was unveiled. It’s not super collaborative. Apple might accept a pull request here or there, but they’ll be working on it alone.

The most sure benefit I can see with an open-source Swift is security. With public source code, any security researcher can dive right into Swift’s source code and the source code of the compiler and find potential vectors for attack in a way that’s a lot more difficult if you don’t have source access. 

Swift is an incredibly interesting language, though. It lets developers write very high-level code with the performance of a very low-level language. It also gets the head start of being the lingua franca of the army of iOS and OS X developers in the wild. At the same time, there are many other new languages coming into the fray, many of which are offering similar things (high performance, easy concurrency, safety, all with high-level abstractions). If Swift can successfully gain some independent frameworks and communities to grow around them, it just might stand a chance.

I’m so sick of hearing about microservices.

As I walked out out of the conference hall after DHH’s RailsConf keynote this morning, I felt this vibe that people are regarding him as out of touch with reality. Indeed, DHH did give off this sort of church sermon-like tone in his keynote, railing (pun sort of intended) against microservices and JS frameworks.

For some reason, SOAs and JS frameworks have gotten a reputation for being something you want to use instead of something that you have to use. From what I’ve seen with each, I struggle to understand how they got to be in vogue.

SOA proponents will make the usual arguments. When apps are made of small services it’s easier to scale them individually. If your app hits big enough scale a monolith would be crushed under its own weight. That sort of thing. But I’m also hearing proponents discuss how small services are better because each app is simpler and it lets its developers move faster and with less cognitive load. And that’s a load of bullshit.

Architecting your application as a set of microservices adds a large upfront cost in the form of new complexity, and it takes a lot of traffic for that to pay off. Your uptime is reduced with every codependent service running at the same time, so you need systems engineers to help keep as many nines as possible in your uptime. You start discussing things like putting your services in  a VPC so that they can quickly talk to one another keep traffic private. Each app needs fault tolerance against other services being unreachable. Debugging becomes wildly more difficult. You need to be on your monitoring game.

Oh, and by the way, you need to consider your application-level architecture. Applications don’t break up easily into super independent components; in the real world these components tend to deeply intermingle with one another. It’s challenging to design the services in a way that adding one feature doesn’t end up touching 3-4 services.

I feel like no one ever talks about these application-level issues. I hear people speaking in generalities about ensuring apps only have a single responsibility, but I’ve yet to hear a real-world story of a real-world app that is built with an SOA and takes business need changes in stride and the developers are happy and work with minimal cognitive load. 

Big companies like Google and Amazon aren’t using services because it’s faster or more productive; they’re doing it because they have to.

DHH isn’t trying to cling to some foregone notion of cowboys taming the wild west on their own with their Rails monoliths; he provides real examples of large scale monoliths (Basecamp, GitHub, Shopify). I hate seeing those 3 examples getting reused, but those apps remain successful, and I am not hearing about equivalent SOA-based counterparts.

I’m not snubbing what other frameworks have to offer, but I take comfort in that I can ship real products using Rails with minimal developer manpower. If the app is just as nice, customers won’t care or notice. As everyone around me is levitating toward over-engineered collections of microservices I can see it going two ways, both positive for me. If the world ends up being right and microservices are a productivity panacea, I’ll embrace them with open arms (using Rails 5’s new API mode that DHH was none too excited to announce). If they’re wrong, then I’ll churn out more value faster while they spin their wheels with services.