We should always be supporting each other, but it feels particularly important right now. An election just finished in the US, which means that half the country lost and has to face the coming changes. In particular, this is a scary time for many folks who have been targets in the past couple of years, with escalating legislation against access...
When pairing with my friend Emily, we had a choice of what to implement in her project: start a new feature, or add a command line argument parser? We opted for the latter, because it had to happen eventually and it was more well bounded. It ended up having a lot of depth! We wrote it from scratch to learn more, rather than pulling in a library1....
If you have a blog, you've probably gotten those emails that want to "collaborate" on a guest post—which often means "let us post sketchy links for SEO purposes." Recently, I got one which was a little different flavor than the usual spam, so I bit and replies. The end result was at the same time fascinating, unsurprising, and deeply...
My wife's alarm clock has been acting up lately. Sporadic at first but then every day, it wouldn't blare in the morning at the set time. Instead, when it was supposed to go off it would... reset itself. The time would start flashing in that "I'm confused because the power went out" sort of way. Not very useful. You want the alarm to wake you up,...
I was talking to a friend recently, and zie1 lamented that a Rust web framework uses YAML for its configuration. I'm far from one to defend YAML2, but dug in a little to understand zir issues with it: is it the trauma here, or is it something else? Ultimately, zie wanted something that I also seek in Rust: compile time errors over runtime errors....
Software licenses are a reflection of our values. How you choose to license a piece of software says a lot about what you want to achieve with it. Do you want to reach the maximum amount of users? Do you want to ensure future versions remain free and open source? Do you want to preserve your opportunity to make a profit? They can also be used to...
Asheville is in crisis right now. They're without drinking water, faucets run dry, and it's difficult to flush toilets. As of yesterday, the hospital has water (via tanker trucks), but 80% of the public water system is still without running water. Things are really bad. Lots of infrastructure has been washed away. Even when water is back, there...
teleportation does exist and so does time travel but only forward from OR to recovery room from discomfort to relief from a permanent pain to a temporary one I left something behind not quite a part of myself —unwelcome guests poisoning me from the inside no longer welcome
I like to make silly things, and I also like to put in minimal effort for those silly things. I also like to make things in Rust, mostly for the web, and this is where we run into a problem. See, if I want to make something for the web, I could use Django but I don't want that. I mean, Django is for building serious businesses, not for building...
The first time I went on call as a software engineer, it was exciting—and ultimately traumatic. Since then, I've had on-call experiences at multiple other jobs and have grown to really appreciate it as part of the role. As I've progressed through my career, I've gotten to help establish on-call processes and run some related trainings. Here is...
This is inspired by receiving a "personnel update" when a friend was fired many years ago. It felt coldly impersonal for such a deeply personal event, so I imagined what it would be like if the same approach were taken to other deeply personal events. * * * Subject: Personnel Update From: dad@family.com To: son@family.com CC:...
It's hard to make progress on side projects sometimes. Getting started is easy when we see the bright future of the project. Then somewhere in the middle, we get stuck in lists of tasks to do, a long way in and still a long way from the finish line. This happens to me as much as anyone. In the last couple of years, I stumbled into a way to avoid...
Sometimes I joke that as a principal engineer, my main programming language is English. It's half true, though, since my job is as much about people and communciation as it is about technology. Probably more, actually. Writing is useful at all levels of software engineering. It's not just something for tech leads, architects, and principal...
Look, I'm sorry, but if the docs say not to do something that's like catnip. Then I just have to do it. So when I saw that the Typesense docs say not to use it as a primary datastore? Well well well, that's what we'll have to do. I spent a little bit of time figuring out what a bad but plausible use-case would be. The answer is: a chat app. Most...
Part of being a social animal is that we communicate with each other. We live in a society, and we have to interact with other people. A lot of that communication happens through language, especially spoken and signed language. For many of us, this language happens so freely and easily that it is as unremarkable as walking. It's something that...
Every software engineer uses a programming language, usually multiple. Few of us make programming languages. This makes sense, because the work we need to get done can typically be done just fine in the languages that exist. Those already have people making them better. Let's focus on the task at hand. But that means that we're missing out on...
My friend Erika is a big fan of Gleam, and her enthusiasm (and explicit encouragement) finally got me to learn the language. It's a functional programming language which targets both the BEAM (Erlang's VM) and JavaScript. This makes it appealing as a language that can target both frontend and backend applications easily, can benefit from the...
The human body has limits, and we break down if we push past them. This can contribute to burnout, lead to stress fractures, or cause a host of other issues. We need to give our bodies time to rest so that we can heal. This is something we often resist, but it's essential. And it's beneficial for more than just healing. But what does it even mean...
This post has been a struggle to write. Not just because it requires a lot of vulnerability, though that's part of it. And it's not just about finding the right words. Most of the struggle has been fatigue. It's hard to find the energy to open my text editor and when I do, my brain feels like mush. Most of my life revolves around productivity....
Last week's blog post accidentally got published a few hours early1. One of the keen-eyed among you even submitted it to the orange site before it was officially up, since it was in my RSS feed briefly and was picked up by various RSS readers. Resolving that issue led me to discover the command faketime and a wonderful way of validating processes...
One of my big hobbies outside of tech is chess. I like to play it, and I also help run our town's chess club. As part of that, we like to run rated tournaments to get our members some experience in a low-pressure tournament environment. These are my responsibility to organize and run, and our club's only certified tournament director. We hosted...
Software engineers typically don't stay anywhere for very long. If you're not moving, you're losing out on opportunities1. And yet, I've made the choice to join and stay at one company for seven years. That's more than half my career to date. Why did I do that? And would I do it again? Why have I stayed so long? People change companies for a lot...
I recently ran into a bug in some Go code that no one had touched in a few years. The code in question was not particularly complicated, and had been reviewed by multiple people. It included a timeout, and is straightforward: allow a Websocket connection to test that the client can open those successfully, and then close it. The weird thing is...
About a month ago1, I was onboarding a friend into one of my side project codebases and she asked me why I was using a particular type of UUID. I'd heard about this type while working on that project, and it's really neat. So instead of hogging that knowledge for just us, here it is: some good uses for different versions of UUID. What are the...
When the power goes out, most people are understanding. Yet the most livid I've seen people is when web apps or computers they use have a bug or go down. But most of the time, it's a really bad sign if this never happens1. I was talking to my dad about this recently. For most of his career, he was a corporate accountant for a public utility...
Something I hear occasionally from some software people1 is something along the lines of: "Well, the hard part is figured out, and the rest is just implementation details." This typically means they've created an algorithm to do something, and the rest of it is all the supporting activities to build an application or production system around this...
Every software engineer can have a great blog, if they want to. Many of us start blogs, but most of those blogs lie abandoned or sporadically updated. It's okay if you start blogging and figure out it's not really for you. But there are also some common issues that block people who want to write a blog for fun or to improve as a writer1. I ran...
In 2022, I developed nerve pain in my arms. It came on quickly, and it was bad: I couldn't drive, I couldn't type, and at the worst I couldn't pick up our kids. That episode spontaneously resolved after a couple of months, but flareups happen occasionally. One guaranteed trigger is my laptop: if I use it as, well, a laptop, then I'll have pain...
Most computer systems we interact with have an auth system of some kind. The problem is, that sentence is at best unclear and at worst nonsense. "Auth" can mean at least two things: authentication or authorization1. Which do we mean for an "auth system"? It's never perfectly clear and, unfortunately, we often mean both. This is a widespread...
I saw a claim recently that in functional programming using "map/filter iterates over the list twice, while the foreach loop iterates only once." The author continued that "Haskell can fuse maps together as an optimization but I don't think you safely fuse arbitrary map/filters? I dunno." There are really two claims here: in functional...
When you are working in any sort of leadership role, you'll have to get people to work toward initiatives that you're leading or make changes you're proposing. Whether you're a line manager running a team day-to-day, or a principal engineer pushing technical initiatives forward, it all comes down to the intersection of people and technology. When...
A couple of months ago, one of my friends told me about a startup called Hume. I was primed to be skeptical, except that I trust this friend to have a somewhat balanced perspective on this topic. He'd talked to some people there and read their site and generally felt a good vibe about them and the mission. Their mission is to build AI that will...
In 2017, the way I see the world changed, literally. For the first time in my life, I had nearly full depth perception. When I was a kid, I was always the one who was bad at ball sports. Not for lack of trying, either. I'd run after a ball to catch it, only to be off by a few feet. I'd whiff when hitting a softball pitch. And I quit indoor soccer...
Logging is a critical tool for maintaining any web application, and yet we're getting it wrong. With great logs, you can see what your application is doing. And without them? Things can be broken left and right without you ever finding out. Instead, you wonder why your customers don't come back, and shrug, and blame someone other than...
While working on the grammar for my programming language, Lilac, I was exploring different choices for statement terminators. . is very appealing, or !. Ultimately, I might make the "boring" choice of using either ; or significant whitespace. But that had me asking: why is it that so many languages use semicolons for their statement terminators1?...
A couple of months ago, every video call I had on my personal computer ended up using Chromium. I tried using Firefox and it looked good on my end: I could see and hear the other person. But they just saw a blank video feed and heard nothing. Firefox showed me that it's sending, but it never goes through to them. This happened with Google Meet, a...
We have made decaf a villain. We often malign decaf coffee and those who drink it. "No thanks, give me the good stuff." "Death before decaf." "Decaf isn't coffee." It has this reputation that it's bad and that coffee people avoid it. And yet, if you drink decaf, you're a true coffee lover. You're drinking it for the flavor, not the buzz. I have a...
I've been writing this blog since 2015, and my writing picked up pace in 2022. That year I wrote 37,000 words, more than the 33,000 I'd written up to that point. It has accelerated since then. At some point, I realized that I've put in a lot of time and effort writing here, and got the idea to bundle it up into a book. The motivation here isn't...
I've previously written that project names should be cute, not descriptive. That post talks about services and does not talk at all about modules or variables. It's different in the latter context: those names should often be descriptive. What's the difference, and how do you decide on a cute or descriptive name? A lot of it comes down to how...
One of my most insidious procrastination mechanisms is doing things that feel like work but are just a fun diversion. I ran into that recently for a side project I'm working on. It wasn't really necessary to test database options semi-rigorously, but here we are. This project is one that I really want to use myself, and I think other people will...
Compression is a really hard problem, and it attracts a lot of interesting ideas. There are some numbers whose digits contain all sequences of digits1. People have long hypothesized that pi is one such number; a proof remains elusive. If we have a number which contains all sequences of digits, could we transmit a message using that? Instead of...
One tenet of big-a Agile1 is that developers should all work on individual user stories as the smallest unit of work2. That a ticket should almost always be a story, because that means it's something that delivers concrete value to the users. There are some cases in which this leads to absurdity. I've written tongue-in-cheek tickets of this type...
Recently while reading Real-World Cryptography, I got nerd sniped1 by the mention of Bleichenbacher's attack on RSA. This is cool, how does it work? I had to understand, and to understand something, I usually have to build it. Well, friends, that is what I did. I implemented RSA from scratch, wrote the attack to decrypt a message, and made a web...
A mentee recently mentioned a really frustrating problem that her manager seems to be ignoring. The specific problem doesn't matter, so don't focus on the technical details here. Hey Nicole! At $DAYJOB, we have some big problems and it's frustrating, I keep pointing them out and nothing happens. I've told my manager three times about this one in...
A couple of weeks ago, I started working with a personal trainer to improve my fitness. I've long been an endurance athlete, and it's time to lean into my overall fitness and strength. Part of this is to be healthy and live a long life. But honestly? More of it is a desire to come back stronger and beat my old personal records. As part of the...
In tech, we're fortunate to have separate management and technical tracks, though it's still underdeveloped1. However, the path you take isn't very clear, it's not broadly understood what the responsibilities are, and there aren't as many resources out there as there are for management. But there are still some really good resources! The...
I've worked places where we aspired to (but did not reach) 100% code coverage. We used tools like a code coverage ratchet to ensure that the test coverage always went up and never down. This had a few effects. One of them was the intended effect: we wrote more tests. Another was unintended: we would sometimes write unrelated tests or hack things...
I've been running my backups by hand1 every week on my laptop for as long as they've been set up. Automating them was something important but was on the back burner, because, well, it never felt very important. Then I lost a few days of work when my SSD died, and it felt more urgent. Haha, no, I still kept doing it manually every week. It was...
Tomorrow, I'm boarding an airplane to attend a work event. It's my first time flying since 2018, and I'm excited to meet all my coworkers in person. The travel is, on whole, going to be a good experience. But there is a lot surrounding the travel that is stressful and scary. I'm traveling to a state that is banning HRT for trans people. And my...
When you're designing a piece of software, the single most important thing to design for is understandability. Security, performance, and correctness are all important, but they come after understandability. Don't get me wrong, all of those are important. Software that isn't correct leads to expensive errors and frustrating experiences. Slow...
While reading Real-World Cryptography, I came across the "million message attack". This is an attack that Daniel Bleichenbacher demonstrated in 1998, which effectively broke RSA with a particular encoding function called PKCS #1. It was only mentioned briefly, so I dug in and decided to try to understand the attack, eventually to implement it....
At my first job, we were a distributed team and would get together often. When we went out to eat, one of my coworkers would always order the steak if it was anywhere on the menu. Every single time we went to some Ohio restaurant that had truly lackluster steak, he'd order it anyway. He knew it was going to be bad! He'd done it before, and we...
While pairing on a small Rust program with a friend, I ran into a problem: to compile to WASM, one of my dependencies needed one of its dependencies to turn on a feature. A variation of this that I've run into in other projects is where a transitive dependency has a bug/CVE and I want to upgrade it. So what do you do if a transitive dependency is...
In high school, one of my teachers shattered my plans for my life, in the most beautiful way. Most of my life, I'd intended to become a math professional of some sort: a math teacher, when that was all I saw math for; an actuary, when I started to learn more; and then a mathematician. I knew that to get a math degree, I'd probably have to take...
This is one of those cliched posts: Reflection on the year that's ending, reviewing last year's goals, and talking about hopes and goals for next year. They're cliche, and they're also useful. The planning and reflecting process is a useful one, and sharing openly means other people can come along and learn with me1. Reflecting on 2023 I thought...
Recently someone I was talking to ran into a fun borrow checker problem in Rust which is illustrative of some current underlying limitations of Rust's borrow checker. The problem boiled down to: they took a reference in a loop (dropped on each iteration), and the borrow checker complains that it cannot borrow it mutably multiple times, since it...
Every year I do some of Advent of Code. One year I completed it, but usually I just do some of it as a social thing with friends and then taper off as interest wanes. This year, I did three days of it, and stopped because I really truly did not want to write more solutions in the language I chose. See, previous years I made a reasonable choice,...
I'm proud to announce that Hurl is officially released and done! You can check out the docs on hurl.wtf. The language itself came out of an interesting question: Python sometimes uses exceptions for control flow, so could we implement a language that eschews normal control flow and only uses exceptions? The answer is yes, and it produces a...
The waterfall model is probably the most reviled methodology in software engineering. This methodology was first described in a 1970 paper by Dr. Winston Royce. This paper didn't call it waterfall, nor did it endorse the technique, and the paper contains a lot of good insights and raises some interesting questions. Let's take a look at some of...
Performance is one of the big reasons to use Rust. It's not a magic wand for performance, it just gives you the control to eke out whatever performance you need. So if your program is still slow, how do you fix that? Profiling your program is one of the best options for figuring out why it's slow and where you need to focus your improvement....
The biggest tech companies employ a lot of engineers. In 2021, Microsoft employed over 100,000 software engineers. That is just mind boggling scale to me. It's roughly as many people as the whole county I grew up in. They are paying a lot of engineers. Some of them do very little, with employees saying they "were paid to do little-to-no work"1....
This post is hard to write in a lot of ways. It's more personal than most I've written. This is presumptively a tech blog, and this piece is about so much more than technology. But it's important. Making things, software or otherwise, is ultimately about people. One of the ways I express love for the people I care about is through making things....
Rust is a hard language to learn, in the scheme 1 of things. I've previously talked about why the learning curve is hard and what we could do about it. Today, I'm proud to say that there's another resource to help people learn Rust in a more approachable way. Introducing Yet Another Rust Resource 2 , or YARR. (Yes, many examples are pirate...
Stop me if you've heard this one before: "We're putting accessibility (features) on the roadmap." Or this one: "We don't need to make it accessible since we don't have any blind users 1 ." It belies an attitude that's all too common in the software industry: That accessibility is something you can build once and be done with. That it's an extra...
Most of us make some bad decisions in high school. While other people were drinking, going to parties, and who knows what else, I was doing some experimentation of my own. I was writing my first (and only) piece of malware. From as early as I can remember, I've had a fascination with security. In games, I would play rogues and try to pickpocket...
Rust has a lot of nice things that make life easy. One of the least discussed ones is also one of my favorites. It's a little nugget in the standard library that makes handling possible failures a lot easier. And it's not even baked in—it just falls out from the type system. Nicely handling multiple Results or Options When you do something that...
As software engineers, we routinely estimate our work. Our most common brush with estimates is when we estimate individual tasks within a sprint. Usually, we do that with abstract points, and that's the wrong way about it. We should be cutting to the chase and estimating directly in units of time. Note: Although this post reads as a strong...
Last week, I did a Q&A session for a friend's security class. One of the students asked a question that I loved. They asked something like, "As a principal engineer, how do you make sure your company stays at the forefront of innovation?" There are two reasons I love this question. The first is that it's a good and natural one, which I had early...
Recently, I listened to an interview with Haroon Meer, the founder of a company focused on honeypots. Honeypots (also known as canaries or tripwires) are used to detect network intrusions and people nosing around at things they're not supposed to. They are an essential component of modern network security. It got me thinking: These are part of...
There's a common quote in the software world that you should "make it work, make it right, then make it fast."1 This is a catchy aphorism, and it is often taken as a rule. But in its short form, it misses some crucial nuance. Let's unpack it to see what's missing, then how to do things right. What does it mean? Unpacking the statement, we have...
Recently in a programming community I belong to, someone presented a problem. They had a Rust program which was using threads and for loops. When they updated the code to use iterators, it got dramatically slower. Why did this happen? For a Rust veteran, the problem might not be surprising, but it trips up a lot of people because of how iterators...
I've got a reputation at work as being a skilled debugger. It's a frequent occurrence that the weird stuff lands on my desk1 after it goes through another skilled engineer or two. To say my job is substantially "debug the weird shit" would not be an understatement and I'm here for it. This extends throughout our codebase, and into code I haven't...
Update October 2, 2023: This is now fixed: you can update your name in your user settings. This works for the OpenAI Platform accounts, and they say the same for ChatGPT (etc.) is coming soon. Thank you to those who reached out to OpenAI employees about this, and thank you so much to the kind folks at OpenAI who I talked to who prioritized this...
I've been using GitHub Copilot on personal projects since March. It's been an interesting experience, and one that I realized I have to change. Using Copilot nearly full time has had some positive and negative impacts on me, and it's time to take control of how I interact with it. The honeymoon phase I've liked a lot about working with Copilot....
Words matter. First impressions matter. I'm reading The Pragmatic Programmer in a book club, and there's a section titled "Good-Enough Software". In it, the authors expand that "the phrase 'good enough' does not imply sloppy or poorly produced code" and that it must still meet all requirements. The rest of the section is a reasonable message that...
I've been working on my programming language for a couple of months now, in fits and starts1. In the original post, I laid out my plan for it, and after creating the parser the next step was writing a formatter. I thought this would be a nice intermediate step after writing the parser, something easy to exercise the code without being as...
The world is changing right now. We don't know just how much yet, but LLMs are having a major impact on almost every field, and we could see anything from minor efficiency gains to catastrophic AI apocalypses to mass disruption of many jobs. The cone of possibility is wide, and it includes the possibility of creating human-like intelligences. As...
I was reading "Real-World Cryptography" and ran across an thought-provoking statement. While talking about why hashes are often represented in hexademical, the author states (emphasis mine): There are other ways to encode binary data for human consumption, but the two most widely used encodings are hexademical and base64. The larger the base, the...
The next time you start on a major project, I want you to write code for a couple of days and then delete it all. Just throw it away. I'm serious. And you should probably have some of your best engineers doing this throwaway work. It's going to save you time in the long run. The usual approach In software teams, a common approach to developing...
Last Wednesday just before 3pm, I went pack up my laptop to get ready to drive 7 hours to visit my family in Ohio. Fedora had some updates to apply and when it went to come back on after those, I saw the words no one wants to see: Default Boot Device Missing or Boot Failed. Insert Recovery Media and Hit any key Panic sets in, because this is my...
Recently I started working on a programming language, Hurl. Writing the initial code samples and developing the concept is all fine and good, but the next step is to actually make it work. The steps I outlined for developing Hurl in the last post were: Write out code samples to get a feel for Hurl and its semantics Define Hurl's grammar in a...
One of my private repos depends on LangChain, so I got a lovely email from GitHub this morning: Ooh, a high severity remote-code execution vulnerability in LangChain? On the one hand, I'm not entirely shocked that a framework that includes the ability to run LLM-generated code might run untrusted code. On the other hand, it is high severity, so...
People change their names for all sorts of reasons. They get married, they transition, or they just decide a different name better suits them. When this happens, things break. Recently I talked about how email address changes break things. Today it's how to fix this issue with git. We use git at work. After I came out at work, it was a game of...
After my last blog post about Hurl, someone asked me, and I quote: "... why?" The simple answer is "for the joke." But the longer answer is that useless software1 is a fantastic way to explore and experience the joy of computing. Play is an important part of exploration and joy. As technologists, we spend our days mired in making useful things....
Sometimes we have ideas that are bad but demand to enter reality. A few months ago, while chatting with a friend, we toyed around with the idea of a language where the only control flow you get is error handling. This idea embedded itself in my brain and wouldn't let me go, so I kept just talking about it until two people in the same week...
As developers, we can be metric obsessed. We tend to like objective measures of things. 99th percentile request times, CPU percentage, disk utilization. Nothing escapes our attempts to quantify it, not even our productivity: enter story points1. We measure our productivity in some way by how much we get done. This is the quantity of work or...
Units are a key part of doing any calculation. A number on its own is just a scalar and doesn't represent anything in particular. If I tell you to go drive 5, you'd naturally ask "5 what?" Software often has to deal with quantities that represent real-world things. How we represent these quantities in different languages is an interesting window...
A lot of applications treat your email address as something immutable that is linked to you and which will never change. It can't be linked to someone else, and it can't change. This is, of course, not true. Email addresses do change. I changed my work email address recently (associated with the same account) and let me tell you: almost no...
We're plunging into a world where AI-generated text surrounds us. But we don't know where we are on that. What portion of the text you read each day was generated fully or partially by a human, or by an LLM? We don't know, and probably can't know, and that brings about some problems. I'm not so naive as to think that because something should be...
On Monday, I was talking to a friend about programming and I mentioned that I prefer to review Rust code over Python code. He asked why, and I had some rambling answer, but I had to take some time to think about it. It boils down to the fact that I can give a much better review of Rust code, despite having much more exposure to Python. The main...
This week is Never Graduate Week at the Recurse Center, where alumni come back to do Recurse-y things together. It's a great experience and I've had a lot of fun reconnecting with friends and meeting some new friends. But it wouldn't be an RC experience without working at the edge of your abilities! I did that this week by participating in the...
So often when we sign up for an application, it asks us for our gender, sex, or title. For example, there is a cycling app called Zwift which I use to ride indoors. When you sign up, you enter your gender. On the app, they say that you need to be honest because it impacts things. They say "Be Honest! - Accurate weight, height, and gender...
Internal company hack days (or hack weeks) are a common thing in tech companies, but not universal. They should be universal, though. Hackdays help you get great new ideas that are both impactful and feasible. They're probably the best thing you can do to improve your product and reshape your roadmap. Bold claim, so let's unpack it. Hackdays, for...
A lot of programming languages allow variable shadowing in new scopes. Early on, you learn that it can cause errors and can be confusing, but is situationally appropriate sometimes. Something that's less commonly allowed is redeclaring variables to shadow them locally. And when it is allowed, it's often considered bad practice and confusing....
Eight years ago, I decided to start a blog. For most of the life of my blog, it was relatively inactive. And then, I just started pumping out a lot more blog posts in 2022 while attending the Recurse Center. What changed? I stopped relying on visits from the muse, and started scheduling them. It used to be that I would write when the mood struck...
When I think of feature flags and authorization, I usually think about very different things. They are used for different purposes. But ultimately, they are abstractions of the same thing. They might even be the same thing except for how they are used and the consequences for bypassing them. But that is a bold claim. Let's establish what we are...
We are in the early days with a new technology. There is a lot of hype around LLMs, and takes on every end of the spectrum. Some predict that programmers will be out of a job sooner than later. Others predict that these will just contribute to spam. Today I'd like to focus on one particular take I've read: Using LLMs will make us produce worse...
Traditionally, an org chart is represented as a tree. You start at the top with the root of the tree, probably the CEO. And then everything comes down from there hierarchically. It doesn't have to be that way, though! We can imagine other topologies for companies which would work differently. Let's challenge assumptions one by one and see where...
vim is my text editor soulmate1. But I've gone and done a Brutus by betraying vim and using a different editor. And I did it on March 15th2, the Ides of March. Or is it the IDEs of March? The betrayal happened slowly, then all at once. For the past few weeks I've been ruminating on the pair programming experience I have had at work. Mostly, we've...
Happy Pi Day, fellow nerds! This is a holiday I've celebrated every year since at least 2010, and I'm not stopping anytime soon. The celebrations have evolved. It used to be just "bake a pie" and "haha pi, pie". Over time, I twisted it a bit (pizza is a pie of sorts! a cake with a pi symbol on it!). This year is the next evolution. I've made a...
One of the challenging things about being a staff+ engineer is that people trust you. They trust you a lot, and there might be less pushback on ideas than there should be. This makes sense. To become a staff+ engineer, you usually need to be really good at this intersection of skills1: Writing good code Software architecture and system design...
Chess is booming, and tech is burning to the ground. It's inevitable, soon, that Chess is going to acquire the entire tech industry. And when Chess acquires us, they'll replace us and take our software engineering jobs1. Then we'll be stuck playing their game, and we'll be sitting on those 64 squares. When Chess takes our jobs, which roles will...
One of my favorite things is reading about the tools other people use, and talking about the tools I use. When I read a post recently about a data journalist's data tool belt, well... I knew I'd have to share my own software engineering tool belt, too. So, here's my software engineering tool belt. There are a lot of tools that I use, and not all...
January 2023 was a rough month if you wanted to play chess on the most popular chess website, chess.com1. Their service has been experiencing an unprecedented amount downtime because of a huge influx of users2. There have been days where it's all but unusable. It's frustrating as a user! It's also surely frustrating for the business behind the...
I've been working on writing a Rust training course, and one of the things I struggled with explaining in there was the difference between references and pointers. Ultimately, the underlying representation is the same: both hold an address for some memory. The difference between them is ultimately in semantics. References have some rules enforced...
So often, people argue against restrictions on technology (or tech companies) with the argument that those restrictions aren't possible given the scale, value, or some other property of the technology. For example, a common retort to arguments that Facebook and YouTube should have better moderation is that "human moderation is impossible at that...
I'm working on a database system that stores and queries chess games and positions. Right now, it contains 240 million unique positions1 from 3.8 million games. One of the things it needs to do is quickly find all the games where a particular position occurs. I'd also like it to do things like find games where this position occurs and it ends in...
I've been thinking about the learning curve for Rust lately, and why it feels so hard to learn. I think the reason is because the complexity is all front-loaded, and the resources generally don't actively reduce that front-loading1. There are two well-trod paths for learning Rust: read long books, or learn by example. These work for some people,...
A long-standing debate between me and a peer at work has been how we should name services. His position was always that services should be named something descriptive, so that you can infer from the name what it does. My position is that the name should definitely not be descriptive, but should be something cute and wholly disconnected from the...
Earlier this week, I ran into a confusing situation with lifetimes and the borrow checker while working on my Lox interpreter. It took me a little while to figure out, and it's an instructive situation. Here's a reduced-down version of what I was working on. It's an interpreter, so there is a scanner which produces tokens. Ideally these tokens...
This is one of those cliched posts: Reflection on the year that's ending, and talking about goals and whatnot for next year. They're cliche, but they're also useful. The planning and reflecting process is a useful one, and sharing openly means other people can come along and learn with me. Reflecting on the year This year has been one hell of a...
There's a tradition at Recurse Center of writing a Return Statement after your batch. I'm not sure of the origin of the terminology, but it seems like it's a pun on the return statement in programming languages. It's a great tradition, and it gives me a good motivator to reflect on my batch and share those reflections. This is going to be a ride,...
I've been using vim for nearly as long as I've been writing code. My first introduction to it was being thrown in the deep end in 2009 by my Intro to CS lab assistant, who told us to write our programs using vi1 on the department servers. Why he told us that, I have no idea. But I got used to switching into and out of insert mode, and also how to...
And that's it. My batch at RC ended yesterday. I have so many thoughts and feelings from this time, but it's going to take time to coalesce them all. I'll write up my Return Statement1 in a week or two, but for now, here's what I was up to the last week! Mostly, this last week was an attempt to speedrun Crafting Interpreters. This book has been...
Reading on screens is very difficult for me. I just cannot focus on the articles, especially when there are notifications coming in or even just other content on the screen1. I have a reMarkable tablet (RM), which I love dearly2 and much prefer to read on. But it's annoying getting articles onto it. To put a blog post onto my RM, I copy the link...
As I come up on the end of my batch at Recurse Center, I've been doing some reflecting on my time here. One of the standout themes is how much I've learned through struggling with other people. In particular, this learning together has make some difficult topics approachable, where I may have given up or gotten stuck on my own. This week, we were...
I recently read "Designing Freedom" by Stafford Beer. It has me thinking a lot about the systems we have in place and something clicked for why they feel so wrong despite being so prevalent. I'm not sure what any solutions look like yet, but outlining a problem is the first step, so let's go. Systems background First, some background. What's a...
As I write this, I'm sitting, surrounded by family, recovering from a cold. I wasn't sure what I'd write this week for the RC week 10 recap, since it's a short week. This week I didn't get a whole lot of coding done, so it's time for the trope: the Thanksgiving post. Of course, I'm thankful for my family who I'm surrounded by at this holiday. My...
While working on a project where I was putting a lot of data into a HashMap, I started to notice my hashmaps were taking up a lot of RAM. I mean, a lot of RAM. I did a back of the napkin calculation for what the minimum memory usage should be, and I was getting more than twice what I expected in resident memory. I'm aware that HashMaps trade off...
I have three weeks left at Recurse Center. This last week was significantly less productive for me than usual, because I've been pretty fatigued and just recovered from a cold. But I still got some work done that I'm proud of. More than that, I'm excited for the coming three weeks! This week I was mostly fatigued all week, so I didn't do very...
It's time for me to leave GitHub behind and move to another forge. I'm not necessarily advocating for anyone else to do the same, but if my reasons resonate with you then you may want to consider it. I also don't expect this post to... matter, if that makes sense1. I'm not a major open-source maintainer or contributor. I'm just somebody who likes...
I'm two-thirds of the way done with my RC batch now. Eight weeks down, four weeks to go. The last two weeks have been difficult for me because of life happening. Week 7 was hard because I had some travel to help my parents, and that just takes me out of my routine and is generally stressful. It was good, and I am very glad that I had the...
I'm the kind of nerd that has a favorite software license. For a while that favorite license was the Mozilla Public License (MPL). Right now, it's the GNU Affero General Public License (AGPL). Licenses are really important on all code, and they're critical to the open source movement. They reflect the values of the people writing the software....
It's that time again: I read another paper, and here's what I took away from it! This week I read "C-store: a column-oriented DBMS" from chapter 4 of the Red Book. This one I picked since I thought it would be helpful for the chess database I'm working on, and it does seem applicable! This paper was pretty significant for making a strong case for...
Seven weeks down, five weeks to go! It's flying by quickly. On the one hand, I want it to last forever. On the other hand, I know it can't, and I'm looking forward to talking to coworkers again at my day job when I go back. RC has given me a renewed appreciation for what I get at my job. More on that in December, though. For now: RC, and the...
I'm halfway done with my RC batch now. Time feels like it has sped up. The feeling that my time at RC is infinite is gone. This was compounded by seeing folks from the Fall 1 batch conclude their batches yesterday. We'll get a new boost from the Winter 1 batch joining on Monday, which I'm really pumped for! New people, new excitement, new energy!...
For the last few weeks, some of us have been working through learning about interactive theorem proving together at Recurse Center. I've been curious about proof assistants since undergrad, and finally have the time, space, and peers to dive into it with. It's been an interesting experience getting started. Since we're just getting started, I...
Another week, another paper! This week for our Red Book reading group, I read "Concurrency Control Performance Modeling" by Rakesh Agrawal, Michael J. Carey, and Miron Livny. It was 46 pages, and I had a little trouble finding the whole paper—many of the Google Scholar links had missing pages in the middle, which was confusing the first time I...
Another week of my RC batch wraps up. I'm done with five weeks, and seven weeks are left! Time is still flying by, and I've hit an inflection point. I have gotten what I want out of the two projects I've worked on so far, so I'm going to wrap them up and move on to one new project for the rest of the batch. A very social week This week I did a...
I've been working on Patzer, a chess engine, during my time at RC. The first engine-like thing I implemented for it was alpha-beta pruning, which is a way of pruning out branches of the search tree to significantly speed up search. This is a common algorithm, which I also implemented in my undergrad AI class. That doesn't mean that I fully...
Wow, my RC batch is one-third done. I've just finished my fourth week, and there are eight weeks left. Time is flying by. I feel like I've settled into a decent groove. Taking a step back, it is setting in how much I've learned so far and how much I've accomplished. In these four weeks, I've learned about the architecture of databases and managed...
Last week, I read "The Gamma Database Project" for a Red Book reading group. Unlike the last paper for this group, this one was a lot more approachable in length: 19 pages. I'm putting up some of my notes here from reading the paper. If you read through to the end, there's dessert: a quibble I have with the paper. My understanding is that this...
The third week of my batch at Recurse Center is finished. It is still flying by too quickly. Nine weeks left! This week was a whirlwind and really busy. I think I pushed myself too hard. I had just recovered from my cold and was a little drained, and then got my COVID booster and flu shot, which really knocked me out. But I got a lot done, and...
I've set up a homelab finally! This is something I've wanted for a while and finally the timing was right. The right project came along to justify it, so I took the plunge. Naturally, that leads to a few questions: What's a home lab? Why do you want one? And what is the shiny hardware? (That last one is the dessert if you get through the rest...
Last week, I read "Architecture of a Database System" for a Red Book reading group. This is as massive paper: 119 pages. What surprised me is how approachable it is. I have relatively little background building database systems and more experience using them. Despite this, the paper was readable and I was able to take away quite a bit from it,...
The second week of my batch at Recurse Center (RC) is a wrap, and it already feels like it's going too quickly. My batch is twelve weeks long, so I'm 17% through. Only ten weeks left! This is a precious time, so I'm trying to make the most of it, but also trying to not increase the pressure on myself to make the most of it. This can get a bit...
In software engineering, there are two principles that often come into conflict. The first one is the principal of least surprise. The second one is doing the right thing. These come into conflict when the usual thing that people do is in fact the wrong thing. A particular example of this is the behavior of rounding. In school we were taught that...
The first week of my batch at Recurse Center (RC) just finished, and it was an intense week! I'm planning to write a blog post each week about my experience at RC. They'll vary, but it'll probably be a mixture of what I did and my feelings about everything. There won't be too much technical content—I'm planning to write individual blog posts on...
It's been almost a decade since I graduated from college. In that time, I've worked at three startups, co-founded a non-profit immigration tech company, consulted for the United Nations, and noped out of grad school after one semester (twice!). I've also struggled with depression and anxiety, had three different therapists, and tried multiple...
Even with the wealth of information on web sites and in videos, books remain a great resource for learning. And they're great for group learning, too! We've run a book club at work a few times. Some sessions were more successful than others. The main way our book clubs faltered or failed was through severe drop-off. This is a proxy for a lot of...
The job of a software engineer is not to produce code, but to solve problems; we just happen to solve most of those problems by producing code. Ultimately, producing code is hard, and we need help. That's why GitHub's Copilot is exciting, but it's far from ideal, and it's the tip of the iceberg of what's been done and what is to come. There have...
It seems like everyone these days is developing in containers. Specifically, I mean running your local development environment almost entirely in containers. There's a lot to be said for it, especially when you're bringing new developers into a project: it can be an invaluable way for anyone new to the project to quickly get all the tooling set...
Near the beginning of my career, I was working for a startup that made database software used by other companies in their production infrastructure. The premise was that our super-fast database had a computing framework that would let you do things in real-time that usually took batch jobs, and we powered things like recommender systems and fraud...
If you're building an application that needs to scale—and we all tell ourselves that we are—then at some point you have to figure out if it does or not. This is where load testing comes in: if you want to see whether or not your application can handle scale, just generate scale and see if it can handle it! It sounds straightforward enough. Then...
Not even a year ago, most software companies and software engineers were some form of remote work skeptical. Remote work existed (I've been working remote for most of my admittedly short career!) but it was not widespread. When I talked to recruiters at big tech companies they would all insist that remote work was not feasible for them, and even...
Last Saturday, I ran into a problem doing a routine backup of a web app I maintain. In fact, this was the second time I ran into the exact same issue, so it's time to write it down. (Hopefully, the third time I run into this, I have the presence of mind to look up my own solution!) My web app is deployed using docker-machine and docker-compose....
I take pride in my work and in writing good code, and it's important sometimes to take a step back and ask: what does that even mean? And does it matter? At a high level, "good code" is code that is suitable for its purpose and achieves its goals. That definition is pretty lacking, though, I think. You can write some very very hacky prototypes...
Lately, I've been working on implementing ping on my own as a project to keep learning Rust and to deepen my knowledge of networks. I'm just going for a super basic utility here, nothing fancy, not even all the features of ping. But since the language is new to me and my lower-level network knowledge is weak, I decided that it could be helpful to...
Every programmer has had to swap variables. It's common in real programs and it's a frequently used example when people want to show off just how nice and simple Python is. Python handles this case very nicely and efficiently. But how Python handles it efficiently is not always clear, so we'll have to dive into how the runtime works and...
If you're in the software industry, it's hard to not be aware of agile development at this point. It seems like every team practices it differently, but there are certain commonalities that run through all teams I've seen. One of those is the term used for each time-delimited section of the development process: "sprint." I'm an endurance athlete,...
In 2005, I got my invite to get a Gmail account. It was incredible, and I loved it, although I didn't really know why at the time. It was a combination of really great design so it was pleasant to use, the hype built up by the invite system, the perpetual feeling of getting something more as you watched your allotted storage slowly tick up, and...
Every year, GoodReads has a Reading Challenge, where you set how many books you want to read and record them as you go. This year, I got serious about it, and it was a wonderful motivational device. I set a goal of two books per month, and I just eked it out over the finish line, finishing my 24th book this morning. Here are some of the best....
Crunch time has an allure: it feels like if you just push hard enough, you can get more done. You can push hard and get that next release done on time, get those new features out, earn more revenue for your company. Engineers are under immense pressure to deliver more and do it now, and we also feel special: we feel unique, like we are not...
Multitasking is incredibly alluring. Why go slowly, doing one thing at a time, if you could get a second thing done? Why not fill those five seconds while your code compiles with reading an article about the latest web frameworks? In fact, multitasking is hiding everywhere in your daily work. Any time you switch from one task to another with the...
We are barraged by constant distractions, and they are degrading the quality of our work. Our digital society now is set up to allow us to focus for mere minutes at a time, since we are in an attention economy and the sole objective of companies is to capture more of our time. Facebook, Google, and Snapchat are all incentivized to get us to look...
People talk about disrupting industries when those industries appear to be in a stable but inefficient state. For example, the taxicab industry: there was little innovation going on in it, and it was stable, but it seemed like it was far from ideal. Along came Uber, intent to disrupt the industry - and disrupt it they did. Uber has a culture of...
Estimating software projects is hard, if not impossible. This seems likely to be fundamental to the work, because we're inventing new things and invention doesn't happen on a fixed schedule. And yet, many teams still estimate how long their tasks will take to finish. Why should you do this, if you can't do it accurately? You do it because it can...
When you're building or scaling a software engineering team, you naturally run into a choice at some point: will we all be in the same office, or will we do this "remote work" thing? There are a lot of factors that go into whether or not remote work will work for your team, like if you know how to work remote. Another consideration, to make it...
I've been working remote since September 2016. There are a lot of engineers who have worked remote longer than I have; there are others who have more insight into how they work than I do; and there are plenty of people who simply don't work in the same way I do. My intention in this post is to share how I work, the reasons why I work that way,...
Just over a year ago, I left the startup I was working for and started my own business. My intention was to do freelance work ("consulting", to all my clients) until I was able to launch my first product, and then shift into being a product company. My ambitions and confidence were very high. In this last year, I have accomplished a great deal...
Here's an exchange that's pretty common: "How long will that take?" "A few days." I run into this all the time with clients - they have real business needs to know how long something will take and what the risks are with any given project. So, we are asked to give estimates of how long tasks will take. Whether in time (2 days) or points (3...
This was my first time going to PyOhio, and it was a blast. There will be some videos being posted soon, so I will opt to link to those as they come in, but first, here are some of the highlights: Ed Finkler of OSMI gave a great talk on mental illness in tech, resources that are available, what OSMI does, etc. This topic needs to be discussed...
One of the keys in baking bread is getting the dough to rise well. As the yeast does its work, it ferments some of the sugars in the dough into alcohol and carbon dioxide, resulting in a growing, bubbly mass of dough. There are some tricks to making dough rise quickly, like using more yeast, using instant yeast, or even with a microwave. These...
Update: I wrote this while preparing a talk for the Columbus Functional Programmers meetup. You can find the talk on YouTube. It has more humor than these words, but then you'd have to listen to my voice. This post is a long one, so here’s a brief roadmap. We’ll start with a quick introduction to functional programming. Then you’ll get a quick...
A friend of mine is very into keyboards and, after seeing his keyboards at work and admiring his Ergodox many times, I took the plunge and built my own. 152 solder joints later, I have this beauty: It took a few days to get used to it and in the process, I found a bug in layer switching, which I contributed a fix for. While fixing it, I came...
It has long been predicted that with more automation and more technology, we could all work less and have more leisure time, but we continue to fall short of that promise. In many ways, we're working harder and longer, with more stress, than previous generations did. I think that a large part of that is because of societal pressures to work long...
At the end of this week, I am starting a new chapter of my life: entrepreneurship. This is my last week at CrossChx, and then I begin splitting my time between contract work and developing some of my own ideas. I only spent about three quarters of a year at CrossChx, but in that time a lot has happened. I've made some friends who will be with me...
On March 22, 2016, I talked about scaling up graphs at Scale Tech. It was recorded and is viewable on YouTube: If you have thoughts on scaling graphs or big data in general, please reach out to me! I'm always happy to talk about this.
Surveillance has gotten a lot of media attention lately (and a bit of attention on this very blog), and for good reason. So, it should be no surprise that it's also turning up in our dystopian novels! "The Circle" is a dystopian novel by Dave Eggers. While fiction, it is set in a plausible universe which is alarmingly similar to present day, and...
In 2010, the news broke that Harriton High School, in a suburb of Philadelphia, was activating webcams on student laptops1. When they were at home. In their bedrooms. They captured photos while students were in private spaces, where they never expected to be watched. A few days ago, I heard about another school that is also surveilling their...
Here's something we don't talk about enough: burnout sucks and it can happen to any one of us. We need to talk about it. We need to know how to deal with it and recover from it. And we need to recognize that everyone can come back from it, stronger than ever. In the software industry, we are subject to lots of pressure, long hours, and...
I just finished reading Bruce Schneier's latest book, "Data and Goliath." I was apprehensive at first -- I'm a big fan of Schneier's posts online, but I found this randomly at the library and I was hoping not to be disappointed. In the end, it was well worth the read. The book was split into three parts. In Part One, he discusses what a world of...
As an undergraduate, I always imagined that I would someday move to the SF Bay Area to live in the heart of the software industry. With this in mind, in my final semester at Kent State, I joined a Silicon Valley startup as their third engineer1. The staff at that time was split: one founder and one engineer were in Mountain View, CA; one founder...
It seems like everyone in the software industry goes through a blogging phase. This is the beginning of mine. I have started this blog time and time again over the last three years. My original inspiration for having a technical blog came from one of my mentors at my internship. The continued inspiration is from people telling me that I sometimes...
Identity theft is a huge problem, costing Americans more than $4.5 billion in 2012. Identity theft victims frequently lose time and money and undergo significant mental hardships while dealing with the fallout. It can happen a few different ways, but one large attack vector is through the identity verification process. Every time your identity is...