Jach's personal blog

(Largely containing a mind-dump to myselves: past, present, and future)
Current favorite quote: "Supposedly smart people are weirdly ignorant of Bayes' Rule." William B Vogt, 2010

Vim's learning curve is wrong

This image has been around for years:
learning curve

(I actually found this blog post while searching for the image, it's worth a quick read but touches on a different point.)

Here's my first complaint. The axes aren't labeled. Well, I guess that's better than being incorrectly labeled, since now you have a chance to interpret it correctly. The horizontal axis being time is usually a good guess, and in this case is correct. (Which is why emacs is funny.) Learning curves are fairly arbitrary anyway. I think that they're supposed to measure the rate at which one acquires knowledge or ability, the rate at which one learns. They're supposed to measure velocity. Typically, however, creators of graphs intend them to measure either difficulty, frustration, or total ability or amount learned, with perhaps specific pieces of knowledge along the way. They represent your position. Position where? On some path to total mastery. In the above graph, we have a lot of interpretations to work with. I'm going to present the Proper Interpretation of each editor, which is the interpretation I chose for this post, and then explain why vim's is wrong no matter how you look at it.

Notepad is graphed as both difficulty and an absolute amount of editing ability. At the start you gain some ability, you struggle a bit to remember to save as > all documents before saving as anything non-.txt, and then you're done with ability and that extra step doesn't get any harder (or easier). The program will offer you no more. If you interpret this as a velocity of learning, then you begin to learn and continue learning more at walking speed forever. This is absurd, so we won't use that interpretation.

Pico is the same as Notepad, there's just more to learn and more frustration.

Visual Studio is different. It's graphed as a velocity, but as VS fans will tell you it could also be difficulty. There is a potential joke if you interpret it as total amount learned: "you learn, become a master, then the next version comes out and you forget everything you once knew." But this doesn't really match against reality, and I don't think it was the intended joke, but who knows. If interpreted properly as a velocity, you initially start learning fairly quickly, eventually you've learned almost everything, and you start slowing down your rate of acquiring new knowledge until you've achieved total mastery and there's nothing left to learn. You stop moving. Similarly with difficulty/frustration, it's hard in the beginning, reaches its peak difficulty, and starts getting easier and easier as you succumb to the sweet folds of Microsoft and do everything their way, then you fall into a blissful coma as you shovel piles of C++ or C# code around all day.

Both vim and emacs are "nonsense" which makes them funny. Vim's is a step-function at time=0, which is impossible in reality but makes the point. Vim is legendary for its initial difficulty and frustration, even if that legend isn't true. The graph captures that anyway since it's funny. But it doesn't stay that way, which is where the graph fails. If interpreted as a total amount learned, it's even more wrong, because no one has to learn all of vim before they can do anything. If interpreted as a velocity of learning it's closer to the truth, but still wrong. It suggests forever sprinting to learn new things.

emacs is just for the laughs. There's no possible way to interpret it with actual meaning when you can go back in time. (Did you know emacs lets you go back in time? It's just ctrl+alt+shift+windowskey+backslash+b.)

I'll qualify my following statement after I make it. Vim is easy to get started with and low in frustration. Qualified, a decent out of the box vim is what I said. For Windows, that means gVim. For Linux, that means a complete vim installation and purging of the old vi. For Mac, pick your poison.

You start vim. You go donate to children in Uganda. You quickly type "test" to test. But only one 't' gets printed. You freak out and force-quit the program and never speak of it again.

Well, that's if you're a bad person. If you took the time to look and think, you'd see "Oh hey, in the lower left it says INSERT. I should Google about vim before going further." Or use the included vimtutor, I hear good things about it.

You learn vim has 2 modes: command mode and insert mode. (Depending on the tutorial they might tell you of the other modes. (There are more than 3!)) You type "i" to enter insert mode where you can type and (with a proper out-of-the-box vim) backspace what you type, and the Escape key to return to command mode where you can type the command ":w" to write (that is, save), ":q" to quit, or ":x" to save-and-exit. Sometimes the editor will yell at you and tell you to put a "!" at the end of what you just typed. If you're using gVim, you can set it so that it always starts in insert mode and do your saving and quitting with your mouse, like always. Now it's just as like having Notepad++.

That knowledge is only slightly more than required to operate Notepad, and only slightly more difficult. You learn it very quickly, just like with Notepad. Vim is easy.

If you want to learn vim, though, not just a better Notepad, your journey has just begun. But it's a casual journey. The pace is your own. If you're a curious person, you will learn a lot in a short time (weeks). Once you have more than a few entries in your .vimrc file and you're using hjkl for simple navigation instead of the arrow keys, vim has officially become an extension of whom you are. When you start spending most of your time in command mode and expand beyond just hjkl, when you start adding very useful plugins, you're just doing the equivalent of building muscle to make yourself more powerful.

At some point, if you stick with it, you'll reach the "Productive" point where you're at least as productive as you were before, on average. Maybe you get bitten the first time you try to copy/paste to the global copy/paste buffer, so you need to take time out of your editing to find out vim has multiple buffers and the global one is '+', so you can copy globally by pressing v to enter visual mode, and typing "+y to yank the selection. Pasting from what you copied ages ago in your browser with right click is similarly "+p.

But you're Productive. vim is a part of you, you know a lot. It's not so hard to get to be Productive. After this point, you will stop learning for periods of time, only to learn something new and useful here and there that you will remember. Maybe you even do a learning spree every so often.

If I had to graph vim's learning curve as a rate of learning, it would look something like a sine wave with random wavelengths (mostly short after the first initial learning phase). If I had to graph it as total amount learned over time, it would have some spiky climbs at the start and then increase more slowly with long plateaus. Eventually it would stop, it wouldn't increase without bound as there is a finite amount to learn. If I had to graph it as difficulty over time, it would be similar to Pico's graph but after it becomes an extension of your body it would go down to near 0 again, only to rise every so often when new things are being learned. (Such as the nerdtree plugin which I have yet to like enough to use it, but plenty of other people love it.)

I've only been using vim since around 2006-2007. 6 years may sound a lot, but every so often I still learn new things. Not every day or even every month, but every so often. Today I learned "*" searches for the word under the cursor, previously I'd manually type it out or just type ev/CTRL-R0, this saves so much time. What initially pushed me over the edge to learn it was installing Gentoo Linux the first time, and when I had to edit stuff with no GUI it was either vim or nano. Nano's more annoying than Notepad, so I learned vim. I've never gone to anything else.

Which isn't to say I haven't used other editors in the interim, even editors I thought were okay. My first editor was Notepad, that lasted all of a day because I had a friend giving me some initial tips and he told me to use EditPad Lite so I did, and it lasted me for at least 2 years. I've used VS and can't stand it, I've used Eclipse and tolerate it, I've used Notepad++ and Crimson Editor and they're just okay. The editor based on Eclipse for Adobe Flex was nice, but that's a side-effect in that IDEs are useful for being immediately "productive" with a new language/environment at the cost of actually remembering anything. I've used emacs, I'm just not awesome enough to like it.

If you're thinking about making the jump, go for it. Over 1300 hackers can't be wrong! (It's literally #1 there, that means it's the mainstream option.) It's not even close to as hard as the legends say, really. And if you don't like it, that's fine, at least you tried it.

Posted on 2012-07-27 by Jach

Tags: programming, vim


Trackback URL:

Back to the top

Anonymous August 03, 2018 01:32:00 PM The horizontal axis can be any way to represent experience. (see here: Time is one way, but you can also represent it in "lines of code written" or "projects completed." If this is the case, then some of the interpretations could change. Specifically I'm looking at vim as learning velocity vs number of projects completed.

In this case I'd say that without that initial learning burst (y axis jump) you get no projects written so the X axis never moves. You say it's simple to get started, but I'd disagree when comparing to something like notepad with virtually nothing to learn. Imagine writing an entire project in vim without leaving insert mode. Without a bunch of practice and learning (y axis), that's what most people will end up doing, and therefore revert back to notepad. Just to write a reasonable project you'd have to learn at least 10x more than notepad, so the initial learning is huge in comparison.

As for the plot maintaining a constant learning rate, I think this is because vim users love to play with their environment. Just when they learn how things work they change their key bindings and have to get used to them again.
Jach August 03, 2018 08:52:47 PM That's a useful article to have for reference, particularly the bit that says: "The expression steep learning curve is used with opposite meanings." Regardless of which meaning you care to use, or if you use some other subtle different meaning, such a concept can't be very valuable. Except for having fun internet arguments. :)

When I first used vim for a project, rather than just editing files needed to install an OS, all I had was this coffee mug for reference. I was enchanted by the "wicked cool" stuff. Still that's a far cry from vim mastery, and I didn't use everything on the mug for the project. It didn't feel like I had to know "10x more than notepad" to get stuff done. I had to know a few facts around modes, saving, and quitting, but that's it, and I can learn more as I please. With Notepad, you don't have to learn about modes, or quitting (standard behavior) but you do have to learn about saving (especially "Save As"). On the other hand if you use gVim on Windows you also don't have to learn about quitting (standard behavior). So vim just requires you to learn one more thing. And you won't have to learn as quickly about \r and \n when you try to share your code or open someone else's.

I can't imagine never leaving insert mode, because you have to leave it at some point to save, but I think I get your point. Still, it took many projects for me to start using more vim features more regularly. At some point I rebound Escape to 'jk' and developed a bad habit, which took a lot of time spent in Eclipse to break, where when I was thinking over some code I'd casually cycle pressing 'jk' over and over, moving the cursor up and down. I still use hjkl more than I should, but for my first projects I indeed pretty much exclusively used the arrow keys, escape key, 'i' key, and :x. Occasionally I'd try stuff from my mug until a lot of it became natural, eventually I turned on features like syntax coloring and auto-indenting which I didn't have for many projects when I only used EditPad Lite. This doesn't feel like an impossible must-learn-everything to complete even one project curve you're describing, or even 10x beyond Notepad (or EditPad). It's been 6 years since I wrote this blog post and I still occasionally learn new vim things. (Of course vim 8 has some new improvements, but even apart from those. And if you count the plugin ecosystem...)

We're an experimental bunch for sure but I don't know any vim users who are constantly rebinding things to totally different commands to do it. Yesterday I finally put up a dot files repo so I can get around to easily merging various settings from various machines, I wish I had kept history so you could see how my vimrc file has evolved. A lot of that has been the same since ~2008 at least up until the OmniCppComplete bit. There's also an amusing comment I left myself relevant to yours: ""I can't unmap these from my fingers! Trying to use buffers..." (Over the last year I've tried using buffers over tabs with the help of the buftabline plugin, but I still find myself typing \tn and \tp to switch so I just remapped them to the buffer movements.)
Jach February 04, 2022 05:54:58 PM It's nice to see from logs some people finding this post again. Some of you might be interested in a more recent (but sadly still very much draft) post that describes my own setup in more detail. I did a whirlwind tour of vim with some coworkers once in about 15 mins using that post as reference, but I don't think it worked that well in making adopters out of them. Still, for someone already into vim, they might find something of interest in it.
Back to the first comment

Comment using the form below

(Only if you want to be notified of further responses, never displayed.)

Your Comment:

LaTeX allowed in comments, use $$\$\$...\$\$$$ to wrap inline and $$[math]...[/math]$$ to wrap blocks.