Tag: Dive Deep

Let’s Reason Together

Let’s Reason Together

For the past few weeks I’ve made considerable gains in learning AI-related tools. Not through some formal training process, but by just doing it. I guess it’s good to heed my own advice?

Professional learning needn’t be solely focused on seemingly professional stuff, either. Part of what helped free the mental logjam of diving deep was allowing myself to use AI for fun stuff, such as creative writing. Going through that process has revealed both the power and limitations of LLMs; experiences I’ll be able to carry forward into professional use cases.

One pretty clear lesson is that, past a certain size, projects need to have some degree of structure, lest context get lost in a sea of tokens. Another lesson is that motivation for learning often comes when working on a project together with others.

To support the above, as an aid for creative writers using AI, I created this story framework repository. It contains all the scaffolding required to keep track of large creative writing projects, along with instructions to a number of AI tools on how to use it. And since it’s based on git and plain text files with markdown, it naturally supports group collaboration through branching, pull requests, and commit history.

Want to try your hand at AI-assisted storytelling? Give it a try!

Patience Isn’t A Virtue

Patience Isn’t A Virtue

I’ve had space on the brain recently, having in the last month visited both the Jet Propulsion Laboratory and the Johnson Space Center. There’s a paradox of sorts when thinking about interstellar travel called the wait calculation (or, in simpler form, the wait/walk dilemma). The gist is that we should not launch a slow spacecraft now because one sent later with a faster propulsion system would simply overtake it. Repeat that argument ad infinitum, and you’ll never launch, hence the paradox.

These days I’m feeling caught in a similar sort of trap when it comes to learning about AI, with announcements almost daily (just this week, GPT-5 launched, right on the heels of the release of a bunch of open weight models that can run all sorts of places, including Amazon Bedrock). Just when I think I’ve identified the technology I want to really embrace, new ones arrive that create new capabilities, deprecate old ones, and demand rethinking workflows. It’s disorienting.

You know what isn’t disorienting? Photos of cool command centers. Here’s three of them from my recent travels:

The room where it happened
The room where it’s been happening a while
The room where it’s still happening

I’m a sucker for a good command center, that’s for sure. But enough distractions; I know I just need to dig into deeper AI learning. That’s the trick: just start.

Random Content

Random Content

Last week I stumbled onto this presentation I made for a job interview I did nearly 11 years ago. Python generators are pretty cool! I also dig the vaguely LCARS styling, which was a built-in theme of Google Sheets.

Thought it’d be fun to share here. Enjoy!

(Oh, and in posting this I also learned how to ensure a consistent aspect ratio in CSS. Cool!)

TL;DR

TL;DR

I’ve discovered a couple highly practical uses for GenAI this week relative to performance reviews.

In one case, I collected various stakeholder feedback for an individual on my team (using these questions from the other day) and used AI to extract common themes (both strengths and growth areas) that I could share without revealing who wrote what (which I’d promised in the hopes of getting more honest responses). It was also useful for me as a manager to see what emerged so we could review together.

In another, I took all the self-evaluations across a team and asked AI to identify and then summarize specific portions that would be relevant to pass along to the broader leadership group (e.g. feedback they had about the organization, common challenges that might be indicators of systemic problems). It’s a lot to ask of an executive to read these docs in their entirety, but there’s valuable insights to be gleaned. Building this summary was the best of both worlds.

Something my years at Amazon taught me is the usefulness of discussing performance in light of shared values. Our evaluation forms this year broke down questions along those lines (at my suggestion), but I’m now seeing it may be a bit too structured and artificially constraining. So next year I might see if we can keep the reflection questions a bit more open-ended, and then use AI tooling to align people’s responses to our specific guiding principles. Will that be effective? Not sure! But worth a try.

That Kind Of Day

That Kind Of Day

You know when you’re trying to clean up a bunch of old AWS accounts but there’s no way to bulk close them so you have to click them one at a time and then click close and then copy and paste the account number to confirm and then there’s also a rate limit so you have to wait a minute between closures and then you hit a “10 account closures per 30 days” limit and no you can’t increase the quota says the documentation but you talk to support anyways and then they try to increase the quota but they can’t either so they suggest you log into each of them as root one at a time to close and you say “fine” but then the root email passwords are missing in your repository of credentials so you try to go through the forgot password flow but the root email address has two plus signs in it and no Exchange configuration you can think of to try seems to be able to accept such an email address and so you’re just outta luck…

ARGH!!!!!!!!!!!

UPDATE: So you finally get a shared mailbox set up with a carefully crafted alias that will receive email from the offending email address at least from your personal gmail account so in theory its working but then you retry the forgot password flow on the AWS login page and there’s a CAPTCHA and the first 4 times you try to solve it you get it wrong and then finally you get it right and the page claims it’s sent you password reset instructions to via email but you’ve waited 15 minutes and nothing has come through and yes you’ve checked the junk folder and what the hell am I doing with my life this is not what I dreamed a career in technology was going to be like and why can’t it involve more of the Property Brothers??

Failure To Communicate

Failure To Communicate

I’m a sucker for travel point programs (and gamification more broadly). I’ve achieved maximum status on American Airlines, and am almost there with Marriott. When you get to the upper tiers there are crossover benefits with other programs, but they require activation. Today I tried taking advantage linking my Marriott status to Hertz, but the website threw a delightful stack trace:

Error processing capillary request: Error converting value {null} to type 'System.DateTime'. Path 'profiles[0].fields.marriottstatusmatchd', line 1, position 792. - at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureType(JsonReader reader, Object value, CultureInfo culture, JsonContract contract, Type targetType) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, Object target) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, Object target) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateList(IList list, JsonReader reader, JsonArrayContract contract, JsonProperty containerProperty, String id) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateList(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, Object existingValue, String id) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, Object target) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent) at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType) at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings) at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings) at Brierley.HertzModules.Custom.CapillaryIntegration.CapillaryManager.d__8.MoveNext() in C:\devroot\htz-loyalty\code\Portals\CustomModules\CapillaryIntegration\CapillaryManager.cs:line 66 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Brierley.HertzModules.Custom.MemberStat.d__8.MoveNext() in C:\devroot\htz-loyalty\code\Portals\CustomModules\MemberStat.ascx.cs:line 305

Probably not a great thing to leak, because one can learn a lot from a stack trace. For example, I can see their webserver runs on Windows, that it’s based on C# and uses ASP.Net web user control files, and that it uses the Newtonsoft JSON framework. If I were nefarious, and hunting for vulnerabilities, that’s a treasure trove.

Also interesting is the namespace of the module: Brierley. A quick Google search tells me that The Brierley Group is “a recognized innovator in the design of Customer Loyalty programs” and is behind a number of the ones I use every time I travel. Who knew there were companies who specialize in this sort of thing? Learn something new every day I guess.

All Will Love Me And Despair

All Will Love Me And Despair

A joy of my life is hacking around on APIs so I can automate things that would otherwise be manual. I’ve done it with Ticketmaster, American Airlines, WordPress (i.e. this blog), the AWS Product API, a payment page, a physician search API, a bunch of internal Amazon tools, and now (I’m happy to say) Tableau.

Deep in the land of San Diego, in the fires of his MacBook, the Developer Jud forged a Python script, and into this script he poured his creativity, his manipulations, and his will to dominate all APIs.

One script to rule them all.

One by one, the free websites of the Internet fell to the power of the script. There were some who resisted… but the power of Chrome Dev Tools could not be undone.

Played The Fool

Played The Fool

I’m not into pranks, giving or receiving. Maybe it’s just because my years are limited, but I don’t generally appreciate being inconvenienced in ways that waste my time for no reason other than humor. It’s a bit like an individualized corollary of the broken window fallacy.

Because of the above I get somewhat hypersensitive around April 1. I feel I’m generally good at sniffing out the BS, but I got taken pretty hard this year, cleverly enough that I have to tip my hat.

So a website I visit regularly posts periodic brain teasers. The one on April 1 sounded innocuous enough. The gist:

Start with a number. If it’s even, divide by 2. If odd, multiply by 3 and add 1. Repeat enough times, and you’ll end up with 1. Prove why that’s the case for any starting number.

I’m a sucker for that sort of mathy puzzle, and I spent a decent amount of time throughout the day noodling on it. Well, here’s the deal. Known as the Collatz conjecture, this convergence to one is famously unsolved, described on the Wikipedia page as “an extraordinarily difficult problem, completely out of reach of present day mathematics.” Lovely, so you’re saying this Ph.D. dropout is unlikely to solve it?

To be fair, I should have known. Numeric conjectures that intermingle addition and multiplication are notoriously complex, despite their apparent simplicity. I used to joke that a life goal was to solve Goldbach’s conjecture, which states that every even natural number greater than 2 is the sum of two prime numbers. Apparently I said this enough at my first job that when I left, they gave me this fill-in-the-blank certificate as a gift:

It’s a good reminder that it’s the “easy” stuff you have to worry about most. It’s never five minutes.

Leap Day

Leap Day

The world is a complex place. Time is hard, as evidenced by the plethora of things going wrong today. Naming is hard. Designing architectures is hard. Getting GenAI right is hard when the answers really matter.

And as it turns out, color is hard too! Did you know there are “imaginary colors”? I didn’t? How cool!

This is not an argument to run away from technology, but to say that we who do this work must be vigilant and realistic. The answer to “how long” is never “five minutes”. And we must engage across a broad set of disciplines, because our own perspectives are limited.

When confronted with complexity, the wrong answer is to retreat to comfortable simplicity. Read. Listen. Have an open mind and broaden your view of the world.