Skip to main content Blog Drone

books ==> Software

  1. How To Build a Social Network

    Read The Book Here

    Hi! This is a little microproject I want to do: I want to compress my years of experience building the API backend of a top-50 Steam game into a bunch of weird, rambling advice that I can deliver with all of the authority of someone who can’t differentiate success due to merit from success due to luck.


videos ==> Software




  1. I Built a Card Game Very Quickly with AI-Generated Art

    This is a time-lapse of me very quickly demonstrating the entire, end-to-end process, by putting together an 18-card expansion deck in just under 3 hours.

    2024 EDIT: I built this game in 2022, before cheap, low-effort, and morally questionable AI art generation tools became broadly available to all of humanity. I did it using python scripts and legitimate, public data-sets of verifiable provenance, and put a lot of additional effort into the output and layout of the cards - and I’ve made the output available for free. Please do not come at me with “AI is prima facie immoral” unless you’re willing to engage with this project on these terms.

    2023 EDIT: GOOD THING THAT THE WHOLE AI ART INDUSTRY DIDN’T CHANGE OVERNIGHT AND BECOME DRAMATICALLY EASIER FOR NON-TECHNICAL USERS TO INTERFACE WITH EXACTLY FIFTEEN MINUTES AFTER I FINISHED THIS PROJECT, OR I’D HAVE FELT LIKE A REAL SCHMUCK


  2. A Terrible Concert from a Confused, Glitchy AI

    This is an early build of a game engine was working on in 2020, designed to produce a procgen roguelike world.

    If you watch how badly the chess games go you can see that the distributed gameplay logic engine didn’t work so good. Distributed consistency is really hard you guys.

    Honestly the procgen music engine wasn’t… terrible. As procgen music engines go it’s… on the verge of listenable. If this were playing while I were wandering around in a forest for a long period of time I wouldn’t be TOO MAD.

    The goal was to create music that just ran forever in the background and never really drew attention to itself, which is kind of where it’s at.

    I put a lot of effort into this “taking model-generated MIDI, using heuristic rules to sort it and apply structure to it, then running it through a javascript in-browser synth” project, but not a year later models like Suno could generate full pop songs so this was basically obsolete before it ever launched.

    Honestly, watching it go and listening to it is kinda charming.

    Here’s another, later concert from a slightly later build:

    There’s a little special song at 13:50 that is one of the worst things the engine has ever composed.

    Whenever I played this for anybody who was at all interested in music they were actively mad at me for doing this to music.



articles ==> Software

  1. Hash Tuning

    Expensive hash functions are good for security but bad for your automated test framework.

    I build a new auth system about once a year.

    That’s a weird hobby, but, it’s, like, incidental to the actual hobby: I start a lot of projects using new technologies, and the first thing I have to figure out in these new technologies is always auth.

    And every time I do, after I’ve got most of auth working, I have to figure out why my test suite takes 500+ms to run per test, despite my using an all-local stack of generally pretty performant technologies - in fact, a lot of the time it feels like the more modern and performant my stack is, the slower all of these tests are.



  2. Please Stop Being Such Good Developers

    You are all massively overcomplicating what could be such a simple and pleasant thing.

    So, sometimes, in FooApplication, we need to extract some Nurble Data from the HTTP request, which is included as a base-64-encoded JSON blob in a cookie from the Nurble provider.


  3. generative captcha

    So, I decided, “how hard would it be to build my own CAPTCHA?”, but instead of showing people boring trains and crosswalks, I could generate the dumbest possible categories of things.





  4. Phoenix LiveView makes a Very Old Mistake

    I’m really enjoying learning about Elixir, and Phoenix. They constitute, in my opinion, an extremely thoughtfully designed language and framework. So far my biggest gripe about the language is that prominent library developers keep choosing names for their products and libraries that are not terribly Google-able. “Phoenix”? “Hex”? “Cowboy”?

    Anyways, Phoenix got really popular in 2017, at which point it seemingly dropped off of the face of the planet.

    I want to put that wholly at the feet of their pursuit of Phoenix LiveView, a stack so fundamentally cursed that it undoes almost every iota of goodwill earned from Phoenix or Elixir.


  5. Arrays With More than 18 Elements In Them are Dumb

    A decade ago, when I was working on, you know, procedural generation stuff, fresh out of University, I definitely felt like I’d need to spend some time putting together some serious tools for generating selections from a variety of probability distributions.

    At the time, I was building a “Mohammed Chang” generator - a random name generator that used census data to try to generate mathematically probable names. If I’m pulling names out of a hat, and I want to pick “Smith” more often than I pick “Schwarzchild’ - well, that’s a job for a weighted probability distribution.


notes ==> Software

  1. The Redemption of Our Lady XML

    I don’t hate XML as much as the rest of the world.

    one time I was working on a personal text animation library in Godot and I wanted to drive it with text

    I needed some way to mark that certain text had different properties, like, some text might move quickly, or slowly, or be bouncy, or have a rainbow effect applied to it

    and I was like “I wish there were some way to create a markup language for this”

    some kind of markup language that I could extend with my own parts

    XML isn’t great as a universal data serialization format, and it’s definitely quite bad as a programming language, but you know, as an extensible markup language it’s got legs

    i wonder if the people who designed it knew

    (ed: this is a repost of essentially exactly what I wrote the first time I discovered this)


  2. Project Management

    If you ever leave software developers alone for too long, they’ll attempt things they’ve been dreaming of for years like a “new version” or a “big refactor” and both of these things have an awful tendency to break a shit tonne of features and completely ruin the stability of production code, so if you have a developer who doesn’t have the very tired look in their eyes you need to get them an unrealistic deadline on an incredibly ill-defined feature, and fast

    most project management is just about keeping developers from ruining your product with their clever ideas

    you hear that? even now they’re whispering about rewriting your entire decade-old legacy codebase in Kotlin even though nobody on the team is familiar with Kotlin or even the JVM, and they think they can do it in less than 6 months because they’re software developers and thus haven’t developed any ability to comprehend the passage of time


  3. Bloat

    I’ve been on the internet for… the entirety of it, actually, and two unchanging constants are posts complaining that “kids these days are worse” and “computer programs are too bloated”.

    Posts going all the way back to Usenet complain that programmers these days are using too many resources, including too many features, wasting processor cycles and RAM and disk space that could have been used more efficiently by the kinds of trim, svelte programs that existed in the years prior when developers could deliver twice as many features on three transistors held together by a twig and some gum.

    Why, they finally proved that a computer could beat a human at chess in 1997 on a computer that’s a thousand times less powerful than a modern iPhone, and they got us to the moon with a bunch of computers that would’ve been put to shame by a TI-86+, and yet I still can’t have more than 38 youtube tabs open before my computer starts to get a little slow? I’m pretty sure the reason for this is exclusively programmer laziness and no other reasons.

    You know you can still run Wordstar and Lotus Notes, if you really want. Zero bloat. They run unbelievably fast, on account of being carefully optimized for computers that you still had to start with a hand-crank and a starter engine.

    It turns out that very few people actively prioritize “lack of features” when choosing which products to use. Most people are out there solving their problems using the first free tool that Google turned up and dealing with 18 layers of intrusive adware while attempting to dodge a $7/mo subscription payment for Frunglebunt Premium: Most of The Features You Actually Need, Good Luck Cancelling Your Account.

    Nothing about that business model incentivizes small, fast, optimized software.

    If you really, really want, there is absolutely a popular GitHub repo out there, half-maintained by one insane Rust developer who isn’t on speaking terms with the rest of his family:

    It will do everything that you need to accomplish, for free, unbelievably fast, it runs entirely on the command line. You can use it if you simply learn how to install a complex language toolchain and invoke it with a command that looks like xsprt -vrflbrfl --o --dongly-mode.

    It turns out, tools for professionals look a lot different from tools for consumers, and that is On Purpose and By Design.


  4. age verification

    apparently YouTube is testing out age verification, but I’m going to be really surprised and extremely disappointed if their AI flags me as potentially under the age of 18, on account of my Google account was created in 2006


  5. UIs

    the only kinds of UIs I make are plain, utilitarian, retro, and unfriendly



  6. reverse impostor syndrome

    it’s kind of the opposite of “impostor syndrome”, as I think of myself as a thoroughly boring person with a skill-set that’s essentially as common as “accountant” - like, it turns out that you can’t throw a rock without hitting a chubby nerd who’s good at computers and python and servers and stuff

    it’s not just because we’re absurdly common, it’s also because we’re super bad at dodging rocks

    “oh, you’re a python/javascript server developer who can also do a bit of Rust? oh you have a lot of opinions about databases? Okay, tell me about the video game you’re OBVIOUSLY developing in your spare time.”


  7. Meditation for Developers

    i’m going to sell an e-book called “meditation for developers” and inside it’s just gonna read “play balatro on the toilet then have a shower”


  8. Crypto makes me sad

    Crypto has been so predatory and actively evil that it actively killed my excitement for decentralized, democratized technology, although Mastodon has restored it somewhat


  9. threats

    you fucked up a perfectly good monkey is what you did

    I don’t have to imagine, I’ve even tried taken medication for that exact same problem before, what I don’t understand is why you’d WANT that


  10. When code reviews LGTM

    lgtm

    this might be one of my more controversial software opinions

    my bar for a code review is “do I understand approximately what this code is doing and how”, and that’s often enough to find one or two quibbles (‘hey this could have been named better" or “are you sure this part does what you think it does?”) but often it leads to the ol’ rubber stamp of justice

    honestly I think that senior devs who can’t let a single PR go by without at least one nitpick because otherwise they feel like they haven’t done their duty aren’t accomplishing as much as they think

    sometimes I would not do things the same way that that other person did

    and then I just chalk that up to “hey, everybody’s mind works a different way” and go about my day

    like, this is not to say I won’t intervene if something truly dangerous or ill-advised is happening, but, like, once a project has been chugging along for a little while with the same people, usually it gets increasingly clear when that is the case

    sometimes a PR comes in with “I’m pretty sure that this won’t break prod” and that one maybe deserves a little more of the fine-toothed comb

    note: if you’re working on avionics, medical software, people’s bank accounts, or are a nuclear engineer, definitely ignore me


  11. The Dream Syndicate

    okay, so, funny story, in the DeltaGreen TTRPG there’s a group of people called “The Dream Syndicate” with a fake website

    so I follow the link, I go to the website, and I think “whoa, this is INSANE, the language feels so CULTY, I love that they went to all of this trouble to build a fake online cult to match their description in the source book”

    and then I read about the Dream Syndicate in the source book and it doesn’t match at all

    this is just a real website?

    DREAM SYNDICATE

    modern american companies are way, way down the jim jones pipeline to fuckin’ cult city

    tell me your company doesn’t have a set of commandments (c.f. “values”) you’re supposed to live by and a holy mission


  12. A/B testing

    A B testing, which is where we show the UI to a bee, and if they fly towards it it’s cool


  13. WASM, offline first

    folks have been promising that offline-first or local-first development from the web browser is Just Around The Corner for almost as long as they’ve been promising that browser WASM is going to be The Next Big Thing and I feel like I’m going to get old and die before anybody makes a single real product like this


  14. skinner box

    in order to try and get people to deploy more often, we’re employing a random reward skinner box strategy

    22 micrograms of opiates have been shipped to your home or place of residence


  15. many years of experience

    I have been writing software professionally, and then also recreationally in my spare time, regularly, for over 20 years now

    I’m not bad at it by any measure, but it is weird how mediocre I feel given all that practice

    for every once-in-a-lifetime genius there’s at least a few hundred guys like me who are just, like, kinda okay at a thing I guess


  16. an in-client database

    about once every ten thousand years, the prophecy states a frontend developer will realize that they spend most of their time carefully using RPCs to curate a little miniature in-client database in order to keep their UI data up-to-date and sane,

    and, in an effort to solve this problem for themselves in perpetuity, end up nerd sniping themselves for multiple consecutive years on a synchronization or complex query solution to perma-solve this problem, like Meteor.js or GraphQL

    These solutions tend to be so powerful that they make simple applications like the well known Todo App seem almost magically trivial

    but the black-box, complex and highly bespoke nature of these solutions keeps them niche: RPC over HTTP is a well-understood model for a reason, it’s much harder to reason about access control or rate limiting in a Custom Sync Protocol made by Some Guy

    it’s even worse when, once every ten thousand years, a backend developer decides that they will refuse to learn Javascript and end up inventing some fabulously, wildly elaborate system to write everything in a unified environment

    like ASP.NET WebForms or Elixir’s Phoenix Live Views


  17. that's a problem for future me

    a hard thing, when coding, is when you get trapped in an intractable-feeling knot of not being able to work on Problem X until you make some progress on Problem Y, which you don’t want to tackle until you hit Problem Z, which is dependent on …

    in order to keep yourself sane and keep your change from getting way out of control, DO ONE THING AT A TIME. keep a list of future changes. stub out functionality that doesn’t exist yet.

    learn this powerful mantra: “that’s a problem for future me”

    sometimes, as future you, you have to go back and re-do something you did wrong: that’s okay

    it turns out going back and re-doing that thing is a thousand times easier than being stuck staring at a blank page trying to solve every problem at once


  18. stay out of CS

    If every CS undergraduate program in the world shut its doors tomorrow, in about ten years I, personally would be dramatically better off, so I’m not sure why people keep advancing this “AI will kill the junior developer pipeline” argument like it is a bad thing.

    the entities who need there to be lots of cheap software developers are companies, I’m not a company, I’m a guy

    “should I start a CS degree in this uncertain atmosphere”

    no!

    the only stable job is… all of the other jobs that aren’t programming

    you should do one of those instead

    also if everybody who’s currently making a video game in their spare time would stop, that would also be peachy

    i’m looking at you, EVERY SINGLE PERSON ON MASTODON


  19. canada's yikes software ecosystem

    woof, someone tried to compile a list of Canadian digital services and in the “replacements for cloud services like AWS” column they have, like, eight versions of “guy running a software consultancy out of his boat” and a bunch of companies that can not meaningfully compete with Hetzner

    I’m pretty patriotic but I’m not “hosting services in Canada” patriotic, I could just as easily shovel money into a fireplace

    i wouldn’t be surprised if Canada turned out to be the enterprise Java capital of the world and I want that to carry every centimeter of the derision I intend


  20. standing desk

    an expensive standing desk is a wonderful way to find out that you don’t like standing while you work


  21. wacky 90s fads

    Eradicating newspapers didn’t exactly create utopian outcomes the way we may have hoped, but nevertheless, print media newspapers and magazines can’t just keep on existing while all of their functionality lives on in a superior format.

    They’ve been going the way of renting tapes from the local Blockbuster for a while now.

    I don’t feel too bad for traditional print media or the postal service, they’ve had more than half of my entire life to figure out some kind of viable pivot.

    It’s funny, when I was a kid something like the internet and e-mail existed, but it was laboriously hand-created every day, manually, by legions of hard workers doing their best to get fresh content to your door every morning and deliver all of your messages by hand to anybody who you might want to talk to.

    News, movie reviews, weather updates, daily games, local updates, it was a surprisingly robust and varied offering, differentiated by the rest of written content by its relative speed and immediacy.

    Obviously the speed and immediacy of electronic transmission wins, right? once your average person has access to a powerful, comfortable to use internet-enabled device at all times, the only thing a newspaper can do that a modern computer can’t is act as a cheap wrapper for fish and chips.

    So what do we lose? Well, business models supporting creators of hyper-local content, for one. Not a lot of vloggers out there covering the municipal news beat. Also: news had a kind of journalistic code of ethics that the internet has not been able to replace, although I sometimes think that they get lionized more than they deserve - the code was more what you’d call guidelines than actual rules.


  22. 100% user supported

    Obsidian says that it’s “100% User Supported” which, when I think about it, isn’t a big claim, that’s also the case for Google and McDonalds


  23. latest #2

    only a couple of hours ago, GitHub, but it is super weird that you are keeping track


  24. worst month value

    had a weird ticket at work whose resolution was simply explaining that February has, in fact, 28 days1, meaning that if you happen to buy a month based subscription to anything, February is simply always going to be the month where you get the least bang for your buck


    1. usually ↩︎


  25. curse detection shibboleth

    “bejeweled pachinko sniggering scunthorpe specialist banana zipline tofu c. kickball”

    this one seemingly harmless phrase will get flagged by basically all naive systems



  26. the children arent alright

    just having the weirdest interactions in a r/webdev conversation where folks are pushing, reviewing, and merging pull requests in their own personal single-person repositories

    and I’m like “why would you do that?” and they’re like “well how else do you merge a branch” and I finally realize the mistake I’ve made


  27. you must use AI to be productive

    I get mad when I see people complain that all software tools just DULL YOUR WELL HONED DEVELOPER SENSES and everybody’s getting soft, but then I also get mad when I see people crow that people who don’t adopt every AI tool right away are going to be left in the dust.

    the solution turned out to be very simple: shut off twitter

    the problem isn’t either of these points of view, it’s an algorithm that prioritizes engagement showing me the worst version of any given argument to make me angry at it

    Tools can, in fact, make you faster. They can also make you sloppier, and more reliant on said tools.

    Every developer is responsible for finding their own happy, productive middle ground.

    This is as true for Copilot as it is for an IDE with an integrated debugger, or talking your code over with ChatGPT, or using npm libraries, or StackOverflow, or doing math with a calculator


  28. async traits in rust

    you know Godel’s Incompleteness Theorem? The idea that any consistent formal system is incapable of proving all truths?

    I think that I believe that something similar exists for formal type systems: for each of them there are concepts that are useful but inexpressible

    anyways Rust’s type system has conspired to make something that seems like it should be simple: async functions in object traits - seemingly impossible, and apparently this remains an unsolved probelm

    https://smallcultfollowing.com/babysteps/blog/2019/10/26/async-fn-in-traits-are-hard/

    Support for async fn in traits is probably the single most common feature request that I hear about. It’s also one of the more complex topics. So I thought it’d be nice to do a blog post kind of giving the “lay of the land” on that feature – what makes it complicated? What questions remain open?

    uh, suffice to say, the fine details of this intelligent strangers’ blog entry mostly go above my tiny peanut head and I just read “it’s stupendously difficult for a lot of complex type safety reasons, and there’s a macro that makes it possible using devil magic”

    In general, this seemingly benign idea: “i’m going to define my service interfaces as traits and then I can implement the backend using swappable services that each implement the trait”

    has felt like a bit of an uphill battle in Rustland


  29. bloat free

    whenever someone pitches some new hardware idea that’s “simple”, “powerful”, “optimized”, and “free from distractions” that means that they built something that doesn’t do shit and they’re hoping you won’t notice


  30. dev, prod

    work environments are divided into dev, prod, and stag

    • dev is the live one so named because that’s where we show off our feature dev-elopment to our customers
    • prod is a test environment where we prod at new features that aren’t ready yet
    • stag is a special build where all of the avatars are replaced with various deer

    for some reason new developers are confused by this but I think it’s entirely clear



  31. wormhole

    I needed to send a big file to another technically competent adult

    there are many ways to do this that I have access to, but I just tried a way I had never tried before, magic wormhole

    https://magic-wormhole.readthedocs.io/en/latest/

    It goes like this: I already have choco installed on my computer (very like brew for Mac Os)

    so I installed magic wormhole with a choco install magic-wormhole

    then, I found the file I wanted to send and set up a wormhole send file.zip

    Wormhole code is: 11-virginia-shamrock
    On the other computer, please run:
    
    wormhole receive 11-virginia-shamrock
    

    and the other computer installed wormhole, typed that in, and the file was transferred

    magic

    neat!


  32. mighty morphin monolith

    so, uh, VRChat’s backend is designed similar to this but instead of “Modular Monolith” I called it a “Mighty Morphin’ Monolith” which I think we can all agree is many times cooler


  33. coffee shops

    AWS has launched a coffee shop

    instead of paying for the whole cup, you pay for each component

    the beans are competitively priced for the industry, but they make it up on water and sugar

    also if you leave the cafe with your coffee in hand they charge you $130,000


    redis has launched a coffee shop

    from inside AWS’s coffee shop

    so you get the privilege of paying both AWS and redis for the same coffee

    although the recipe is just available online for free


    cloudflare has launched a coffee shop

    you can drink as much coffee as you want for ten dollars a month, which seems like a good deal, but if you start to depend on it they will find you and muscle you into paying tens of thousands of dollars a month

    for coffee


    datadog has launched a coffee shop

    i know about it because their “sales engineers” called my personal phone at 2am in the morning to tell me about it


    solarwinds bought one of my favorite coffee shops, which i hate, and now they’re constantly trying to sell me on more coffee from the other shops they bought


  34. SOLID design

    anybody trying to sell you something called “Liskov Substitution” is trying way too hard to force an acronym, and that round peg in a square hole is exactly the sort of design all too common in SOLID systems


    i spent a bunch of time learning how to make code SOLID and DRY and then I spent a bunch of time relearning how to make code WET and fluid



  35. javascript and mongo: good actually

    part of my job remains explaining to people that MongoDB and JavaScript are good, actually

    a thing that, after many years, I well and truly believe, now

    no, really! they’re good! there have been instances in the past of them not being good but they actually can be used to build very impressive services at scale!

    you have to learn to write MongoDB like you would Cassandra/Scylla/Dynamo a little bit, though

    the thing you lose going to Mongo from a SQL database is “joins”, but - if you’re building a system that needs to write-scale, you’re not going to be able to use joins anyways, joins won’t work across shards, so maybe you should be considering “only application side joins and as few of them as possible” from the get-go anyways

    of course, “building with scale in mind from the outset” is a bad strategy for most products because honestly: the chance any given product is going to NEED to scale that big is like 1/1000, most companies literally just need POSTGRES and then SQL already has decades of lore and understanding and tooling behind it

    use postgres, dummy

    but the fact that we started with Mongo and built with Mongo and now have a product that’s on Mongo is not a bad thing, and is, in fact, better than if we had a hugely interconnected SQL database that we had to try to unknot every time write performance against a table became a problem

    each individual Mongo collection is an utterly self-contained entity that can live on a completely different server, if necessary

    did you know you can just take a problem table and move it to its whole own cluster? it’s expensive but try and do that with something that has a load of joins pointed at it and you’ll discover why that’s not often a viable strategy in SQL land

    and you know what? Mongo’s schemaless, flexible design and easy post-hoc application of indexes to remedy slow queries? that creates a pretty buttery smooth experience to develop an experimental new product with.

    In lots of systems, you don’t need a load of joins anyways: do you really ACTUALLY have a lot of relationships or does everything just have the single back-link to a “userId”?

    In many cases, you have nested relationships, like a TodoGroup filled with Todos, but

    wait a minute, that can just be a nested object, sharded by userId.

    As for JavaScript, most of the haters are hating on the JavaScript of 2004 and a couple of NaN memes they saw once. Digging in nowadays, JS is, IMO, equivalent in its power and expressiveness to Python, but with a much clearer model for cooperative multitasking. Not a lot of folks out there hating on Python.

    “Oh, template based inheritance is bad” yeah, well, so are deeply nested inheritance hierarchies which are basically impossible to build in JS thanks to its comparatively slim object model.

    I will say that I’m not in love with TypeScript: if you want strict, static typing there are languages that do it way, way better, why not just use one of those? C#, or Rust, or Kotlin, or hell, just admit you’re a Java developer.


  36. Cooking Vacation

    there needs to be an alternative to vacation called “quiet i’m cooking” where you take an at work vacation from meetings and other human interactions and actually get some shit done

    “where’s greg?”

    “oh, he’s on cooking vacation, he’s here but you’re not allowed to talk to him”

    i don’t like software developers making it out to be like they’re soft, prima donna miracle workers who can’t accomplish anything unless they have days of uninterrupted quiet and peace to focus on their masterpiece

    unless it’s me, I want that


  37. SaaS Rep

    hey, I’m your new account rep at SaaS company

    I notice you’re using our product, could we meet to chat about how you’re using it and determine if you could be spending more money? my business is relationships, specifically very irritating ones

    perhaps you’ve noticed that I’ve called you on a personal number

    how did I find this number? immaterial


  38. Double Jeopardy

    In one year of university, I had a compilers course and a sound course and I had to do a project in both, so for both classes I handed in a sound compiler that converted a musical language into audio.

    It wasn’t a perfect example of what either class was looking for, but doing one project and getting a B in both classes meets a very different and very personal measure of success.

    Some professors warned me that “reusing the same assignment” might qualify as academic dishonesty, but that seems like nonsense to me: presumably those professors don’t create a new syllabus and new assignments from scratch every semester.



  39. Cost Estimation

    one of the big things you’re going to have to get good at on the journey up the software development ladder is answering the questions of “how much will it cost” and “how long will it take” and honestly I see a lot of junior developers fall into the trap that accurately answering these questions is literally impossible

    if you can back-of-the-envelope this stuff and get it even remotely in the right ballpark that is fine, just give them something

    look, kid, I KNOW that all software development is custom and all custom work is unpredictable, that’s like the first thing we all learn, just give the blazers-and-golden-retrievers a dang t-shirt size for that login screen and we’ll figure it out as we go

    the accuracy of the cost estimate needs to be, like, within an order of magnitude, if you can even get the number of zeroes right you’re golden, just find a little bit of real data and extrapolate a bit


  40. 256

    there is more than one place in VRChat’s backend where I set an arbitrary limit to a power-of-two because even though it’s arbitrary, if I set it to that, people will assume it’s for an important technical reason

    modern devices basically never actually have a limit of 256 for anything I think it’s mostly just programmer habit at this point


  41. if you can't measure it

    I often see the quote “if you can’t measure it, you can’t manage it”, which is catchy enough to have a lively life of its own

    But the full quote is “It is wrong to suppose that if you can’t measure it, you can’t manage it – a costly myth.”

    It’s one of the worst frequent misquotes because the misquote literally inverts the meaning, it’s like if I said “don’t light children on fire” and someone were to quote me as having said “light children on fire”, which is technically true, I guess, but it’s not what I meant.

    “light children on fire”

    Cube Drone


  42. friday deploys

    I’m going to go against the common wisdom on this one. If you aren’t confident enough to push to production on Friday, you aren’t confident enough to push to production, period. Invest in your rollback and monitoring and staged rollout tech until you don’t lose 20% of your week.


  43. amirite

    more like clownstrike amirite?

    (satisfied, he walks away from his keyboard, another day defeated)


  44. Security Fail

    look, one of these is legitimately so much more secure than using the same password for everything

    it means that somebody who invades your home can steal your identity, but with one password for everything, someone can steal your identity if they break any of the sites you’ve ever visited.

    of course it’s best to have 2FA and a password manager, but decades of insistence and my family still is committed to just the most dogshit passwords, real “Password123” level stuff


  45. iOS Devil Magic

    I’m a software developer, right? I know how to build a lot of things.

    But if someone said “we want photos that automatically crop into foreground and background so that we can display elements in between those layers” I’d say “no, that’s too hard”.

    Is it using the depth sensor, or AI auto-cropping, or both? WHAT DEVILRY IS THIS



  46. unix time

    I learned about how unix time works in early University, ‘round 2007, which would be 17 years ago

    Unix time ends, 19 January 2038, 14 years from now

    so I’m officially past the point where I’m closer to the end of Unix time than I am to the point where I learned what unix time was

    we’re only 14 years away from the end of time as we know it

    by then, it probably won’t matter, but I still plan to hold a real party for the end of time


    basically any computers and any software - post 2005 - are going to be immune to the 2038 problem

    which means that most governments and banks are completely screwed


  47. FOSS is not a business model

    I saw someone on Mastodon pillorying someone’s little personal code project for not being FOSS

    ok, random stranger, I’m subtweeting you

    seventeen people in all of history have ever made a profit from FOSS software, indies have it hard enough already, don’t try to get them to release their source code just because you think it will probably work out for them

    every FOSS monetization model:

    • begging strangers for money, hoping for the best
    • run it as a SAAS
    • large, expensive enterprise support packages

    the first one produces vanishingly low returns and the last two don’t usually work for games and have you getting run out of business by Amazon


  48. mastodon rate limiting

    sometimes I get rate limited by Mastodon, while using the Mastodon client normally, from a single tab, which strikes me as a bit odd

    on account of… you know, Mastodon, you’re the one doing this


  49. corporate beat poetry

    Following up

    with the mental model

    of validating solutions

    aligned autonomy

    while tailoring

    our frameworks’ approach

    to specific flows

    out of these perspectives

    we’ve gathered a lot

    of great feedback

    for planning and executing

    roll-out team objectives

    baking that in

    to a new process

    to address pain points

    we’ve identified

    including barriers

    to ideation,

    focus,

    and synergies,

    while preserving

    our best chance to succeed

    with a new team-level


    product strategy documentation phase

    to clearly align

    the team’s strategy

    to the overall company strategy

    creating a big improvement

    over last half

    a cross discipline

    planning leads team

    will create a more inclusive experience

    across the board

    we’re really stretched

    so we can go deep

    utilizing impact analysis

    planning cycles

    detailed planning leads

    across four distinct phases

    utilizing context

    to jump in

    to high level completion

    of the company strategy phase


    the output of which

    was the phase priorities

    which we’ll walk into

    with the OKR setting phase

    for lightweight half-planning

    strategy buffered feedback week phase

    then, again,

    we’ll have the monthly

    company objectives

    to deliver a “golden goose”

    “star retention” using

    the team strategy doc

    which I’ll share out

    after this presentation,

    investment in targets

    and goals

    that will have value

    for the business,

    delineating an exciting change


  50. data scientists have a lot to answer for

    database, ok

    data warehouse… ok

    data mart… ok

    data stream? … ok

    data pipeline? … ok

    data… lake? …. ok

    data K-mart? … prices & values

    data lakehouse? … no, this is starting to get concerning, you’re crossing the analogies

    data beachhouse? … where did you say you were taking our data again?



  51. quiet is nice

    When I was in my 20s I’d see an article about how a programmer’s focus and flow is a PRECIOUS AND UNIQUE GEM THAT MUST BE PROTECTED AT ALL COSTS and think “yes, it is, I agree”

    and now, older, I think that we have had it too good for too long and are used to being treated like pampered babies, yes, we must be exempt from meetings and distractions in a perfect sea of quiet or the golden goose will not lay its programming eggs

    … but I’m still happier when it’s quiet and I don’t have meetings

    I don’t think it’s WRONG that programming is best done in quiet, uninterrupted, focused stretches, that’s actually kinda self-evident

    but I also think that demanding these stretches can seem petty and arrogant, as if programming is the only discipline that benefits from focus and quiet and reflection.

    Maybe, just maybe, every creative role benefits from focus and quiet and reflection, and only software developers have been privileged enough to be able to demand it.


  52. build

    today in work:

    a build with “build” in the name of the build will build, but it won’t deploy because when we build it, it includes “build” in the name of the completed build

    but when we try to deploy it, it decides that “build” is the cut-off point for the name of the build, but it uses the “build” in the name of the build rather than the “build” added by a completed build: as a result it can’t find the correct build

    in conclusion: build


  53. feedback

    sometimes it’s hard to reconcile my belief that Software Development Isn’t That Hard And Just About Anybody Who Seems Smart Could Probably Do My Job

    with providing useful feedback during the interview phase


  54. coffee shop working

    I can’t stand working in coffee shops.

    It’s loud, people are having conversations all around you. Not enough screen space. Laptop keyboard.

    You can’t leave your “office” unattended to use the bathroom unless you want it to wander away. I have better coffee beans at home.

    I think that people have over-romanticized working in coffee shops, it actually sucks.


  55. stackoverflow harvest

    I answered one question on Stack Overflow, one time, a decade ago

    but their algorithm is so good at entrenching answers that my worthless point harvest is bountiful, e’ry season



  56. widget

    Okay, tech vocabulary time:

    A “Widget” is any UI element.

    The way to develop a widget it to sit down, uncomfortably: this will give you a Widgey.

    Then, develop functionality by training that Widgey - that should evolve your prototype to a Widgeotto.

    Once you’ve got to there, it’s not long before you’ve got a fully evolved Widgeot, at which point your app will really be Flying.


  57. go

    i’ma say it, now that I can program in Rust, I can’t imagine a scenario in which I would want to program in Go


  58. forgetful

    fontawesome picks for forgetful user flows come in varying levels of cruelty


    writing “password reset” is always one of those things that’s way trickier than you think it’s going to be

    it’s a form, that triggers an email, that triggers another form, I think it’s one of the most complicated components of an auth system

    unlike registration and log in, though, you rarely have to return to it once it’s set up, though



  59. helltime oscillatrix

    there’s a DORA metric associated with how fast you can recover from a prod outage which is why, in order to game the system, I have created the “helltime oscillatrix” which breaks prod over 100,000 times per second, once a month


  60. c-lovers

    so, I regret to inform you that the “C-Lovers” is not a tech meet-up, in fact, they are a local fish & chip shop

    actually

    i don’t regret to inform you that

    these fish and chips are delicious


  61. spite tow

    the tow capacity of a Miata is a sternly worded note in the manual saying “no”

    “do not do this, it is an extremely bad idea”

    of course, most folks on the internet perceive that as a challenge which is why there are loads of pictures of Miatas towing things, presumably out of spite


    This might be one of my more controversial opinions, but…

    JavaScript doesn’t benefit much from having a whole-ass type system bolted on a la TypeScript. It’s like attaching a tow-ball hitch to a Miata: just adding the capability doesn’t make it practical to use. JavaScript is not the right environment for type safety.

    If you want byzantine type safety, just program in a language that was designed from the ground up with byzantine type safety in mind, like Rust, or C#, or Scala.


  62. terraform aint easy

    There was a recent Reddit post where a DevOps employee lost their shit because their co-workers weren’t getting on board immediately with their Terraform repo, and

    I’m gonna say it: despite ClickOps’ many problems, Terraform has a bad UI and ClickOps has a good UI, getting people who are used to being able to do things with a few clicks to read a stack of manuals is going to be a challenge, especially if those people have “other things to do with their time”.

    Having an organization where everybody makes changes to infrastructure with PRs and a papertrail seems like it’s obviously gonna be better but affecting that particular change by simply creating the repo isn’t gonna do it.

    You’re gonna have to make the Terraform repo the ONLY way to change infra, and for a good while you’re gonna have to deal with going from an org where everybody can make changes to an org where everything is backed up by only one person knowing Terraform.

    Like, don’t confuse this for me saying “infrastructure as code is bad”, it’s good, and for any org with more than a handful of people making cloud changes it’s gonna be obviously better, but the effort to switch over to Terraform, which is hard, from ClickOps, which is easy, is significant.


  63. the CBC, everybody

    recently I saw someone circulating a petition requesting that the Canadian government use public funds to provide a mastodon server for all Canadians

    in something of a rebuttal, I would like to note that the portal that every single Canadian needs access to for crucial tax information is down for the entire weekend for one of it’s regular nappy naps, and this is one of the government’s more modern and prominent public digital projects

    now if someone were to write a version of Mastodon that ran entirely on IBM servers that haven’t been manufactured since 1997, that would be a whole different ball game

    behold, the comments section at the CBC:

    please, for the love of god, do not let the Canadian government anywhere near your technology


  64. software conferences

    the thing I like about javascript conferences is that they only have one room for talks but they just get whoever’s on the mic at any given time to hand it over when they need time to set something up, so you can quickly catch loads of talks so long as you don’t mind that they’re in kind of a jumbled order

    the thing I like about C conferences is that if you find the end of a line and stand two spaces behind it, the building will explode

    the thing I like about Erlang conferences is that if anything goes wrong in one of the rooms, everyone will just leave, get back into the room, and pretend like nothing happened

    i can’t remember what I liked about memcached conferences because there was a power outage

    the thing I like about rust conferences is that they’re a huge amount of effort to set up but once they do they run really smoothly

    the thing I like about PHP conferences is that they’re easy for anybody to set up and that it’s really hard to predict what will happen at them, which is also a thing that a lot of people do not like about PHP conferences

    the thing I like about Go conferences is that they’re exactly like C conferences, but with a guy who comes around and collects the garbage every now and again

    the thing I like about Postgres conferences is the consistency, but they only ever throw the one and honestly if they can’t find a bigger venue they’re going to start running out of space

    i’m not such a big fan of AWS conferences, they seem reasonably priced at first but then you wander from one region to another and suddenly you owe them fourty eight thousand dollars

    i’ve never managed to get in to a RabbitMQ conference but I’ve had a great time just waiting in line for one

    I wasn’t sure which mastodon conference to attend, there were so many and most of them seemed like they were run by amateurs, so I just went to the biggest one

    the thing I like about lisp conferences is that there aren’t a lot of standards or guidelines for them so each of the big ones just kind of makes up its own rules

    the thing I like about retro emulation conferences is that you go into a huge, modern conference hall and they’ve set up a perfect recreation of a conference from 1993 in there, all the way down to the carpeting

    the thing I like about roguelike conferences is that if you miss a talk you just have to leave

    the thing I like about VC-funded conferences is how fun they are in the first few years, before they inevitably need to justify their massive investment and start to get weird

    the thing I like about C# conferences is how much they improved over Java conferences, which they were clearly modeled after, but honestly I haven’t seen or thought about either in years and I think I’m a lot happier for it

    the thing I like about scrum conferences is that they’ve clearly never put any more than two weeks worth of effort into planning them so they’re always just all over the place

    (I would, of course, refuse to attend any scrum conference that took more than 2 weeks to plan: that would just be a waterfall conference and who wants to go to one of those?)

    I attended a pure functional programming conference and as a result I changed my mind about functional programming, which , when I think about it, means it can’t have been a pure functional programming conference after all.

    The thing I like about quantum computing conferences is that they’re run in a lot of different states at the same time

    The thing I liked about AI conferences in the 80s were that you could set your booth up in a part of the conference hall that nobody could get to, and, in doing so, bring the entire convention to a halt.



  65. hash DoS

    remember, kids: any service responsible enough to hash passwords with a lengthy and expensive to calculate crypto function is also a service you can probably bring down by finding a way to trigger that crypto function’s execution tens of thousands of times in a row


  66. rust result

    me: Result is acting strange, it has different behavior in this example than in my code

    r/rust: which Result were you using?

    me: what do you mean, which Result?


  67. env vars

    database products that don’t allow you to set the username and password from environment variables, I wish you a very WHY ARE YOU LIKE THIS

    please, i need this for my setup pipeline to be smooth


  68. WFH

    Former Amazon VP Ben Smith on admitting he was wrong to push for workers to return to the office several days a week: “As someone once asked me, ‘Have you ever noticed the only people in favor of RTO are people with large admin staffs and grown children?’ I had not, because that was me. Touche.”

    Working from “home” - A mea culpa.



  69. correction

    I’d like to correct a previous post, I am told by numerous technical colleagues that this is not, in fact, Kubernetes


    Oh, you’d rather work from home?

    What if I were to tell you that we’ve installed cry-pods at work so that you can cry without disturbing your co-workers?


  70. go v. rust

    one of the significant barriers I have to learning Go is just how mad it makes me

    I love all languages equally.

    mutable slices? string length determined by raw byte count of the UTF-8? pointers to mutable data as arguments?

    i’m sorry, are you from the past?

    Go’s whole community seems to have unified around a convention of single-letter variable names which is as infuriating as it is simply wrong, and the dank ass Unix wizard responsible should be retired for it.

    I don’t care if your hands are falling off your body and you’re still using vi, typing the rest of the word is STILL non negotiable

    you ever try to grep the letter “l”?

    you don’t need to write a whole essay but you’re not even bothering with the word

    anyways: here’s what I think about that, in a language even you fucking Go nerds can understand: y c g f y

    words are free my good bitch

    look at me, I’m using a code editor written in 1974 so I can’t simply autocomplete any variable name by pressing tab

    look at me, I think that writing code is more important than reading it

    Now Rust - Rust is a thing of beauty.

    I’m angry at myself, for being too stupid to think seven-dimensionally enough to be able to code in Rust. Oh, the type of that code is a Maybe[Future[Async[Wrapper[Arc[Reactor[Core]]]]] and you needed a Future[Async[Arc[Wrapper]]]]? Guess you’re fucked.

    But with Go, I’m angry at the language, just for having the sheer gall to just be C with a rubber mask on.

    Learning Rust is like learning Haskell, or, like, Esperanto, it’s a mind-expanding paradigm that’s endlessly frustrating because you’re learning how to operate in a new, fae universe where the rules are as alien as they are unbreakable, and while you respect its beauty and power, you literally can’t do anything because you need to spend 6 more Lifetimes learning about how Hindley-Miller type systems apply to memory management.

    Whereas learning Go is more like driving a manual transmission to the Staples so that you can send a fax to your doctor. You just spend the whole time going “fuck, it’s 2023, I can’t believe I still have to do this shit.”

    Note

    can you tell I’m a python/javascript developer

    LOOK, I’M FROM A SOFT UNIVERSE WHERE I CAN REPRESENT LITERALLY EVERYTHING IN MY LIFE AS TRANSFORMATIONS ON A LIST OF STRINGS

    just wanna emphasize that one time I spent a whole afternoon reading about how one might attempt to build a linked list in Rust and I still don’t understand how to build a linked list in Rust

    somebody wrote an entire book about how to write a Linked List in Rust

    the memory safety aspect makes it slightly more complicated than building something trivial and dumb like a working nuclear reactor or an entire commercial jet

    Editor’s Note: years later, I finally learned enough Rust to be dangerous and it is one of my favorite languages. On the other hand, this blog is running on Hugo (Go) and when I realized that Go HTML templates use, essentially, postfix notation, I got so mad I threw my mug at my computer screen.


  71. tv head

    “Why do you love TV-headed avatars so much?”

    well, one of them taught me how to program in 1994

    HI, I'M YOUR COLOR COMPUTER


  72. apple

    Remember when Microsoft got a stern talking to from the government for having the audacity to include their applications bundled in their OS, and then anti-trust law got its anus torn clear out and Apple just made an OS that you’re not allowed to program for at all unless you run it by Apple first



  73. systemD

    a lot of people in the linux ecosystem are mad about systemd but I don’t see what’s not to like about an anime where people race cool toyotas





  74. simon SES

    SES is an interface that really shows off Amazon’s talent for simple, clear, practical API design - for example, if you want to send an email there’s only 71 quick, easy functions to learn:


  75. XML

    When I’m looking at the problem, specifically, of scripting video-game style dialogue, the thing I’m looking to work with is a language that allows me to mark up text.

    In fact, if I could mark up the text in a way that’s extensible - with all of my weird text animations and sound effects and mood modifiers and special effects - that’d be great.

    None of these formats seem to do the trick YAML isn’t really a markup language at all, it’s an object serialization language, same with JSON.

    Why, this calls for an… extensible markup language.

    I wish someone had made something like that.


  76. chess

    I can build a program that can beat me at chess.

    And let me tell you, it’s not because I’m good at chess.

    I’m not even that good at programming.


  77. motivation

    A lot of my family work in supervisory roles, and when I talk to them about the difficulties of working with other people our problems are very different: they need to keep people motivated to work.

    I rarely work with people who need to be motivated. Most of the people in my last few jobs have brought loads of their own motivation. If anything, they need to be calmed down and reminded to take their vacation days.

    “Please do not build this from scratch: a solution already exists.”

    Carl Sagan famously said

    “If you wish to make an apple pie from scratch, you must first invent the universe”

    — and I’ve met countless software developers (myself included) who would respond to that quote by rolling up their sleeves and going “welp.”

    I use a term to justify building things that don’t need to be built: joy-driven development.

    Sometimes, especially if you’re trying to manage your own flagging motivation, you can do things your own way because that makes it… more fun. It improves your sense of ownership over the product. It’s what differentiates craftsmanship from good engineering. Sure, the custom solution is not as flexible or well understood as the existing one, but…

    A lot of becoming a senior developer is developing better instincts about where projects can and should fall on the DIY to NIH spectrum. I’m still way too gung-ho about building my own solutions for things.



  78. load bearing poster

    I use the term “load bearing poster” all the time when describing legacy code - it means “that’s very obviously kinda bad but it’s also kinda best not to poke it unless you’re feeling brave”.



  79. choosing saas providers

    basically my theory of ops tooling is that if you’re a small team without a dedicated specialist, it needs to be rock solid and dirt simple, and SaaS providers get you there a lot faster than DIY



  80. typescript

    the way I feel about typescript is the way I’d feel if someone popularized adding gendered nouns to english to make it feel more like a romance language