Author: Eric

  • System 1 programming

    Early in my career, my team lead pulled me over to show me something in some code of mine I had written and put up for peer review. I don’t remember the exact context, just that there was a fairly simple operation that could have been done quite simply in 4-5 lines of code, that I had cleverly condensed down to 1. He had the code in question up on the screen and told me “I see what you’re doing, and this works. But it took my pea brain about a minute of really thinking about it to understand what you’re doing and confirm that it works. On the other hand, if you had just written this out in 4-5 lines of code, I’d have understood it instantly. So I’m going to need you to fix this.” It’s a vivid, specific example of something experienced developers try to impart on the newbies – don’t get clever, and don’t hesitate to write more lines in order to be more explicit about what you’re doing. I just finished reading Thinking, Fast and Slow by Daniel Kahneman, and this incident jumped back to my memory, because it was the perfect case study for writing code they way we naturally think.

    (more…)
  • The checkboxes are everywhere, and once you notice them you’ll never unsee them

    I’ve lost count of the number of times I’ve had to sit through some sort of motivational, life lesson-style speech. I have not however, lost count of the number of lines from those speeches that actually stuck with me, because it’s literally “2.” Most people trying to write 1 of these speeches would be better served by rolling in a TV and playing the song “Everybody’s Free to Wear Sunscreen” instead. But there is another idea, from talk about sales and marketing strategies for a company I used to work for, that has so subtly stuck with me and now pops up with frightening regularity.

    (more…)
  • A case study in peak overemployment

    If you see tech updates on Twitter (never X), you may have heard of the strange tale of 1 Soham Parekh. Apparently the young man has taken the trend of overemployment to a level that can be best described as caricature. For a recap on what’s happened and the initial fallout, as well as Parekh trying to defend himself, here’s a video covering the incident. While it’s easy to grab a snack and enjoy the drama, this Parekh character seems emblematic of a lot of issues going on right now, and it’s worth talking about.

    (more…)
  • The myth of “enterprise software”

    We don’t talk about uncategorized software all that often. We almost always include an adjective to indicate something about the code we’re discussing, usually as a means of describing the problem domain. As a few quick examples, there’s e-commerce software, marketing software, educational software, or inventory management software. That clarification is handy, since it provides context about the code being discussed. The problem (and I would not be at all surprised if Java people – and I largely write Java at my job – did this), is when we over-generalize how we categorize software in a way that adds no value. For example, “administrative software” or “enterprise software.”

    (more…)
  • Abstractions are hard to get right

    Abstractions are 1 of those things that are fairly easy to understand the basics of, but hard to really do right. They’re a tool used to simplify code by using a simpler-to-understand proxy (like a database record or a class/interface), but that doesn’t really scratch the surface of how to use them well vs. just tossing in them into code because you’re supposed use them. Done well, abstractions let you move forward while keeping just the right level of detail in your head. The problem is that almost everything we do in programming is just layering abstractions over real-world processes and behaviors. That makes it deceptively easy to have software that feels like it’s in the way more than it is actually helping anything.

    (more…)
  • The AI pitfall

    I really wanted to call this “The AI trap,” but I try not to ascribe to malice what I could explain with ignorance, apathy, and/or stupidity, and given that I generally don’t ascribe the level of foresight and deliberation needed to execute a “trap” to the types of people running large public companies, “trap” isn’t the right word. But even so, this push to start using AI to do as much as humanly possible has already generated content about the plight of junior devs. What I’m worried about is senior developers (yes, I am technically considered a “senior” dev, so there is some self-interest here) are about to walk themselves into a nasty setup they’re never going to recover from.

    (more…)
  • You can just run the code

    So I haven’t made as much progress on the actual gift registry I wanted to write this year, although I do have a Go web application that connects to a Postgres database, with an endpoint that gets the database stats, collects telemetry data, pipes it all to an OpenTelemetry stack, and returns an HTML page with the health check results (server-side rendering is a much more pleasant experience than trying to wrangle Javascript frameworks). I also have tests that confirm this is working. That took a lot longer to set up than I anticipated, but I’m really happy with what I’ve been able to do.

    (more…)
  • I don’t think the problem is that the job market is broken

    If you hear anyone say anything about the jobs market these days, odds are the word “broken” comes to mind. Hundreds of resumes sent out, and in the best case scenario people have been getting tens of calls in response. Not job offers, not in-person interviews, just the company in question calling back to start the potential interview process. Given the auto-rejections coming far too quickly for a human to have made a decision on the resume, the silence about whether or not the company is moving forward with candidates, and ghost jobs, it’s easy to see why people think there’s a fundamental problem with the process. From the employer side, given the fact the software industry has a bloodbath lately, there’s far more applicants than openings, and by all (public-facing at least) indications, every posting is getting flooded with applications. All of this is leading to a situation where people in software are going unemployed for months, even years, after losing their jobs. All of this certainly sounds like a system that fundamentally isn’t working, but I’ve come to a more disturbing hypothesis – the job market isn’t broken, it’s been optimized.

    (more…)
  • Another “left-pad” incident is coming, and it’s going to be nasty.

    Maybe it’s just me, but lately it seems like every problem that doesn’t come directly from customers is resolved by integrating with something that just does it for you, no need to worry. Some of this stuff is really useful because it solves a problem that’s tangential to yours but too much work to just do yourself (for example, a library that renders graphs on a web page based on JSON data, or a framework for setting up a REST API web server). But lately it seems like more and more stuff is coming out that’s handling stuff that really should be handled by the application itself (for example, building an OAuth sign-in widget, or implementing feature flags). I get not wanting to spend a lot of time on something that isn’t the key thing that your business does, but I think we’re wildly overestimating the value we’re bringing to our applications if we outsource everything but proprietary company data, and wildly underestimating our exposure if 1 of these dependencies breaks or has a security problem. Just because it’s not “core” to the main objectives of our software doesn’t mean it’s not important, or so complicated that we can’t do it ourselves.

    (more…)
  • That deep end was deeper than I anticipated

    So while I read up on Golang, I thought I’d go ahead and set up some sort of observability infrastructure to have in place as soon as I started coding. After all, part of my goal is to instrument an application for OpenTelemetry and take advantage of that. What I found was that it’s not as simple as “pick something and spin it up” as I had hoped. That makes sense, running these sorts of services is part of platform engineering, there are teams whose full-time job includes deploying and managing these types of services, but I’m still spending longer getting that up and ready than I initially wanted to. But that’s OK – another part of this is to get better at operating software, and stuff like this is good for understanding what all is involved in “running and supporting software that actually has users.”

    (more…)