Blog

  • Group Decisions

    People are complicated. Really complicated. Navigating people in an environment where their motivations (and your own) are subject to a wide variety of ever-changing stimuli and thoughts makes for an exhausting experience. But if you can observe and identify what’s happening, you'll be able to rise above the chaos and find your way to a productive outcome. Meetings are where most conversations about problems that require decisions are discussed. But they are interpersonal communication puzzles ...

  • Cataloging Conflict

    I spend a good bit of time in conflict resolution - either my own, people on my team or between groups. I’ve noticed that one of the most helpful things to do in these situations - aside from empathy, which is absolutely crucial - is understanding the type(s) of conflict being had. A lot of time is spent debating decisions. Each of these decisions has consequences but the nature of those consequences should be clearly understood to better assign value to the conflict. Technical conflict h...

  • Life of a Project

    Projects pulsate with life. They're conceived, they grow, they mature, and eventually, they transition into a state of completion. Each stage presents its unique challenges and opportunities, necessitating distinct approaches for optimal outcomes. This essay delves into the various phases of a project, highlighting their differences and outlining strategies for effective management. Ideas are fleeting, yet some are so compelling they demand attention. In these nascent stages, the absence of cons...

  • Predictability

    The topic of predictability in software engineering is one that comes up often at work. Program Increments - a tool used as part of applying agile in large teams - is arguably a tool intended to help drive some predictability in an organization. But if one purpose of Program Increments is to bring predictability to development cycles then it can only be effective if underlying systems have I will start by saying I am no expert on this subject - in fact, everything in here is based on my own ...

  • Brevity

    In the past several months I’ve seen the affect that poor communication has on the efficiency of an organization. It’s not so much that it is the source of problems but it compounds all problems dramatically. Like the relationship between a spark and a powder keg, the more problematic an organization is, the more sensitive it is to bad communication. In these situations, But what As an engineer, if I’m talking about a specific bug that needs to be fixed to a stakeholder (say, a product manag...

  • Using CloudFlare with Notion

    With my website (which uses Notion as its CMS), I ran into a problem caused by a quirk of Notion’s API. When you upload an image to Notion and then fetch that image as part of a page payload, the image URL is an S3 bucket key that expires after an hour. Which is fine for most use cases but is problematic when pre-rendering a site - like I do for To solve the problem, I use R2 as a repository for static imagery. When I fetch an image from Notion and it is has an expiring URL, I will check to ...

  • Notion as a CMS

    I’ve been tinkering with Notion as a CMS for the last few days and decided it checked all the boxes for a simple site like my own. Below is a high level recap of some of the keys steps. But for more detail, First of all, I chose NextJS for this because I’m familiar with it, it has a lot of options for switching between different types of rendering and React is something I’m comfortable with. But, really, this is workable in any static site generator. Notion has a very clean integration AP...

  • A/B Testing and Feature Flags

    Let’s start by defining the difference between A/B testing and feature flagging. There is a lot of overlap between the two because the definition of both includes the simultaneous presence of two (or more) different ways of presenting a user interface and/or accomplishing a task within an application. The only real difference is the You can use Adobe Target to establish feature flags that can then dictate to an application which implementation to use. But Target’s feature set allows for a ri...

  • Small Teams Do Better

    With communication as difficult as it is, keeping your development team as small as possible yields much better outcomes for a lot of reasons. I wanted to put together a few thoughts about what the benefits are and why I think they materialize. Scalability and Flexibility Smaller teams offer more flexibility in project management, ensuring continuity and flow in the project without much disruption when changes occur. This is because the members are more acquainted with the full context of the ...

  • Ansie

    Ansie is a rich-text terminal rendering package I started this package out of frustration of not having a relatively simple way to output rich text without relying on direct terminal codes which is difficult to parse with the human eye. Yes, there is With Ansie, there are no dependencies for the library - not even chalk. It uses PEGJS to build a parser that will read an XML-based string and translate that into terminal codes. For example: This feels better to me, as a web developer than the sam...

  • Slackbot On The Edge

    While there are some examples of how to setup a slackbot that runs on Lambdas, there wasn’t much available for running in an edge environment. The Edge Runtime has a few limitations (or differences) - not the least of which is that they often are not using the Node APIs. Rather they will often use v8 directly and make available the Fetch API. When using the app directory, API routes will run in this reduced environment which left me having to implement a new Slack Bolt Receiver. The example belo...

  • Github Webhooks And NextJS

    I recently decided to switch an internal tool from NextJS pages router to app router. There’s lots of documentation about how to do that but the part that I was surprised would be tricky was getting my api implementation for my Github app’s webhook handler working again. As part of the migration I moved my webhooks endpoint for github from its original location In the app dir, route handlers actually take different parameters and export different function. For one thing, you export a separate h...