Abort() Considered Harmful

Aug 28, 2020
Consider a function like the following within the context of a RESTful API handling a request such as POST /resource-a. def make_resource_a(resource_a_request): # assume this client does no error handling of its own response = http_client.post( url="https://some-other-service.domain.com", body=json.dumps(resource_a_request) ) resource_a = serialize_resource_a(response) return resource_a For better or worse, synchronous RPC calls like this over HTTP are a fairly common thing to encounter, and anyone who’s worked with anything similar will know that there are quite a few things that can go wrong in this function. (read more)

Tuning uWSGI, or: Why So Slow?

Dec 5, 2019
Linode’s public API has seen steady growth in traffic as we cut away from legacy management options over to new ones that leverage the API. Earlier this year, we made a change that improved performance immensely. I detail the change, and how it was discovered, below. As traffic increased, we began to occasionally hit a critical threshold where service degradation occurred. The primary symptom was higher response times. The service had hit the same limit before, and the approach taken then was simply to scale horizontally (add more boxes. (read more)

Machine Lawyers

Nov 17, 2019
I recently read a series of articles by Erik Dietrich critiquing the trend of describing software engineering as a trade, or craft. At risk of oversummarizing and misconstruing, the gist was that this trend misunderstands the nature of software work as “knowledge work,” as opposed to “skilled labor” like pipe-fitting, which can be accounted for and estimated at a greater degree of precision and accuracy. While I don’t really agree with the argument, the conclusion is well taken. (read more)