The damn dumbest smart kid I know

Partial explanation for smart folks, like Paul Graham or Mark Zuckerberg, making consistently bad predictions - The Peculiar Blindness of Experts:

In Tetlock’s 20-year study, both the broad foxes and the narrow hedgehogs were quick to let a successful prediction reinforce their beliefs. But when an outcome took them by surprise, foxes were much more likely to adjust their ideas. Hedgehogs barely budged. Some made authoritative predictions that turned out to be wildly wrong—then updated their theories in the wrong direction. They became even more convinced of the original beliefs that had led them astray. The best forecasters, by contrast, view their own ideas as hypotheses in need of testing. If they make a bet and lose, they embrace the logic of a loss just as they would the reinforcement of a win. This is called, in a word, learning.


Chernobyl on HBO

We’re three episodes into the Chernobyl miniseries. Great acting, sets, and costumes. I had no idea how much worse the historical situation could have gone. Recommend.


Brent Simmons on Playdate - “the thing that seems very difficult, maybe even impossible, that may fail, but is the best expression of our talent and love”


Web assembly + browser editor + CDN edge = wow

I’m still impressed that the web platform has progressed to the point we can build web apps entirely in the browser with Glitch, Code Sandbox, and friends. That we are now starting to build web apps to run (partially) on edge CDNs (Cloudflare) and edit those kinds of web apps in a browser (Fastly Terrarium) is kind of blowing my mind. (Via Simon Willison)


Music ranked: the string section

Best albums, singles of the years. Who is better, the Beatles or the Rolling Stones. Top 100 smooth jazz to fall asleep to. We love to put music into boxes and then rank the items in those boxes. So without further ado, ladies and gentlemen, I present to you: the string section of the orchestra, as rated by the string section.

There's a bit of a tie for first place. The violins and cellos feel equally strongly that they are the best. The cellos and basses are equal mixes of ambivalence to these status games and envy that they are not in the violin or cello sections.

Here's a sampling of the sentiment data our polling gathered, aggregated by section.

Violins: I’m better than everyone else or I’m better than that violinist over there.

Violas: I wish I played cello. Or, that I'd gone to that writing workshop.

Cellos: I am underrated, more composers should write good solo work for cello. I am going to use every minute of this melody to shine. I am overflowing with emotion, which you will hear through my extremely wide vibrato.

Basses: I wish I played cello. Or jazz. Or that this instrument was as loud as the brass section. Or that I was out at the loading dock, smoking.


A foray into building interface

I spent some time this weekend attempting to make front-end code with Tailwind CSS. Tailwind is a utility-first approach to CSS wherein styles are organized into classes by how they function, not what they style. Instead of avatar-image as a class name on a user’s photo, you would probably have m-4, roughly meaning “margin four”. It’s a bit cryptic at first!

Reading through all the documentation before getting started is a good idea! Once I read through it and tinkered with it (or any other utility-first CSS approach) for a bit, it was pretty easy to use. The point where it clicked for me was when I thought “hmm, this needs a little room on the top” and then “that means I want mt-2, perfect!” Having a good autocomplete for class names helps a lot too.

I started off trying to use Tailwind in a Code Sandbox, but it seems like the community hasn’t quite figured that one out yet. That said, once I cloned a not-quite-working sandbox locally and ran it, I was off to the races.

I’ll probably read more through the component gallery next. If I can get closer to being to thinking/sketching up a UI component and then coding it up in just HTML and utility CSS, that will be a huge step forward for my craft.

Onward and upward! 📈


Refreshing my Rails: OmniAuth

I’m refreshing my understanding of mainstay Rails libraries lately1. This week, it’s OmniAuth.

When you sign-in (authenticate) to website A (say dev.to) via website B (say GitHub), that’s delegated authentication and the protocol underneath it is OAuth2. OAuth2 is a bit tricky because there is a lot of back-and-forth between the service that the user signs into (GitHub) and the service that you’re signing into with that authentication (dev.to).

Once you’ve set it up set it up, OmniAuth encapsulates much of the back-and-forth with a Strategy class. A bunch of folks out on the internet have bravely contributed literally hundreds of strategies for various services that provide OAuth2 sign-in, e.g. omniauth-twitter or omniauth-github.

A nice thing about the Strategy implementation is that each phase of the OAuth2 callback scheme2 is a method; you can overwrite each one to handle the particularities of the provider you’re integrating with. For example, the “callback phase” is the most common extension point since every app is likely to want to store user information and access tokens differently.

In the wild, OmniAuth is often used in combination with Devise for user models which in turn uses Warden for authentication.

Also nifty to note: the Rakefile for OmniAuth has developer tasks for benchmarking performance and measuring memory overhead. It’s pretty awesome that an essential gem like this has that level of detail in its maintenance.

The time required to do a simplistic OAuth verification is negligible; about as fast as a call to Redis:

% rake perf:ips
Warming up --------------------------------------
                 ips     1.210k i/100ms
Calculating -------------------------------------
                 ips     12.329k (± 5.1%) i/s -     61.710k in   5.019465s

I have no baseline to compare this with, but memory usage looks like this:

% rake perf:mem|head
Total allocated: 147317 bytes (831 objects)
Total retained:  60863 bytes (152 objects)

allocated memory by gem
-----------------------------------
     74492  lib
     52894  rubygems
     12659  omniauth/lib
      4200  rack-2.0.7
      2832  hashie-3.6.0

So that’s OmniAuth. If your Rails app is more than a few years old and integrates with other services, you’re probably already using it. Thanks, OmniAuth community!


  1. This series isn’t meant as tutorials for getting started with these libraries. If tutorials are the first thirty minutes I spend with a library, these are the second thirty minutes where I start to wonder how this library works. I’ll always link to getting started tutorials though! 
  2. In short: user clicks a link/submits a form on your site to initiate authentication with the other site. If the user successfully authenticates with the other site, they are redirected (the callback) back to your site with a user info and an access token encoded in a query parameter. OAuth 2 simplified is an even better read. 

Gorillaz & Moby & Van Vaudeville & Soulection

Gorillaz, Demon Days - this one holds up, still a solid album.

News to me, Moby has been making extended ambient tracks in some manner of partnership with the Calm app. They make good “I need to focus and get stuff done” music, but aren’t particularly high energy, if that’s your thing. Says Moby, “my suggestion is to not approach this as music, but to approach it as a sleep aid or tool”. Okay!

I would like to some day learn enough piano to play and sing the songs of the original Van Halen line-up, e.g. “Panama”, “Hot for Teacher”, “Beautiful Girls”, and “Unchained”. My theory here is, the original Van Halen is very Vaudeville, except louder and more late-seventies. Corollary: played literally and with a little bit of a vaudevillian spin, they’d work perfectly. Case in point: “Ice Cream Man”.

Somehow, I’ve never mentioned Soulection Radio. It’s equal parts new R&B/hip-hop, classic soul, and a lot of sample culture. It’s one of the best things going on Apple Music, Spotify, and Soundcloud.


Robocalls. What a concept!

They’re on our phones, in our voicemails. Computers or sometimes even humans calling in massive volumes, funneling people into bad purchases. Questionable insurance at best, outright fraud at worst. Sometimes, depending on the state you live in, politics!

There’s no reason to pick up on an unknown number in 2019, or even 2009. For many of us, Dunbar’s number for phone calls is in the low single digits. Outside those few numbers, why answer an even remotely questionable number, ever?

If you squint right, robocalls appear they were  designed for the technological landscape of 1995, of Friends and cordless, landline phones. Robocalls,  could have made sense in 1995. You get a call, it’s Friday, there are no repeats of your favorite show on, you’re a bit bored. Sure, maybe you’ll pick up. Or in 1992, when receiving a phone call was not only a big, exciting deal!, but also a social imperative. You can’t just let the answering machine pick up? It could be…someone. Probably a human!

Sadly, the technological landscape I just described is exactly folks who aren’t “technology natives”. I suspect that’s largely who Robocalls prey on: the bored and lonely, those who grew up before the pace of technological evolution surged and haven’t developed a layered defense to those who would prey on them.


How we get back to space

Space isn’t a dead-end, it’s just taking us longer to figure out than our earliest trajectory. The New Yorker has a great look at The Race to Develop the Moon for industrial purposes:

Lunar construction projects now look feasible. “Down the hall, we have a telerobotics lab,” Burns said. “You could print components of habitats, of telescopes. You use the lunar regolith”—the dust of the moon—“as your printing material. You could print the wrench you need to fix something.” Fifteen years ago, the moon was believed to be a dry rock; now we know that there’s water there. Both private industry and national agencies regard the mining of water and precious materials as something that’s not too far off.

Only twelve people have walked on the moon, all of them between the summer of 1969 and Christmas, 1972. All the moonwalkers were men, all were American, all but one were Boy Scouts, and almost all listened to country-and-Western music on their way to the moon; they earned eight dollars a day, minus a fee for a bed on the spacecraft.

Buzz Aldrin had hoped, and briefly expected, that it would be he, and not Neil Armstrong, who would take the first human step on the moon. The astronaut Michael Collins, who manned the control module that orbited the moon while Armstrong and Aldrin walked below, has said of Aldrin that he “resents not being first on the moon more than he appreciates being second.” On the moon, Armstrong took photos of Aldrin posing, but Aldrin took none of Armstrong doing the same. One of the few photos that shows Neil Armstrong on the moon was taken by Armstrong himself—of his reflection in Aldrin’s helmet, as Aldrin salutes the flag. We are petty and misbehave on Earth; we will be petty and misbehave in space.

​Futurism isn’t dead, it’s just not all around us like Tomorrowland promised.


The notes - May 6, 2018

Unclogging the blog pipes here…

Think better

I feel seen - Satisfaction and progress in open-ended work:

For more open-ended problems, much of the challenge lies in figuring out what to do next. These rich questions offer deep satisfaction on longer time scales, but without a clear sense of progress, each day ends ambiguously. Was today good? Will these tinkerings add up to anything? In what timeframe? Who knows. Ultimately: what structures around progress, self-correction, and operations can help us in open-ended mode?

Times Jason Kottke or Austin Kleon wrote about thoughtfully engaging with the news: Things you notice when you quit the news, A tip for a better media diet: delay reading the news, You can be woke without waking up to the news.

Code better

I revisited thinking about code on my iPad again this weekend. On the one hand, the status quo continues: you can type programs in, but you can’t navigate, compile, or run them on the device. Textastic, Working Copy, Codea, and Swift Playgrounds continue to exist and continue to set a high standard but leave me wanting. I did make it further using CodeSandbox than last time I tried. If you don’t mind living entirely in a mobile Safari tab, you can do non-trivial things with JavaScript!

Related: Muse is a prototype for an iPad-based thinking environment and I want this running on a dozen iPads spread across a big table in a well-lit room. The demo video and accompanying essay are full of great ideas.

SRE School: No Haunted Forests:

You've heard the euphemism tech debt, where like a car loan you hold a recurring obligation in exchange for immediate liquidity. But this is misleading: bad code is not merely overhead, it also reduces optionality for all teams that come in contact with it. Imagine being unable to get indoor plumbing because your neighbor has a mortgage!

Preact - a cool way to understand React as a UI runtime is to look at smaller, single purpose implementation of the concept. To my surprise, much of React’s API surface area is about delivering values to components, passing those values to components, and letting the component help decide if it should re-render. All implemented in two not-so-tricky functions which handle render components.

Listen better

Spider-Man: Into the Spider-Verse - fresher than it is essential, carries the vibe of the movie nicely.

Ben Folds Five, The Unauthorized Biography of Reinhold Messner - I forgot how strongly this album starts, “Narcolepsy is a real gem”.

New-to-me band whose whole catalog I’m celebrating: The Middle Kids.

Vampire Weekend, Father of the Bride - meets but does not exceed expectations.


Possibly the biggest upsight I’ve had on software estimation in a while - the blowup factor: erikbern.com/2019/04/1…


What makes Into the Wide Open such a great album?

Into the Great Wide Open strikes me as a singular album. Perhaps it’s not even the best Tom Petty album, but it stands out from the rest in some kind of way.

Maybe it’s nostalgia? It’s the first Petty album I bought.

Maybe it’s humble? None of the songs are flashy, sitting right on the fence between songwriting and rock ‘n roll.

Maybe it’s the lyrics? I’ve listened to this album a lot, so I’ve actually heard the lyrics and they’re the right balance between clever and storytelling, for me.

Maybe it’s Jeff Lynne? Love that guy’s production work. Great touch.

It’s not too long, it’s not too short. All the moving parts do their job without getting showy. Perhaps, it’s just more than the sum of its parts.


Typo’d GraphQL as “GraphSQL” and was like “that’s a little on the nose there, fingers”


A nice reminder that our work is often more about storytelling than we think - Name It, and They Will Come — Overreacted


TIL, Vim hybrid absolute + relative line numbering: jeffkreeftmeijer.com/vim-numbe…


Does Clojure style still rely on writing a lot of chains of higher-order functions (with -> IIRC) or have they moved on to something else?


Sometimes software rewrites don’t fail - if you focus on escaping a local maximum for the product and customers.


Leaning into the impostor syndrome here, I did a little bit of GraphQL hacking to see how the ecosystem is coming along. Not too badly! github.com/therealad…

Also, semi-literate programming 🤓🤠💪!


Stephen Anderson on The Future of Design: Computation & Complexity. Like everything else, its going to get more weird. But, the large-scale outcome remains the same - design is deciding which elements are essential and which elements to remove:

The real world isn’t so simple, and often has many competing goals and constraints. As a designer, what are you already doing, to help define the objectives and goals for a project? As critical as this is to teamwork, it’s the single, driving factor for machines. We can — and should — absolutely lean into defining these things. This has always been important, but will be vital as we hand over more decisions to Machine Learning.

This definitely sounds like the future…

Now, what if I told you nothing could be designed that can’t be pitched, coded up, and released in an afternoon. Sound insane? I know of at least one company — the largest in their industry — that works this way.

…and we have to invent a future where we solve this future we created without thinking through the ramifications:

Never before has technology allowed individuals to do more harm (or good) with such low effort. — Christian Beck

​Any practice where we can drive the iteration time to zero will end up requiring a new way of working where the computer generates a bunch of possible designs/systems/artifacts and a human applies education and intuition to determine which one to keep:

Play this out, and the role of human shifts from that of hands-on creator using software to render an idea to that of a conductor (or curator or cultivator?) working with software to explore possible options. In a sense, we develop a sort of symbiotic relationship with the machine; the machine generates possibilities that we then direct or tweak until arriving at an optimal solution. We see this playing out in nearly every industry, from manufacturing to the design of web sites to healthcare.

​A phase transition has already happened where the most successful systems occasionally touch the lives of city-sized populations. “Scale” means the most successful systems/platforms touch entire societies and a major fraction of the human population. I missed this forest amongst the trees of frameworks, languages, and databases. I suspect leaders like Zuckerberg and Dorsey missed it amongst the trees of growth and market acquisition.

Again, we have to invent a future where we fix the future we accidentally created:

What is new in all this is visibility into the scale and scope of problems we now work on — we have to ask questions about impact and outcomes. Facebook and Twitter are platforms that have changed the world. The addictive properties of Pinterest and SnapChat are changing human behavior and social interactions. We can’t treat these things like simple web apps. They aren’t.

Part of inventing the future to fix the future is thinking more about feedback loops and how small changes in forces and incentives create outsized results:

Much of the literature on formal systems thinking is dedicated to this topic of small changes. Reinforcing loops and balancing loops are the two foundational structures of systems thinking. The idea goes like this: Want to introduce a change? Don’t try to change the system (you can’t!). Instead, introduce a small change, or tweak an existing rule, then see what happens.

More optimiscally, this last bit leads me to (continue to) think that the skills designers need aren’t so far off the skills developers need:

I’ve identified about 11 ways of being that describe design. I won’t go into them all — there’s a post coming for that. But you’ve heard me mention some of these:

  • Frame & Reframe Problems
  • Work from Principles & Values
  • Think in Systems and Contexts
  • Focus on Human Needs & Motivations
  • See Possible Futures (where Others See Present Realities)
  • Thrive on Ambiguity