Tag: Deliver Results

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.

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.

That Lovin’ Feeling

That Lovin’ Feeling

I’ve done a fair share of production debugging in my career. There’s a heroic Dopamine rush that comes with it, that feeling of diving deep on a problem in a critical situation, finding the solution, and then implementing it to the delight of your customers and teammates (well, either delight or they graciously allow you to live another day).

A similar feeling is experienced any time you build something with your own two hands and see it come to life; that joy is why this blog is named what it is, because I love to build. But as a manager of a technical team, I don’t get the chance to directly build solutions as often as I might like, and when I do, it often represents a failure of some kind. To be successful as a leader, one needs to learn to let the joy of building go, at least the hands-on kind.

Instead, what a manager must cultivate is the joy of watching others succeed, especially those to whom they are charged to mentor as direct reports. Being thrilled when a person shares a difficult problem they solved; rejoicing when a struggling individual responds to your coaching with positive growth. Giving others the spotlight and serving their needs while hidden from view. Learn to get a Dopamine hit from such experiences, and you’ll do well.

And here’s the real kicker: when you achieve it, you’ll have scaled your ability to enjoy your job beyond what was possible before, because you now have a whole team of people whose successes are a source of happiness, versus just your own. Ultimately you’re still building, but now it’s through others.

It’s Not Personal

It’s Not Personal

I love Raising Cain’s. Their chicken fingers melt in your mouth, their sauce is top-notch, and the Texas Toast is a perfect bonus. I give it the edge over Chick-fil-A for best fast-foot chicken joint (though it’s close).

A few days ago I stopped by to get my typical 3 Finger Combo (with a lemonade and extra sauce, natch). It was pretty crowded and noisy, with many folks waiting for food, either to eat there, take with them, or to deliver on behalf of another (thanks to services like DoorDash, GrubHub, and UberEats, one can no longer make assumptions about how busy a restaurant is by the line at the counter, which is another customer experience post worth writing, but I digress). After saying what I wanted, I was asked to provide my name for the order. I did so, carefully pronouncing the short u in Jud which I’m regularly doing (it’s not a reference to the 2nd greatest Beatles song of all time, instead it’s pronounced like the country singing mother-daughter duet from the 90s, though only spelled with one d). I think they heard it right, but I couldn’t be sure.

While waiting for my food, I reflected a bit on this experience. I get the objective: make the experience more personal, so that when my order is ready I’m called by name and I thus feel like it was specially prepared. But that approach is flawed, because it fails to work backwards from actual customer desires. I suspect I’m not alone in that I don’t want a “personalized experience” at Raising Cain’s like I do at my job; I want to get the delicious chicken that I ordered quickly and accurately. An order number not only suffices, it does the job better than a name, for numerous reasons:

  • A number guarantees uniqueness in a way names do not, decreasing likelihood of an order mix-up.
  • Numbers are more easily distinguishable audibly compared to names. My name is often misheard, and it’s not nearly as tricky as many others.
  • Gathering a name requires an extra step in the ordering process, slowing it down. A number can simply be assigned.

These benefits have analogs in computer science, for example the advantages of searching a database using a unique identifier vs free text fields. Which someday when I need to explain the latter to someone who’s less familiar with the technology, I might just use the former as a metaphor: the act of ordering is adding a row to a data table of “customers waiting for orders”, and the person calling out the order once it’s ready is querying that table. A good database design seeks to make such queries unique and performant.

Further, the model of indicating a parking space number when getting curbside delivery is remarkably similar to hash-based lookups. Hmm, I probably need to turn this into a larger talk someday.

But in the meantime, when I’m asked for my name at a restaurant checkout counter? Call me “three one four” thank you very much.

Throwing In The Towel

Throwing In The Towel

I’ve said before that I enjoy thinking about organizations, continuously optimizing them to give the highest probability of the desired outcomes. Organizational ergonomics, if you will. I’m also a mathematician by training and a nerd, which is what made Applying the Universal Scalability Law to organizations such a fascinating read, because it puts statistical weight behind its arguments.

In the same vein, I thoroughly enjoyed the following two articles that take a mathematical approach to understanding variability in project estimation (a perniciously difficult problem in all technical work):

The latter’s provocative title hopefully piques your interest enough to read further. You won’t regret it!

My Kingdom For A Streak

My Kingdom For A Streak

Because I’m a LeBron fan, when it comes to Wordle, I care more about longevity of sustained greatness (i.e. my perfect streak of winning games) than I do about having epic individual performances (i.e. having a lot games where I’ve won in 2 or 3 guesses). That means I need a way to keep my statistics even if I move between devices or need to replace one.

Almost to quadruple 100!

It turns out (at least as of this writing, who knows if the NYT will change it) that statistics are stored in a simple JSON object in browser local storage. On a laptop this storage is easily manipulated using DevTools, and on mobile it’s a bit tougher but still not too bad, at least on Android.

Both of the above, however, rely on GUIs. It got me thinking if there was a scriptable approach. First, I found a Python library (natch) that can speak the Chrome DevTools protocol. Then I had to figure out how to use it to read and write to local storage. That wasn’t too hard (even though the example here is in Node, the technique was portable). Finally I needed to make the library connect to both a laptop-based browser (easy), and my Android phone via adb (not so easy). Luckily I stumbled on the correct magical incantation in this post. Put it all together, and boom, I can now backup my Wordle streak, and easily transfer it between devices, using a script:

import chrome_local_storage

laptop_storage = chrome_local_storage.ChromeLocalStorage(port=9222)
phone_storage = chrome_local_storage.ChromeLocalStorage(port=9223)

wordle_stats = laptop_storage.get('games/wordle', 'nyt-wordle-statistics')
phone_storage.set('games/wordle', 'nyt-wordle-statistics', wordle_stats)

Want to see how I did it? Well, you’re in luck, because I packaged up my implementation and published it on PyPI. The source code is also on Github. Enjoy!

Left Hand, Meet Right Hand

Left Hand, Meet Right Hand

Earlier this week I got an email from a recruiter. In itself, that’s not a remarkable occurrence, I’ve gotten 263 such emails since I started tracking them back in 2015. What made this one funny is that it was from my current employer.

I’m regularly asked about the corporate culture at AWS, and a common way I’ve described it is being like a large collection of small startups. This decentralization has a number of benefits, not least of which it only rarely feels like I’m working for a curmudgeonly big business (especially when compared to my last large company gig). But every once in a while the disadvantages show.

Put A Bow On It

Put A Bow On It

Despite writing a bit about CDK nearly two years ago, it’s taken me some time to get a chance to really lean into it. Having now built out a couple real projects, I can confidently say that like it has its rough edges, like any technology, but overall it’s both powerful and fun.

If you’re so inclined, feel free to check out my most recent creation, a construct for deploying a Hyperledger Fabric network on Amazon Managed Blockchain.

# Easy as pie!
HyperledgerFabricNetwork(
    self, 'MyNetwork',
    network_name='MyNetwork',
    member_name='MyMember',
)

For my next trick post I’ll go through one of the aforementioned rough edges I discovered, and how it can hopefully be fixed.

Whatcha Been Up To?

Whatcha Been Up To?

I’m naming this truism in honor of the co-inventor of the spreadsheet:

Bricklin’s Law

The probability of a project’s success is inversely proportional to the number of status tracking tools used by its team members.

Also, I think this is the first time I’ve used “pull quote” formatting on this blog. Neat!