HNHacker News
TopNewBestAskShowJobs

ibdknox

8,390 karma · joined September 5, 2010

Previously co-founder of Eve and Light Table. YC alum. Ex-Microsoft Program Manager for C# and VB in Visual Studio and head of product at Relational AI.

http://chris-granger.com http://www.witheve.com http://www.lighttable.com

submissionscomments
ibdknox··on DataScript – Datomic in ClojureScript
Why is it confusing? It's a basic port of that proprietary database to JavaScript. It's not like it's something completely unrelated.
ibdknox··on Tell HN: I will build you a working MVP for $2,345
I got/get lots of offers, but in general the projects were pretty uninteresting (so many clones), people didn't really know what they want, and I found that what people really needed was someone to think through their ideas with them, not a prototype.

At that point in time 5k was reasonable. The price would go up quite a bit if I were doing it now though. But I doubt I'd do it again - the work didn't end up being as exciting as I thought it would be.

What I would consider doing in the future is the "idea consulting" I discovered most people ended up needing. I have a knack for pulling things apart and putting them back together in interesting ways :)

ibdknox··on Programming paradigms that change how you think about coding
we're actually in the process of changing the name :)

EDIT: re FRP, you might find this Lambda The Ultimate post insightful: http://lambda-the-ultimate.org/node/4900

FRP has issues with openness and isn't real great at dealing with collections. It also forces you to express things kind of unnaturally (e.g. instead of "click this and increment x", you say "the counter is the count of all click events"). There are other methods of managing time, like Glitch[1] and Bloom[2] that seem more promising :)

[1]: http://lambda-the-ultimate.org/node/4910 [2]: http://boom.cs.berkeley.edu/

ibdknox··on Toward a better programming
Black boxing is very, very important and necessary if we're ever going to build a complex system, BUT my point is that you should be able to see what it does if you need to. So I don't think we're at odds in our thinking.
ibdknox··on Toward a better programming
> A more concrete problem is displaying and explaining nested scope, closures and shadowing.

That's what really killed it for me and also one of the things that I found pretty surprising. Tracking references is apparently way harder than I realized. And while I thought we could come up with a decent way to do it, it really did just confuse people. I tried a bunch of different strategies, from names, to boxes that follow you around, to dataflow graphs. None of them seemed to be good enough.

ibdknox··on Toward a better programming
But the hard part isn't dealing with invalid parses and error recovery. The hard part is dealing with completely valid bits of code that aren't yet finished:

    (doseq [x (range|cursor|)]
      )
You can wait until the end of time, but that won't finish ;) Whereas I probably wanted to get out (range 10) before it went off and looped forever.

Text also doesn't provide you with stable IDs. If I previously had function "foo" in a file and now that's gone, but there's a function "bar" in the same place with roughly the same code, does that mean it was renamed? Or did foo get deleted and we need to surface that anything using foo is an error? How would you know? The only thing you have to go on is position and position can change for all sorts of other reasons. I ran into this problem with trying to do functions in single editors: when the file can change in any way, reconciling that file with your previous view of the world is tremendously difficult.

ibdknox··on Toward a better programming
that prototype is basically nothing like what the end result will be. And yeah, it will be keyboardable :)
ibdknox··on Toward a better programming
I haven't seen that, thanks so much for the pointer!

> in order to affect the real world, one must go there and roll up one's sleeves

This has always been our strategy :) Whatever we do come up with, it will be entirely shaped by working with real people on coming up with something that actually solves the problem.

ibdknox··on Toward a better programming
> So I need a graphics designer to make a symbol for a card.

I think this is the crux of the debate. The point isn't high quality visualizations, it's about bringing the simple little pictures you'd draw to solve your problem directly into the environment. Can you draw a box and put some text in it? Tada! Your own little representation of a card.

I'm not suggesting that you hire people out to build your representations :) This is about providing tools for understanding. Maybe you don't see value in that, and there's no reason you can't just keep seeing things as plain raw text (that's just a representation itself).

> Anyway, scale things up in a way that I don't have to write so many matplotlib calls and you will have my attention.

Give us a bit and I think we can provide a whole lot more than just that. But we'll see!

ibdknox··on Toward a better programming
The clever part of the strategy I was using in that demo was that all domains are expressed declaratively as datastructures. This meant that the glue language only needed to be very good at manipulating vectors and maps. You built up a structure that represented music, html, or whatever and then just labeled it as such. Interop between domains then becomes pretty simplistic data transformation from one domain's format to another. And given how constrained the glue language could be, you could build incredibly powerful tools that make that easy. You could literally template out the structure you want and just drag/drop things in, fix a few cases that we maybe get wrong and you're done - you've translated tweets into music.

We ended up abandoning that path for now as there are some aspects of functional programming that prove pretty hard to teach people about and seem largely incidental.

ibdknox··on Toward a better programming
It's not about choosing one or the other, it's about allowing both. I can use symbols (though not sentences or other usefully descriptive language), but do I have an opportunity to represent those symbols at all? no.

I'm not saying we should forsake language, if you look at the now very out of date Aurora demo, all the operations have sentence descriptions. This certainly isn't an all or nothing thing. If it makes sense to visualize some aspect of the system in a way that is meaningful to me, I should be able to do so - that is after all how people often solve hard problems.

ibdknox··on Toward a better programming
> There is always a need for two types of languages, higher level domain languages and general purpose languages.

I never suggested otherwise, just that when you're in a domain you should be in that domain. That solution requires something more general purpose to glue domains together, which is the crux of the problem. What does such a language look like? How do you ensure you don't lose all the good properties you gain from the domain specific languages/editors when passing between them?

I think you present a false dichotomy though. General purpose languages are just as much about encoding a process. The distinction between compiling to the machine vs some abstract machine also isn't really relevant: this is about semantics, not implementation. And if you let implementation dictate the semantics you won't get very far from where we are now.

> What I strongly disagree with is claiming that the complexities that plague general purpose languages are somehow mitigated by building more domain specific languages.

I never said that :) I said that programming would be greatly improved by being observable, direct, and incidentally simple. And again those have nothing to do with what "level" you're programming at, they're just principles to apply. I do think there is a general solution that can encompass most of the levels (though I'm not interested in trying to do that any time soon), but there is a common case here and it certainly isn't high level theorem proving or embedded systems. It's stupidly simple automation tasks, or forms over data apps, or business workflows. The world works on poorly written excel spreadsheets and balls of Java mud. You don't have to fix everything to make a huge impact and the things we learn in doing so can help us push everything else forward too.

ibdknox··on Toward a better programming
#ddd -> #ccc

It seems like I can never win the contrast debate :p Try it now.

ibdknox··on Visual Programming Languages – Snapshots
One of my 4 implementations was the prototype I did at MSFT that became the debugger canvas :) Me and a few others built it after I saw the original Code Bubbles demo.

> The new C# compiler Roslyn makes determining relation fairly trivial, something that I'm assuming proved difficult in Clojure(script) and Javascript.

I had access to the language models then too, but the thing is relation is not always written directly into the code. This was the point I was making about locality. In a world with mutability, you can't really know what matters. We tend to cope with this by putting code that relates near each other (in the same file, in the same parts of a file, etc), but that relation isn't made specific in the call chain. It could be, and usually is, buried under several levels of indirection. The lack of locality really frustrated people, because the mainstream models we have for programming don't directly relate to flow and so it ended up being a square peg in a round whole kind of thing.

> so it's interesting to hear that you've decided against it

I've decided against it for the way we program now... :) Flow as a general concept is a very good one, and anything that can make that explicit would be wonderful. But we can't program with rampant mutation and callbacks and expect it to work out.

ibdknox··on Visual Programming Languages – Snapshots
It's been done a few times before :) For example, check out the debugger canvas: http://visualstudiogallery.msdn.microsoft.com/4a979842-b9aa-...

The problem ends up being that you're trading one form of cognitive load for another and it turns out that given our text-centric view of writing code, locality ends up having a lot of importance (which is lost in the model you're suggesting). There are lots of other issues with it at a practical level too. I've never seen an input model that works well with lots of disconnected little editors, for example. How do you navigate between them? How do you lay them out? What happens when the graph is disjoint? How do I get to some point in the flow of the program? What if I need multiple things that aren't directly related next to each other? How do you even determine relation?

After having implemented this in various forms about 4 times now, I'm fairly convinced this is one of those things that makes good intuitive sense, but bleeds to death from a whole bunch of paper cuts in practice.

The one case where this does seem successful though is in the step-wise debugging case. There's a very definite flow, locality matters a lot less, and debugging is an inherently mouse-oriented task - all the things you need for a zoom-based infinite canvas to work out.

ibdknox··on Light Table 0.6.2 released
fwiw, none of us posted this and I'm not sure why it ended up here.
ibdknox··on OpenBSD will shut down if we do not have the funding to keep the lights on
If the maintainers of that page are around here, I suggest putting some visualization of how close you are to the goal on there. It's amazing how much of a psychological motivator a bar filling up is.
ibdknox··on Light Table is now open source
once you've added something to the workspace (just like in Sublime's "project") it's now available in the navigator. Press cmd-o type Gem
ibdknox··on Light Table is now open source
Why not? There's a `File: open file` command, and then there's the navigator to look through files that are in the workspace. You can also add files to the workspace from the command pane with `Workspace: add file` or `Workspace: add folder`.
ibdknox··on Light Table is now open source
If you're interested in this, get ahold of us and I'm sure we can work something out. The plan was always to do a dual licensing scheme to enable exactly what you're talking about.
ibdknox··on Light Table is now open source
Right now the python plugin works by running a little tcp client and connecting to LT's main tcp server. You'd just need to flip those. The Clojure nREPL stuff does this, though it might be a hair bit more complicated than what you'll need for the python one: https://github.com/LightTable/Clojure/blob/master/src/lt/plu...

Past that, you'd just need to add something to the python plugin that runs a tcp server in your process and then hooks into the python running code that's already there. https://github.com/LightTable/Python/blob/master/py-src/ltma...

ibdknox··on Light Table is now open source
We have a CA as well, adapted from Twitter's: https://docs.google.com/a/kodowa.com/forms/d/1ME_PT6qLKUcALU...
ibdknox··on Light Table is now open source
Another interesting part of this is the use of behavior diffs, which means the user can at any point easily remove a behavior that is causing a conflict. Unlike in most situations where multiple plugins may add functionality and you're stuck with whatever the mixture is, it's very easy to take just what you want with LT plugins. One of the key goals of BOT was to enable people to handle conflicts downstream without needing to touch the source.
ibdknox··on Light Table is now open source
We relatively recently put up a full tutorial that should help you get going http://docs.lighttable.com/tutorials/full/ :) If you run into other issues our discussion list is pretty active and usually quite helpful: https://groups.google.com/forum/#!forum/light-table-discussi...
ibdknox··on Light Table is now open source
Pushed a fix just a couple minutes ago, might have to hard refresh to get it though.
ibdknox··on Light Table is now open source
There was some discussion about going with the GPL on the mailing list: https://groups.google.com/d/msg/light-table-discussion/5YscX...

If you have different needs, shoot us an email and I'm sure we can work something out.

ibdknox··on Beat This Level, Get A Programming Job
There's a pretty big difference in audience in these two examples. Codecademy is targeting people who have no, or nearly no, experience programming and trying to turn them into programmers. CodeCombat's normal stuff appears to be in the same vein, but this specific challenge is something only a fairly experienced programmer is likely to solve. It's easy to place great programmers. Not so easy to take someone, make them a good programmer, and then get them a job.
ibdknox··on Intel XDK: An HTML5 development IDE
I can confirm it's brackets.
ibdknox··on Lamdu - towards the next generation IDE
FWIW, the main goal of Light Table is to provide a platform for people to experiment with and build these kinds of experiences without having to worry about all the other standard editory stuff. By using a browser for the UI, we have the opportunity to very easily play with all sorts of really interesting display and editing paradigms.

Unfortunately, the notion of editing an AST is by definition language specific, so it's unlikely that someone could create the structural editor and just have it work for everybody. Moreover, as they mention here for Lamdu, it often requires looking at the language slightly differently and enforcing some rules that wouldn't normally exist in the code. But, with a decent foundation we can at least make writing the necessarily language specific parts relatively straightforward.

For those new to this world and wondering why this stuff doesn't seem to exist, one of the biggest problems with projectional editors is handling the translation problem. How do you reconcile changes in your representation with changes in the underlying code? Can you reliably parse handwritten code into your AST representation write it back and so on without any loss? What happens with handwritten styles that maybe don't fit into the projection's way of viewing the world? What if I know a better way to output the AST than you? It's also particularly difficult dealing with change over time since there are no true unique identifiers for bits of code.

The approach they're taking is likely the correct approach for the "future" - we should be designing languages and approaches to coincide with the ability to tool them. Even better would be to never have a handwritten format at all: the cannonical representation is always the AST. And though you might be able to edit a projection of it as text, you're never at a loss for how to get back to your "good" representation. This is the world I think we ultimately need to get to and you'll be seeing some really cool stuff from us in that vein early in 2014.

ibdknox··on How Dogecoin changed my perspective on cryptocurrency
"was begun" or "began" would be the correct usages I believe. FWIW, "came into existence" or "started" seem like they'd fit nicely there :)
← PreviousPage 5 of 17Next →