Gut Check

Gut Check

It’s that time again: New Year’s resolutions! Per my meta-resolution, this year’s book reading target is 44, but I wanted to add a twist to it.

Leaders who are right a lot “seek diverse perspectives and work to disconfirm their beliefs.” In 2022, 16 of the 45 books I read in were by authors who were either not male or not white. That’s 36%, a sizable fraction; in line with what I did in 2021 (33%) and 2020 (38%), and much better than my rates in 2019 (18%) and 2018 (15%).

But none of those metrics are anywhere close to reality: about 91% of the world’s population is either not male or not white. That’s a lot of valuable perspectives I’m missing out on.

Given my backlog and some strategic book choices I have lined up, getting all the way to 40 out of 44 isn’t realistic, but I can still do better than my recent history. So in 2023, my plan is to double last year’s fraction to 32 out of 44 (73%). Ambitious but doable. And I can’t wait.

Already finished my first one, in fact: Radical Candor. And I’m a chapter into The Analects, by Confucius. It’s embarrassing that I’ve never read anything by this giant of ancient wisdom. Already found a couple sayings that stand out:

The Master acquires his information by being affable, kind, and respectful, and by showing restraint in his action and a willingness to yield. The way the Master asks for information is different from that of other people.

Do not worry that other people do not know you. But be concerned that you do not know them.

Good stuff!

Tools Of The Trade

Tools Of The Trade

I’ve been working primarily from home since early 2019, and over time have carefully crafted a space that suits my needs pretty well. Here’s what I’ve put together, roughly from left to right as pictured:

Tuft and Needle California King mattress: Sleep is critical to success at work (and life in general). Upgrading to a big bed was a game changer, I can’t believe it took 21 years of marriage to take that plunge. Worth every penny.

Washburn 12 string acoustic guitar: My wife bought this for me for our first Christmas together in 1998. I’m not much of an acoustic player, but I can strum a few chords now and then.

Carvin Bunny Brunel signature 5 string bass: I’ve been playing bass for about 8 years, first on a Gretsch Junior Jet small scale, and then on this considerable upgrade.

Gallien-Krueger MB 112 combo amp: For a couple years I played through a hand-made German tube amp paired with a classic Ampeg 8×10 refrigerator-sized speaker cabinet that I refurbished myself. It was loud as heck and cool to look at, but weighed over 200 pounds and barely fit in my largest car. The tube amp was also finicky and I once shocked myself on its 220V power input (not fun). I’ve never regretted selling it and picking up this lightweight combo and its companion extension cab (not pictured). Just as powerful, better sounding, 20% the weight and volume, and more reliable. A no-brainer.

Casio Privia PX-130 digital piano: In 2010 I was on a short-term assignment 2500 miles from home, and needed something productive to do during my downtime. Bought this instrument and had it shipped to my extended stay hotel; it was just what the doctor ordered. The assignment ended up becoming a full-time gig, the one that led me to relocate from Ohio to San Diego. One of my better life decisions.

Picasso’s The Old Guitarist (not pictured): The art in the photo is some generic thing we bought when relocated, I don’t even remember where from. So I’d rather talk about the artwork you can’t see here, but will see in the background if you’re on a video call with me. It’s a print of my wife’s favorite painting. Also in the room are a pencil drawing of a character from the Wingfeather Saga that I commissioned the author’s son to make, and handwritten lyrics from one of my favorite Andy Gullahorn songs.

Jarvis Standing Desk from Fully: I’ll never willingly go back to a regular desk after enjoying the benefits of an adjustable height desk. I stand about 80% of the time now. And this desk was the perfect size, don’t really need a lot of space beyond what’s needed for my computer workstation.

Varier Variable Balens kneeling chair: Definitely overpriced given I stand most of the time, but given how unhealthy sitting is, when I’m not standing, I quite like kneeling. It also functions well on carpet, and tucks away nicely, both of which matter in a bedroom-based workspace.

Macbook Pro 16″ 2019: Haven’t used a Windows PC since 2012, and won’t ever go back. Would prefer native Linux, but I can still do enough terminal-based things to make it feel Unix-like. Upgrading to 32GB of RAM and going back to physical function keys would be nice but I’m fine for now.

Dell UltraSharp 34 Curved USB-C Monitor: Absolutely love only needing to plug in a single cable into my laptop for data and power, and the integrated USB ports mean no additional docking station is needing. Five years ago I would have wished for more resolution (and likely a second monitor), but training myself to organize my active work across multiple desktops obviated that need, and the screen itself is plenty wide for two windows side-by-side. As an aside, anyone who still insists on 80 character limits for code line length needs to be sent back to 1998; silliest linter default setting ever.

Logitech MX Mechanical Mini keyboard: The loud clickity-clack would get annoying in an office, but I’m by myself all day, so I’m loving it. The layout isn’t quite the same as the keyboard on the laptop itself, which is a tiny bit annoying, but I’ve adjusted.

Logitech MX Master 3S mouse: Lots of buttons and scroll doohickeys, fully programmable, feels great in the hand. Especially love that I can activate mission control with one press; really helps keep my windows organized.

Razer Kiyo Pro webcam: I spend a good portion of my day on video calls, including ones with customers with whom I need to earn trust. Every bit of quality matters when trying to communicate, thus a high-quality webcam that works in a variety of lighting conditions (I’m often on calls early in the morning before the sun is up). Sadly their software doesn’t work on Mac, but I can still tweak the settings with CameraController.

Blue Yeti X microphone: Audio quality probably matters even more than video quality when it comes to projecting trustworthiness and authority, thus I didn’t scrimp. With the boom arm I’m able to position the mic so it’s just out of the frame of the webcam. I’m not going for streamer or podcast vibes, I want the focus on my message, not the gear.

Shokz OpenRun Pro mini headphones (not pictured): Having a mic like the Yeti X means I can’t play call audio through speakers or listeners will hear feedback. That means using headphones. But I don’t want something bulky or that draws attention to itself. These are barely visible, sound sufficiently good for voice, have a battery that lasts darn near forever, and the open design means I can go between taking calls and hearing what’s going on around me at will. As the name implies, they’re also great for exercise. For music, and when I need isolation, my Sony WH1000XM4 headphones are vastly better, but they’re not nearly as convenient for every day wear.

Timbuk2 San Francisco backpack: I’m due for an upgrade here, but for now this gets the job done. What’s more important is what I keep in it at all times:

  • One each of a black, blue, and red pen, a 0.5mm mechanical pencil, and a small tablet of paper
  • Dual-ended whiteboard markers (blue, red, black, and orange)
  • USB-C to video adapter (includes HDMI, DVI, and VGA because you never know)
  • Nekteck 107W USB-C Charger with a 10 ft power cord (love this thing and its 4 ports)
  • Anker portable battery, and various USB power cables, enough to adapt between C, A, and micro-B as needed
  • USB-A to Apple lightning cord (I don’t have an iPhone, but I want to be helpful if others need one)
  • Extra charging cable for my watch and my headset (both of which are proprietary)
  • Toothbrush, toothpaste, floss, breath mints, deodorant, moist hand wipes, napkins, and a couple masks
  • Advil, Aleve, cold medicine of some kind, sunscreen, chapstick, and earplugs
  • Small stack of business cards
  • Travel umbrella

Thanks for reading all the way to the end of this monster post. Happy New Year to ya!

Whoever Will Lose Their Life

Whoever Will Lose Their Life

Last month, my post on layoffs got 113 views in one day. I suppose that’s what passes as “going viral” around these parts. While I certainly wouldn’t mind more readers, I’m okay with my current reach.

How does that square with the principle of thinking big? The common way of considering scale is quantity; it’s certainly the easiest to measure. But one can have an outsized impact in quality without needing large numbers. Think of it like big in depth vs big in breadth. When it comes to technology I embrace breadth, but when it comes to impact, I value depth quite a bit more. And sometimes to get that result requires thinking small.

On my desk is the following photograph by Eric Peters. It captures my objective well.

Speaking of things on my desk, perhaps I’ll document my setup in a future post. That could be fun.

Welcome Robot Overlords

Welcome Robot Overlords

Maybe I don’t actually need to learn a new programming language?

Naturally, I’ll have more to say on this soon. But I figured I’d also ask ChatGPT its opinion on the question:

It depends on what you want to do with programming. If you are just starting out with programming and don’t have any specific goals in mind, you may want to start with a general-purpose programming language like Python or Java. These languages are widely used and have a large community of users, so you can find a lot of resources to help you learn and get started.

If you have specific goals in mind, such as building web applications or mobile apps, you may need to learn a language that is more specialized for those purposes. For example, if you want to build web applications, you may want to learn HTML, CSS, and JavaScript. If you want to build mobile apps, you may want to learn a language like Swift (for iOS) or Java (for Android).

In general, it’s a good idea to start with a general-purpose language and then learn additional languages as needed to achieve your goals. This will give you a strong foundation in programming concepts that you can apply to any language you learn in the future.

That’s pretty solid advice for a newbie, but I’m far from that. Perhaps the human touch is still needed?

We’re All Coders Now

We’re All Coders Now

I work in the intersection of technology and government. Which is why stumbling on Catala was such a delight. “Deriving faithful-by-construction algorithms from legislative texts” you say? Uh yeah, pretty sure my customers could benefit from that kind of rigor.

And could it count for my currently unmet resolution if I can pick up the basics before year-end? I get to decide the answer to that, and the answer is yes. Time to get reading.

Eyes On The Prize

Eyes On The Prize

“Only those who will risk going too far can possibly find out how far one can go.”

T. S. Eliot

Yesterday I finished To Flourish or Destruct, and with that I’ve completed year one of my meta-resolution: reading 43 books, the same number as my age.

I’ve also successfully written on this blog at least once every month, another of my resolutions. This is my 31st post, so I’ll finish the year no worse than averaging 2.5 posts a month, a pace I’m happy with.

However, I haven’t ended up learning a new programming language this year, my other resolution. And that’s okay. Not because ChatGPT stands to replace coders soon (spoiler: it won’t), but because while goals should be SMART, they needn’t all be actually achieved. The goal of resolutions is not absolute completion, but inspiring yourself to accomplish something. To move the needle positively for your life. To take a step towards become a fully flourishing human person, as Christian Smith would say in the book I just read (echoing Aristotle 2300 years before him).

While each goal in and of itself should be achievable (the A in SMART), in aggregate they should be aspirational. When discussing goal setting with my team, I want them to define enough goals for themselves that it’s likely there’s one or two they won’t complete. Otherwise they’re not thinking big enough.

Livin’ On A Prayer

Livin’ On A Prayer

Today marks a unique milestone. It’s exactly halfway between the day I started my professional career as a software developer (June 4, 2001) and the same date the year I turn 65 (June 4, 2044), ostensibly about the time I retire (though who knows, I’m a bit of a workaholic).

Richard Rohr, the Franciscan priest and writer, speaks of “the two halves of life” in his book Falling Upward. Indeed, midpoints are a common moment to reflect on how far one has come, and how far one has left to go. I’m no exception to that. I’ve been blessed to have been in the tech industry for over 20 years. Done some fun work. Some interesting work. And I hope, some work that’s used technology to improve people’s lives while having a positive influence on those around me along the way.

It’s a common refrain that technology in its myriad forms has ruined humanity, whether it be social media and cell phones in 2022, the printing press back in the 15th century, or even agriculture in ages past. Maybe I prefer to see the bright side in things, because I believe that despite our faults in wielding it, the evidence shows that technology has unlocked human potential and made lives better in innumerable ways. I wouldn’t wish any of it away, and moving forward it still can, should, and must be used for the betterment of us all.

This will require us to remain vigilant and disciplined, ask tough questions, and apply our knowledge well, but I believe that it’s possible to do so. I’ve tried my best these first twenty-one and a half years. Here’s to twenty-one and a half more!

Zeros And Ones

Zeros And Ones

If you’ve never heard of Benford’s Law, it’s worth reading about this nifty statistical fact. The gist is that for certain types of data sets, the frequency of the leading digit follows a predictable pattern (with 1 being the most frequent by far). I decided to put it to the test by analyzing the total view counts for each post on this blog.

Leading DigitActual RatePredicted Rate
131.3%30.1%
227.7%17.6%
317.5%12.5%
47.8%9.7%
55.4%7.9%
62.4%6.7%
71.2%5.8%
84.2%5.1%
92.4%4.6%

I guess that’s why they call it a law, because the actual digit rates match up pretty well.

Speaking of which, apparently I also have a thing for named laws. If you do too, the article is worth it for this side note:

The fact that things are often named for someone who didn’t discover it first is common. In fact, there is a name for this, Stigler’s Law of Eponymy. It was proposed by the American statistics professor Stephen Stigler in 1980 when he wrote that no scientific discovery is named after its original discoverer. In an ironic twist, Stigler acknowledged that the American sociologist Robert Merton had previously discovered “Stigler’s Law”.

End Of An Era

End Of An Era

Frederick Brooks died last week. He was a giant of the software industry, and deserves wider recognition for his contributions. Start by reading the New York Times article linked above, then grab a copy of The Mythical Man-Month. Few works have moved me so profoundly, at least if you measure by number of times I reference them (which, incidentally, is roughly how Google’s PageRank works).

Rest in peace, Mr Brooks. I’m thankful for you, and I’m sure you won’t be forgotten by those who build our castles in the air.

Adventures With APIs

Adventures With APIs

I’ve written before about the advantages of knowing how to dig around in DevTools to reverse engineer website interfaces. This week I’ve had three further instances of doing this work to good effect.

The Friendly Skies

Firstly, I travel a lot, enough that I now have Executive Platinum status on American Airlines. This means I’m first in line for complimentary upgrades, but only if there are seats available. So I wanted an easy way to go straight to a complete seat map to look at availability without needing to go through a full search on the website. Turns out there’s a magic URL that does just that, and all you need to do is pass it some parameters. So I present to you, a quick and dirty seat map lookup form. Give it a try!

While that’s cool, I wondered if I could make it simpler by leveraging a flight data API like the one from FlightLabs. That was pretty straightforward as well. Though I couldn’t embed it in WordPress, I did script it up in Python for your enjoyment. Just pass it a flight number, and it’ll do the rest. Neat!

Shake It Off

This week Taylor Swift tour tickets went on sale, and needless to say it broke Ticketmaster, despite their best attempts to add friction via pre-registration to enter a lottery to win a code to join a queue to enter a room to maybe get lucky enough to click fast enough to buy tickets. Sadly I was unsuccessful at securing seats despite dozens attempts across several days. But I did learn something about the API Ticketmaster used to check queue status, so all was not lost.

When I first joined the queue, the following was displayed:

Of course I was curious: how many more than 2000 people were there… 5000? 25000? A million? So I opened up DevTools, and took a look at the calls coming back from the server to check status. Lo and behold, there was a wealth of info in an easily digested JSON block:

Wouldn’t it have been helpful to display that information to the user? At least the exact users in line, and the expected service time value. No idea why it wasn’t shown, other than Ticketmaster not being known as a terribly customer obsessed company.

Automating ******** Across ****

The final example can’t speak of publicly other to say my penchant for automation will save my employer a sizable amount of money. In these uncertain economic times, that’s always a good thing.