Tag: Learn And Be Curious

Spirit And Truth

Spirit And Truth

As I was reading Things they didn’t teach you about Software Engineering, I found myself frequently nodding along. There’s a fountain of wisdom here. Seriously, go read it, or at least go read the headers, which are helpfully summarized along the side of the page.

One worth a deeper dive is this: domain knowledge is more important than your coding skills. I cannot agree more. If you don’t know your customer, it’s unlikely anything you build will add value, no matter how perfectly it’s constructed. And given that the typical end-user is rarely going to be a developer themselves, this knowledge won’t come automatically. It needs to be pursued intentionally.

I’ll go even further, though: knowledge isn’t enough. When the going gets tough (and it will, because programming is hard), a team needs more than information about their customers to keep them moving forward. They need an emotion powerful enough to overcome diverse roadblocks. They need empathy.

The best engineers don’t just seek to know about the problems they’re solving. They internalize those problems, engaging their emotions alongside their intellect. When a customer has a challenge, they feel it in their bones (it’s not by accident that we use the metaphor of a “pain point” when describing problems). When a customer is angry at a missed deadline or poor quality outcome, they lean in, acknowledging failure. And when a customer is overjoyed at the success of a new product launch, they get to share in that happiness.

Empathy is the key that unlocks the willpower to achieve great things. Regardless of technical prowess, show me an empathetic developer, and I’ll show you a good one.

No Easy Answers

No Easy Answers

I’ve been managing technical people for a while now, but when it comes to asking good questions and listening well, I’m always learning. One thing I’ve discovered is that questions needn’t be complex to be effective. Here’s three I use regularly:

How do you feel about that?

Giving someone space to express their emotions is usually a good place to start when beginning a conversation. This is doubly true in the workplace, where there’s a misperception that feelings have no place. But we’re all human, and our effectiveness is predicated on aligning our emotions to the task at hand.

What could you do about that?

Once a person feels safe describing how they feel about a situation, it’s time to explore options for how to move forward. The word could here is critical, it’s a word about possibilities. Usually with just a little nudge, people will be able to come up with a variety of potential solutions on their own.

What do you want to do about that?

Too often people are asked to consider all sorts of factors when weighing options, but never their own desires. And especially not just surface desires, but what they truly want based on their own complex (and often competing and contradictory) web of values. It’s a powerful question; simple to ask, but hard to answer truthfully. Though once it is, I’ve found one often has all the data at hand to make a high quality decision.

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.

Living On A Jet Plane

Living On A Jet Plane

Between a job requires a considerable amount of travel, and a whirlwind European vacation this summer, I’ve been to quite a few places this past year:

I’m thankful for the experiences I’ve had to date. Few things are more humbling than realizing that you are just one individual in a large world; I feel that way from my travels, and I’m far from having seen even a decent fraction of the cultures that fill the earth.

Want to be a better developer, manager, relative, friend, or person in general? Consider travel if you can.

Kindness Trumps Rightness

Kindness Trumps Rightness

Regularly I’ll hear people claim “I don’t care what anyone says about me.” While I appreciate the sentiment of confidence such a statement is intended to communicate, I believe it’s unhelpful, for several reasons.

First, I don’t believe it’s possible. Humans are social creatures, and much of our mental software is set up to be concerned with our standing with other people. Some of us perhaps more so than others can set that aside at times, but no one can turn it off completely.

Second, living with disregard for others’ perspectives on your own life and actions deprives you of valuable wisdom. Of course one shouldn’t take all opinions equally, and one must discern how to synthesize the input of others with your own evaluations. But more data is rarely a bad thing. Listen, then decide.

Most importantly, however, is that knowing how those you come in contact with feel about you is a healthy way to measure if you’re having a positive influence on them. At the end of the day I want every person I interact with to come away feeling that their lives are better for having known me. That’s more valuable than pretty much any other measure of impact I can imagine, and it’s true both personally and professionally. Absolutely nothing is more important to your career than being kind. Not education. Not skill. Not drive. Nothing.

So yes, I care what everyone says about me. And you should too.

Testing, Testing, 1, 2, 3

Testing, Testing, 1, 2, 3

Hard to believe it’s been 3 years since I started taking AWS Certification exams, eventually passing all 12 that were active at the time, thanks in part to virtual proctoring and a knack I’ve had since college for being good at multiple-choice tests.

In order to stay current one must retake the exams within a three year window, so I’ve been working my way back through them. Over the summer I passed Solutions Architect Professional and DevOps Engineer Professional, and yesterday I completed the Security Specialty. Thanks to lower-level exams auto-renewing when professional exams are passed, that brings me to 7 exams that will remain current through 2025.

Seven is a nice number; don’t think I’ll bother renewing the others unless a need arises.

Progress Report

Progress Report

At the beginning of this year I made two resolutions:

  1. Post on this blog at least once per month
  2. Learn a new programming language

For the first one, so far so good. For the second, not so much. I read a book on Clojure, but haven’t yet had a reason to use it beyond tutorial exercises, so can’t really say I’ve learned it. Maybe it’s just that these days I’m thinking more about systems than software, and thus language choices seem less important?

Speaking of book reading, though, I’m well on my way to achieving my meta resolution (to read the same number of books as my age, every year, for the rest of my life). According to Goodreads I’ve completed 39 books so far against a goal of 43 (seven books ahead of schedule). Should be no problem to get to the finish line and beyond.

Here are the five star highlights:

Honorable mention goes to Range, which I can’t recommend enough for anyone who feels like they’ve missed out on their calling by meandering through a number of life experiences. Generalists make the best leaders and problem solvers, so embrace the variety of perspectives you can bring to the table. Real life is not like golf or chess or programming only in assembly.

Reap The Whirlwind

Reap The Whirlwind

This summer my family and I went on a two week European vacation. Six cities in fourteen days is no joke, but we had a blast, saw a ton, and stayed healthy throughout. For something different, I thought I’d catalog our activities here.

Day 1 – Rome

  • Land at Leonardi da Vinci International Airport
  • Taxi ride to the hotel (aggressive driver kept us on our toes)
  • Jetlag recovery nap (essential)
  • Pizza at Taverna Rossini
  • Pico Gelato for dessert (tears of joy were shed)

Day 2 – Rome

  • Trevi Fountain
  • Colosseum
  • Piazza del Campidoglio
  • Pantheon
  • Lunch at La Soffitta Renovatio
  • The Vatican, including the Sistine Chapel and St Peter’s Basilica
  • More gelato at Pico
  • Quick dinner at the hotel before crashing in bed

Day 3 – Rome

  • Temple of Asclepius
  • Walk through Villa Borghese
  • Piazza di Spagna (the Spanish Steps)
  • Trevi Fountain (again)
  • Vicus Caprarius (ruins under Trevi)
  • Life-changing carbonara at Al Simeto (no one spoke English, a good sign)
  • Even more gelato at Pico

Day 4 – Florence

  • Morning train to Florence, and walk to our Airbnb that was right on the square
  • Accademia Gallery to see Michelangelo’s David (breathtaking)
  • Uffizi Gallery (Birth of Venus, amongst other masterpieces)
  • Life-changing chianti at La Buchetta, and the steak was pretty good too
  • Evening walk at the Piazza della Signoria

Day 5 – Florence

  • Climb to the top of the Brunelleschi Dome
  • Tour of the Duomo cathedral
  • Cappelle Medicee
  • Basilica di San Lorenzo
  • Trattoria Sergio Gozzi for lunch with an old friend (and killer truffles)
  • Battistero di San Giovanni
  • Palazzo Strozzi
  • Ponte Vecchio
  • Gelateria Edoardo il gelato biologico (obviously)
  • Quick pizza from a grab and go

Day 6 – Alps

  • Walk to the Florence train station
  • Train through Bologna, Bolzano, Innsbruck
  • Arrived in Munich in the afternoon
  • Dinner at Haxnbauer im Scholastikahaus (pork knuckles FTW!)

Day 7 – Munich

  • Bus ride to Bavaria
  • Neuschwanstein Castle
  • Quick lunch (sausages and beer)
  • Oberammergau
  • Linderhof Castle

Day 8 – Munich

  • Morning run in the Englischer Garten
  • Tour of Dachau (a sobering and essential experience)
  • Shopping in Marienplatz
  • Walkthrough of Peterskirche (including a climb of the tower)
  • Stroll through the Englischer Garten in the rain
  • Dinner at Hofbräuhaus
  • Midnight sleeper train to Paris

Day 9 – Paris

  • Taxi to the hotel to freshen up
  • Walk through Jardin des Plantes
  • Brunch at Clint (poached eggs, yummy)
  • Recovery nap (absolutely essential)
  • Shopping in Le Marais
  • Dinner at Robert et Louise (beef cooked over an open fire plus a Bordeaux)
  • Walk through Place des Vosges and Place de la Bastille
  • Cards in the hotel lobby

Day 10 – Paris

  • Stroll through Montmartre
  • The Basilica of the Sacred Heart of Paris
  • Eglise Saint-Pierre de Montmartre
  • Cheese sampling from a local shop
  • Walk past Moulin Rouge
  • Arc de Triomphe (only a couple quick photos)
  • Eiffel Tower (didn’t go up though)
  • Pont Alexandre III Bridge
  • Eglise de Saint Germain des Pres
  • Macarons from Boutique Pierre Hermé
  • Le Jardin du Luxembourg
  • Panthéon (photo from afar)
  • Cathédrale Notre-Dame (just an outside view)
  • Ile de la Cité
  • Sainte-Chapelle (beautiful stained glass)
  • Lunch at Brasserie Les Deux Palais
  • Quick walk past Musée du Louvre
  • Tried to tour the Catacombs, but alas they were booked out
  • Crepes from Au Beurre Salé
  • Well-earned sleep

Day 11 – London

  • Eurostar through the Chunnel (delightful train and fast!)
  • Tube to Pimlico station
  • Bit of recuperation at the Westminster Hotel
  • Tour of the Churchill War Rooms
  • Dinner at The Admiralty (Trafalgar Square)
  • Walk past Westminster Abbey, Big Ben, and Parliament

Day 12 – London

  • Several hours of exploration at the National History Museum (Dippy!)
  • Nap on the lawn at Hyde Park
  • Princess Diana Memorial Fountain
  • Science Afternoon Tea at The Drawing Rooms
  • Stroll over Westminster Bridge

Day 13 – Oxford

  • Morning train to Oxford
  • Fish and chips at Wig & Pen
  • Photos at The Eagle and Child (sadly closed due to COVID)
  • Shopping on Cornmarket Street
  • The Sheldonian Theatre
  • The Hertford Bridge (most photographed spot in Oxford)
  • Bodleian Library
  • Blackwell’s Bookshop (bought a rare Isaac Asimov book: The Clock We Live On)
  • Radcliffe Camera
  • University Church of St Mary the Virgin
  • The Bear Inn (serving Oxford since 1242)
  • Christ Church College
  • Merton College
  • Martyrs’ Cross

Day 14 – Journeying

  • Sleep in late
  • Depart Heathrow in the early afternoon
  • And land in San Diego in the late afternoon (hooray for timezones)

And there you have it. Not a bad way to spend a fortnight.

Crossing The Rubicon

Crossing The Rubicon

There are a plethora of resources for those just getting started with software development, and best I can tell, most of them will do the job adequately well. But there isn’t nearly as much on what is needed next: guidance on how to get from “early intermediate coder” to “seasoned software engineer”. In brief, here are some suggestions:

  1. Study existing high-quality code; if you don’t know what good looks like, it’s nearly impossible to produce it.
  2. Write a lot of code. There’s no substitute for practice and putting in your time.
  3. Find someone who can give you feedback on the code you write, and humbly iterate per the guidance.

In my experience, an efficient way to do all three is to find a couple open source projects that need support, dig into their code, and submit contributions. You start from a base of quality code, get to write more, and you’ll get feedback through pull requests. And the icing on the cake is that it’s all done in public.

Spend a few years of doing the above and you’ll be well on your way to next-level programming expertise. It’ll also teach you how to code with a distributed and decentralized community of stakeholders, and that’s no small thing.

Sharing Is Caring

Sharing Is Caring

Last week I recorded a Q&A video session with a colleague for an upcoming team all-hands meeting. Ostensibly we were there to speak on the benefits of a recently-deployed internal tool that’s become quite popular. But the value comes not from the tool itself, but from those whom it empowers to easily share their work.

https://stackoverflow.blog/2020/05/14/the-most-successful-developers-share-more-than-they-take/

Maybe it’s just the self-reflection inherent to middle age (I turned 43 a month ago), or the heartfelt email my team received this weekend from a recent customer, but in some small way I hope that when I’ve gone I’ll have contributed my portion to the ongoing corpus of human knowledge, and further, that I was able to utilize said knowledge for the greater good. The only way for that to happen is to maximally share what I build whenever possible, whether through open source code repositories, high-quality documentation, or even this blog (modest though it may be). It takes extra work, but the work is worth it.