Language as Data
There must be a better way of doing what we do. I’m sure there are many motivations to create but the motivation I’m most interested in is the one to realize your thoughts and ideas in some tangible way. This is a very abstract statement but for me this often means building a software system that does something useful, fun or that helps make my life easier. Ok this is a little abstract but stick with me… There is a point – I think 😉
Sticking with the creation of software systems for a second, think about all the languages, paradigms, platforms and tools that exist. Many of these are nice but most of them are not really “new”. I do think that there are some incredibly good tools, platforms that keep me organized and languages that allow me to express my thoughts but do any of them really improve on what I’m currently using? Does any one of them really solve all the problems I encounter?
In terms of languages and tools I don’t think much has really changed in the last 30-40 years. We’re still playing around with the same language paradigms whether it be Object Orientation, functional programming, etc. And these languages really only let us do the same thing as each other. I do concede that these languages have offered those paradigms in cleaner syntax and have taken some of the burden away from developers allowing them to focus more on the problems they are trying to solve but thats more sugar than anything else. As an experiment, ask yourself how many new flow control concepts you’ve encountered in each of the languages you use? Threading has been a thorn in our sides for decades but until recently I haven’t really seen much that allows us to express the interaction and data flow in a complex system in new ways.
IDE’s really haven’t evolved much either, even if they do have more features. I mean if you look at Eclipse, Visual Studio, IntelliJ or the thousands of other IDEs out there do they really do anything different? Ok lets see, automated build, syntax hinting, stating dependencies, basic code analysis, testing and performance analysis, etc. They all do these tasks differently and to the preference of their respective proponents but there isn’t really anything one offers that the others don’t.
What would lead me to change how I’m doing what I do today. For me that is primarily, “Will changing how or what I’m doing allow me to express and realize my thoughts more fully?” In systems development this often means producing my work faster, more performant and in a way that is more easily understood.
The IDE as Data
It has been a while since I’ve found anything that passes that one test but perhaps Light Table, the brain child of Chris Granger, does. If you don’t know what Light Table is then take a look at the Kickstarter page that, I believe launched the project. Essentially Chris is attempting to rethink how we go about constructing software systems by creating a tool that allows us to express our thoughts and interact with them in a more real-time fashion. Don’t think of Light Table as simply another IDE. If you do that is missing the point. Taken from Chris’ site,
“Light Table is based on a very simple idea: we need a real work surface to code on, not just an editor and a project explorer. We need to be able to move things around, keep clutter down, and bring information to the foreground in the places we need it most.“
What I think is more interesting are the principals that guide the development of Light Table.
- You should never have to look for documentation
- Files are not the best representation of code, just a convenient serialization.
- Editors can be anywhere and show you anything – not just text.
- Trying is encouraged – changes produce instantaneous results
- We can shine some light on related bits of code
In addition I think that when you are creating something you need to interact with it. Rarely (read never) do I have an idea that is so clear that I can just sit down and write a design and implementation. For this reason the Instant feedback, ability to embed the running application into the workspace and immediate links to documentation that Light Table have built into it are really great. Take a look at this demo to see an example of how this is achieved in Light Table.
To achieve this it required thinking of Light Table as a workspace to facilitate communicating your thoughts into something tangible rather than as an IDE. Key to that cognitive shift is looking at Light Table, “as a value” or data, instead of as a traditional IDE. Chris refers to this as a Behavior-Object-Tag engine, similar to the Component-Entity-System approach used in game development.
The Language as Data
Forget the IDE what about the Language we use to communicate our thoughts?
I find myself wondering how the ideas behind Light Table can be adapted to an entirely remote, API based, development approach where you have an software system that is deployed to a number of PAAS and/or IAAS based environments with a polyglot language set such as java, python, ruby and C leveraging features provided by numerous services such as google maps, amazon S3, MongoHQ, Loggly, PubNub, New Relic, et. al. Having just returned from DreamForce I can safely say that this is not something in the future but the way people are already building the next generation of applications.
In this multi-paradigm world I think that the approach Light Table is taking is the right one. I can imagine being able to connect Light Table to these services in a single workspace based on whatever makes sense in the context that you are working in. This is already hinted at in how you can create dynamic workspace in Light Table today and see how the changes you make in one part of the system affect other parts of the system. Perhaps an even clearer example is how MathCad allows you to integrate mathematical calculations, simulations, text, images etc into a single living document.
This is exactly the kind of thing I’m thinking about but not just limited to mathematics. I certainly can imagine modeling, mathematics, live renderings, user interaction workflows, data manipulation, data visualization, etc all becoming part of a single unit of work each specified in a way that is most appropriate for the given domain but all working together. Some of the elements may only need to be realtime or immediate during a given stage in the process but perhaps not. Perhaps this becomes a kind of living changing application space instead of simply a language to state what is to be done it becomes the environment the application is built in, the statement of intent and the actual construct itself.
Getting back to the IDE as a value concept; I find this really intriguing but more so if applied to the combination of programming languages and tooling. Combining the runtime engine and development environment is nothing new but take that a step further. What if you could create a workspace that combines multiple paradigms, languages and semantics in a single stream of consciousness? To some extent this is related to Organic Computing where the system is composed of numerous autonomous systems each aware of their environment (read reflection) react and organize themselves to solve a given problem.
Linguistically speaking, languages change constantly as they influence each other and new and interesting ways of communicating thoughts are found. Not all of these are as clear as others but more often than not only what works sticks. As an example my wife speaks is a native Spanish speaker who has learned English and I am a native English speaker who has learned to speak Spanish (poorly – but I’m trying). Over time I’ve found that some communication feels more natural in one language or the other. Observe any multilingual household for a few minutes and you’ll see how often people switch back and forth. Children do this as if it were the most natural thing in the world and perhaps it is.
If the languages used to create software systems were “living”, as it were, then perhaps we would organically find ways of communicating that are more natural or clear. If it is true that thought is closely tied to the languages we use to communicate verbally then perhaps by opening this up we would be able to express new thoughts and ideas that we can’t conceive of today.
So where is this all leading?
I am going to try and borrow the lead that Chris and others have started, mix in some thoughts I’ve taken from other areas and experiment a bit. I’d like to see what happens if I combine multiple languages, services and paradigms into a single single stream of consciousness in a manner similar to what Light Table is doing for the overall creative workspace. Next I’ll try and describe what something like this would look like?