I've been thinking a bit about the strange and evolving etiquette around phone calls. It used to be that you would just call someone if you wanted to talk to them, but that was in a time where real-time voice conversation was the only effective way to communicate outside of a physical meeting. These days we have all sorts of other systems: various kinds of text messages, voice messages, picture chats, forum threads, tickets/issue trackers... Point is that an actual real-time voice or video call is considered a fairly presumptuous thing; it says "I want your entire attention right this second".
The two schools of thought on this are either, well, there's an ignore button right there, so call anyone whenever you want, or the opposite: you shouldn't call someone except in an emergency or via prior agreement. I feel somewhat compelled by the former, I mean, what's the difference between saying "hey can I call you now" and having a box pop up that says "someone wants to call you now"? But the way phone interfaces work is that phone calls are meant to be preemptive and quite intrusive. The phone supports this idea of the phone call as a you-have-to-deal-with-it-right-now form of communication.
On the other hand, it seems somewhat overwrought to have such elaborate rituals around phone calling. Sending a text message to ask someone if you can call them, or even worse sending a text message that turns into a time scheduling conversation that turns into a calendar invite that turns into a phone call. Ugh. Then again, being interrupted by phone calls when you're trying to work is super irritating. Why is this person calling me? What do they want? Is it important? The only way to find out is to take the call and hope it was for a good reason.
So here's my humble suggestion: a phone matchmaker. There's no such thing as phone call anymore, only a phone agreement. You send a phone request with a time range and a reason, ie "I would like to talk to you sometime in the next hour about our upcoming demo". The recipient then selects a time in that range, like 15 minutes from now, or a range within that range, like any time after 4pm. Once you have a definite time, the phone call is booked in, and when the time comes your phones will display a countdown and automatically connect to each other.
In the phone-call-equivalent case, the request looks like "I would like to talk to you as soon as possible for general chatting", and the recipient can say "how about right now?", in which case there is some minimum countdown before the meeting starts, say 10 seconds or something. When the countdown starts, the call can be snoozed for a few minutes like an alarm, or even canceled entirely. The matchmaker would also integrate both ways with existing calendaring systems, so you could do the scheduling out of band but the phone call would start at the scheduled time. And everytime you send a request it would also appear in your calendar.
Either way, the point is to decouple the idea of real-time conversation from making a real-time decision. Having to decide whether to commit your full attention to something on no notice with no reason is a terrible experience. Worse still, once you know how annoying it is to receive a phone call you never want to make one. But sometimes real-time conversation is the best tool for the job, and I think taking away the annoyances associated with it would make that tool far more useful.
Realistic deadlines are notoriously difficult to produce, both in software and elsewhere. Some of this problem comes from optimism, from external pressure or just plain lack of understanding, but I think there's a particular source of unrealistic deadlines that's worth considering: aspiration, the idea that setting a deadline makes it more likely the thing will get done by that time.
Perhaps the most common example of this idea is Parkinson's Law: "work expands so as to fill the time available for its completion". But I think if we're going to find any truth in that statement it's important to separate out three components: the scope, the work, and the time. Scope is how big your goal is, work is how much you need to do to achieve the goal, and time is how long it takes to do the work.
I would agree that scope expands to fill the time available (if you let it), and can contract to nearly nothing (if you don't live in the real world). However, the amount of work required to fulfill your scope is much less flexible. On the low end, there is some essential amount of work that has to be done for the goal to happen. There's also a maximum; in theory you could overcomplicate the way you do something to the point of just digging holes and filling them back in again, but at that point it's not even clear that what you're doing qualifies as work for any reasonable definition of it.
Which brings us to the relationship between work and time. Assuming work means progress towards the goal (and that progress can't be infinitely small, Zeno fans), it can't expand forever. And, in a more realistic sense, unless people are being willfully inefficient there's some predictable range of conversion rates from time to work. To put it another way, I don't buy that work decreases in efficiency to fill the time available.
You'll notice, though, that there's no guarantee that the time actually contains work. You can spend an infinite amount of time staring at a tree and be no closer to building a house. I would describe that as essentially an allocation problem, as in if you want to get a thing done, but you're not working on it, then really the issue isn't to do with the work, it's to do with where you're putting your resources. Setting a deadline is just one (crude) way of doing resource allocation. If you have to have your novel done by the end of November, well, you've implicitly allocated your time up until then.
So these are the two exceptions I would make: more time allows for increased scope, and deadlines are a kind of time allocation. But neither of these works in reverse; if you decrease the time, that doesn't necessarily decrease your scope; and although you can allocate more time to meet a deadline, you can't allocate more time than you have. Assuming a fixed scope, efficiency, and resource allocation, you should expect absolutely no change in amount of work with a change in deadline.
Yet sometimes, and I call out my old nemesis two-way implication here, it's easy to believe that since less work takes less time, you can provide less time and the project will take less work. But there's no reason to think this, any more than there is to think that you can create gold from lead or propel yourself through the air with your mind. There's just no mechanism to generate more work from nothing.
Ultimately I feel the real mistake here is a lack of firewall between control structure and reporting structure. "How long will it take to do this?" is a purely data-driven question, calling for a scientific process with a scientific answer. "I want you to do this" is an executive statement, an instruction that lets you coordinate work on a large scale. "I want it to take this long to do this" is nonsense.
I think bluntness is a very interesting idea. Why is it that sometimes social-convention-ignoring factual statements are refreshingly honest, and other times they are deeply offensive? I once had a small child touch my stomach and say "why do you have a big belly?" I thought this was hilarious and told him it was because I eat a lot. If someone older had done the same thing, though, I would have assumed some degree of malice on their part.
I've previously heard that nerds have their tact filter on backwards; whereas most people apply tact to the things they say, nerdy types tend to apply it to things they hear. This is a fun theory, but I don't think it really makes sense. Nerds hurt each others' feelings all the time, and everyone applies filters (or more generally, transforms) to the things they say and the things they hear. That's why we don't tell our parents about our sex lives, or take book recommendations at face value.
I will agree that many nerds seem to prefer bluntness over politesse, but I don't think that comes from pivotal childhood lessons about communication style. Rather, I think that it's down to the nature of their disciplines. In science and engineering, facts and rigorous thinking reign supreme. It's what I described as frustating in Mechanics and again in The apple's taste; yes, yes, you have a bunch of vague hand-wavey ideas, but how's this whole thing going to work? I need substance, because at the end of the day I'm going to press buttons on a computer and I need to know which buttons to press. If you understand that there is some essential data to be conveyed by your words, why obscure it and waste everyone's time?
Another aspect is that many nerdy disciplines involve systemic thinking. A key skill in engineering is combining many small components to make a big system, and the equivalent in science is breaking down big systems into small components to understand them. So if we think about our behaviour as small components in a big society, what behaviour is the best for the system? Is it best for everyone to waste time repeatedly encoding and decoding information in layers of euphemism and ambiguity? Well, obviously not if you think of it like that.
However, I should take the time to distinguish between bluntness and meanness here, because the latter is also tragically common among some nerdy communities. I think this is sometimes a kind of the-bullied-become-the-bullies effect, but other times it's down to a mistaken belief that being mean is more direct. For example, here's a Linus Torvalds email that includes both, and an explanation later on of his mindset. Notice the characteristic confusion about subtlety and niceness. But they're not the same thing. Subtlety obscures your meaning, niceness is just the opposite of meanness.
There's actually a useful parallel here; if what matters is facts, you don't want to waste time or effort adding extra nice words to those facts. However, you also don't want to waste time or effort adding extra mean words to those facts. Both are unnecessary for the same reason. Is the code bad? Say the code's bad. Has your friend gotten fat? Tell them they've gotten fat. But just as there's no need to hem and haw, there's also no need to swear or snear. Your intention is conveyed in these extra words you use. If you don't think your intention matters, don't add any extra words, but you can't include them and pretend you're just being honest.
Meanness doesn't come from a desire to express truth, it comes from a desire to punish or wound. A child can ask why you have a big belly and you can tell from the way they ask that they don't intend harm. For adults, it's easier to assume malicious intent, so it may be safest to signal your lack of malice with unnecessary nice words when you first meet someone (assuming you care about that kind of compatibility). However, I fully endorse the idea of dropping politeness with people you know in pursuit of a more efficient and truthful standard of communication.
But if you ever find yourself telling your friends to shut the fuck up, you may need to consider if you're being truthful or just angry.
Last time I made 3 prototypes as part of a single project. This time was a bit more modest, just a simple experiment with some new tech, but I was pretty happy with it. I've missed having regular prototypes as a way to keep trying out new things, but I'm hoping to ramp them back up soon as things stabilise with my writing.
I've wanted to try out AWS Lambda for a while, since it seems like an interesting way of shrinking the smallest unit of code. I thought I'd take my Floyd-Steinberg prototype and make it run as a Lambda function that dithers any image you upload to a particular S3 bucket. Rust was pretty neat for that, because it just spits out a static binary so I didn't have to worry about dependencies. I did have to wrap it in a little node script to handle the AWS side of things though, which seemed like a bit of a waste.
Unfortunately, as with many things AWS, the core offering is pretty cool but everything around it was really hard work. I wanted anyone to be able to upload, but you can't do that and limit the file size, so I would have been on the hook for someone uploading their favourite Linux distribution images or whatever. I also had some difficulty with my version of libc being different than the one on the Lambda machines, but in the end the right answer was to just spin up a micro with the right AMI and compile it there, and everything was fine after that.
All said and done, though, I think it turned out well. Lambda seems like an interesting technology and the pricing is ridiculously good. I'm curious to try out the API Gateway/serverless stack at some point, which seems much more complicated but also more polished.
I had a fun idea for a business today: what if you offered free graffiti removal paid for by advertising?
I'm sure it's pretty annoying having to pay to get your wall cleaned whenever it gets tagged. For a large company, that might not be a huge expense, but what about for a person, or even a small business without a lot of spare cash? If your wall has graffiti on it anyway why not let us cover it up with a poster?
You'd leave the poster up for some fixed campaign length, and at the end of the run take down the poster and clean the wall it was on. The wall owner gets their nice clean wall back, and the cleaning business makes money from the advertising. Everyone wins!
The only problem would be that an unscrupulous company could deliberately graffiti attractive advertising spaces, but I think it'd be pretty easy to get caught if you were doing that, especially because most of the ideal places are pretty high-traffic. That possiblility aside, it seems like a surprisingly ethical advertising business.