Visiting MAUI

It’s been a few months since my last post, which is not necessarily what I intended, but I took some time off at the beginning of the year before jumping into new ventures. Since then, I’ve been quite engaged coming up to speed with a new team and getting going on some data architecture challenges. There have also been a lot of meetings and a good bit of family time.

Those who have followed this blog for a long time know that there was a time when I was doing a lot of .Net work. In a previous life, I did a lot of federal contracting and that world is very Windows-centric and .Net is a common platform. The last few years have offered little opportunity to work with it, though I did do some server-based work in .Net core that ended up running in production in Alpine containers on AWS. That solved a specific business need and I didn’t need to touch it much after it was deployed.

Read more

New Directions

Since the first of the year, I’ve been on my own. After considering a number of really compelling job offers, I decided to start my own company and take a contract position with company doing work that’s meaningful to me (more on that in the future). I’m also picking back up with some GIS work … Read more

Stripe API Pagination in FME

I few weeks ago, I described an integration I built to pull data from the Stripe via its API and load it into BigQuery. There were two main problems with this approach: First, it was incredibly hacky – a Wile E. Coyote approach to the problem involving cron jobs and EC2 instances and GCS uploads and scheduled jobs in BigQuery. It got the job done, but in a way that was slightly embarrassing. Second, everything else we did was leveraging FME and this stood outside of that pattern.

I really wanted to bring this process into the FME fold, but I needed to tackle Stripe’s API pagination in order to do it. Most of Stripe’s helper libraries have an auto-pagination feature that allows you to keep loading objects until you reach the end. This feature is not available if you are using the raw Stripe REST API, which is essentially all that is available to FME via the HTTPCaller transformer.

Stripe’s API uses cursor-based pagination, meaning that it points to the ID of the next object to read in the dataset. Luckily, Safe Software has an article that describes how to handle cursor-based pagination. This article is that it uses the Slack API as an example. The Slack API is well designed and returns everything you need to handle pagination in one place in the response document, but this isn’t the case with Stripe’s API so I had to modify the approach somewhat.

Read more

Organizational Muscle Memory

I’ve had plenty of opportunity to tell my “story” lately. After my initial post that my current position is ending, there has been a pleasantly surprising amount of interest and activity. Others have told me that I shouldn’t be surprised, but I feel like I’ve been fairly heads-down the past six years so it was … Read more

Integrating Stripe with BigQuery

One of the projects that I mentioned in my post a couple of weeks ago was the migration of our billing system to Stripe. Stripe is widely used for billing on the internet, in both SaaS and non-SaaS use cases. A while back, I wrote about the general limitations of IPaaS platforms in terms of flexibility and Stripe exposes a lot of these.

One particular product did not expose all of the object type we needed to extract from Stripe. Another simply did not sync all of the object types it claimed to be syncing. A third had a clear bug in which it wrote the current date/time into all date fields. In each of these cases, we were left to file support tickets and wait. I moved on.

Read more

Salesforce to Jira: Using FME for Business Automation

I mentioned in my previous post that, at my current organization, we had made good use of FME in processing non-spatial business data. In this post, I’ll provide an example of that. One of the functions in my department is professional services. Our professional services team, like similar teams in many product companies, doesn’t capture its own work. It is dependent on our sales team to capture work and communicate when the deal has closed so work can begin. As we grew, and as we switched to fully remote during the pandemic, this communication often lagged, resulting in delays in starting work that had previously closed. We chose to tackle this problem with automation.

Read more

Turning the Page

It is rare that I use my blog to explicitly blow my own horn. I prefer to write about technology, leadership, and the good works of others, but I find myself in different circumstances now. I learned this week that my current position will be eliminated as of 31 December, 2022. After that, I will be available for my next role. Until then, I am actively looking in addition to winding things down where I am now.

Regarding my next role, I have taken nothing off the table. I am open to consulting engagements or full-time positions. I am also considering starting my own company, which would be a consulting firm with the intent to grow rather than remaining a one-person outfit. I am writing this post because LinkedIn profiles and one-page CVs rarely paint a complete picture, so this is a companion piece that is intended to fill in the gaps.

I have been in my current position for nearly six years. Given the size of the company, it has been a mix of leadership and hands-on technical work. Since we have always been eyeing growth, I skewed toward leadership, because it is important for a company to avoid single-threading functions through individual people as much as possible.

Read more

Lessons from Maps and Old Code

Taking over someone else’s code is hard. There is probably no better look at how a person thinks than looking at their code. It can be tempting to trash their code and start from scratch. This temptation often runs into conflict with a sunk-cost fallacy that says “The previous person spent so much time on this that they had to understand the problem far better than me and maybe my time would be best spent learning from their code.” The really tough part about this is that it’s not always a fallacy.

My own encounter with this dilemma came early in my career – early enough that the code in question was written in AML. The company I worked for at the time had just transferred me to the offices of a large water utility to take over the development of their cartographic production system from a developer who had recently moved on. I had never met this developer and he was already gone, so I only had his code to work from.

Read more

Reflections, Twenty-One Years On

Yesterday was the 21st anniversary of 9/11. I tend to let that day go by without comment. My recollections of the day itself add nothing as I was 50 miles outside of DC at the time. Even that far away, the roads were filled with panicked people and the phone networks were crashing, but I wasn’t in the city and I have nothing to add about that day.

Twenty-one years ago today, I was driving back home with my family and, as we crossed the Harry Nice Bridge from Virginia back into Maryland, it was flanked on either side by armed boats from local law enforcement and the National Guard. At that time, I was a contractor supporting an infrastructure protection program for the Department of Defense. There was no clearer illustration of the importance of what we did than those boats on that day.

Read more