Tag: Invent And Simplify

Have It Your Way

Have It Your Way

My first real job was at Burger King, which I got at my dad’s behest the summer of 1994. I was only 15 years old, and what I could do was pretty limited (no food prep, nothing to do with the deep fryer, couldn’t even do dishes because of knives). But what I could do was operate the register and take orders. On balance it was a positive experience, not least because it taught me how to talk to strangers.

I’ll never forget one particular aspect of my training. There was a question we were expressly forbidden to ask when interacting with customers, and if we ever did, even accidentally, our manager would yell at us from across the kitchen. The question?

Is that it?

Why was it verboten? Because it shuts down conversation. In social situations humans are wired to want to answer questions in the affirmative, and a “yes” response to that question means no more items to add to the order, and my corporate overlords definitely didn’t want us to encourage customers to stop adding fries, drinks, desserts, and more. What question were we instead instructed to ask?

Is there anything else?

The difference is significant, as an affirmative answer here encourages the customer to go ahead and keep ordering, subtly suggesting that perhaps there’s more they would enjoy. I realize now, though, that there’s an even better way to nudge a person to continue speaking what’s on their mind.

What else?

I first picked up this simple but effective question from one of my managers at AWS, as he would use it throughout our 1-on-1 meetings to get me to be honest about what I was thinking and feeling about my job. This question works because unlike the prior one, it assumes that a person already has more to say, nudging them to say it. I know it worked on me (I had no shortage of opinions to share, no doubt).

It reminds me of another short but powerful prompt that can take a conversation to the next level:

Tell me more.

When trying to listen actively, it can be a challenge to think of relevant follow-up questions in real-time, especially with a person who’s taciturn, or if you don’t have a prepared agenda. “What else” and “tell me more” are great because they can be used at any lull in the conversation; keep them at the ready, and they won’t let you down.

“For millions of years, mankind lived just like the animals. Then something happened which unleashed the power of our imagination. We learned to talk and we learned to listen. Speech has allowed the communication of ideas, enabling human beings to work together to build the impossible. Mankind’s greatest achievements have come about by talking, and its greatest failures by not talking. It doesn’t have to be like this. Our greatest hopes could become reality in the future. With the technology at our disposal, the possibilities are unbounded. All we need to do is make sure we keep talking.”

Stephen Hawking
Here And There And Everywhere

Here And There And Everywhere

Just in case the post on crossword solve times didn’t make it obvious enough, I like to track things. I suspect it’s a corollary of liking gamification. Here’s a rundown of info I’m keeping and the tools I’m using:

This post is itself is also a tracker. A tracker of trackers; a meta-tracker, if you will.

Better Together

Better Together

Today the United States celebrates its independence. Amongst the barbecues and fireworks, it’s worth taking a few minutes to reflect on the significance of this day in history. For me, I’m most thankful for the contributions of this country’s founders to the ideals of good government.

We’ve had no shortage of trouble in living up to those ideals, and I’m convinced that some considerable reforms are still needed given how the nation has evolved (see Breaking the Two-Party Doom Loop for my favorite take on that subject), but on the whole, the system of government we enjoy with its equal representation, checks and balances, and problem solving using negotiation and compromise vs violence, has promoted human flourishing both here and around the world (well, sometimes at least).

It’s been a privilege of mine to work in the public sector for most of my career, and I don’t expect that to change anytime soon, as I’ve doubled-down on situating myself at the intersection of tech and politics. I figure it’s how I can best honor those who got us this far; to continue the quest for developing better governmental systems and policy.

I’m not alone in that effort, as I’ve been able to meet a lot of great people along the way, dedicated public servants who really care about improving lives. Perhaps you too should consider joining our ranks? Governments are positioned to solve numerous problems both big and small, and they need the kind of smart problem-solvers that tech folks typically are. It may not be glamorous, but it’s desperately needed.

Personal Assistant

Personal Assistant

For some reason unbeknownst to me, health insurance in the United States is tied to employment. So one of the joys of starting a new job is being forced to reevaluate a bunch of plans, choose new options, and in some cases, find new doctors. As it turns out, my previous physician retired last year, so in any case I need to find a new one.

This afternoon I called my preferred medical network to ask about doctors accepting new patients, and the agent informed me that due to a shortage of folks, there pretty much isn’t anyone for the next couple of months. Lovely. I asked about waiting lists or notifications I could sign up for; naturally that doesn’t exist either. The best he could suggest was to check the physician search page every couple of days.

Well, I’m lazy, so I reverse engineered the search API behind the website, wrote a Lambda function to query it periodically, and set up an alarm to email me when the search results come back non-empty. Take that, manual process.

Security Sunday

Security Sunday

I’ve been a daily user of YubiKeys since 2018. These little devices pack a hefty security punch with a number of useful features, including universal second factor (U2F), time-based one-time passwords (TOTP), static passwords, and personal identity verification (PIV).

This article contains an excellent overview of all the functions and how to use them. If you’re at all interesting in beefing up your security posture, I can’t recommend it highly enough.

A Helpful Transmogrifier

A Helpful Transmogrifier

Have a large CSV file and want a quick way to query it? Consider transforming it into a SQLite database. It’s easy! One command will do it:

$ sqlite3 "$sqlite_filename" ".import $csv_filename $table_name --csv"

Here’s a concrete example using airtravel.csv:

$ sqlite3 air.db ".import airtravel.csv air --csv"
$ sqlite3 air.db "SELECT * FROM air WHERE air.Month = 'JAN'"
JAN|  340|  360|  417

Neato! Admittedly the handling of headers and column names isn’t great, but that can be solved with a bit more script-fu (which I’ll leave as an exercise for the reader).

The Tie That Binds

The Tie That Binds

Read these two articles yesterday. On the surface they’re about different topics, but there’s a common thread: both call out an aspect of technical work that is often ignored, especially by the less-experienced.

The first tale, Our Company Fired the Best Developer and Project Manager, reminds us that “Getting your tasks done is half of the job. The other half is how you do it.” I’d go even further and say getting your tasks done is only a quarter of your job. The rest is how you do them, when you do them by, and most importantly, ensuring you understand why those are your tasks in the first place, and if perhaps you should be doing other tasks instead. Don’t climb the ladder only to find you leaned it against the wrong wall.

Coding Won’t Exist In 5 Years is yet another ChatGPT article, whose crux is the following: “Programming is the process of solving problems using a computer. Writing code is just one aspect of this process. It’s a necessary part, but it’s not the whole picture.” Yes, learn to write code well, but be aware you’re more valuable as an editor than as a drafter, and that’s only going to get more true as AI gets better.

Irreduceable Complexity

Irreduceable Complexity

“Make everything as simple as possible, but not simpler.” – Albert Einstein

In any technical discussion, beware when someone says something is simple. Things are rarely as simple as their marketing materials claim, and there is a vast gulf between a quickly-constructed proof of concept and a production-ready solution.

Even concepts that might seem straightforward at first glance have considerable potential for edge cases and other gotchas. Consider the following as canonical examples:

A corollary to the above: there is no such thing as a “5 minute task” in technology. When you hear such a claim, mentally multiply by 10.

All The Things

All The Things

I agree with this article that there’s a special joy that comes from building something to suit your own needs. But that doesn’t mean you shouldn’t share the results. You’ve got to store your artifacts somewhere, so might as well stick them in a public spot like Github. Perhaps someone else will find your work interesting and useful, not the least of whom might be an interviewer who needs examples of your code to do a proper evaluation.

Here’s a rundown of projects for which I am either the primary author or significant contributor, grouped roughly by subject matter. I capture them here for the value of having such an index, but also because some of it I believe has value. If any of you find such value, would you let me know?

Lambda Functions & Tools

Buy Me A Coffee Webhook – I wrote about this project two weeks ago, it’s a CDK-deployed Lambda function with an HTTPS endpoint that can receive webhook notifications from Buy Me A Coffee.

Temperature Collector – Another Lambda function, but this one deployed using terraform. It gathers temperature data from heterogeneous sources and publishes it to CloudWatch. I’ve also written about this one before; if nothing else it’s a reference example for how to use terraform modules.

Selenium Lambda Layer – It’s tricky to get all the right bits in place to get a headless browser working with Selenium in Lambda. Given how browser tech evolves, I doubt this still works, and if I have to do it again, my first choice would be CloudWatch Synthetics Canaries instead.

Lambda Layer Builder – When packaging dependencies, I prefer keeping them in a layer vs including them in the Lambda deployment package itself. It keeps the deployable package small, and ensures I can edit code directly in the console when I need quick turnaround. This script makes it a one-liner to construct and upload a layer that contains a set of either Python or Node.js dependencies.

Blockchain Constructs

Managed Blockchain Document Ledger – As part of a customer workshop I built this fully-functional example of using Amazon Managed Blockchain to write and read documents to Hyperledger Fabric. It illustrates how to create the network, set up users, load chaincode, front with an API Gateway and Lambda function, and deploy Hyperledger Explorer for visualizing the contents of the blockchain. It’s all automated using CDK and bash scripts.

Hyperledger Fabric CDK Construct – As I was developing the above, I realized there could be value in porting the capabilities provided by the bash scripts into custom resources, and packaging it all up into an easily installable CDK construct. This was my first foray into publishing a construct, and I learned a ton about it, in particular how to use projen to deploy a full CI/CD pipeline and get support across all CDK-supported languages.

Ethereum CDK Construct – Essentially the same as the above, but for Ethereum-based blockchain networks. I can only take minor credit for this one; while I gave them the idea, most of the implementation was done by an early career cohort as a capstone project.

Math, Music, and A/V Tools

Lilypond Music Files – Analogous to LaTeX for academic whitepapers, Lilypond is a text-based markup language for engraving (i.e. typesetting) sheet music. I created this repository as a place to collect my own by-ear transcriptions of bass guitar lines. There’s not much in there; consider it an aspirational life goal to add more (what would be extra rad is if this could be automated via AI/ML, with a tool like melody.ml).

Mix Maestro – I’ve been mixing live audio for nearly 20 years, on both analog and digital consoles. Back in 2013 I was doing so on a Roland mixer that had an RS-232 interface for remote control, and I wanted a way for musicians to adjust their own levels without buying an entire Aviom setup. So I grabbed a Raspberry Pi and wrote an HTTP server that abstracted the details. This repository contains the server code; I also wrote a companion Android app.

Light Maestro – Similar to Mix Maestro, I needed a way to control stage lighting, but without any budget to buy a console that had an app. Not only was I able to get a DMX interface built on top of another Raspberry Pi, but I was able to synchronize scenes to ProPresenter via its ability to trigger audio file playback, which I detected using Linux atime changes. Kinda hacky, but it worked more reliably than the bargain basement light board and the inexperienced volunteers that ran it.

Project Euler Solutions – If you want a fun and nerdy way to practice coding, Project Euler is a great resource (and more fun than Leetcode in this mathematician’s opinion). This repository contains my solutions to all the problems I’ve solved to date.

Docker Images

Buildozer – I love Python a lot, and sometimes that means I want to use it for projects where it isn’t typically considered, such as cross-platform GUI app development. With Kivy, it turns out to be quite possible. Buildozer is a framework for building Kivy apps for Android and iOS. Getting its dependencies right is a pain, especially on MacOS, but Docker to the rescue!

LaTeX – Back in graduate school I earned money by typesetting academic papers for mathematicians (such as the esteemed George Andrews) using LaTeX, a typesetting system built by none other than Donald Knuth, one of the giants of computer science (if you haven’t read The Art of Computer Programming, you really should; those folks were geniuses in ways modern developers rarely appreciate). Anyhow, LaTeX is also one of those tools that’s tricky to get set up, so it’s a perfect fit for running in Docker.

Development Utilities

AWS CLI Profile Credential Helpers – Early in my tenure with AWS, I was working with several customers simultaneously, each of which had its own single-sign on solution for their accounts (e.g. Azure SSO, Okta, Shibboleth). In order to abstract away the details of each provider’s mechanism for getting temporary credentials, I built this wrapper, along with a handful of other useful utilities. I’ve used them daily ever since.

Amazon CloudWatch Publisher – Another tool that came directly out of customer work, I needed a way to publish basic CloudWatch metrics (like CPU usage, disk space, network traffic) from Apple hardware, which would not (at the time) run the CloudWatch agent. I decided to build it in Python (natch), which has the added benefit of allowing it to run on other platforms such as the Raspberry Pi.

Kubernetes Tools – It took me a couple months of regular usage to get comfortable with kubectl. Once I could rattle off most commands from memory, I found myself doing similar things over and over. Hence these wrappers. I stuck them on Github for posterity, and am glad I did.

MacOS Dotfiles – Since I made the switch to MacOS (and its Linux-like terminal) in early 2014, I’ve had 4 employer owned and 2 personally owned Apple computing devices. Not changing that any time soon, and looking forward to a rumored 15″ Macbook Air, which I’ll probably buy for its portability (don’t really need the raw power of the Pro when I’ve got the cloud). When I do, I’ll use this set of scripts to automate its setup just how I like it.

Résumé Builder – An example of using LaTeX and my associated Docker image to build a PDF résumé via a continuous deployment pipeline implemented on Github and Travis CI. The résumé is the résumé, if you follow me?

Software Packages

Chrome Local Storage – Yet another project I’ve blogged about, this is a Python package for importing and exporting local storage from a Chrome browser. I built it to move Wordle stats from my laptop to my phone.

Output Scrubber – Writing sensitive information to application logs is generally a bad idea, but it’s easy to do so inadvertently. Include this package in your Node.js application, and it will insert itself into stdout and stderr and remove any pre-configured patterns it finds, such as social security numbers and email addresses. Of course if you’re logging in AWS, there’s some additional tools at your disposal.

Requestium – I’m not the original author of this package, but found its “best of both worlds” tremendously helpful when building some automation around an internal website, because it let me get logged in via Selenium and then switch over to the requests module to interact with APIs. When I needed a few new features, I offered to write the PRs, and discovered the creator was looking for a new owner for the project, and I decided to say yes, at least on a best effort basis. So far it hasn’t required more than a few hours a month at most.

Other Applications

Garage Envoy – This is another “build an HTTP API on top of a thing” project. I took a Raspberry Pi, added a relay that I wired into the opener, and some proximity sensors for detecting the position of the door, and voilà, I had an Internet controllable garage door. The most useful thing here was learning how to control the RPIO pins on the Pi to open/close switches and read sensor values.

Pinochle Scoresheet – In 2013 I went back to school to get a web development certificate from San Diego State. Part of that program was a class on Android app development, and this code was my capstone project. Pinochle is a card game that I’ve been playing since I was a kid, so it was fun to create an app I’d actually use. In retrospect, though, a native app is overkill and a simple mobile-friendly web app would be fine. Also, this app was Pinochle-specific, but I play quite a variety of games regularly, so a general-purpose tool would be nice to have…

Online Scoresheet (coming soon) – … thus this idea was born. Besides being an app I would use myself, I want to use this development to learn a few new things. First, I want to build it within a cloud-based integrated environment like Github Codespaces or Amazon CodeCatalyst. Second, I want to (finally) learn React.js beyond a hello world app. My domain name is bought (onlinescoresheet.net plus a few synonyms) and a sample app is spinning, all I need to do now is build it out.

Garbage In, Garbage Out

Garbage In, Garbage Out

I try to put as much code as I can on Github, as an exercise in learning in public. Over the holiday I published something new: a Lambda function deployed with CDK that is called when events fire from Buy Me A Coffee. It’s notable for a couple reasons:

  • First, if you haven’t noticed, there’s now a little orange icon down in the lower right of this blog. If you’ve benefited from my writings here, and are feeling generous, you can buy me a coffee using that icon. No pressure, though!
  • Second, I wanted a permanent reference repo for doing a basic Lambda deployment with CDK, and now I have one.
  • Finally, and most interestingly, my first draft of this code (both the CDK and the function itself) was written by ChatGPT.

As I’ve been reflecting on what artificial intelligence means for the future software engineering, I doubt it’s going to obviate the need for understanding code. What I do think it will be able to do is produce workable drafts, getting maybe half-way to a workable solution, with developers making revisions to get it across the finish line.

If I’m right about that, software professionals are going to need to tweak their skill sets to be less like writers and more like editors. Few developers I know are particularly adept at reading code, though it’s a shortcut for leveling up coding skill. Software is an oddball in that respect: in most other creative domains, one must study the work of the geniuses who came before, but we don’t typically train coders that way. Now it might not even matter, because the machines can do the studying for us.

What will be important, then? Formulating problems, and then tweaking resultant autogenerated code. So code fluency will still be needed. Just not for the boilerplate; for that, we’ll have tools like ChatGPT and AlphaCode.