Codeq
blog.datomic.com
blog.datomic.com
The fact that the file model continues to dominate suggests to me that there may be significant drawbacks as well.
Possibilities:
* Losing the ability to use file-based tools costs too much. This is less that the function model is bad and more that existing tools happen to be file-based
* The model will eventually win, it's just taking a really long time for thoughts/tools to catch up.
* The model is better, but has not caught on for reason unrelated to its utility. The model is Betamax.
* The file-based model is better
Personally, I think the image model is a huge win for a single programmer, while the file model makes it easier to integrate changes from a big team. (There's not really a "DVCS for images" yet.) When I look around, I see that tools that have won tend to support big teams of less-efficient programmers.
So it's not really surprising to me that, by numbers, the file model dominates. That's not an indictment of the image model.
What do you mean by "better"? There are more Corollas than BMW 5's on the streets here, but does that mean they're better, or worse, or better for a particular use case? I'll take the image model for building a fast prototype any day, even if I have to hand it over to a big team writing C or Java for the final product.
How much of this do you feel is due to the lack of tools (VCS, IDEs, etc) equipped to deal with the image model, and how much is inherent to the models?
Is this limitation inherent? I think that's impossible to say. How many people accurately predicted the importance of a DVCS, before ever seeing one built? Or for that matter, a garbage collector? In cases where it's not obvious, the tools drive our understanding.
I don't see anything inherent in image models that would prevent this, though languages don't seem designed in a way that would make this particularly easy. For example, right now we're collaboratively editing a (very simple) shared image (HN).
I enjoy git on the command line, but _tight_ integration with the editor is an almost sublime experience.
So git's well-defined data structure already enables quite a bit of editor magic, but Codeq's extra layer of abstraction is very intriguing. Also, the fact that you can query the engine and get back simple data compares favorably to the mishmash of shelling out and git object parsing done by many tools today.
WRT Smalltalk's image, code management is only one of its marquee features, so I think Smalltalkers would object to calling image vs files a false dichotomy. The image is more akin to a versioned virtual machine than an SCM. I've never known the magic of the image (or a Lisp machine), so I lack an opinion on which is superior.
¹ Drew Neil's excellent video introductions to fugitive: http://vimcasts.org/episodes/archive (April/May 2011)
² and other _content_ tracking DVCSs
None of the Lisp machines really had image-based development. The MIT ones all had an Emacs that worked on text source files. You'd boot into a system image, but that was more like a kernel binary, than the Smalltalk image with a class browser. Interlisp had a structured editor that worked on s-expressions in memory, kind of like the Smalltalk class browser, but these were saved to files (the system would automatically track which definitions were saved in which files, and could tell you about changes: http://larry.masinter.net/interlisp-ieee.pdf).
Yeah, I agree. That was inaccurate on my part. What I said really only applies to the code management side.
Another example is Plan9. Some of its innovations were ported (/proc, utf8, ...), but some things probably never will (everything is a file).
Programmers seem to love adopting the features of Lisp, as long as they can re-assure themselves they are not actually programming in Lisp.
http://srikumarks.github.com/jexpr/
{do: [
{fetchURL: "http://some.data.source/",
timeout: 30.0,
onfail: {raiseError: "URL not reachable"}},
{fork: [
{displayInElement: "element_id"},
{cacheInLocalStorage: "prefix"}
]}]}
more here:http://srikumarks.github.com/gyan/2012/04/15/j-expressions/
http://srikumarks.github.com/gyan/2012/04/14/creating-dsls-i...
http://lambda-the-ultimate.org/node/2887
EDIT: And for the record, I actually think it's a brilliant idea.
When I started coding professionally I used IBM's VisualAge for Java (which was actually a multi-language tool based on Smalltalk) and it did exactly that: all Java classes were managed as code artefacts held in the IDE's internal repository. You had to export from the IDE if you wanted your standard files-in-directores source/objects. It worked very naturally and when IBM moved to Eclipse instead I found it to be quite a step backwards in terms of working with my code. But the drawback was was you could do exactly what the VisualAge IDE supported and not much more.
The file-based model gives a level of low-cost interoperability that's pretty hard to beat.
The mere mention of editors and IDEs suggests to me that they envision analysis as the gateway drug.
More specifically, where git mostly looks at code as a collection of files and differences in individual lines, codeq breaks it down into code as a collection of semantic units (function definitions for clojure, possibly class definitions, methods, etc. if other languages are supported). Your version control system would actually understand if a particular method had been moved from a subclass into a parent class, instead of just considering it as lines being deleted here and added elsewhere.
I don't think this is an alternative to another product. Instead I think it's something fairly new and interesting: they built a tool which takes your tokenized source code (presumably only in Clojure) and your git log and makes a queryable database out of it. So you could query "who changed my kill_puppies function last year" or other semi-structured things, as opposed to a combination of git blame + ack + ctags.
Like they said in the article, this would be the underpinnings of a larger system; something to manage code deployments, or an IDE, or a code review tool.
A smarter and faster version of git-bisect - given an anonymous function, when does the answer returned change working backwards through the codebase?
Or perhaps time warp integration - request a build of project foo but with library bar from the last tagged release version and function baz from a year ago.
I'm so glad this approach is finally coming, and in what style!
The rules don't have output until incorporated in a query - you can think of them as akin to SQL views. However, they don't need to be installed in the db, you can pass them as an arg, as the query does.
This raises a question for Rich regarding Datomic and the notion of "derived facts" a la "Out Of The Tar Pit":
Datalog Rules can be used to query by some trivial notion of derived facts at any point in time, but most derived facts are expensive to compute and thus should be cached and introduced by a new transaction. In the case of Codeq, this includes the full output of the analyzer. It seems like a natural extension of Datomic to support lazy calculation and caching of derived facts. I could even imagine some cluster scheduling of that work, in a sense producing a map-reduced immutable materialized view of sorts.
I realize I said a question was coming, but I'm having a hard time formulating one... which probably means that I don't understand the problem well enough. So, can you talk a little bit about how you envision Datomic evolving with respect to derived facts?
In short: "In a database management system following the relational model, a view is a virtual table representing the result of a database query. Whenever a query or an update addresses an ordinary view's virtual table, the DBMS converts these into queries or updates against the underlying base tables. A materialized view takes a different approach in which the query result is cached as a concrete table that may be updated from the original base tables from time to time. This enables much more efficient access, at the cost of some data being potentially out-of-date. It is most useful in data warehousing scenarios, where frequent queries of the actual base tables can be extremely expensive."
What I don't understand is why I need cookies enabled in Firefox to view the post. This is obviously a Blogger issue, as I've seen those little gears many times before. I can't imagine the great Rich Hickey intends it.
Are you going to stick to analysis, or support code transformations? If you're going to transform code, how will you avoid IDE refactor tool hell?
I was struck with the same idea (turning ASTs into git DAGs; normalizing code) back when I was first learning git, but the idea took me down a different path - writing a structured (no-plaintext) programming environment. I'll get to the version control portion soon enough, and I hope there'll be some lessons I can take away from Codeq!
.QL(http://en.wikipedia.org/wiki/.QL) is a similar project to query codebases developed by SemmleCode, that gives a "OO+SQL flavor" to the queries.
It is nice to see a similar idea actually implemented.
I don't know how many times I have lost the scroll handle behind it when this widget is used.
1. It is an IDE's job, to keep track of changes of individual expressions in the code of a project.
2. This information should be stored separately from the source code files, as a meta-data to the project, not the individual files.
3. I don't need a solution for a problem I do not have.
4. The query language is ugly.
5. I do not want to use any "free" commercial service for a solution which can be implemented as a emacs-lisp package.
6. I see nothing in this blog post of any interest.
7. I have no over-excitement just because something comes from Rich Hickey.
I am not a programmer, I solve problems using symbolic representations. Anything that lets me reason about solving this problems at a higher level is a net gain for me. I've been wishing for something like this for the last 13 years. This is fantastic in my mind, I want people to run like hell with it.
Is the IDE supposed to have it's own revision history stored somewhere? I understand how it might be an IDE's job to recognize individual functions but there's no way it is supposed to keep track of changes. That is entirely the source control's job.
> 2. This information should be stored separately from the source code files, as a meta-data to the project, not the individual files.
What information? This doesn't change your code in any way, it analyzes it and stores the data resulting from that in the datomic db.
3, 4, 6 are entirely subjective, it's rather clear plenty of others find this interesting and useful. I do agree that the query language isn't pretty.
5. Maybe someone will dislike Datomic enough to implement this as an emacs package. The source for codeq itself is open source, datomic is only a storage backend.
7. Let's be straight, judging from the points you made you certainly didn't go into this with no bias. Some of us don't get angry just because it comes from Hickey.
Ahh, sour grapes and/or jealousy. Yes, it IS obvious now.