The IDE Divide (2004)
osteele.com
osteele.com
Tell that to Tom Lehrer.
Virtually all of the best hackers I can think of eschew IDEs and would be narratized as "language mavens", but they are very particular about their tools, have a set of favored tools, and engage in toolsmithing to extend their reach. Accordingly they select languages in which it is easy to build new tools. (In the past these were usually C, shell, awk, and later Perl; nowadays Python and Ruby are the strongest candidates.)
This dichotomy exists only when you consider programmers whose main goal is to solve problems that fit into a finite number of well-known categories. When a programmer is regularly confronted with problems of unknown scope and complexity and needs a way to dynamically extend his reach, he gravitates to an approach like I described above.
That said, there are a number of active research mathematicians who are outstanding musicians, though they tend to not have the time to play enough concerts to be known for it (being busy with math).
In VS 2005, Microsoft spent a huge amount of effort adding edit-and-continue support. This is a feature that requires collaboration from all parts of the environment. The additional boost to productivity is minimal, compared to having colouring, auto-complete, and a REPL, and those 3 features combined are probably less work than EnC.
I'd argue that auto-complete, one of the major IDE/editor features, is alone responsible for most of the boost I get from coding in an environment. Instantly, thousands of symbols can move out of my brain and into a list that appears as I type.
I think the problem is more that most people don't know it exists and it's almost impossible to get Edit and Continue working properly in Visual Studio. I think I've only ever managed once for console programs, but then it completely breaks debugging for ASP.net.
There's a load of things I wish worked properly in Visual Studio that don't that I know would make a massive difference in my productivity. It's almost impossible to drop into .Net library code, load external symbols, etc. When you get a gnarly problem where it's due to some 'helpful' utterly insane choice that the ASP.Net framework guys made the time I would save just dropping into the code from the IDE is massive, rather than popping open ILSpy, figuring out the flow and trying to figure out the path the program is taking.
My workflow is code, read through the code, test the code, fix the code, test the code, fix the code. Annoyingly during testing I can't edit the damn code to fix the simple mistakes I've missed. Edit and continue would be great if it actually worked.
Regarding ASP.Net debugging, I have to resort to the same thing. We actually have a set of custom framework assemblies as a last resort debugging tool that we load into the GAC in a VMware instance which have gone through a tool I wrote using Mono.Cecil that makes all members and classes public and not sealed. They all have exported PDBs as well from MS symbol server so we can step through :)
However, Visual Studio would get a fuck ton more love from me if it didn't crash 8 times a day as well. It's so damn unreliable.
My "other world" of gcc + C + vim + Linux is far more pleasant.
So no, I don't think edit and continue is that big of a deal. A REPL would have been easier and more useful, see F# Interactive.
As far as stepping into code, I find the MS symbol server and .NET source code stepping to "just work". But I sympathize with the pain of debugging a deep stack in ASP.NET, trying to figure out how their abstraction worked. For 3rd party libraries, would it not be up to that publisher to publish their own symbols/source?
This is exactly what I had in mind reading this article. My experience with IDEs and languages has been that they are, for the developer, orthogonal to one another. Throughout school I never even touched an IDE - ended up writing a 100KLOC+ program (C compiler) with a text editor and debugging using print statements, no debugger or anything. It was a ball of mud but it worked great.
Where IDEs have really helped me is for larger scale projects, especially where I integrate lots of new-to-me 3rd party libraries. Being able to contextually explore the namespace of the libraries without sorting through all the documentation is a huge time-saver. Refactoring is also a plus; I don't end up using the refactoring tools that often but Eclipse's refactoring beats find-replace any day.
I guess what I'm trying to say is, languages help developers implement algorithms and data structures. These tend to be the 2-by-4s and screws of software development; a high-quality language is a straight, square, well-finished set of building materials that are sized & shaped for the structure you're building. IDEs help explore namespace and refactor, they're your drills and saws. Understandably the building materials can influence how easy it is to work on them with high-powered tools, but from a development perspective, they're complements, not substitutes.
For me the biggest problem with edit-and-continue in Visual Studio is that you can only edit code when program is paused at breakpoint. You can't change drawing routine formula and observe effects on animation on the second screen. I've seen Notch doing that in Java and it was cool. In VS you get "Changes are not allowed while code is running" error when you start typing.
Even php/javascript feels more interactive than C#, just press F5 and watch the page change. In VS ASP.NET you have to restart whole site (10x longer).
Also edit-and-continue works only for very local changes.
As someone who has crossed this divide (and I'd like to think, successfully) from Tool Maven (Eclipse) to Language Maven, I'd like to say that I much prefer being a Language Maven. As pleasant as navigating static types can be in a well-crafted system, I don't think this automatic navigability is worth the overhead. Taxonomy needs room to evolve, and at any point in time a statically typed system is making an (unjustified) assertion that yes, this time we have it right.
That said, I think there is quite a lot of room for inferring taxonomies from dynamically-typed languages (I'm thinking specifically of JavaScript, but also of Clojure and Python). After all, human programmers infer taxonomy all the time. And indeed, this inference has the great benefit of not even pretending to be set in stone, and is explicitly meta-data about your code, rather than insinuate itself into your code.
The future is bright and I look forward to seeing the new tooling that can give us the best of both worlds across a wide variety of languages. (I heard that Steve Yegge is working on something related to this that at Google.)
People who work on IDEs / text editors can work on tooling and integrating with languages as they become popular (or before), but developing an IDE from scratch with a language and continuing to support it seems like a waste of time when I personally would never really consider using it and its chances of being a decent text editor are slim.
Which is all not to say that I definitely do like coordination between the two camps.
So I guess I made two arguments, one that I like what I use and prefer to keep using it over having some new perhaps questionable tool, and two that it's a non-trivial amount of work that has already been done, which I feel is better spent by other external parties rather than core devs.
The history has shown that languages developed without concerns of IDE were the most successful or the most influential languages.
I don't doubt you, but I do wonder at your benchmarks for success and influence.
FWIW, I use Emacs, which is an editor with a programming language embedded. So does that make me a language maven (as I like emacs lisp and playing with it) or a tool maven, because I am learning about the tool I use to edit code (and almost everything else textual)?
Sources: http://markmail.org/message/ve7mwqxhci4pm6lw, http://docs.python.org/2/faq/design.html#why-are-colons-requ...
Edited to add: I'm currently working in Spring, and being able to click from an xml bean definition directly to a class, and/or from an interface to implementing classes is pretty nice. I hadn't used Intellij until recently and it makes working in java much less painful than I had found it in the past. (It's still somewhat painful...)
Rich Hickey said: "Patterns means 'I've run out of language". Someone blogged recently about IDEs being a language smell.
I understand if you're stuck in the Java+Hibernate+XML+Spring+SQL development hell that you need IntelliJ. But you're not necessarily being "productive" for doing so: it's pretty much the Java ecosystem forcing that down your throat : (
So if you say: "I can't really imagine using a plain text editor for $BLUB development work" (where $BLUB would be, say, Java or C#) then I kinda see your point (been there, done that).
But don't imply that no "development work" is done by people using Emacs / vim.
As to me, when I do really need to work in Java, I'm now using Emacs + eclim (Emacs connecting to an Eclipse server to get Eclipse code nagivation, refactoring, etc.).
I write Android apps in Emacs.
The emacs-eclim project could sure use some developers if anyone is interested. My elisp-fu is pretty weak.
I've been pretty happy with the experience with this setup.
I wrote about it here: http://henrikwarne.com/2012/06/17/programmer-productivity-em...
Language designers: please don't design for today's flash-in-the-pan IDEs that no one will care about in ten years; design a language to last a lifetime (or more!), and the IDEs will follow. Bonus in that your language won't be locked to some IDE no one will care about in ten years. Also, wasting your time and focus on making an IDE for your language will take away from your time and focus to make your language better, or you may make compromises in the language for the sake of the IDE.
(and yes, in case you couldn't tell, I'm an Emacs user ;)
If we are going to move forward into parallel programming, the solution is going to come from the Language Mavens IMHO.
Has anyone ever seen this idea articulated elsewhere?
As for parallel programming - that itself is a wide-spectrum of different types of programming, and again I don't think we have to paint it as choosing one or the other.
For example, when I worked on parallel algorithms for very large clusters, I was really missing some of the things IDEs provide like graphical debuggers. While a better-designed language may have made some parts of my task easier, it would also have made low-level optimization much harder.
tl;dr - different things needed for different situations
Thinking about it more, I do know some people that would fall under the authors definition of "Language Maven" and I think there it is not the lack of tooling that makes them eschew tooling, it that so much tooling is garbage. An example: when you use a cross-reference browser and it either misses some of the references, or lists so many false-references that you have too low a SNR to find what you were looking for, it makes you stop using cross-reference browsers.
At least they should try to make IDEs more modular so they can be "stripped" to editor + intellisense + refactoring. But no....the innards are too twisted together for this so you're stuck with the entire beast :(
As soon as you do that though people will ask for plugins and then people will make plugins and then you'll be back where you started. IntelliJ isn't much more than a project file format, an editor and a plugin API.