1,463 karma · joined August 15, 2013
Engineer working on Urbit
phil at pcmonk.me
[ my public key: https://keybase.io/pcmonk; my proof: https://keybase.io/pcmonk/sigs/tet7bohLuwyz-BYeBElYMeFlsAYxpfAv-FLVf5l4UZg ]
I'm not sure reducing keystrokes is a useful measure. I can't think of a better one, though, so at least it's something quantifiable.
Pure tree editing, with no text editor to fall back to, is important. I didn't even use textual output, while it sounds like these guys did. They also used javascript, which is interesting since it has so much syntax. Lisp seems like a natural choice to me since the tree structure is readily apparent.
Dogfooding is critical, and it's very natural for a project like this. When I got to that point, I learned so much about what was really important in an editor. Like macros -- those helped so much.
Keyboard-based editing of trees is possible, but it takes significant effort to make it feel decently natural.
Collaboration is definitely the most important thing people in this area need to learn. There are dozens of projects similar to this one, and they're generally created by solo programmers (like I did) or by pairs (like Prune). Tree-based editing will never take off until a group of like-minded programmers gets together and makes it happen. I've been pulled away into an unrelated project, but if I were to come back to this, my first move would be to get some collaborators.
If you find yourself not doing something because you don't think it's worthy of the fine company you've built, you're thinking way too much about the formal company and not enough about the ideas, work, and vision that made the company what it is.
Nitpick: although tty == tty is, as you say, vacuously true in this case, that's just because tty is a pointer. If tty were a float, this wouldn't be the case, since it could be NaN. I wouldn't be surprised if it learned to test a variable for equality against itself from some floating point code.
There's definitely some cases where you shouldn't follow the "biggest to smallest" ordering, but they're usually pretty obvious when you run into them. They usually involve inheritance and such.
The challenge is, of course, that a general-purpose tree editor is not likely to be efficient for editing code. You have to resist the urge to over-generalize. A good structured code editor isn't likely to be useful for anything besides coding.
Many of my friends' parents weren't engineers, and some would fall into the "poorer families" category, but they still decided that forgoing an extra salary to homeschool their kids was worth it. It's a very real trade-off, but given most people's level of spending, it's not that hard to cut down quite a bit while maintaining an excellent quality of life, if you have a good enough motivation.
If this wasn't the case, a significant amount of code would break. I've seen a good bit of code where there's a struct A, and then struct B begins with the same fields as in struct A. This allows you to treat either of them as a struct A, a kind of polymorphism. The compiler doesn't know whether you're going to do that, so it can't arbitrarily rearrange the members of the structs.
I don't know exactly what you mean by "human intelligence", but in general we get deeper not by stretching vertically, but by moving vertically, if you follow the metaphor. Many software engineers today don't even have a passing familiarity with the deeper levels of the stack they're programming on, and that's all new stuff in the last ~50 years.
I have no conception of how any software written mostly in TeX with a little bit of Perl could have "elegant design" as a selling point.
Lowering the barrier to hardware startups is an awesome thing, of course. Hardware has a greater potential to directly impact lives at this point than software. There's tremendous software power locked up in the small, awkward-to-use computing devices we call phones, tablets, laptops, desktops, and servers.
http://meta.stackexchange.com/questions/9134/jon-skeet-facts
Additionally, phrases like "What you're really saying is that you have the rewards system of a child" are exactly what I'm talking about. That statement is intentionally worded as an attack, so I have to make a conscious effort to not get defensive. If you want an actual discussion about how rewards systems may change as people grow up, we can talk about that. That was an extremely ineffective way of starting the conversation, though.
It's very easy to couch constructive criticism in a few words of sincere praise/recognition of their work, and it generally results in them doing better work in the future. In fact, they'll be much more likely to listen to your criticism if you haven't immediately put them on the defensive. Once either side gets at all defensive, it's extremely difficult to have any kind meaningful conversation. If you always say "this is crap", then you're literally asking them to defend themselves.
If you haven't already, I would recommend reading "How to Win Friends and Influence People" by Dale Carnegie.
First, since thinking is the hardest part, it's important to eliminate as many distractions as possible. Having to break concentration because I'm writing/typing is very unhelpful. Writing or typing with poor typing skills breaks concentration for longer periods of time.
Second, a nontrivial part of "thinking" is actually reading code spread across multiple files. Since I use vim, typing speed helps me to quickly get to the sections of code that I need to review. This greatly speeds up the thinking process.
Of course, I definitely do write stuff out at times, and I find I can think very well with a whiteboard. These are mostly for things that need to be diagrammed out in two dimensions (which a lot of things do need to be).
Of course, it can be actually shorter with a goto.
http://www.huffingtonpost.com/2012/04/25/foreign-language-de...
At any rate, the thing that's strange about it is how verbose and hackish everything is. It's obvious the language wasn't designed to do anything like this, so the only way you can incorporate features like this is with unnecessarily obtuse and complex blocks of code.
While perhaps stated with slight hyperbole, this is actually a serious question. I don't see how, for example, these pipable functions give any additional real expressive power, and they seem incredibly hacky in how you have to build them. I simply don't understand why anyone would use this kind of thing. C makes sense; I can see an argument for C++03; this is madness.