“Make Me Feel Like A Wizard” Isn’t A Feature. Or Is It?

There’s something about typing in a trigger word into your code editor, hitting the Tab key, and seeing it suddenly transformed into a custom function, class, object, or whatever which you’ve created– it feels magical.

I know it’s not truly magical, obviously. But it feels like it.

For context, I’m mentioning this because I’m in the middle of migrating from the 32-bit version of my coding editor to the 64-bit version. The plugin I currently use to manage my reusable code snippets is only available in a 32-bit DLL, it hasn’t been updated in nearly 6 years, etc. There is a different code snippet plugin available for the 64-bit version, it’s actively developed and maintained, has great documentation, arguably better UX/UI, and does everything the previous plugin does . . . except for the trigger word/Tab key transformation.

The analytical part of my brain says this is a no-brainer: “Migrate your code snippets to the new plugin.”

The creative side of me, however, is like: “But it’s missing THE coolest feature! Can’t we download the plugin source from GitHub and re-compile it in Visual Studio as a 64-bit DLL, or make a wrapper or something?”

The silly part is, no one actually watches me write code. There’s no “wow factor” or whatever you want to call it. If you stop and think about it, the whole trigger word/Tab transformation scheme doesn’t even scale well– because every snippet you add requires you to remember a new trigger word. And if you try to export and share your snippets with someone else, they won’t have memorized your trigger words. It’s impractical.

But typing in “errorhandler”, hitting the Tab key, and suddenly seeing your text replaced with the method to invoke your organization’s error catching and logging object– that’s some Doctor Strange meets Jeffrey Zeldman in Area 51 kinda mojo right there. Using a category scheme with a dropdown UI to ultimately pick the “errorhandler” function from a displayed list of matching functions, just isn’t as satisfying.

I think the secret behind this feature’s irrational appeal is “It makes one feel like a wizard.”  You type in the secret word, press the magic button, and (voila!) something cool happens. It creates an empowering feeling, and that’s a big piece of “locking people in” to your product.  (Seriously, the fact that I’m even considering trying to recompile a plugin which hasn’t been updated in 6 years as a 64-bit DLL shows you how ridiculous this is.)

Your turn now. Tell me about your favorite “Makes me feel like a wizard” feature.

2017 Recap

Andrew Mills standing in front of a "Bargain Priced" shelf of books, holding up a book titled, "Andrew's Brain."

I dislike New Year’s Resolutions, but I also think an important part of mindfulness– and arguably, gratitude– is taking time to note the end of the current year and reflect upon what one has managed to accomplish. Here’s my 2017 in a nutshell, so I can stop that interior monologue of “I didn’t accomplish anything in 2017” whenever I feel tempted to compare my progress against someone else’s:

  1. ReFi my mortgage and HELOC. (This has made a significant improvement in my financial situation compared to 2016, and mitigated a lot of potential damage when interest rates began climbing this year.)
  2. Put a freeze on my credit history with all three credit bureaus (to prevent people from opening new loans under my identity as a result of the Equifax breach).
  3. Resolved the Windows 10 update/fail/rollback loop that plagued my desktop for months as a result of the “Fall Creators Update.”
  4. Had two wisdom teeth extracted after more than a decade of procrastinating.
  5. Read 41 books (including the Bone and Sandman series, so can I have my damn “geek card” back now?)
  6. Upgraded to a new Android 7 phone.
  7. Got acquainted with ECMAScript 6; also built my first Anki deck.


The Situationally Aware Algorithm

Mountain lion lounging in a cottonwood tree during the heat of the day.

Developers often pick an algorithm for its speed, but sometimes it makes more sense to dynamically pick an algorithm based upon the resources available at a particular moment. For example– the “Update All” feature for installing available updates for applications on Android Lollipop devices. “Update All” will download and unpack available updates one after the other, without waiting for the first update it unpacked to be installed. This parallel work queue approach makes sense from a time-saving perspective . . . until you try doing it on a phone with only 400-500 MB of storage space.

When storage space is limited, the processes of downloading the next update and unpacking the last downloaded update rapidly fill up the storage, usually faster than the installing process can use and dispatch the files. Suddenly, you have multiple update error messages in your notifications due to “insufficient space.”

Now, our annoyed Android user has a choice:

  1. Clear their cached data in “Settings -> Storage” and hope this frees up enough space for the “Update All” feature to work properly.
  2. Update each Android app one at a time.

But what if the “Update All” process checked the available storage space before it started downloading updates, and based upon a particular threshold, decided between downloading all the available updates in rapid succession or downloading the first available update and waiting for it to be updated and purged before proceeding with the next download?

The idea of a “situationally aware algorithm” is not new. We can dynamically apply different sorting algorithms to data by determining the size of the dataset beforehand. We can determine how much free space remains in storage on an Android device by using the getFreeSpace() method. We have the means to inspect the resources available to us before we decide to tackle a particular problem, and yet more often than not we plunge ahead with a predetermined “one size fits all” approach.

I blame satisficing. I’m also guilty of it.

When I walk in the woods in my neighborhood, I never look up to see if a mountain lion might be perched on a limb I’m about to pass under. Mountain lions are a non-issue for me, and walking beneath tree branches is an experience which I take for granted will be uneventful.

Until, of course, it isn’t. 😉

Similarly, if we apply an algorithm for sorting large datasets to a smaller dataset, it will still give you results. It’s only when we come across a dataset which completely breaks the algorithm and get no results back (e.g. the dataset is so large it consumes all available RAM) we begin to question if the currently implemented approach to the problem is the correct one.

On the bright side, I think the adoption of practices like User Stories and Test Driven Development– particularly in team approaches where the stories, tests and code are written by different people– is gradually pushing development beyond the satisficing “just make it work” mentality into a more nuanced, situationally aware paradigm.

In the meantime, the best we can do is keep learning our craft, be patient with the status quo, and . . . start checking tree branches for mountain lions before we walk under them.