One thing that has been difficult about prototyping, and specifically about trying to stay on the small end of the idea triangle, is that it's really hard to write small amounts of code. I wrote about that before in terms of setup costs and tooling, but I think there is a wider problem which is just that there's not really a place for very small amounts of code.
Right now, the smallest unit of code tends to be a program. But a program includes certain expectations about size and complexity. Often a program will include a build and compilation system, dependencies, and whatever it needs to talk to the surrounding environment. That's an inherent part of the operating system metaphor; each program in the operating system is an independent unit that can take very little for granted about the other units. Usually that means there is a lot you do from scratch in each program because you have to build up from a low level.
Imagine something like this: you're a designer who has just learned about the golden rectangle and you think it's super neat. You want to have easy access to it so you can use it in your designs. The function is really simple. For example, here's the code to give you the long side of a golden rectangle given the short side in Javascript:
Now you have that code. Where are you going to put it so you can use it? There's no place to just put a function on your computer. Probably what you would do is put some interface around it, maybe a command line tool if you're a programmer, or a little widget or webpage or something. But all of those things are much larger than a single function! Your minimum unit of code has to be large because the operating system doesn't have an interface that would allow for anything smaller. It only knows how to run programs, not functions.
What I would like to see is a hybrid programming/operating environment, where even very small units of code can be stored, inspected and run the same way that whole programs are today. If you can get the minimum unit of code small enough, I think it would change the way we use computers significantly, away from passively consuming the programs of others and towards writing small bespoke units of code for ourselves.
A year ago, I wrote When it all comes together, about the magic of the "a-ha!" moment when things just seem to line up. I included a lot about Catenary, which I was working on at the time, but I think the idea is interesting enough to stand on its own, and I'd like to return to it in the context of some other things I've written since.
There are two feelings I think are particularly notable in the context of discovery. I don't know if anyone else has named them, but I call them the collapse and the expanse. I think of them in terms of fundamental complexity, specifically in the sense of the number of actual possibilities. I touched on the idea in Abstractions: if you have a piece of paper with a million numbers written on it, there are a lot of possibilities for what can be on the paper. But if you look at the numbers and recognise that they fit a pattern, there are much fewer possibilities, sometimes even only one.
That decrease is the collapse: a sudden reduction in complexity, often accompanied by the "a-ha!". When you first realise in basic physics that you can calculate horizontal and vertical motion separately, one hard problem collapses into two simple problems. When you suddenly discover there's an underlying rule behind something you had learned case-by-case, or even figure out how to solve a tricky puzzle, the number of things you have to know decreases dramatically.
It makes sense that this feels good; the collapse is a sign you are storing information more efficiently than before. Much the same way that you can store "the even numbers from 1 to 2,000,000" in less space than you can store the even numbers from 1 to 2,000,000, you can store a collapsed understanding in less space than the knowledge that went into it. Doing this is essential for fitting all the things we need to know into our limited mental storage.
The expanse is the opposite: suddenly discovering that there is more complexity in a thing you thought was simple. Oddly, it feels good even though it means your life has become harder. The feeling is the kind of surprised curiosity you get when you've only ever seen white swans and you see a black swan for the first time, or you visit a new country and everyone acts very differently from what you're used to. Even just learning some new information with a lot of implications can lead to that kind of mind opening expansive feeling.
So why does it feel good? I think it's because the expanse provides you with a lot more new knowledge. And since new understanding requires collapsing down existing knowledge, that knowledge is important fuel for the process. But it's also worth noting that understanding also leads to new knowledge in the form of predictions and constructions. Which means that they complement each other: each collapse leads to more expanses, which should hopefully lead to yet more collapses.
I think it's these complementary processes that really define intelligence: expanding understanding into knowledge, collapsing knowledge back into understanding, and all the while inching closer to a complete representation of the truth.
Looked at the right way, a lack of choice can be very comforting. There's obviously the paradox of choice thing, but the main effect for me is just that a situation that's beyond my control is also beyond my responsibility. I don't have to worry about whether it should or shouldn't be the case, I just have to deal with it as best I can.
In a sense, you can think of a lack of choice as being related to focus. There is some subset of things that you are going to focus on, that you are going to make choices about, and some (much) larger subset that you aren't going to make choices about. In the case of something like whether to save all the orphans in the world or learn to levitate, that decision is out of your hands; there are no choices you can make that will bring about that outcome. In many cases, though, you do get to make a kind of meta-choice: the choice of what to make choices about.
I've found it particularly useful to use that meta-choice to add inevitability to a situation. For example, sometimes I'm struggling to finish some piece of work and getting discouraged. I start wondering if I should stop and do something else, which begins to distract me from the work itself. But if I say "well I'm definitely going to finish this, it's just a question of how long it takes", that takes the choice of whether to do it off the table and lets me focus on how to do it.
Most likely the reason this works is that we have limited resources to use for making decisions. In that context, removing choice is a way of being judicious with those resources. Inevitability, then, is just having the most available resources, and comfortable inevitability is having exactly as much capacity to decide as there are decisions to make.
Extreme views are, by their nature, pretty rare. So much so that it can be surprising when an extreme view turns out to be right, or when the goalposts move such that the sensible view seems extreme. Climate science and evolution both have this problem; for political reasons there are two popular viewpoints, but placing them at equal but opposite extremes severely misrepresents reality. However, there are many other topics without clear answers, and where varying degrees of moderation are valid.
The difficult thing about this is that we seem to disagree proportionally to the difference between our views. So let's say you believe strongly in social welfare programs, and someone else tells you they believe that the poor are poor for a reason and we shouldn't encourage them. In that conversation, you'd probably speak up and tell them that you think they're wrong. But what if you believe that social welfare is widely abused and in many cases is a waste of money? Now their view is still different, but much closer to your own. Do you speak up? Maybe it doesn't seem worth it for a minor disagreement.
The result is that, especially on the internet, you tend to hear big disagreements more than little ones. The bar for someone to bother to speak up is harder to clear when you only disagree a bit. Unfortunately, this means more moderate views tend to be under-represented, because moderates disagree less strongly. Worse still, it means that most disagreements aren't very useful, because the opinion of someone who disagrees with you on everything is less relevant than someone who agrees with you on most things except for one.
A related problem is that it's easy to conflate the strength of a belief with its extremeness. It's certainly true that if you hold an extreme belief you should probably believe it strongly; extraordinary claims require extraordinary evidence and all that. But the converse isn't true: something you believe strongly isn't always extreme. It is possible, even likely, that the right answer in many situations is unextreme. In those cases, what you hold is a strong moderate belief that is every bit worth pushing for as an extreme view.
Which I think answers the proportional disagreement problem too. If you disagree in proportion to the difference between views, moderate voices tend to stay quiet and extreme ones dominate the conversation. On the other hand, if you disagree in proportion to the strength of your belief, disagreements are between those who feel the strongest. That still means extreme views, but hopefully balanced by the larger weight of strongly held moderate views.
It may be that part of the problem with disagreement on the internet is, ironically, not enough disagreement.
After last week's decision to not commit to any particular number of prototypes, I wasn't sure how this week was going to work out. Maybe without the commitment I wouldn't bother to do any prototypess at all. Actually, it was fine and about on par with recent weeks.
I've had this idea for ages to make my Twitter profile auto-update with the current time in my timezone. I'd already checked out the Twitter API and the terms didn't seem to prevent it (they have a rate limit that works out to 1 request per minute). So I figured why not just hunker down and write it. I chose Rust because I thought it would be interesting to see how working with a REST API would work. Actually it turned out to be a pretty substantial pain in the butt, mostly because of OAuth. I tried to use someone else's OAuth library but it wasn't working and in the end I just wrote it from scratch. Works great though!
I wanted to do some more work on my promserver idea, but I wanted something with a bit more of a rigorous foundation. I figured it would be interesting to use Flowtypes to do that. It started to seem like more trouble than it was worth in a few places. Varargs and optional arguments basically just send Flowtype completely off the rails, and it was missing the types for some HTTP library internals that I needed. I still got something working, but it was way harder than it should have been.
This was a bit more laid back and fun. I added two new MeDB plugins to look for the total karma this site has received on Reddit and Hacker News. I still haven't released MeDB even though it's basically ready, just because I still need to figure out how to make globally installed plugins work properly with Node. Still, my stats page now has a little bit more to look at.