Van Halen ranked, atypically
Best songs that David Lee Roth talks over:
- "Hot for Teacher"
- "Panama"
- "Everybody Wants Some"
Coincidentally, best use of Van Halen songs in film:
- "Hot for Teacher" in the strip club scene of Varsity Blues
- "Panama" in the joyriding/donuts scene of Superbad
- "Everybody Wants Some" in the Hummer scene of Zombieland
Bon Iver discovers the Option key on his Mac
[caption id=“attachment_3815” align=“alignnone” width=“213”] Someone just discovered all the weird glyphs you can make if you hold the option key and type random stuff![/caption]
22, A Million, quick thoughts:
- first track has a very Tune-Yards drums thing going
- second track has a very 808s & Heartbreak thing
- a few tracks in: each track is like Bon Iver doing someone else’s track from the past ten years, but with emo autotune
- I like the background piano/horn tracks on “29 #Strafford APTS”
- feels like the track sequencing demonstrates thinking through emotional/tempo pacing 👍
- I really like the use of pseudo-sax harmony e.g. “____45_____”; slightly Ornette Coleman-esque
- I like how a lot of the individual parts don’t fit together exactly right, but it still works
So what genre is this album? Neo-electro-ambient-folk-jam? Either way, it works!

My first car. Except not right-hand drive. 1989 Honda Accord. And it was not nearly so clean, or grey. But you could fit a double bass in the front seat! Pretty practical for my high school needs.
On the albums of The Clash
Passing thoughts on the discography of The Clash that is not London Calling:
- Brian and I had a conversation that randomly veered onto the Clash which prompted to me to listen to all of their studio albums
- I have listened to London Calling a few times before, and recall some story about its producer encouraging them to go broader with the album so as to reach a wider audience; basically that it’s not much like their other albums
- I enjoy London Calling, but I’m not sure what to expect from a categorical English punk band
- I like the punk ethos of don’t wait for permission and build it yourself
- I strongly dislike when punk music is simplistic shouting
- Enough about me, let’s talk about the music
- I was pleasantly surprised!
- Their early albums don’t sound like the learned to play their instruments an hour before they started recording
- They probably listened to music outside of their genre even before London Calling 👍
- The albums after London Calling sound like they were trying to walk a line between keeping to their punk/ish origins and exploring integrating other genres into their sound
- I should mention that their “Guns On the Roof” is exactly the same riff as The Who’s “Can’t Explain”
- Would listen again!
This has been 🔥 takes.
We’re all adults here, but we’re not all mind readers
My favorite advice on the topic of method visibility (i.e. public vs. private) comes from Python creator Guido van Rossum. It goes something like “we’re all adults here” and says it’s not really a necessary thing for compilers/runtimes to hide methods from specific callers. Don’t go mucking around in other object’s implementations. I still think that’s mostly right.
Except, coming up to speed on a new code base is vastly easier when there’s some delineation of the waterline between an object’s public API which it expects other objects to use and its private implementation which it does not. It tells me a) the private methods are open for change and refactoring and b) below the private “waterline”, don’t bother going any deeper when spelunking to figure out how this program works.
In a new or strange codebase, every little bit of tractability helps.
Here comes GraphQL
GraphQL is gaining purchase outside of the JavaScript communities and this seems like a pretty good thing. Shopify and GitHub have jumped on board. Absinthe (Elixir) and graphql-ruby have caught my attention, though I haven’t had an opportunity to tinker with them yet.
That said, I like that GraphQL (and JSON API) let service developers focus on exposing a specific data model and optimizing access to it rather than taking a side quest through REST API design. For application developers, building screens and interactions with the data they need defined inline seems like a big win for contextual understanding.
As ever, the risk of using any kind of mapping layer, whether its objects and relational data or JSON object graphs to downstream service calls, is creating a naive, one to one mapping that create awkwardness and inefficiency.
Weaponized jerks
For a long time, the Central Intelligence Agency has had a guide to wrecking an organization by doing a few weird tricks at meetings. It recently came to light, and took hold as a meme, that this is the reality many people (non-spies) experience in their actual work life. Basically, some people work with weaponized jerks.
Which leads me to wonder, did the CIA invent these tactics, or did they discover them? Were they sitting around, talking about how big of a jerk John is at meetings and how he’s causing the Communists to win? And then they said to themselves, “hey, what if we had low-level agents just be like John?!”
And thus, the CIA made the world just a little bit less great.
Refactor the cow paths
Ron Jeffries, Refactoring – Not on the backlog!
Simples! We take the next feature that we are asked to build, and instead of detouring around all the weeds and bushes, we take the time to clear a path through some of them. Maybe we detour around others. We improve the code where we work, and ignore the code where we don't have to work. We get a nice clean path for some of our work. Odds are, we'll visit this place again: that's how software development works.
Check out his drawings, telling the story of a project evolving from a clear lawn to one overwhelmed with brush. Once your project is overwhelmed with code slowing you down, don’t burn it down. Jeffries says we should instead use whatever work is next to do enabling refactorings to make the project work happens. Since locality is such a strong force in software, it’s likely that refactoring will help the next bit of project work. Repeat several times and a new golden path emerges through your software.
In other words, don’t reach for a new master plan when the effort to change your software goes up. Pave the cow paths through whatever work you’re doing!
A bold, future-retro Audi dash
I’m officially intrigued by the Audi TT and R8 going with no center display. The look is retro and functional. Will it annoy passengers, or do passengers who want to change the radio or see the map even matter in those cars? Worth noting that the 2016 A4 has the same display for the instrument cluster and a giant center display.

Another cool design detail: the A/C controls are on the center of the eyeball vents. Pretty cool!
Our current political Trolley Problem
As self-driving cars inch closer to a daily reality, the Trolley Problem seems to have entered our lexicon. In short, should a self-driving computer choose to avoid hitting a bunch of people and kill its single occupant as a result? Turns out people expect the car to protect the greater good second and their own skin first.
Maybe out our current political environment of unfettered gun violence, climate change, Trump-lead racism, Brexit-fueled xenophobia, and general apprehension about losing what we thought we’d earned are a kind of longer-term but still serious Trolley Problem. Would you vote to improve society at large even if it meant taking yourself down a ego/prestige/money notch?
Well when I put it that way, things seem pretty bleak!
I happened across an Alan Kay essay, Enlightened Imagination for Citizens, and it kinda helped me get through that bleakness. Some highlights:
In a raging flood, a man risks his life to save a swept away child, but two years earlier he voted against strengthening the levee whose breaching caused the flood. During an epidemic people work tirelessly to help the stricken, but ignored elementary sanitation processes that could have prevented the outbreak. More astoundingly, as many as 200,000 Americans die each year from diseases spread by their own doctors who have been ignoring elementary sanitation (including simply washing their hands when needed), but who then work diligently to try to save the patients they have infected. Studies show that about 80% of Americans are “highly concerned” about climate change, yet this percentage drops to less than 20% when the issue is combined with what it will cost to actually deal with these changes.
Regarding our inability to reason about dynamic systems:
One of the reasons the consequences were not imagined is that our human commonsense tends to think of “stability” as something static, whereas in systems it is a dynamic process that can be fragile to modest changes. One way to imagine “stability” is to take a bottle and turn it upside down. If it is gently poked, it will return to its “stable position”. But a slightly more forceful poke will topple it. It is still a system, but has moved into a new dynamic stability, one which will take much more work to restore than required to topple it.
On acting now instead of acquiring a perfect answer or solution:
When the costs of an imperfectly understood event are high or essentially irreversible, measures have to be taken even when perfect proofs are lacking. This idea is understood by most developed societies—and carried out in the form of levees and pumps, food and water stocks, etc.—but is nonetheless resisted by many of the voting public.
Perhaps the solution is to get ourselves representatives that excel at reasoning and legislation instead of politics and fundraising?
One of the reasons we are a republic with a democratic base is that the representatives can be selected to be “the best and the brightest” from the population as a whole (this was another early ideal for the great American experiment). We could argue that the current representatives are “all too representative”, but this is part of a slide in our political and social systems that needs to be shored up and improved. The idea of “national service” is now just a whisper, but it is what needs to be brought back into the forefront of what it means to be a citizen.
A few qualities of mature developers
What is technical leadership? Per Mature Developers, it's a lot of things. My favorites:
So one of the first and most important qualities of mature developers is they’re more often than not paying attention to what is going on around them. They’re deliberately taking their time to observe before proceeding (put succinctly as STOP; Stop, Take a breath, Observe, Proceed).
It is so hard for me to do the stop and breath part.
Sharing the [technical] vision with other involved parties not only serves as a perfect opportunity for practicing one’s skills to explain deeply technical terms and circumstances with non-technical people. It also serves the purpose to validate the vision in terms of relevance to business value and other aspects.
Assessing and understanding risks better puts them into a position where it’s also more likely they’ll actually take risks. Risks which, without the knowledge about business value and the bigger context, may look too big to be worthwhile. But not for mature developers who are able to see beyond the obvious risks and include more aspects into their judgement.
Managing risk, but not overmanaging it: also very difficult.
Previously: Thoughts on “Being a Senior Engineer”.
I love when snares don't keep time
In the majority of music you’ll hear after 1960, the drummer does most of the time keeping with their snare. On 100% of Bruce Springsteen songs, time is kept entirely with the snare. I listen to a lot of The Boss; it’s a little surprising when I don’t here a consistent 1/3 or 2/4 snare keeping time.
That makes the drumming on most jazz albums pretty delightful. For example, Cannonball Adderley, “Games” (Roy McCurdy on drums):
We should make jokes about tech millionaires
I try not to respond to the bullshit in this world with “this person is awful and they should feel awful”. Except for politicians. I try not to participate in witch hunts. I cope via jokes and satire.
After making a few jokes about Paul Graham at RubyConf, a fellow asked me why I made fun of that poor kingmaker (not his words). In short, I think everyone should make jokes about multimillionaires, especially Paul Graham. He’s a celebrity-of-sorts, making the idea of Paul Graham completely open to satire and ridicule. My favorite such satire was a composite character from Silicon Valley who, due to the actor’s passing, will sadly not recur on the show. So it’s up to us, the unwashed internet people, to poke sticks in his platonic sides.
The thing to illuminate is how past Paul Graham used to have the analytical and rational skills to tell when someone like current Paul Graham is acting a fool. Graham suffers from confirmation bias and billionaire bias. He thinks his rational skills are still sharp enough to help him write about extremely tricky and irrational topics like diversity or inequality and he thinks his monetary success makes him doubly qualified to write about these topics from his own first principles. In other words, Past Paul Graham should know enough to tell Current Paul Graham when he’s out of his league.
I feel Paul Graham is an example of the geeks-shall-inherit-the-world and corruption of money that is bullshit in this world and everyone should apply satire to him whenever possible.
Why I blog in bursts
I write here in bursts. It confounds me as to what marks the beginning and end of those spikes. I have a few hunches:
- ambitions grow larger than my free time: it’s easier to hit publish on a self-contained thought than a connected series or magnum-opus essay
- intervention of life: work, vacation, various chores adults are expected to perform
- self-distraction: acting as a novelty junky rather than pushing one thing through to completion
- tweeting less: putting little thoughts into tweets means I’m driven to put slighly-not-little thoughts into blog posts
- reading less: reading interesting things drives me to (attempt to) write interesting things
- skipping record: I worry I’ve already had this thought and published it somewhere
Also sometimes I’m not quite sure how to end a thought like this and I wonder if I should worry about that and then I decide to let it slide.
Extra Ruby chaining, not that costly
A few folks suggested I try lazy enumerables to make my extremely chained style practical. I was curious about the actual costs of my style, so it’s time for lies and microbenchmarks! Turns out naively chaining a bunch of maps together isn’t very costly, so go with that to start.
Lazy came in much slower than consolidating the logic in one loop or chaining them without lazy. I thought, I must not have used lazy properly. Turns out, I’m probably showing that laziness isn’t well suited to iterating over collections without an early termination clause (e.g. a take, first, or find) and that for small collections (like an 87-line /etc/passwd), the cost of the lazy plumbing can noticeably outweigh the work done inside the loops. Thanks to Rein Heinrich for talking me to the bottom line!
One idea per line
Lately, I’m doing a weird thing when writing Ruby code. I’m trying to only put one idea or action per line. I’m not sure about it yet.
Here’s what a method to fetch item-y things might look like:
def fetch_items(options={})
limit = options.fetch(:limit)
timestamp = options.fetch(:timestamp)
paged_helper = PagedHelper
client = OurHttpClient
responses = paged_helper.
new(limit, timestamp).
fetch_pages { |params| client.get(params) }
responses.
map { |r| JSON.parse(r) }.
map { |h| ItemCollection.new(h) }.
map { |ic| ic.items }.
flatten
end
For the sake of comparison, here’s how I may have written that method a couple years ago:
def fetch_items(options={})
helper = PagedHelper.new(limit, timestamp)
responses = helper.fetch_pages { |params| OurHttpClient.get(params) }
responses.map { |r| ItemCollection.new(JSON.parse(r)).items }.flatten
end
I like that the pace of reading the first example is even. You don’t arrive upon some monster line of code that does a multiple things. You don’t have to unpack what’s happening in a situation where you’re calling f(g(h(some_args)))
. It makes moving lines of code around much simpler because each one is only dependent on what comes before, and not what happens inside. It’s a little easier to write a three-part method, which I really like.
But still, I hesitate. My methods end up about 50% longer. Breaking up the Enumerable
transformations into multiple loops instead of one loop doing a bunch of work is probably pretty slow. I have to come up with a lot of names (which is, I think a net good), some of which end up a little redundant.
I’ll let you know how it goes. It may not even survive code review, who knows!
Less fancy
Programming is easier when you know how to stop solving 100 problems with 1 fancy thing and solve 100 problems with 20 plain things.