Even more of a hot topic than programming languages is the interactive development environment, or IDE. Personally, I’m not a huge fan of IDEs. As tools, standing alone, I have no problem with them. I’m a software libertarian: do whatever you want, as long as you don’t interfere with my work. However, here are some of the negatives that I’ve observed when IDEs become commonplace or required in a development environment:
- the “four-wheel drive problem”. This refers to the fact that an unskilled off-road driver, with four-wheel drive, will still get stuck. The more dexterous vehicle will simply have him fail in a more inaccessible place. IDEs pay off when you have to maintain an otherwise unmanageable ball of other people’s terrible code. They make unusable code merely miserable. I don’t think there’s any controversy about this. The problem is that, by providing this power, then enable an activity of dubious value: continual development despite abysmal code quality, when improving or killing the bad code should be a code-red priority. IDEs can delay code-quality problems and defer macroscopic business effects, which is good for manageosaurs who like tight deadlines, but only makes the problem worse at the end stage.
- IDE-dependence. Coding practices that require developers to depend on a specific environment are unforgivable. This is true whether the environment is emacs, vi, or Eclipse. The problem with IDEs is that they’re more likely to push people toward doing things in a way that makes use of a different environment impossible. One pernicious example of this is in Java culture’s mutilation of the command-line way of doing things with singleton directories called “src” and “com”, but there are many that are deeper than that. Worse yet, IDEs enable the employment of programmers who don’t even know what build systems or even version control are. Those are things “some smart guy” worries about so the commodity programmer can crank out classes at his boss’s request.
- spaghettification. I am a major supporter of the read-only IDE, preferably served over the web. I think that code navigation is necessary for anyone who needs to read code, whether it’s crappy corporate code or the best-in-class stuff we actually enjoy reading. When you see a name, you should be able to click on it and see where that name is defined. However, I’m pretty sure that, on balance, automated refactorings are a bad thing. Over time, the abstractions which can easily be “injected” into code using an IDE turn it into “everything is everywhere” spaghetti code. Without an IDE, the only way to do such work is to write a script to do it. There are two effects this has on the development process. One is that it takes time to make the change: maybe 30 minutes. That’s fine, because the conversation that should happen before a change that will affect everyone’s work should take longer than that. The second is that only adept programmers (who understand concepts like scripts and the command line) will be able to do it. That’s a good thing.
- time spent keeping up the environment. Once a company decides on “One Environment” for development, usually an IDE with various in-house customizations, that IDE begins to accumulate plugins of varying quality. That environment usually has to be kept up, and that generates a lot of crappy work that nobody wants to do.
This is just a start on what’s wrong with IDE culture, but the core point is that it creates some bad code. So, I think I should make it clear that I don’t dislike IDEs. They’re tools that are sometimes useful. If you use an IDE but write good code, I have no problem with you. I can’t stand IDE culture, though, because I hate hate hate hate hate hate hate hate the bad code that it generates.
In my experience, software environments that rely heavily on IDEs tend to be those that produce terrible spaghetti code, “everything is everywhere” object-oriented messes, and other monstrosities that simply could not be written by a sole idiot. He had help. Automated refactorings that injected pointless abstractions? Despondency infarction frameworks? Despise patterns? Those are likely culprits.
In other news, I’m taking some time to learn C at a deeper level, because as I get more into machine learning, I’m realizing the importance of being able to reason about performance, which requires a full-stack knowledge of computing. Basic fluency in C, at a minimum, is requisite. I’m working through Zed Shaw’s Learn C the Hard Way, and he’s got some brilliant insights not only about C (on which I can’t evaluate whether his insights are brilliant) but about programming itself. In his preamble chapter, he makes a valid insight in his warning not to use an IDE for the learning process:
An IDE, or “Integrated Development Environment” will turn you stupid. They are the worst tools if you want to be a good programmer because they hide what’s going on from you, and your job is to know what’s going on. They are useful if you’re trying to get something done and the platform is designed around a particular IDE, but for learning to code C (and many other languages) they are pointless. [...]
Sure, you can code pretty quickly, but you can only code in that one language on that one platform. This is why companies love selling them to you. They know you’re lazy, and since it only works on their platform they’ve got you locked in because you are lazy. The way you break the cycle is you suck it up and finally learn to code without an IDE. A plain editor, or a programmer’s editor like Vim or Emacs, makes you work with the code. It’s a little harder, but the end result is you can work with any code, on any computer, in any language, and you know what’s going on. (Emphasis mine.)
I disagree with him that IDEs will “turn you stupid”. Reliance on one prevents a programmer from ever turning smart, but I don’t see how such a tool would cause a degradation of a software engineer’s ability. Corporate coding (lots of maintenance work, low productivity, half the day lost to meetings, difficulty getting permission to do anything interesting, bad source code) does erode a person’s skills over time, but that can’t be blamed on the IDE itself. However, I think he makes a strong point. Most of the ardent IDE users are the one-language, one-environment commodity programmers who never improve, because they never learn what’s actually going on. Such people are terrible for software, and they should all either improve, or be fired.
The problem with IDEs is that each corporate development culture customizes the environment, to the point that the cushy, easy coding environment can’t be replicated at home. For someone like me, who doesn’t even like that type of environment, that’s no problem because I don’t need that shit in order to program. But someone steeped in cargo cult programming because he started in the wrong place is going to falsely assume that programming requires an IDE, having seen little else, and such novice programmers generally lack the skills necessary to set one up to look like the familiar corporate environment. Instead, he needs to start where every great programmer must learn some basic skills: at the command-line. Otherwise, you get a “programmer” who can’t program outside of a specific corporate context– in other words, a “5:01 developer” not by choice, but by a false understanding of what programming really is.
The worst thing about these superficially enriched corporate environments is their lack of documentation. With Unix and the command-line tools, there are man pages and how-to guides all over the Internet. This creates a culture of solving one’s own problems. Given enough time, you can answer your own questions. That’s where most of the growth happens: you don’t know how something works, you Google an error message, and you get a result. Most of the information coming back in indecipherable to a novice programmer, but with enough searching, the problem is solved, and a few things are learned, including answers to some questions that the novice didn’t yet have the insight (“unknown unknowns”) yet to ask. That knowledge isn’t built in a day, but it’s deep. That process doesn’t exist in an over-complex corporate environment, where the only way to move forward is to go and bug someone, and the time cost of any real learning process is at a level that most managers would consider unacceptable.
On this, I’ll crib from Zed Shaw yet again, in Chapter 3 of Learn C the Hard Way:
In the Extra Credit section of each exercise I may have you go find information on your own and figure things out. This is an important part of being a self-sufficient programmer. If you constantly run to ask someone a question before trying to figure it out first then you never learn to solve problems independently. This leads to you never building confidence in your skills and always needing someone else around to do your work. The way you break this habit is to force yourself to try to answer your own questions first, and to confirm that your answer is right. You do this by trying to break things, experimenting with your possible answer, and doing your own research. (Emphasis mine.)
What Zed is describing here is the learning process that never occurs in the corporate environment, and the lack of it is one of the main reasons why corporate software engineers never improve. In the corporate world, you never find out why the build system is set up in the way that it is. You just go bug the person responsible for it. “My shit depends on your shit, so fix your shit so I can run my shit and my boss doesn’t give me shit over my shit not working for shit.” Corporate development often has to be this way, because learning a typical company’s incoherent in-house systems doesn’t provide a general education. When you’re studying the guts of Linux, you’re learning how a best-in-class product was built. There’s real learning in mucking about in small details. For a typically mediocre corporate environment that was built by engineers trying to appease their managers, one day at a time, the quality of the pieces is often so shoddy that not much is learned in truly comprehending them. It’s just a waste of time to deeply learn such systems. Instead, it’s best to get in, answer your question, and get out. Bugging someone is the most efficient and best way to solve the problem.
It should be clear that what I’m railing against is the commodity developer phenomenon. I wrote about “Java Shop Politics” last April, which covers a similar topic. I’m proud of that essay, but I was wrong to single out Java as opposed to, e.g. C#, VB, or even C++. Actually, I think any company that calls itself an “<X> Shop” for any language X is missing the point. The real evil isn’t Java the language, as limited as it may be, but Big Software and the culture thereof. The true enemy is the commodity developer culture, empowered by the modern bastardization of “object-oriented programming” that looks nothing like Alan Kay’s original vision.
In well-run software companies, programs are build to solve problems, and once the problem is finished, it’s Done. The program might be adapted in the future, and may require maintenance, but that’s not an assumption. There aren’t discussions about how much “headcount” to dedicate to ongoing maintenance after completion, because that would make no sense. If people need to modify or fix the program, they’ll do it. Programs solve well-defined problems, and then their authors move on to other things– no God Programs that accumulate requirements, but simple programs designed to do one thing and do it well. The programmer-to-program relationship must be one-to-many. Programmers write programs that do well-defined, comprehensible things well. They solve problems. Then they move on. This is a great way to build software “as needed”, and the only problem with this style of development is that the importance of small programs is hard to micromanage, so managerial dinosaurs who want to track efforts and “headcount” don’t like it much, because they can never figure out who to scream at when things don’t go their way. It’s hard to commoditize programmers when their individual contributions can only be tracked by their direct clients, and when people can silently be doing work of high importance (such as making small improvements to the efficiencies of core algorithms that reduce server costs). The alternative is to invert the programmer-to-program relationship: make it many-to-one. Then you have multiple programmers (now a commodity) working on Giant Programs that Do Everything. This is a terrible way to build software, but it’s also the one historically favored by IDE culture, because the sheer work of setting up a corporate development environment is enough that it can’t be done too often, and this leads managers to desire Giant Projects and a uniformity (such as a one-language policy, see again why “<X> Shops” suck) that managers like but that often makes no sense.
The right way of doing things– one programmer works on many small, self-contained programs– is the core of the so-called “Unix philosophy“. Big Programs, by contrast, invariably have undocumented communication protocols and consistency requirements whose violation leads not only to bugs, but to pernicious misunderstandings that muddle the original conceptual integrity of the system, resulting in spaghetti code and “mudballs”. The antidote is for single programs themselves to be small, for large problems to be solved with systems that are given the respect (such as attention to fault tolerance) that, as such, they deserve.
Are there successful exceptions to the Unix philosophy? Yes, there are, but they’re rare. One notable example is the database, because these systems often have very strong requirements (transactions, performance, concurrency, durability, fault-tolerance) that cannot be as easily solved with small programs and organic growth alone. Some degree of top-down orchestration is required if you’re going to have a viable database, because databases have a lot of requirements that aren’t typical business cruft, but are actually critically important. Postgres, probably the best SQL out there, is not a simple beast. Indeed, databases violate one of the core tenets of the Unix philosophy– store data in plain text– and they do so for good reasons (storage usage). Databases also mandate that people be able to use them without having to keep up with the evolution of such a system’s opaque and highly-optimized internal details, which makes the separation of implementation from interface (something that object-oriented programming got right) a necessary virtue. Database connections, like file handles, should be objects (where “object” means “something that can be used with incomplete knowledge of its internals”.) So databases, in some ways, violate the Unix philosophy, and yet are still used by staunch adherents. (We admit that we’re wrong sometimes.) I will also remark that it has taken decades for some extremely intelligent (and very well-compensated) people to get databases right. Big Projects win when no small project or loose federation thereof will do the job.
My personal belief is that almost every software manager thinks he’s overseeing one of the exceptions: a Big System that (like Postgres) will grow to such importance that people will just swallow the complexity and use the thing, because it’s something that will one day be more important than Postgres or the Linux kernel. In almost all cases, they are wrong. Corporate software is an elephant graveyard of such over-ambitious systems. Exceptions to the Unix philosophy are extremely rare. Your ambitious corporate system is almost certainly not one of them. Furthermore, if most of your developers– or even a solid quarter of them– are commodity developers who can’t code outside of an IDE, you haven’t a chance.
Hey, didn’t Neil Stephenson write something to this effect? That any real programmer used the command line. All I can find now is his book “In the Beginning,” but I thought he had a shorter essay before that dealing with programmers in particular.
http://www.cryptonomicon.com/beginning.html
Good read, but there are clearly some bits that he got wrong fifteen years in retrospect.
Doh – misread your comment the first time. Thought you were looking for the “in the beginning” essay.
Don’t remember any other one, but I think that essay was my first exposure to Stephenson.
Yes, and we really don’t need another post on this non-subject. The tools a programmer chooses to use, do not in any way shape or form reflect on a programmer’s ability. I don’t know how much I can stress that.
There is a lot of Windows software, to use a very clearcut example, written using MS and non MS IDEs that is critical and much more important, complex, and useful than 99.999% of the shit coming out of SF/Valley or any startup anywhere.
And some of that software is monolithic. Really Michael, I’d like to hear your design for a full audio/midi sequencer using “unix philosophy.” Yes, “unix philosophy” is useful. It’s called modularization in giant software. Perhaps you may have heard of it?
Pingback: If you write crappy code, you’re a bad programmer, no matter if you use an IDE or Unix | lanusmaximus
Another example is web browsers. Modern web browsers are complex, but the DOM abstract most of the work out.
pointless. The developers back in the 70′s didn’t have tools like IDEs and they wish they did. Now, we have them and they make work lot easier and better. come to think of it, do you prefer to waste 10hrs on a code that could be written in 1hr? that does not make you a programmer, it makes you a murder because you only kill time.
Please source this claim that IDEs provide a 10x increase in productivity over modern, effective tools like emacs and vi.
I’m obviously opinionated about languages, and I’m not even convinced that there’s a 10x difference between languages for most problems. (C is more verbose than Lisp, but can also be written faster.) In my experience, it’s about 2x. (Reading code is another matter. That’s unbounded in time cost.)
On an individual basis it can provide more than a 10x in productivity. Especially in reading code, which is what one spends 10x more time on, if not 100x or 1000x than writing it.
It’s a matter of preference. I would have loved an IDE in the early and mid 90′s, I just couldn’t afford one. A text editor with syntax highlighting was amazing. Once I finally got one, I realized how useful it is.
I understand kids these days like to go retro and be all hipster and not do anything that makes reasonable sense. That’s sad, and _that_ leads to a lot more shitty code than IDEs.
It’s a tool, it depends how you use it. Bashing programmers for their use of tools, while claiming not to bash them, is a logical fallacy.
I love reading your blog, but this post is pure shit.
Point in hand: The horrific Rails exploit currently going around. They (37signals) love their text editors. What a clusterfuck of epic proportions.
“The horrific Rails exploit currently going around.”
“They (37signals) love their text editors.”
Care to explain the connection?
Coding ability has nothing to do with the tools you use and being labeled by the tools you use is a ridiculous way to judge programming competency.
The tools you use are not the important thing, I agree. But being limited by them and not being able to work without them *is* a sign of incompetence.
The Rails exploit only shows the danger of using libraries without fully understanding them, something that most of us have done lots of times (even when we know better). If your bar for competence is “won’t write exploitable code”, I’m not sure if there is *any* competent programmer in this planet
I agree on both counts. My point being that whether you use IDEs or text editors, you can be a good or bad programmer. Being judged by the tools you use is as bad as being judged by the the type of trackball (or mouse) you use … or by the keyboard you type on. It’s non-sensical, and prejudiced in a whole new way. Honestly, I _have_ been judged because I _only_ use trackballs and trackpads (due to injury). That’s a pretty shitty place to be in.
We need such artificial prejudice that Michael is pushing in this article as much as slaveowners did to justify their horrific treatment of other human beings. It maybe extreme, but to be berated because I choose to use a _superior_ tool and to be put into a lower “class” of programmer behind it is disgusting. And yes, the IDE I use for the development I do is superior to anything I’ve tried including just about every text editor and IDE under the sun, IMO. And in this case, my opinion, is _all_ that should matter as _I_ am the one doing the work.
If you can get the job done, why does it matter? No one should dictate that you should use inferior tools. In many cases, the tools that are touted are inferior. My IDE searches by rough estimates 10-100x faster than grep depending on code size (the bigger, the bigger the order of magnitude in speedup) probably because it uses indexes. Should I drop back down to grep or some other tool that’s inferior just so I can be a “cool” programmer? Or so that people don’t think I’m part of this artificially created group and thus an inferior programmer because they see an IDE on my screen instead of vim? I think not! I’ve evolved with the times.
Also, sometimes there are no decent alternatives. Being handy on the command line is useful … on most systems. DOS/Windows isn’t one of those types of systems.
It’s funny, because I never hear this argument from anyone that had to deal only with crappy tools for many years because that was all they had. Gee, I wonder why?
IDEs are not the same thing as IDE Culture.
An IDE is a tool. Sometimes it comes in handy. I like the concept of a read-only IDE. Anything that reduces time spent reading code, and makes it easier to do this, is a good thing.
Also, 90+ percent of time spent in maintenance is a sign of a broken culture. When a company gets to the point where the maintenance load is that heavy, the good engineers get bored and leave, and the bad ones are hopeless. Inept maintenance makes code worse over time. See: http://michaelochurch.wordpress.com/2011/09/23/taxation-without-representation-why-code-maintenance-fails-and-how-to-fix-it/
IDE Culture is the corporate hell in which that’s considered okay, and in which Big Software is tolerated or even considered normal in cases where it’s not necessary. It’s the world in which you have to use the IDE, because that’s the only way to make sense of the crummy custom build system, and the ancient version control system, and because it’s impossible to read or write code in the environment without taking advantage of a bunch of bizarre, undocumented in-house plugins.
If you’re writing good code, use whatever tools you want. That’s what IDEs are: just tools, not intrinsically good or bad and not deserving of severe emotion. For all that, emacs and vi have been considered IDEs, and that’s not unreasonable. SLIME (emacs IDE for Lisps) is an extremely high-quality IDE.
Yes, I understand the difference between the tool and what you label as IDE culture. However, that’s just about every company from startup to the biggest names. I have never come upon an existing code base that wasn’t garbage in companies of all types, none of which enforced the use of IDEs.
The real problem is sociological. No one wants to maintain shitty code except by choice. If you choose to fix it, it’s your “hero project” and you’re usually given the autonomy to do something about it. If it’s your assigned work when you get in the door, then you’re fucked, because it doesn’t give you credibility (just doing what you were told) nor does it do much for your career.
Most of these technology wars are sociological at heart, but unfortunately the sociological issues often obscure what’s actually right for the problem space. For example, give a typical mid-20s programmer the right to burn old code and he will, because even if the code isn’t that horrible, it’s more fun to write new stuff and it’s better for his career.
I have worked at companies with good code, but they tend to be small, slow-growing companies. VC-istan startups generate a lot of deadline code and hire too fast, and because no one expects to be in the same place in 5 years. Big corporations without an engineering culture tend to end up with shitty code because they have talent problems (hire too little, struggle to retain what they get). The companies that generate good code tend to be the ones where (a) people there intend to be there 10 years down the line, and (b) the culture is strongly technical. VC-istan fails (a) and most big corporations fail (b).
Oh yes, it absolutely is sociological and psychological. As a good friend and developer I’ve worked with on and off once said, “The code is just a reflection of one’s thinking.” Truer words cannot be spoken. I would say, that I have tried many times to rescue shitty code projects, or even partly rescue them, and each time I was denied even though I was the lead dev. After a few experiences like that, it gets disheartening.
Yes, I agree. Good code can only come from places where one expects to be for awhile or from contractors with the know how and very high integrity. To date, I have met only a couple of the former, including myself.
Pingback: Visto nel Web – 61 « Ok, panico
Pingback: Learning C, reducing fear. « Michael O.Church
I learned programming by Turbo Pascal first. IDE was great support with prompt context sensitive help. The compiler was fast, too. It has not been as easy to learn e.g. BASH scripting. What is the efficient way to learn programming for Linux?
What are you programming for linux? There are IDEs and cli tools. Your choice. One is not better than the other. That’s why this whole post naming IDE-culture vs. unix philosophy is such bullshit. I use both an IDE and the CLI for what they’re good for. Being labeled as part of an IDE-culture is like being calling a black person a n*****. Michael still doesn’t get that point and most of these young kind won’t until they get older
You choose your tools. Also, there are more helpful forums if you want to get started programming.
I’ve got a different take on IDEs and editors – I believe you just have to use the right tool for the job.
I’ve been using Visual Studio for 12 years now – since .NET 1.0 was released. But I wouldn’t think of using it for anything else other than C# and .NET work in Windows. Many libraries and frameworks in .NET are so huge that trying to do work in a normal text editor seems ludicrous to me, however bad that sounds. That’s just how it is. The fact that you can get the IDE for free (the express edition) makes it even more popular.
For Ruby, C and Go development, I’ve only ever used a simple text editor, maybe with a directory view on the side and syntax highlighting turned on. That’s how I started developing in those languages and its great.
For Java, have you ever tried to use some Swing library class without some form of intellisense? its almost impossible. So for Java, Eclipse is all I ever use now.
Pingback: Blub vs. engineer empowerment | Michael O. Church
Pingback: Gervais / MacLeod 23: The shodan programmer | Michael O. Church
Reblogged this on 42 and commented:
Just what I was thinking about yesterday.