RSS Amplifier

Blog

Untrod

blog.untrod.comRSS feed ↗47 posts

Latest posts

LLM-Powered Django Admin Fields

Note : All relevant code can be found in the corresponding Github repo . I work at Grove Collaborative -- an ecommerce company that sells thousands of different products. We use Django and the Django admin as our product information system to manage, among other things, all of the copy on our Product …

Robot Dad

See discussion of this post on Hacker News Tired of Alexa's feeble "here's what I found on wikianswerspam.com" responses to my eight-year-old son's science questions, I whipped up Robot Dad during my Thanksgiving break. He now runs in the background of our family computer. Robot Dad sounds like real …

Copy Editing a Novel with ChatGPT

My wife, a writer, recently and unexpectedly needed a final round of copy-editing on a manuscript she had written some time ago. There wasn't time to hire a professional, and even splitting it up, we couldn't get it done between the two of us fast enough. Luckily, I know Python …

Short Stories for Engineers

I've recently been reminded of a few favorite short stories, and discovered some new ones, that swirl around themes of existence, engineering. order, systems, computing, and information. None of these are deep cuts; they are well known among sci-fi readers and short story lovers. But I thought I'd compile the …

Guidepost - Business Value

We write code to deliver business value. We should therefore select solutions where most of the investment is going into the differentiated bits that drive business value. This means we want to write more code that is only relevant to Grove (because it uniquely solves our business problems) and less …

Guidepost - Getting to Production

We’ve always prioritized getting to production frequently. Lots of goodness flows from shipping early and often. The problems associated with shipping too frequently are so much easier to fix than the problems of shipping too infrequently. When releases are infrequent, there is a natural tendency to “shrink to fit …

Guidepost - How Long Should Software Last?

At each stage of the business, there is a correspondingly appropriate length of time you should plan for your code to last - the horizon of the software’s utility. In the very early stages of a start-up, code may only need to last a few days. “We’ll try it …

Guidepost - Scaling Principles

Distributed systems are hard. We should exhaust many options before the solution is “do something distributed”. This is also why we are fine creating services, but are not advocates of “micro services”. Similarly, in most cases we should exhaust vertical scaling before moving to horizontal. It’s almost always less …

Guidepost - Services & Monoliths

Monoliths are not inherently problematic. Perhaps they are even good! Close coupling is the evil to avoid. With good design, monoliths can avoid tight coupling. Services can also be a valuable tool for achieving this. But the purpose of decreasing coupling is to decrease overall complexity. Therefore a service that …

Guidepost - Technology & Language Selection

There is value in consistency, and fungibility (e.g. the extent to which a developer can work on multiple projects). There’s value in better bus factors. Therefore, there is a high bar for selecting a new technology that the team doesn’t know. At some level, programming languages are …

Guidepost - Testing

The primary value of great tests is that it allows developers (especially those who didn’t write the original code!) to refactor. With tests at your back, you can refactor with confidence. Without the ability to refactor, our velocity will slowly decrease to zero. We love automated testing. If you …

Adventures in Candy Land

I play Candy Land occasionally with my two boys (the six year old gets it much more than the three year old). It has the strange property of involving both zero skill and zero agency. There are absolutely no decisions for the player to make at any point; the outcome …

Explorations in The Card Game SET®

SET is a classic pattern-matching card game that's been around since the 1970s, but really took off in the 90s. It hits all the right marks for a great game casual game; easy to learn, works for any number of players, you can play for 5 minutes or for hours …

A Simple Trending Products Recommendation Engine in Python

Our product recommendations were boring. I knew that because our customers told us. When surveyed, the #1 thing they wanted from us was better product discovery. And looking at the analytics data, I could see customers clicking through page after page of recommendations, looking for something new to buy. We …

How to Buy Expensive Software Part 1: Vendors & Demos

Some days it seems like all I'm good for is buying other companies' software. It's a little ridiculous. I get 5-10 emails a day pitching some SaaS solution. You probably get them too. Recognize any of these subject lines? Christopher, do you have 15 minutes to connect about my previous …

Photography & Journalism with Darcy Padilla & Julian Cox - Opening Remarks

On November 17th, I chaired an event at the de Young Museum related to the opening of the exhibit Danny Lyon: Message to the Future . It's there through April 30th, 2017 and I encourage anyone in San Francisco during its run to see it. Danny Lyon is a remarkable photographer …

Actually Understanding Timezones in PostgreSQL

Timezones are the worst. We should all just live in UTC, reasonable sunset hours be damned. And learning about timezone implementation details is incredibly boring and esoteric 1 , so most developers are not inclined to figure out what the hell is actually going on until they really need to. Like …

Eight Surprises During My First Year as a Father

I have a 13-month-old son named Dashiell (pronounced Dash-uhl, and I'm sorry in advance to schoolage Dashiell, whose teachers will all say "Dah-sheel?" on his first day). He's awesome. I mean...I'm not super objective, but even so, he's definitely a good dude. We're going to keep him. Most of …

Zero Downtime Rebrand

Noah Smith and I gave this presentation at the San Francisco Django meetup in March of 2016, shortly after we rebranded ePantry to Grove Collaborative. Here's how we pulled it off. Welcome folks! That's us We rebranded on March 8, 2016. Grove is an aspiration brand that speaks to our …

The First Thing I Tell New Engineers

The first thing I tell junior programmers is: keep going . If you've been programming a while, you know that feeling of encountering a new project, with a new stack, in a new language. The feeling is: OK. And you roll up your sleeves and get to work. But do you …

Software at Companies that Don't Sell Software

If you're a software professional, there are two types of companies you might work for; those whose products are fundamentally software (they make money directly from technology), and those that make their money some other way, but rely on software. Let's call the first Type A, and the second Type …

Trello vs. Asana

In two totally different companies over the past 4 years, across different personalities, teams, and processes, I've seen Asana rejected no fewer than a dozen times in favor of Trello, in spite of multiple executive mandates to use Asana. In both companies, management (of which I am a part) made …

Pushing Bits with Python

When was the last time you needed to directly manipulate a bunch of binary data? Most engineers run across it only in the context of bit flags and masks in C++ or Java. It's a little rarer to muck about with direct binary file data. It's nonetheless quite a bit …

A Simple Content-Based Recommendation Engine in Python

Let's pretend we need to build a recommendation engine for an eCommerce web site. There are basically two approaches you can take: content-based and collaborative-filtering. We'll look at some pros and cons of each approach, and then we'll dig into a simple implementation (ready for deployment on Heroku!) of a …

How Celery Chord Synchronization Works

Celery is a powerful tool for managing asynchronous tasks in Python. The basic model is synchronous Python code pushes a task (in the form of a serialized message) into a message queue (the Celery "broker", which can be a variety of technologies - Redis, RabbitMQ, Memcached, or even a database), and …

Refactoring for Testability: A Real World Example in Python/Django

At ePantry , we strive to have enough automated test coverage that we can deploy with confidence, without being dogmatic about our approach. We certainly aren't a TDD shop, and we don't have rules about code coverage metrics ("no commit can reduce code coverage!"), but it's very unusual that a non-cosmetic …

The No-Frills Guide to PGP on OS X

Want to get started using PGP on your Mac, but confused by the morass of professor-doctor style sites with seemingly out-of-date software and plugins? Have no fear! I'll have you up and running in minutes with this handy guide. You'll learn how to use public key servers and how to …

Form Over Function & The New iPhone

I probably found this more profound than it really is, but Matt Buchanan said it well in the New Yorker, regarding the latest iPhone announcements: Fundamental technology, like manufacturing processes for processors and imaging sensors and displays, have evolved to the point that the basic shape and sense of a …

Declarative Approach to Nesting Backbone Models

Backbone doesn't have great (any?) support for nested models. Here's my approach. I think it's kind of fun (we get to write recursive functions!), and hopefully useful. I'll report back when I've lived with it for a bit longer. Here's the problem: We have a Backbone model with attributes that …

How to Write a Bug Report

Writing good bug reports is the difference between actually seeing your bug get fixed and sending protracted emails over the course of a week convincing a developer that there is, in fact, a bug. By far the most important information you can provide in a bug report are clear reproduction …

Changing Our Development Process

This is a post about change management at a start-up. Kaggle, at just under 20 people, is an interesting size because we are right on the cusp of being able to wing it in terms of process and communication, and needing more formal processes to make sure changes and plans …

Getting Started with Pandas - Predicting SAT Scores for New York City Schools

An Introduction to Pandas This tutorial will get you started with Pandas - a data analysis library for Python that is great for data preparation, joining, and ultimately generating well-formed, tabular data that's easy to use in a variety of visualization tools or (as we will see here) machine learning applications …

Entering Kaggle Competitions with Google Predict

BigML had a great series of posts over the summer pitting some prediction-as-a-service products against each other. One of those was the Google Predict API . I thought it might be fun to enter a Kaggle competition using the API and see how it did against some of the world's top …

Extensible, Single-Line Fizzbuzz in a Tweet

Yep, it's a fizzbuzz blog post! I can hardly believe I've gone this long without ever doing one. I was thinking about hiring and what I would do if someone asked me fizzbuzz, and I think I would have used it as an opportunity to show off some engineering practices …

Rapidly Saving .jpgs in Photoshop

Cliffs notes : Now, whenever I hit F2 in Photoshop, I get a high quality jpg of my file saved to the same directory. No more "File->Save As" nonsense every time I want a static version of the image. What/how/why: I was working on some product mock-ups this …

Engineering Practices in Data Science

Josh Wills wrote this excellent, pithy definition of a data scientist: Data Scientists (n.): Person who is better at statistics than any software engineer and better at software engineering than any statistician. It's certainly true that software engineering and data science are two different disciplines, and for good reason - they …

Getting Started With Python for Data Science

As the product manager at Kaggle I'm fortunate enough to hang around with some of the world's top machine learning experts. And working at a place that specializes in running predictive modelling competitions means that I inevitably got the itch to learn some of this stuff myself. I don't have …

Tale of the Tape (The Indentation Apocalypse)

BRUCE "Emacs" BUFFER: : Now entering the Kill Ring in the blue trunks, with a reach of approximately three-quarters of an inch, hailing from the 9th spot in the ASCII table, it's TAAAABBBBBB! BRUCE "Emacs" BUFFER : In the opposite corner, wearing white, you know him well, don't-call-him-32-he-prefers-hexidecimal-number-20...it's SPAAACCEEEEEE! COMMENTATOR 1 …

Four Fun Facts From Big Data

The credit card industry's term of art for false positives in fraud detection is "insult rate". If you've ever swiped your card at a shop and had it declined, you understand why. A large auto insurance company has discovered that if a household owns two identical cars (same make, same …

A Very Painful Bug

I'll lead off this post by listing all of the various things I thought might have caused this bug, and related phrases that I Googled in the hopes that it will lead some poor soul chasing the same issue to this post, thus shaving 2-3 points off that person's long-term …

Juggernaut in Windows

Note : This is an old post, and no longer relevant as Juggernaut is no longer a thing. Just use socket.io directly. I've fallen in love with Juggernaut . Juggernaut gives you a realtime connection between your servers and client browsers. You can literally push data to clients using your web …

Communicating Performance Thresholds

I think visually, so here's a way I like to communicate performance thresholds. There are a bunch of dimensions that might make an application behave differently. Test against those dimensions and plot the thresholds of each one. Here are some that I made up, for a theoretical application. The goal …

Building Software and Building Bridges

We have a problem. People can't get from one area of town to a neighboring area because there is a river in between and no road. So let's build a bridge. Step 1: Requirements We'll get detailed requirements from civil engineers and government officials, including environmental constraints, safety guidelines, traffic …

No Bugs != Quality

A low bug count is not a good indicator of quality software. Lack of typos and grammatical errors is not indicative of a quality book. If your software has nagging "quality problems", driving the open bug count to zero probably won't be much help (not least because it only addresses …

Localization (or: Localisation) Tip

I just learned something from our documentation team: Try to avoid using gerunds in UI text because they are difficult to localize & translate. While they certainly aren't a challenge for great translators, I'm told they can be misinterpreted by mediocre translators - like the ones that outsourced translating services might use …

How to Improve Chrome Web App Adoption

There was big news in the browser world this month, as Google's Chrome browser eclipsed Firefox's market share , making is the #2 most popular browser in the world. Google's goals with regard to Chrome have always been clear. As Peter Kasting, a founding member of the Chrome team at Google …

DOET Shower

I stayed at a friend's apartment a few weeks ago. It is difficult to describe the decor, but if my grandmother and Master P were forced to collaboratively design an apartment, his place is what you might get. Walls covered in paint made from melted silver, gold dragon faucet heads …