Given the choice of a) tooling, or b) no tooling, you’re not being smart, cool or clever by choosing b.
Obviously, what tools you pick are important and heavy IDEs like IntelliJ are a trade off between speed and functionality, and yeah, more nimble tools do exist, and it’s definitely worth trying different development tools to see what makes you most productive.
…but “no IDE” is just rejecting everything because you didn’t like one thing; it’s just being lazy.
Contrastingly, the worst, slowest developers I've worked with rely on their IDE without understanding what it's doing for them, and are helpless in new/unsupported situations. They also, 100% of the time, screw up their git repositories on a regular basis, and need someone who knows what they're doing to help them out, costing their colleagues time and frustration helping them when they won't help themselves.
Some people from the first group find they prefer not using an IDE. It's rather the opposite of laziness, it's choosing the workflow they find most productive, even if it differs from your preferred workflow.
Do I have to spin up a whole session of the IDE just to run my test suite? Do I have to dig through eleven nested GUI settings dialogues to find out what the command to build the damn project is, just so I can tweak a build parameter? Is there so much boilerplate or XML or whatever within the frameworks we're using that writing or changing code is impossible without automation? These are bad things.
An IDE can be a powerful abstraction, but when the underlying layer it's abstracting over becomes inaccessible, then all it's doing is adding more complexity by obscuring concrete details.
This. All day long.
I can edit, compile and install my kernel and all its drivers in a few command lines from shell, why more and more projects, most way simpler than a kernel, ask me to install for example VSC just to build them? Give me a Makefile and possibly enough instructions to integrate its options into the favorite IDE, but making the IDE a requirement, especially for small projects or those one simply wants to build and install, adds only more complexity.
In the java ecosystem at least, the answer is no. But in highly CI-based situations, the answer is still no, but you DO need the CI system to be up, and the only way to run a test at all is to just commit something and see the CI system run it, e.g. because the tests require a database engine that isn't installed on your development machine.
I'm not saying that's a good idea, just saying that I have seen that in real (as in, for pay and for real eyeballs) dev teams. I've never observed 'I only know how to run my tests inside the IDE'. IDEs (again, this is mostly speaking from the perspective of the java ecosystem) use build tools as project definitions, and those build tests all know how to run the test suite from the command line. `mvn test` is all you need to type.
> Do I have to dig through eleven nested GUI settings dialogues to find out what the command to build the damn project is, just so I can tweak a build parameter?
No, it's `mvn install` or `mvn build` or whatever take on 'build' you are looking for specifically.
If you ditch your IDE, __nothing__ whatsoever would change: Your build is _still_ based on a build tool. (it better be, in the sense that trying to run the build by hand or by patching a bunch of shell scripts together is almost 100% correlated with very low quality dev teams in my experience).
In other words...
what are you on about? IDEs don't abstract such details away to extreme degrees. In fact, insofar that they ever did (generally in GUI builders, which, what with the web and languages like java and Adobe Air and silverlight falling by the wayside in the past few years for front-end dev - are kinda dead), the new takes on such tools all very explicitly keep the whole 'actually this just edits a text file of some sort and this automated click-the-GUI-together tool is bending over backwards to ensure that the underlying file looks as close as possible to what you would write by hand.
IntelliJ even has tooling to get you started:
It took a day or two to get kt over to Maven: basically create a Maven file, make sure everything were in the correct standard Java layout, then build and unzip the war file and compare it to the unzipped war file from the existing build process repeatedly while getting the last tweaks in place.
You nailed it in one — visual studio is exactly what I was complaining about.
> what are you on about?
This complaint is based on a .NET project I used to work on. I'm sure this isn't universally the case for everything .NET, but I had to work with one instance of visual studio open in the code repository and a second instance of visual studio open in the test repository. Everything we did was configured in and executed through VS. It was pretty nasty.
Isn't this the case with Android Studio? Is it even possible to do Android development without Android Studio?
Oh yes: https://www.lambdanative.org/
That said, it would be quite difficult to write anything substantial without Android Studio.
Can you say what language/platform you talk abojt here?
I currently work in Kotlin with IntelliJ where sadly the only working IDE is IntelliJ,but you can build it just fine and even fix bugs using whatever editor you want.
I also maintain a lot of React code, used to work on .Net Core and some plain old C# before Core, I've maintained Angular and before that Java, older Delphi versions and even PHP.
The only projects that had the problem you talk about were
- Visual Studio (not Visul Studio Code) projects from before .Net core
- and old Delphi projects.
That said, I'm kind of stuck with IntelliJ now because of Kotlin (which is an awesome language) but I miss NetBeans a lot and how it - instead of saving everything in its own configuration files - simply accepted Maven .pom files as configuration, meaning uncluttered repos and still having all config synced and up to date everywhere. (Maven is well though out so if you just accept the defaults the files are small and contain only the things they need to contain like name, namespace and version, dependencies and necessary configuration.)
I can happily say that this problem doesn't exist on the other platforms I deal with but I guess you already know :-)
Any decent IDE doesn't enforce such things, it is something questionable devs choose to incorporate. You may inadvertently do this if you don't know an IDE, and try to use excessive features available, but that's still on you for doing so. It shouldn't have been a decision made by someone lacking in knowledge/experience, whether a junior dev or a senior selecting an unknown tool without proper evaluation.
Or are you implying such features from IDEs can somehow be attained by non-IDE toolchains that don't also ingrain you in those toolchains to make use of said features?
how IDE "can" be an abstraction?
It's tool, it's wrapper (e.g button over commandline commands), but abstraction?
I do agree
There is a line between a tool:
A) that makes managing relevant information more efficient, while not hiding any of that information.
B) vs. a tool that hides some details, providing a tradeoff of higher productivity MOST of the time, but at the cost of requiring a fall back tool on other (rare?) occasions.
I would say, once a tool stops providing access to any (even rarely) relevant details, it has become an abstraction.
Specifically: "The best developers" indeed know how to work without an IDE. They also know 5 programming languages, 50 libraries, and know a whole bevy of esoteric randomness, such as difference between a Thompson-NFA style regex engine and the limitations thereof, or something like that.
There is no such thing as a 'the best developer' that doesn't know much. The 'knows many things and has lots of experience' is a tautologic argument.
In the mean time, bad programmers 'use an IDE a lot and are lost without it'. That's also tautologic.
In other words, your observation proves absolutely nothing, in regards to whether it is wise to use an IDE or not. You're not going to magically turn a bad programmer into a good one by uninstalling their IDE. You're not going to ensure a new programmer is going to turn into a good one if you advise them to forego an IDE, nor will you ruin a potentially good one if you install an IDE on their computer.
It says nothing.
The best swimmers can stay afloat with pounds and pounds of weight dragging the down; the worst swimmers will drown. Doesn't mean weighing you down makes you a better swimmer.
An excellent choice in analogies.
Yes, it does; but when you're trying to set a record swimming the English Channel, or escaping from a sinking ship you'd be an idiot to do it deliberately weighing yourself down with weights.
I suppose there's something to be said for both ways of doing things ultimately, depending on what situation you're in, and what your goal is.
...but unconditionally advising people to swim with weights, is simply bad advice.
Your training time to competition time is about 99:1 (on the high side for the competition time). The record attempts (or the emergencies) are a poor continuation of this analogy when it comes to programming.
> unconditionally advising people to swim with weights, is simply bad advice
So we should advise them to use floats instead, since it makes swimming so much easier?
Also, swimmers don't swim with weights to improve technique or strength. I'd expect it would result in unorthodox or worsened technique due to trying to swim around the artificial imbalance of the weights.
They use the aquatic analog to weights - disabling their arms or legs, drastically increasing drag (via multiple swimsuits, or suits with chute-like pockets), swimming against bungee cords.
Using or not using an IDE because good developers use but don’t need an IDE misses the point. It’s never the choice of tool, it’s knowing how to use it.
Also the problems is that most IDEs half ass their git client. When I was using Sourcetree, I rarely ever felt the need to go to the command line.
Wait, isn't this normal? I run "diff" and "git diff" all the time (I think I have those both set up to invoke colordiff, but it's still a command line program). Also vim -d.
Occasionally I browse diffs on Github or Bitbucket instead. I don't find it an improvement. I do favour editors over IDEs, but I don't think I'm an extremist on this one.
Maybe I'm old - my whole os/shell is my ide
People take pride in being less productive and making things harder than they need to be.
That absolutely necessitates understanding of the details of what's going on. You are literally building automation by using additional tooling. It doesn't build it for you.
Also screwing up a git repo, what does that even mean? A bad commit?
The Maven Project IS the configuration. Intellij is only a shortcut. It let's you access configurations via click rather than via a command line expression.
In the end if you want to create a Maven Project configuration or edit the configuration it's on you to do it. At most intellij will just generate boilerplate for you.
For example in CLion you can't create a new target from the IDE, you have to edit the cmake file.
> In order to even get the IDE working with a project you need to configure it to work.
Meaning you already have a Maven/SBT/Gradle project and need to get the IDE to work with it.
Why else would I come on here to make some claim that is false?
Sure, we can probably write code without an IDE but in what way does that mean I'm a better developer? I feel myself cringing whenever I hear that a developer is going to reach for TextEdit or Notepad++ to write code.
People are referring to SublimeText, Vim, Emacs, VSCode as Programming Text editors. VSCode is currently the most popular with vim as purist second and Emacs for "elite" hackers.
I would say VSCode is more in the code editor category, but as I said before the lines are blurring. With enough plugins and configuration even vim and emacs can straddle that line.
In general IDE's tend to have more features less bugs, and have all of these features out of the box.
A dev would require completely separate tools that provide that functionality to say otherwise.
"Best" is a marketing term. How do you mean it as it applies to software quality or productivity?
I'm trying to understand if you're serious, since the author (who notes "I myself use IntelliJ, CLion and MySQL workbench almost everyday") doesn't even seem to believe what he's writing.
The physical equivalent of an IDE would be a laser-guided auto-centering/levelling drill with automatic drill bit changer/sharpener, depth guide, dust evacuation and material sensor with automatic lookup for which hole size and depth to use for the given task. It would weigh 15 kg, need an external power pack and be unusable in tight corners. For some tasks it would be a great time saver, for others it would just be in the way. Some workers would love it, others would fight it. Some would be more productive using it, others would be far more productive if only that damn megadrill did not insist on using that oversized drill bit while they knew the construction would be much stronger by using a slightly smaller bit, necessitating them to override the megadrill tool selector for each and every hole they drilled.
My choice in editors follows the same logic. If I just need to jot down some notes, or knock together a simple bash script or something, it doesn't really matter what I use. Whatever has syntax highlighting and is available on that system is great. Something more complex, where I don't want to spend brain cycles on repetitive tasks or management that the tools can handle for me, I'd rather use something that will handle that for me.
Heck you can do that with a drill too mostly using jigs.
I had to create a few times quite complex shapes from a block of aluminum and what I did I just 3D print a bunch of jigs and drilled out 98-99% of the material away in the same way a CNC would and finished it with dremmel.
True, but the comparison here was against a power drill, not a person with a file and lots of time on his hands. While it may be theoretically possible to achieve the accuracy of a CNC mill using a power drill it would not be the tool of choice. Achieving the repeatability of a CNC mill using hand tools is hard, the more complex the piece the harder it becomes.
To get back to basics without getting lost in a forest of tools these comparisons are based around the 'To IDE, or not to IDE' question. The CNC mill was pulled in through a side door but doesn't really feature in the comparison which was between a simple power drill and the hypothetical 'smart drill' I dubbed 'megadrill' which tries to be as 'helpful' as possible. Some people would like such a contraption, others would shun it.
`laser-guided auto-centering/leveling drill with automatic drill bit changer/sharpener, depth guide, dust evacuation and material sensor with automatic lookup for which hole size and depth to use for the given task.`
Which at that point you probably, as I said, just want a CNC machine.
Given I have and use a handheld drill, a drill press, a manual mill, a CNC mill, a manual lathe, and a CNC lathe, as well as Vim, Emacs, VS Code, and Intellij, I think I'm decently well informed on this topic.
If you setup a CNC mill, you can use it as a manual mill, some people just don't like those ergonomics. I mainly keep my manual mill as a better drill press, and use the CNC for most stuff.
I generally just use intellij for everything in the same way.
IDE is like a big machine that can make a variety of parts to the exact spec very fast with minimal waste. This machine can help even inexperienced operator become productive in short time.
vi/ed is like manual power tools that can accomplish the same task but it takes a lot longer, wastes a lot more material and only experienced operators can be somewhat productive but nowhere near what they could achieve with the big machine.
When users become experts with these tools, they can produce all sorts of custom parts that big machine is not configured for but like they always say - use the right tool for the job: if you are making 5 custom parts then use the hand tools, when you are making hundreds of the same part, use the big machine.
People work with wood for different reasons and people write software for different reasons. All of these tools and approaches can be valid.
Some may be interested in rapid and low cost large scale construction - big teams working fast. Others may be interested in creating a thing of beauty either independently or in small groups of likeminded craftsmen. It shouldn't be surprising that we have many different tools and practices.
When I’m paid to produce, I use tools that help me produce.
When I’m enjoying my passion, I actually do use an entirely different set of tools!
On the other hand, when I’m working on a new area in a several thousand file project with dozens of contributors, or any number of its side-projects that I may have never seen before in my life, it’s more like having talented counsel at my shoulder informing me of all the various contracts I’d be expected to observe for any possible plan of action I might consider taking.
Similarly, an IDE can be overkill when you're writing a self-contained one-off task, or dealing with an opinionated IDE that doesn't fit with the project you're importing.
And then we did it once.
And then we used GPS and Total Stations ever since.
Predrilling a screw hole in some hard wood? Yeah I don't need to feel anything except the power of lithium cells dumping electricity into torque.
For editing or just navigating the source files, the smarter the editor is, the better.
On the other hand I have never seen any IDE where the management of projects (e.g. adding/deleting/moving/renaming files and setting compilation/linking options) and the compilation/building/running functions are as simple and fast as how that can be done without using an IDE (if you know how to do it in the right way).
Especially the Eclipse-based IDE's provided by many vendors of embedded products are the worst offenders.
I have wasted too much time with helping puzzled coworkers to find where in the hierarchy of IDE menus one could find whatever was needed. Even when knowing where to find the commands, using the IDE menus was many orders of magnitude slower than what I could do outside the IDE to perform the same function upon the project.
I know VSCode is positioned this way in the market, probably to differentiate it from VS. And I switched to it from a much less “smart” editor (TextMate, which I still adore! No offense meant to TM creator/maintainers!).
I’m having a hard time seeing this as a clear distinction, however. I mean, VSCode has a built in debugger/protocol, language server/protocol/intellisense, file system aware refactoring, code rewriting refactoring, integrated git client, inline blame and history navigation, GitHub integration, linter integration including automated fixes…
I understand it’s a different tool than VS, but I honestly don’t have a clear understanding of what separates editor from IDE in this case.
Anything lesser, they're calling a simple code editor but, by actual definition, they are referring to a lighter IDE (as the ones that can be installed as base editors they have all extended with plugins/extensions to that point) and then acting like the topic is about the big-brand IDEs, even though it is making points against tooling they are all using with their "editors" just like what you're using VSCode for.
Therefore, if you want you can invoke from inside the editor any commands needed for project management or for compiling/linking/running/debugging.
So in the end you are right that a powerful editor can do what an IDE does, after some customization.
The main difference with IDE's is that the project management provided by the IDE is normally non-optional, you are forced to always use it.
In 30 years of experiencing a very large number of IDE's I have not seen even a single one where using its project management functions would not waste a lot of time comparing to non-integrated alternatives.
I think that it is sad that only a very small number of developers know how to use correctly the ancient program "make". I do not know why this happened. To use correctly "make" I have never needed anything else besides reading the GNU make manual provided with gmake, but it seems that very few people read the manual.
The only time when I had to write makefiles was more than 20 years ago, when I have written a set of universal makefiles, which I have been using unchanged for every software project ever since. For any new project I need to just (optionally) add a file with some extra definitions, e.g. a list of directories where the source files are located or the names of the executables or libraries that must be built. If no definitions are provided, suitable defaults are used, e.g. the directory with the Makefile also contains the source files and the target is an executable with the same name as the directory. The Makefile per target directory may contain just a single line, with an include directive for the universal makefile. The universal makefile searches all the source directories for all the possible types of source files, selects automatically the appropriate compilers based on the language indicated by the file name extensions and on the cross-compilation target if one is specified, generates automatically all the dependencies and so on.
Instead of using "make" like this, almost all the open-source projects that I have seen have huge and immensely complicated makefiles that are much more difficult to read, understand and modify than the source files of the programs. When the makefiles are generated from templates, those are typically even more difficult to understand and modify.
I have no idea who loves those extremely complex methods of compiling and building software projects.
During the years, a lot of replacements for "make" have been introduced, which are better than "make" used wrongly, but I have not seen any which is better than "make" used rightly, without pointless complications.
For easy maintenance, the universal makefile is split into 4 files that are completely universal + 1 makefile with extra definitions per each combination of operating system and CPU type that might be a target for compilation.
The extra files for specific compilation targets, e.g. skylake-linux-gnu, armv7e-m4-none-eabi, i686-cygwin and so on, contain definitions for the names of all the tools that might be used, e.g. compilers for various programming languages, linking commands, librarian commands, binary file modification commands (e.g. objcopy), default locations for library files, default locations for include files, default values for compilation flags.
The 4 completely universal files do not contain directly any command name or command flags or any file name or any directory name. They contain only variable names whose values are either defined in the operating system/CPU specific makefile or whose values are determined by the make command by scanning the project and by transforming the found files, e.g. by replacing the file name extensions.
The 4 completely universal files are:
1. A file for the top directory of a complex project, which descends recursively in all subdirectories and runs there the given make command, if a Makefile exists in the subdirectory
2. A file with make targets. Examples of make targets:
$(RM) $(RMFLAGS) $(MAP) $(BIN) $(IMPLIB) $(EXE) $(LIB) $(WEXE) $(DLIB)
$(RM) $(RMFLAGS) $(OBJS) $(OBJS:.o=.d) $(OBJS:.o=.lst)
all : $(EXE) $(LIB) $(WEXE) $(DLIB)
The 4 variables above are the files to be built, respectively CLI executables, static libraries, GUI executables and dynamic libraries.
As I have said everything must be expressed using variables that will be defined elsewhere.
3. A file with make rules, for how to build any kind of file that might be encountered. Examples of rules:
$(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -o $@ -c $<
$(CXX) $(CXXFLAGS) $(DEFINES) $(INCLUDES) -o $@ -S $<
$(CXX) $(CXXFLAGS) $(DEFINES) $(INCLUDES) -MD -o $(@:.d=.o) -c $<
4. A file with definitions, which is the most important in simplifying the makefiles needed for any new project, which are typically almost empty, because they do not need any other line besides including the universal makefile, even if I usually add a definition with a list of source directories, in order to separate the place where the project is built from the place where the source files are stored and possibly some options, e.g. building a debug version instead of a release version, or building for a cross-compilation target.
Example how to determine the directories with source files:
ifeq "$(strip $(SOURCE_DIRS))" ""
SOURCE_DIRS := .
ifeq "$(strip $(PREFIX_DIR))" ""
VPATH := $(SOURCE_DIRS)
VPATH := $(addprefix $(PREFIX_DIR)/, $(SOURCE_DIRS))
Example of how to scan the source directories for source files written in a certain programming language:
CPP_FILES := $(notdir $(wildcard $(addsuffix /*.cpp, $(VPATH))))
The list for every kind of source files is stored in a corresponding variable like above.
For the source files that are compiled to object files, the list of object files that must be made is computed so:
OBJS := $(CPP_FILES:.cpp=.o) $(C_FILES:.c=.o) $(SS_FILES:.S=.o) $(S_FILES:.s=.o) $(O_FILES)
I use many more kinds of source files, so the OBJS above is just a shortened example.
The operating system/CPU type specific makefile includes the 3 universal files with targets, rules and definitions and it also includes the automatically generated dependencies:
so later only the specific makefile needs to be included, depending on the compilation target.
There are many more details, but these are the general principles. They are intended to make me write as little as possible in the Makefile for a new project.
If I do not define in the Makefile from the project directory what shall be built with "make all", then either an executable is built, having the same name as the Makefile directory, or another kind of file is built, if the directory has a special suffix, e.g. a static library for a directory ending in "_lib".
When I add, delete, move or rename source files, I do not have to do anything for project management, except doing a "make clean" before that, because the next "make" will update the lists of source files.
- Checking sources out of version control
- "Importing" them in the Eclipse workspace as projects from existing code in an arbitrary location
- Configuring what Maven installation, and with what configuration files, is to be used to build your projects
- Defining a grimoire of Maven command lines (build and test locally, build and deploy somewhere else, package for release, etc.) as run/debug configurations
The tooling and layout of the same functionality you choose to use is something more modern tools, and product versions, have improved upon but is unrelated to what an IDE is. It also differs between tools and IDEs. For you to say you've never used an IDE with simple or fast file handling is either a lie or a severe lack of experience, as almost all decent ones have a 1 or 2-click approach via the explorer (and toolbar/hotkeys if you don't like an explorer side-pane). I actually can't think of any half-decent IDE that doesn't have the same approach for files as popular code editors, and I've used a lot of both for different platforms and languages. The only time I've had noticeable experiences is in cases via command/terminal but we're talking GUI editors here.
Worth noting, I have never in my career found myself mentioning any Eclipse-based IDE as an example of a good IDE. In fact, almost every dev I've ever met regards them as the worst IDEs they have experienced, not as a baseline standard for or expectation of IDEs. It's basically redundant to comment on x experience being bad as anyone that has ever used one already knows that is expected.
This is the vi vs emacs debate transposed to build tools and as such will never conclude. Some like their tools to be as "complete" as possible, others want them out of the way. You might be closer to the first camp, I'm close to the second, others are in between. All of these choices are fine, there is no canonical truth here and as such the "nonsense" label used above is just that, nonsensical.
I disagree with the author's dislike of code completion tools but somewhat agree with the other points. In particular how some IDEs create their own project structure.
Many of the most highly productive people use Separated Development Environments. The integration is most times not necessary. I have never had an IDE provide a feature that I needed and couldn't quickly create or obtain.
People let you install your tools in your monolithic IDE package. Why are you so insistent on degrading people who are experts in their fields?
Something like tab completion can't exist outside the editor, but as soon as features can exist as separate tools, bundling them together begins to feel like a limitation. Having separate tools means you can discard the ones you don't need, which is part of what leads to fully-featured IDEs feeling so bloated to me.
I think there are also certain efficiencies that come with bundling as well though. You end up with a bunch of things specifically designed to work together so they in some cases are better than the generic, composable tools. I still find myself firing up IntelliJ from time to time because sometimes it just seems to work better (faster, more responsive, etc) even though the feature I am using technically exists in VSCode + Metals.
I'm, of course, not talking about certain platforms that almost certainly expect or require the use of a specific IDE build tool.
I'm not rejecting IDEs because I didn't like one thing. I like nothing about IDEs except the refactoring feature; but even that doesn't make up for the painful UX. IDEs are like MS Word: they do everything I need but I hate every moment of it.
Henry David Thoreau
One day the IDE will do most of the coding. Users will just click “ok” and spend most of their time asking IT to reboot and reinstall things until it all just works(tm).
The sentences do carry a general spirit, however, which is very nice and pleasing, until you're reminded that Thoreau's rugged existence in nature was supported by his mum cooking him dinner.
I would instead offer the following sentence from Walden as a better encapsulation:
"The best works of art are the expression of man’s struggle to free himself from this condition, but the effect of our art is merely to make this low state comfortable and that higher state to be forgotten."
Namely, our arts and crafts come to cater to the alleviation of the burden of our physicality, yet neglect the needs of our spirituality.
I doubt that either the command line or an IDE can cater much to spirituality, although I've heard some argue that there's much food for the soul in Emacs and Lisp.
But lo! men have become the tools of their tools. The man who independently plucked the fruits when he was hungry is become a farmer; and he who stood under a tree for shelter, a housekeeper. We now no longer camp as for a night, but have settled down on earth and forgotten heaven. We have adopted Christianity merely as an improved method of agri-culture. We have built for this world a family mansion, and for the next a family tomb. The best works of art are the expression of man’s struggle to free himself from this condition, but the effect of our art is merely to make this low state comfortable and that higher state to be forgotten. There is actually no place in this village for a work of fine art, if any had come down to us, to stand, for our lives, our houses and streets, furnish no proper pedestal for it. There is not a nail to hang a picture on, nor a shelf to receive the bust of a hero or a saint. When I consider how our houses are built and paid for, or not paid for, and their internal economy managed and sustained, I wonder that the floor does not give way under the visitor while he is admiring the gewgaws upon the mantel-piece, and let him through into the cellar, to some solid and honest though earthy foundation.”
Some examples of Teaching/learning.
The US Navy is teaches C without an IDE. This makes sense for them. If they had institutional knowledge going back to the 1970s, it all still pretty much applies and looks the same as it did 50 years ago, or another 50 years from now.
Yes. You should use a good tooling if your goal is to make something.
Basically, don't think a single toolset is always going to be superior to your other toolsets. Feel free to mix and match, and change over from one toolset to the other when it's convenient or just more efficient. But of course moderation isn't going to get the clicks.
Your sentiment about the right tools for the job is spot on, and one should strive to choose tools that make you more productive but IDEs are one tool of many.
There's a host of other things to consider, like what is the testing environment like, library management, repository layout, etc. When you're working across a wide variety of languages, setups, environments, etc. choosing an IDE like Eclipse or Atom might not always be the right tool for the job. This also completely neglects the fact that vi/vim and Emacs, while mostly considered "text editors", can be enhanced to essentially be IDEs in their own right.
I think the article's arguments are weak, but so is this counter-argument, sorry.
> you’re not being smart, cool or clever by choosing
I think it's so blurry now as to be a pointless debate anyway - is VS Code an 'IDE'? Or is it an editor with a load of plug-ins available that give it equivalent functionality to an IDE? Because the latter definitely applies to vim and emacs and sublime too, and if it's the first, then... A lot of people don't use an IDE!
The author make a few good points about abusing some features; just like abusing any tool beyond their intended purposes.
IMO the best is the compromise of making the code IDE agnostic. So yeah, I do use IDEs and other tools in conjunction to that the tools I used and the skills I know are not bound to a specific project.
Also the point about IDEs auto generating toHashCode, toString, etc. If your class needs these methods, whether they were auto generated or not seems besides the point. The point the IDE is "compensating for lacking language features" doesn't make sense to me, the code is compensating, whether a human or IDE writes it.
The "brain cycles" are only run while doing the memorization, not while actually doing the work.
> I don't recall ever struggling to remember syntax of languages I frequently code in.
Because you've memorized it.
You can't easily consider a treatment or remedy or library function you don't remember.
https://www.youtube.com/watch?v=jR7d56UeeeU <= Song-based memorization aide for 200 different medications
That and error detection are only features I like in IDEs. For everything else, dedicated tools are often better (but not necessarily easier) than integrated ones.
I kind of view IDEs like that. You can use it as a crutch, or you can take the energy you would have used thinking about the things the IDE is now doing for you and focus it elsewhere.
IDEs are similar. If you want to be as efficient as possible and get as much done as possible, you want an IDE. But if learning and exercising your mind is the goal, you’d be better served with a text editor.
We see this in London cycle lanes. Some cycles are doing a commute, some are trying out for the olympics, some people are doing 25 on a electric scooter and these are alien - hard to predict because they don't obey our intuition about physics. A guy on a scooter does 10mph tops and puts his foot down a lot.
On a steep enough descent, a cyclist could get up to speeds beyond 50 mph, which really isn't safe given the equipment.
(They've also done some more motorized cycle and electric content lately. A recent video showed how to rebuild an old motorcycle's frame into an electric motorcycle using a kit.)
I see, your own peddling can make them go faster. Ok these things should be illegal!
So, at large, I would guess the "as a crutch" use happens far more.
Nitpicking, but in the world of regulations, electric assist tapers off until around 25-30 km/h, at which point you start carrying the entire bike anyway, plus the dead weight of the battery and the motor.
I wonder if this simile could be extended to programming. Being hindered by not being able to choose your own tools?
I live out in the country in Australia. I’m planning a velomobile with an auxiliary motor for both touring and local use, and with this combination I expect and hope to attain an average speed of over 50km/h for the ~39km trip to the nearest town for church and groceries on Sundays. (I currently tend to average 22–24km/h on my recumbent tricycle with no motor, the trip typically taking 1h35–1h50m, with an estimated average power output of 120W. 200W is quite a lot to add!)
Meanwhile there are real 10x developers out there that while they care about the tools stay out of the weeds of them.
This line of blog post reminds me of a Paul McCartney interview I read where someone asked him what kind of strings he uses on his guitar. Paul replied “shiny ones”. I think Paul is actually a lot more technical than he lets on in interviews and probably knew full well what kind they were. What he communicated to the person asking the question was that it doesn’t matter so much.
Me: you realise always doing things the hard way does not improve your output, right?
Young jedi: nah, it's fine. GUI only slows me down, also Perl is the best
Me: alright then
And here I am, doing everything in typescript for my job, use VSCode and Webstorm, in love with GitKraken. What a shame. I'm not a cool kid anymore.
The main difference i see between Text editor and IDEs: with text editors you need to add your own configuration and tooling, and this can takes time, while with IDE everything is already in and you just need to learn the quirks.
But right now, i'm working to integrate programs with OCS pods and weird network architecture (we can only interrogate some APIs from the Openshift cluster as a security mesure), and my collegues who only ever worked with IDEs have a development cycle that look like this:
Write code => push => build new image=> deploy pod with new image => get the input and correct mistakes => repeat
I just work withing the pod (i use vim because its everywhere, but i could build the pod with VSCode inside, it is light enough).
So i'll say this: imho if you're in for a short-term contract, learn to use you employer IDE. If you think you'll stay a long time AND you like to have tailor-made tools for you, you can consider a text editor. Whichever choice you make, always learn a new language with the least tooling help you can get (in Eclipse you can deactivate stuff), and learn ed or Vim if you might go DevOps in the future.
I rarely use IDEs for code generation, I don't even like autocomplete. For this stuff I use code snippets; I develop collections of those for any language I use. You don't need an IDE for it; any good text editor has such features.
For me really important features of a good IDE are:
- Navigation. Being able to right-click on a function or method name and jump to its definition is very handy.
Yeah, I may remember where it's defined; I can also use grep (which does not work all that well for methods).
But jumping is so much faster and does not take you out of the flow.
- Code refactoring. I am refactoring code continuously as I work with it. Even simple stuff like renaming a variable or a function (or a method!) is much easier with an IDE.
- Error highlighting.
Note: I can and sometimes do work without an IDE (esp with more obscure languages which don't have good IDE support).
There is some fun it it too, like going camping and living for a while without creature comforts like running water and electricity. But normally, if a tool is available, why not use it?
About languages: I agree that a well-designed language allows you to factor away most boilerplate code. (This was one thing I really liked about Perl! It basically allows you to develop a language dialect for your particular needs. The downside with Perl was that everybody was "reducing boilerplate" in their own way, but this is another story)
Just my 2 cents :-)
For example, when I write React and I use the Foo component, either it is defined on the same file or it is in one of the imports.
On the other hand, with Angular, the foo component is not imported anywhere. In fact, there is no foo component, just one or many Foo components which declare to use the foo tag, and one or another may be loaded depending on the context of the current component. Good luck getting anything done with such an obfuscated environment without tools to deobfuscate it.
And then you have the heavy enterprise frameworks that make a science out of obfuscated code, so that you don't know what code is being executed, because it is hidden behind several layers of inheritance and interfaces, and the instance to create is choosen via xml-configurable meta-programming based dependency injector. Working with such code is guaranteed insanity without heavy IDEs. I would say it's also insanity with heavy IDEs, but people tend to find that opinion controversial.
There's always the option of not working with such obfuscated environments. I know I don't.
this so much. it's priceless to just type a line and have some warnings such as "hey, you're moving this value but using the variable afterwards, take care" or "hey, it looks like you are only using this argument as a reference, consider not passing it by value" just pop up next to the offending line ; when compared to an IDE-less workflow I pretty much divide the amount of hitting "build" I need by ten or more since the IDE tells me everything wrong beforehand.
And it's not "reimplementing" the whole IDE, it's choosing and configuring parts to work just the way you want it to, and it's usually done in a handful of lines.
Seriously, lsps have gotten really good.
Rename across the project is introduced by lsps.
As for renaming, I don't use it particularly often, but it's documented in microsoft's code action documentation to include: Extract method, Extract function, Extract variable, Extract interface from class (some of those might be language/server dependent).
The neovim framework at least does provide a wrapper for the code action.
VSCode gets most of its capabilities outside text editing from language servers. So the rule of thumb is that if VSCode has it, vim/neovim/emacs usually have it these days.
It's not a solution to a problem, it's a problem searching for a solution.
The reality is that Java at this point is a mature platform broadly supported by many, many stakeholders. Its benefits and issues are, in general, decently well known and understood.
Billions (likely even trillions) of lines of Java are running in production today and those applications will need to be maintained moving forward. IDEs make Java development a much more pleasant experience and so there will be a place for IDEs.
I would add graphical debuggers to your list. You can get by with command line debuggers and there are external attachable debuggers but neither is really comparable to an IDE.
I left them out because I very rarely use them, unfortunately. It's my personal vice, of sort.
I tried to learn to use and love them, more than once, but never learned to be more efficient with them than without, and when a deadline hits, usually drop them and never look back.
I grew up as a programmer without graphical debuggers, developed a rather sophisticated way to debug with essentially "print" statements, but on steroids -- I have a library of debugging utilities which I kind of recreate for any language I am working with. I've a habit to anticipate where they may be needed, and my code is usually peppered with commented out debugging statements (of course all of them generated via code snippets), which help me to be very efficient in debugging my code.
I must say that some of my collaborators over the years hated it, others loved it, adapted my system and used it in their own code.
I think it would be good to un-learn this habit and learn to use debuggers efficiently, and to produce a bit more conventional code. On the other hand, life is short, and there are only so many fights you can hope to win...
Perl for example is extremely difficult for an editor to get right, especially if you use OO framework other than Moose.
On the other hand, as others pointed out, where is the line between an IDE and a sufficiently customized editor using language server?
In the past, this was possible without too much pressure on cognitive load. In modern code bases with all sorts of libraries and layers of abstraction ontop of abstraction ontop of abstraction ad infinitum, it's just not feasible anymore. I got to a point in certain development ecosystems where not relying on tooling started to really hinder me. Self reliance was no longer a strength and a point occurred where I simply had to lean on more and more tooling or I'd be lost.
I still think if you have tooling that does something, you should understand what it's doing and how it's doing, at least once, then let it do every subsequent need for that task. It's good not to have black boxes in your ecosystem. Unfortunately even that is becoming difficult because of the number of layers of abstraction in some ecosystems (especially web development).
I've never been a fan of black boxes that I simply trust and don't know their tradespaces, then hope for the best.
I don't know that I view that as a positive. A lot of software development is about managing complexity. IDEs allow developers to be sloppier.
In the same way that faster CPUs have resulted in less optimized software over the years, IDEs have resulted in more complex software.
Like an architect that uses CAD to create plans for a large building -- sure, they could do that with a pen on paper as well, but it would require a lot more people and a lot more time.
I would buy a more powerful computer. I have a project with 34908 files and IntelliJ doesn't care. Not quite 40_000+ files but still a lot :).
Also with IntelliJ I make fewer mistakes. This "thing" is just more intelligent than I am. Add "SonarLint" to the game and I sometimes don't even know _why_ I am wrong :P.
Also I think "Avoid IDE lock-in of your project" is the wrong subtitle for the following paragraph. You would have the same problems by using just a text editor.
Rd6n6 mentioned refactoring. Do that in an editor and you will go crazy after a while :).
I love and hate my IDE :).
The requirement is a little bit less for some other popular languages.
Dynamically typed languages can hardly be automatically refactored.
In the general case, yes – but that's like saying “no termination analysis is possible because of the halting problem”. The IDE can safely refactor, unsafely attempt a refactor, and warn when it does the latter rather than the former.
Though I didn't know PyCharm didn't do that! That's dangerous; thanks for the warning.
Your command line with vim/emacs and other tools that together arrive at the same feature set as a Integrated Development Environment are still... a development environment.
Not using an IDE doesn't mean you can't have autocomplete, syntax checking, linting, automated rebuilds, and all that other good stuff. It's just not all in one package.
And yes you shouldn't force your choice of (integrated) development environment on others. Different people have different needs: News at 11.
* terminal open at root of project used for source control
* one or more tabs for ssh/VMs etc
* IDE/VSCode/vim for editing
Any of those is fine. And sometimes I switch between them depending on my mood. If I’m out and about it can be nice to conserve battery and focus by going full terminal mode. If I have AC power and a full screen then I don’t mind an IDE as much.
One thing I insist on is doing as much work with git from the CLI. IDEs often do things like staging new files automatically that I’m not a fan of.
To the point on this one, I sometimes find myself running neovim inside the IntelliJ or VSCode terminal, when I need to edit a config file quickly while running scripts in that terminal, or just to edit a file outside the project directory. Or like you, I primarily use the git CLI, because IDEs often use to me unintuitive mappings of GUI buttons to git actions ("what does Synchronize do for git?"), so then it pops open $EDITOR to write my commit message.
When I need to create a lot of "new" code, I'll usually use nvim. When I need to edit/refactor existing code, I'll more often use atom or vscode.
I like both a lot. When bashing out code that is already reasonably clear in my head, vim works faster and with less "overhead". An ide like vscode works better for me when I need a good global search & replace, or something the ide has plugins for.
It's usually useful, at least in some abstract way to the team. It felt essential when I worked alone and was accountable for everything.
No. You're wrong. Not having the right tools raises the cognitive load. You just think it's simpler because you are severely restricted in the complexity of the programs you can create with just your brain and the documentation.
IDEs expand the complexity of what you can build and make you more productive building programs of any size, because features like autocomplete and refactoring take thr cognitive burden off you.
In other words, you state that your way is the right way while my way is wrong.
Notice I did not state that my way is the right way for everyone? What makes you think yours is?
As long as you're working on a fairly standard type of project much of the taxing minutiae of programming is automated away by a good IDE that, unless you're working on a very small project, the time and effort saved is worth it.
In other words, that IDE which may assist you while you're building yet another CRUD project gets in the way when you're, say, developing a driver for a sensor on an IP camera based on a reverse-engineered example.
Sometimes, all the things the IDE lets you not think about is hugely more helpful than the additional cognitive load of modeling what the IDE itself is doing in your head.
Sometimes, having the thinnest possible layer between you and what you're running is hugely more helpful than the additional cognitive load of handling the things the IDE would've turn for you in wetware.
As ever, it's trade-offs all the way down.
Beyond that, it was a great experience. Of course, using python contributed to that great experience since most things can be easily remembered and the autocompletes are not so useful due to the dynamic nature of the language. When I needed to do Java/spring development I always fired up eclipse even if though I knew it would take 5 minutes to start and a couple of seconds for each suggestion to appear. However, trying to develop in Java without an IDE by having the javadocs open and copying and pasting all the package and class names all the time and missing everything static typing offers your is a nightmare!
An IDE on top of that always felt restricting to me. Like why limit yourself? But maybe that's a windows/Mac thing.
This view is exactly the view esposed by Brian W. Kernighan and Rob Pike in The Unix Programming Environment from 1984:
If Unixheads would stop pretending their stone-knives-and-bearskins development tools were equivalent to full-fledged IDEs, development would have advanced much more than it has decades ago.
The old unix editors have had rename across project, find references, go to definition/implementation for several years at this point via lsps (the same way vscode gets its functionality).
> What about integrated debugging
Those are usually (slightly ecosystem dependent) wrappers around a terminal debugger.
> What about hot reload?
Correct me if I'm wrong, but these are also wrappers around cli functionality (once again, might be ecosystem dependent). And you're probably just saving yourself the trouble of writing/running a script.
>Those are usually (slightly ecosystem dependent) wrappers around a terminal debugger.
And, in my experience, are vastly more convenient than terminal debuggers alone.
It continues to amaze me that "it's worth becoming familiar with a wide range of tools and then pick the one that's going to work best for you in any given situation" is a concept so many people have trouble with.
But that's not really a good thing: you only have one system, therefore only one environment.
How do you use multiple versions of the same library for different project? It's not an easy thing to do if you rely on the system paths for libraries.
It's much better if libraries are just a thing you install to the current project rather than being a system wide thing.
It's just more flexible, which allows me to use new tech/langs very quickly.
If you don't focus on IDE features, you tend to implement quality of life improvements at a level that also works in an editor. Like in the language, framework, or library you're using (See the code generators point in the article).
With languages like Rust, that have zero cost abstractions, you don't even run into performance problems when doing so.
I'm sure you know, but Webstorm is limited by license/design. JetBrains sells editors to deal with almost every tech. I personally subscribe to the Toolbox for ~$200/yr and get all the IDEs. Some languages (like Rust) don't have a custom IDE, just a plugin into IntelliJ, the ur IDE from them.
In most cases I feel that using an IDE nets you short-term, micro-productivity gains and also nets you long-term rot/maintenance headaches. imo it's typically not worth it.
1. interactive debugger
2. quick jump to function/constant implementation
3. show usages of function/constant under cursor
4. source control (Git) diffs
5. database browser
There are probably other things I'm forgetting to mention.
Sure, all of these can either be cobbled together to some degree out of the fundamental individual tools. You can add plugins to Vim or Emacs to help with many of these. With enough effort you can get close to what a polished IDE offers... but you're effectively making your own quirky, fragile, non-portable inferior IDE.
Yeah, a heavy IDE is slow to start and resource hungry. But hardware is cheap, and you only start the IDE once every few days (or weeks).
When I'm on a remote server, then I'm in a shell using vim. Fine, and doable. But to really build and get things done, saving my brain for actual problem solving, I wouldn't want to give up my IDE.
Also, some of the cons on OP's list are problems with the language being developed in, not the IDE.
The complaints levied at Java and Android specifically are issues I've really only seen in that language and on that platform. Excise that and all these arguments feel very flat and empty. It has not been my experience at all that using an IDE means I can't remember my project layouts, API calls, etc.
And frankly, this wreaks of the same sort of elitist arguments that only a small minority of grammarians make against spell-check. So what if the tool is a crutch? ALL TOOLS ARE! That's the point of tools, to off-load some forms of manual labor. A table saw and a fence are going to let me make straight cuts a lot quicker and easier than using a hand saw. Humanity grows and life moves on and troglodytes complain that the field is being "ruined", but what they really mean is they can't keep up.
Depending on the language and build system, this might be something I set up manually (set up an IDE project to mirror the build system), something you can set up automatically (export build system to IDE project), or there might be a standard layout for source code that mostly works.
I don’t really use other ide features. Separate terminals are great
Having the ability to do everything from your IDE allows you to leverage all of the tooling built into that IDE.
Sure, in some settings the source code is not available and you still want to debug. Then I use debuggers. But outside of that I prefer printf debugging.
Note that I'm not saying that people who prefer debuggers are wrong. They probably have their reasons, as I have. Everyone should be allowed to use the method they prefer the most.
I do however really wish the world made it easier to help turn both state introspection via interactive debugger and state introspection via printf shotgun into structured trace-level logging that could be shared and/or committed to the codebase independent of the original debugging tool used.
Relatedly, the ability to find all usages of a symbol and navigate between them is indispensable for me at this point.
I don't know if people just aren't aware, but vi and emacs have been doing this since at least the 90s. This isn't some fancy feature that requires an IDE. Recently the support has improved even more through LSP.
No, rtags & friends aren't remotely comparable to an IDE which has a semantic understanding of the code, and will catch the uses without false positives.
Whether the implementation is prone to false positives (it really shouldn't be) is up the server, not the client (e.g. vim or VS Code). The client actually doesn't have 'a semantic understanding of the code' - that's the point of it, not needing every editor to implement an understanding of every language it wants to support.
Recently LSP provides exactly what you desire anyways with context sensitive jumps.
Edit: Regardless, perhaps our difference here lies around what the minimum specification is. My reading of this thread and the post i responded to is that people think moving around in code without an IDE means closing one file, navigating to the next file and opening that one. This is patently not how it works, and what i was adressing.
I often do codebase-wide renamings. I would definitely lose a lot of time if I had to check every single instance of "getId" as you say (to give more precise figures, if I want to rename an "id" I get ~2000 matches). With my IDE I can just ctrl-shift-r and rename any symbol and it works without me having to think about it.
> Recently LSP provides exactly what you desire anyways with context sensitive jumps.
that's likely implementation issues but LSP for C++ in 2021 is definitely not as good & integrated as e.g. native clang integration for parsing.
We know about them. When you start adding these scripts to vi and Emacs they're no longer in the realm of plain text editors. You can add a bunch of hacks to turn vi or Emacs into a poor mans IDE.