Right, it is not about whether or not the code is complex and difficult to understand.
That is the traditional (and bad) commenting advice: that you should add comments to code that is difficult to understand.
The point of commenting everything is to allow the program to be understood entirely from comments, so that when you are maintaining a code base you rarely have to read code, and instead are working with native language.
I would comment your example like this:
// complete purchase process
this.completePurchaseProcess(paymentInfo)
When you have "complete purchase process" written out as english words you can process that much more quickly than "this.completePurchaseProcess(paymentInfo)"
How often do you actually read through the code, trying to understand what's happening and you need english language? Once you read an english description - do you still often have to look at the code to understand what is really happening? //complete purchase process - what does that mean? When you look at the method, I see exactly what's being called and with what parameters.
There must be an insane amount of cognitive overload when having to parse through 2x the number of lines because every line of code is accompanied by a line of comment.
I like your article and the example you used, code clarity is vital. Poor code is often accompanied by many poor comments which only helps in overwhelming the next poor soul who has to read the code.
However, I think that the larger the project, the more sense it makes to comment heavily. Again, code clarity needs to be a priority, but so does comment clarity, so much time is spent reading code by humans who are optimized to parse natural language. So we should cater to our users, not just the users of our executable, but the users of our source too!
Some commenting is okay and necessary. The point is that generally, if you are adding heavy commenting, you can probably refactor the code in such a way that commenting is not necessary. Even in a large codebase.
More seriously: yes, you should name functions/variables/etc. reasonably. And often if you write a comment, you will find you are actually explaining away a wart. But often you need to document business logic, code that needs to be written in a less than clear way for performance reasons, explanations of why you chose approach A instead of what would seem like another perfectly reasonable approach B, URL links for standard doc PDFs, and a million other little things.
There are comments that aren't necessary if you write your code better, but there's others that are needed even if you write your code perfectly.
Documenting business logic works much better via Spec files - if you have BDD test files Given/When/Then format, that'll go a long way in describing functionality, in my opinion.
As a front end web developer, I am not really sure I understand any "advantages" to VIM or VI, or any command-line based edit for that matter. Sure, they might be great if you're doing scripting, messing around with the back end, or dong DB stuff. But for me, writing day-to-day JS, HTML, CSS code, VIM seems like a very huge burden. It's like trying to unscrew a screw with scissors when you have a screwdriver laying next to you. Why not just use a good, well-rounded editor like Sublime or Atom, or even Eclipse, for that matter..? I often see web developer, dabbling in front end code, doing their coding in VIM. Yuck. Someone explain?
I'll start off with the best advice I ever ran across with regards to the beat to death "choosing an editor" question:
> Try all the popular ones, give them all a fair shot like several weeks of exclusive use. Pick one. Practice it. Move on to more interesting problems.
Vim is a good well-rounded editor that can do anything Sublime or Atom can do. And it did them before Sublime or Atom existed. It has Gui's that feel native.
Every new generational crop of editors, I give the new guys a fair shot. Use them for a few weeks, but usually end up back on Vim after that. Last one that really "shook things up" was TextMate...though all editors have those features now.
So, to your question specifically: Why vim?
I could go on about keyboard efficiency or home row or more terse key combos to get the same thing done or blah blah blah. But really, none of that is true.
The reason I use vim is simple: It's feature full, does everything I need, I know it and know it well, and....
I've got better things to do then learn another editor as well.
I think you missed the point. I believe the idea is that there isn't One Editor To Rule Them All. You can try out new text editors, but in the end, just pick whichever one feels right for you, and move on.
I think vim is especially well-suited to front-end dev, as it is one of the software areas that doesn't depend heavily on an IDE (as opposed to, say, Java). For me, vim keybindings are wired into my brain after a few years of use, and it lightens my cognitive load, just as it is stated in TFA. So, to answer your question:
> Why not just use a good, well-rounded editor like Sublime or Atom, or even Eclipse, for that matter..?
- Sublime: Closed-source.
- Eclipse: I don't need that big of an environment just for editing text.
- Atom: That one actually tempts me. I gave it a try, with the vim keybindings plugin, and it had a slight delay when executing commands that made me go away. I'm keeping a close eye on neovim integration, though; it sounds very promising.
It doesn't matter what type of dev you are front/back-end, Vim is (one) of the best text editors for coding period. I use it for both front and backend, and for note-taking when I'm doing UX design. Or when I'm writing blog posts. Or when I need to write a long email.
I also use Vim bindings in my browser thx to cVim.
>they might be great if you're doing scripting, messing around with the back end, or dong DB stuff. But for me, writing day-to-day JS, HTML, CSS code, VIM seems like a very huge burden.
Why is back-end different from front-end? It's all text on a screen. Your statement amounts to, "It might be good for writing and viewing text on a screen but for me, someone writing and viewing text on a screen, it seems like a burden."
I'm a full stack dev and I use vim for everything. From back end system admin to front end.
I don't need any IDE fancy stuff when MVC is pretty straight forward.
If I need to split screen or jump between window it's tmux or vsplit/split on vim really. I don't use many commands with VIM.
Plus most front end tools are cmdline. bower, composer (for php), grunt, npm, etc... I also use vagrant to run my projects and ansible those are mostly cmdline.
I guess in general, I like the fact I have everything in control in one terminal.
I don't have to jump or juggle between different programs. IDE, Commandline, and bunch of other programs.
Some IDE might have bower, grunt, etc.. extension tuck in somewhere where I have to search for. No thanks.
I got tmux and I don't have to jump between window just to restart or do stuff with vagrant either.
edit: I know about 15 at max vim command. >___<. And like maybe 8 commands for tmux.
> Why not just use a good, well-rounded editor like Sublime or Atom
I'd like to ask you the same question: what makes you think Sublim or Atom is a superior text editor (not: I'm not talking IDE) ?
Personally I took the time to learn and be proficient with vim; it is now my editor of choice because it gives me a lot of power and doesn't get in the way. It did take time, but it was worth it. I'm pretty sure if I chose another editor I would be equally proficient; it's not so much about vim being the best one, it's more about how I'm efficient with it today.
I guess you've been turned down by vim because it's hard to start with, and in that sense Sublime or Atom are certainly better text editors ... but it doesn't matter, because the learning phase is only temporary.
No, you understand just fine. VIM has developed mostly irrational cult following. It exists because it came from an era when computer keyboards were not much more than typewriter keyboards. In that context you needed to get creative in order to interact with any software. I was building and messing with computers as far back as 1978, so yeah, I lived that era. And, yes, I too wrote editors and programs that operated in similar fashion. The motivation wasn't to make it more efficient or to keep your hands on the keyboard. The mouse did not exist. All you had was a crippled keyboard.
I don't know anyone of my generation that doesn't simply laugh or look at the cult of vim and isn't perplexed by some of what proponents of the cult say. We ran as fast as we could from those kinds of interfaces once the computer keyboard developed further and the GUI took to the world. The people who had to use that shit 'cause there was no other choice dropped it like hot potatoes as soon as they could.
Here's reality from the perspective of designing, building and programming all sorts of computers for over 30 years:
If you are spending so much time typing that fractions of a second at the keyboard make a significant impact on the development cycle, you are a hack and don't know what you are doing.
Real software and hardware engineers spend far more time designing and planning than coding. Coding is the end result of a process and, in terms of time, is often dwarfed by design and debugging.
As an example, we are in the middle of a month-long process of designing a database for a project. Not one line of code has been written. Every day is devoted to database structure discussions and documentation. Once settled, the DB code might take a week to write.
We are also designing an FPGA-based board as part of the same project. Over three months have gone into research, circuit design and other tasks. The time coding in Verilog won't even compare to the effort before getting to that point.
And then there's debugging and the inevitable pivot or two.
There's nothing whatsoever an editor can do to impact this development cycle in a measurable way. We use several GUI-based code editors. Nobody here is saying "if I could only keep my hands on the keyboard for another few seconds I could...". If they did, the laughter in the room would be so loud you could measure it with a seismograph because it is so utterly ridiculous.
Do I use vim? Of course, only when I have no other choice.
> If you are spending so much time typing that fractions of a second at the keyboard make a significant impact on the development cycle, you are a hack and don't know what you are doing.
The win isn't that you saved fractions of a second. It's that your quick edit was fast enough that it didn't interrupt your thought process.
> As an example, we are in the middle of a month-long process of designing a database for a project. Not one line of code has been written. Every day is devoted to database structure discussions and documentation. Once settled, the DB code might take a week to write.
You say this like trial-and-error isn't a valid way to design something. You can spend as much time as you want designing things up front, but until you try them, there's a good chance you won't know if it's a good design. You'll always find issues later on.
Another way to look at it is this: you could write down you ideas on paper or in diagrams, or you could write them down in code, and run them to see if they make sense/work the way you think they should.
The code you write while designing doesn't have to be the same codebase as the final product. It can just be a bunch of small programs you use to help formulate your ideas.
Once you have enough experience you do far less trial and error. I rarely write code that does not work. By that I mean, my code generally solves the problem to be solved on the first write and is generally significantly bug-free.
That's not because I am a genius or somehow super-human, I have a lot of experience and have developed a decent process of design-before-coding. Trial and error is really wasteful. It still has it's place in areas that might not be entirely clear. Outside of that, design-before-coding can save tons of time and aggravation.
In other words, coding is the end of a process, not the process.
Ah, I think the difference is that usually when I'm working on something, it's a new problem, and I need some time to not only try to find a solution, but first understand the problem. I find that trying to write a solution helps me to get the problem space loaded into my head.
Different people have different processes, I suppose. And that's a probably a big reason for why people have different opinions on tools: they have different use cases.
If you are spending so much time typing that fractions of a second at the keyboard make a significant impact on the development cycle, you are a hack and don't know what you are doing.
This is a point addressed in the article.
And that’s why I don’t really care about Vim “speed”. I am not “faster” using Vim. I do not generate noticeable more code at the end of the day. But I generate it with less effort and caring more about the quality than battling with my keyboard. I am more relaxed, more in control, focused in what matters. Caring about getting stuff done. More productive. That’s Vim killer feature.
I think I can say with a good degree of certainty that the hundreds of editors I have used during my career so far, including vi, vim and some self-written, have been absolutely and utterly irrelevant to the success, failure, timeline or budget of any project I've ever done.
In case the question comes up. Why self-written editors? In the early days of using Forth to bootstrap embedded systems you pretty much had to write yourself a decent code editor to go with the system. I've never written an editor for other systems I've used. Whatever was available was always good enough.
"Real software and hardware engineers spend far more time designing and planning than coding. Coding is the end result of a process and, in terms of time, is often dwarfed by design and debugging."
This part of your post is correct. If you don't spend much time coding then you don't have much reason to use Vim. ON the other hand, for those "fake" software guys who do spend a lot of time coding, especially editing code, then . . .
There have always been at least two camps in software development, and I'll throw in hardware in there due to FPGA's.
One goes to code right away and just hacks their way towards a solution.
The other camp is one where the problem is well understood first, design is done "on paper" and coding is simply the embodiment of that design process.
I say "on paper" because today it is likely to be a set of software tools such as state-machine editors, Excel, CAD, MATHLAB, etc.
It is my opinion that to write bug-free code that solves the problem efficiently, elegantly and as close as possible to on time and budget one has no choice but to design first and code as the end-result of the design process.
That's not to say that sometimes you need to write some test code as part of the design process in order to understand what might be going on. This happens a lot in embedded systems. Another scenario is web development where you need to interact with an API a bit before you can really understand how to work with it.
So I am not proposing not coding at all. What I am saying is that those code experiments are part of the "First Seek To Understand" rule (from "The 7 Habits...") that will make the project a success. The code experiments don't seek to solve the problem but rather add knowledge and understanding to the design process that will form the foundation for the actual solution.
The fact that you resort to attacking the messenger just furthers the idea that, for some, vim is an irrational cult, one that has never been shown to have a measurable impact on project performance from nearly any metric.
Look, I used vi for probably a decade while working on Silicon Graphics supercomputers and Sun workstation (Irix and Solaris). I know it pretty well. If I was maintaining Linux servers full time today there would be no question that vim would be the tool to use for obvious reasons. Beyond that...it has no impact on project performance.
To be totally clear, my position isn't that vim is useless. I never said that. What I am saying is that vim offers no advantage in the context of a non-trivial project when compared with GUI-based tools from Notepad++ on up. The design and debugging process offers far more significant gains than vim ever could. In fact, I'll go farther, I'll bet that solid documentation has a far greater effect in any project metric than the negligible gains ascribed to vim.
Want to use it? Fine. Your choice. Nothing wrong with that.
I would say Vim is not good or well rounded until you cobble together a set of addons that let you do things that many IDEs (and text editors) do out of the box.
Even as a text editor - it doesn't come with things like bookmarks, navigable hyperlinks, syntax highlighting, collapsible sections, etc without plugins.
You've got me on navigable hyperlinks with a simple setting or key stroke out of the box, but it's trivial to write a binding to open the URI beneath the cursor.
Eh, I use all of those extensively...vim ships with syntax highlighting and syntax aware folding for every obscure language I've ever used (well, there was one academic project language that didn't ship those with vim, but guess what, they had those files in their repository).
Marks are powerful and play really well with all the movements like I'd expect them too...
So, you regularly use vim without any plugins then?
Marks doesn't even have a visual indicator. So, somehow I doubt you're just using marks for bookmarking and vanilla syntax highlighting is pretty weak.
Let's see your list of plugins. I bet you have at least 30 of them.
Edit: Forgot to answer the initial question. Yes, I use vim exclusively for anything involving editing/writing. In the past years mostly C, C++, Haskell, LaTeX, Java, python...
Largest codebases I've worked with were upwards of 200k SLOC.
I strongly disagree. They're all very powerful features that don't require anything to be useful, if not user friendly, out of the box in a reasonable distribution of vim.
Mostly it depends on where you are coming from. The key is that you'd want to avoid context switches. All my other tools are CLI, so adding an editor in a tmux pane rounds everything out. There is no context switch between my editor and my tools. If all my tools were GUI, It would be a cobbled together set of tools with an editor around it. If you were using an IDE suite and
Your evaluation and thinking is entirely correct. For most mainstream development the vast majority of your time will be spent on things (debugging, testing, stepping through, reading documentation, refactoring, etc) that don't involve typing/modifying reams of text. Furthermore, if you're using languages like C++, Vim has very poor refactoring support when compared with commercial tools like Visual Assist. Having said that, you can get a decent IDE with Vim plugins - for free. You don't have to learn or use Vim's text manipulation commands at all, if you don't want to.
> Why not just use a good, well-rounded editor like Sublime or Atom, or even Eclipse, for that matter..?
Because those editors use GUI that isn't optimized for editing text. They use the same widgets that are used by the Volume Manager, the Finder, the web browser. Vim's interface is geared only towards editing text.
Ah yes, the infamous volume-manager-that-you-have-to-adjust-with-a-text-field, I hate that thing.
According to you VIM isn't optimized for editing text. It uses a UI (terminal) that was designed for entering batch commands and displaying their output.
The terminal isn't a UI, and VIM doesn't use any UI toolkit, not even curses, but rather is completely custom. This enables it to specialize in text manipulation, whereas graphical editors like Sublime build on top of the OS-provided UI and keyboard conventions. Some prefer the latter because it is more "familiar", but personally I think the fact that VIM is its own thing is what makes it special.
>It's like trying to unscrew a screw with scissors when you have a screwdriver laying next to you.
I kind of felt the same way when I first started learning vim. It seems "foreign" at first, but now that I'm able to use it pretty proficiently I think this is a bad comparison.
Vim is more like a power screwdriver that not just anyone can handle, but once you get the hang of it you never want to use a regular screwdriver again.
Vim, unlike other editors, usually requires customization though, so you really have to emerge your self in vim to get up-and-running whereas with an editor like atom you're typically good to go.
VIM's (and others like it) strengths are in its configurability and movement commands and lack need for the arrow-keys. So much so that theres a VIM plugin for just about every popular editor, including Sublime and Atom.
I believe the need for fancier editors like Sublime and Atom has come about because VIM's development has waned and its code base is hard to update and innovate on.
VIM has a learning curve, but once you're over the hump you can do many kinds of edits much faster than using the mouse. You need to join two lines of text? It's one key press. Transpose two lines of text? Three key presses. Also macros are very easy to define and use (once you understand how they work).
What would you say is the learning curve? From someone who is used to GUI editors, moving to VIM...how long until you're actually reaping the benefits?
It took me a week to be comfortable with the mode change, then 1 month to be relatively comfortable with Vim... and 5 more month to properly reap some of his advantage when editing text. It may seem a long time, but it's taking me the same time to be comfortable with emacs right now, and from what I remember, with other editor more or less the same difficulties arise (I've never tried Sublime enough for example, but for Textmate it took me less time only because the feature set is narrower... habits themselves took the same time to kick in)
It took me a day to use it as "notepad with syntax highlighting", couple of weeks before I started preferring normal mode to insert mode, and from there on I slowly evolved my configuration and the tricks I use/learn.
Nowadays when using vim I occasionally have people ask me "how did you do that?" and I won't even know what keys I typed. The keybindings are as natural as walking/grabbing things and require as much conscious thoughts. I usually have to redo it in slow motion to see what I did...
I can highly recommend Bram Moolenaar's essay on "The Seven Habits of Effective Text Editing" (http://www.moolenaar.net/habits.html), it has a vim focus, but I think his points are editor agnostic
Edit: I started using vim as a windows GUI person in university since I wanted to edit over SSH and vim was the only editor with syntax highlighting on the servers. So it's not like I was a terminal wizard back then (I am now :p)
Play VIM Adventures[1]. Even doing a few levels was enough for me to start enjoying benefits. And I didn't switch from Visual Studio for the bulk of code editing, I just added VsVim. That way I'm not forced into VIM. I can use as much or as little as I want. No pressure. (Though all my config editing is over SSH and VIM itself is great there.)
The biggest, easiest, thing for me was macros. Being able to easily and quickly record a macro and apply it over many lines - that's slick. Like converting a CREATE TABLE to a set of ORM instructions, or into a structure. Before I'd use some half cooked regex and clean up after. Now I just edit one l line while in a macro then run it N times.
Apart from that, it's just a ton of little things that add up.
Also: ViEmu for Office. VimFx for Firefox (there's one for Chrome too, Vimium). Browsing without the mouse is really great; quite elegant.
Spend 2-3 hours and learn the basic movement methods, this brings you at a comparable speed with a mouse-based editor. After a week of using you'll develop muscle memory and you're already faster. At least that's my experience with teaching other people so far.
Don't think of Vi or Vim as of regular editor. Think of it as functional programming language for text transformation, because that is what it essentially is. General form of vim command is nOm: repeat n-times operator O on text the motion command m moves over. So, for example, 5dw says "delete 5 words" because w command moves to next word, d operator stands "delete". The nice thing about this is that once you learn new motion command or operator, you become instantly more powerful. For example, after you learn that ) moves to the next sentence, you can now delete whole sentences with d). After you learn about change c operator, you can now change whole sentence with c). This essentially deletes the sentence and puts you in insert mode so you can type in the replacement text.
There are also text objects that allow you to apply operator on the object. For example if you are anywhere inside if (.) condition, you can type ci(, which stands for change inner ( i.e. change everything inside brackets, to quickly change the condition. Similarly, there is inner word, paragraph, XML tag, brace {, etc text objects, so it is fast to delete/modify etc entire blocks of code.
Vim also has Perl compatible regex engine, which allows you to do sweeping changes and transformation of text. The operators work with search motion as well, so you can do things like d/regex i.e. delete everything from current cursor position to first match of regex etc.
The :g ex command alone alows you to do fairly complex transformations, for example
:g/pattern/d
delete all lines that match pattern, or
:g/pattern/m$
move all lines matching a pattern to end of file, or something more complex:
:.,$g/^\d/exe "normal! \<C-A>"
Increment each number at the start of a line, from the current line to end-of-file, by one.
Of course there are a plethora of motion commands that allows you to quickly get to the line, character etc where you want to edit, all without taking your hand from the keyboard. In fact, most times you will be editing text well before the person using a mouse finds their mouse cursor.
This is all just scratching the surface (Vim has over 2000 commands), but hopefully it gives you the flavor of the experience editing in Vim. Getting proficient in Vim is liberating, it allows you to bend text effortlessly to your will without too much thinking really. It's programming your text, and in my mind a very valuable skill, just like learning the UNIX/POSIX command line is incredibly valuable (it's another functional programming environment where individual commands are your functions/filters and shell is executing them and you can string these filters together in unique ways to do all kinds of powerful things that simply don't have an equivalent in the GUI). Command line and Vim multiply you as developer and there is nothing in the GUI world that can come even close to this experience.
It sounds like you aren't familiar with mechanical keyboards and why people like them-- any similarities you're noticing between this keyboard and an old HP from 2000 are purely cosmetic.
I happen to own two keyboards: a mechanical one similar to this, and the Apple keyboard. I think the Apple keyboard is great, but finally it's a very basic laptop-style chiclet keyboard with nothing remarkable about it other than good aesthetics and compatibility with OS X. I won't bore you with the details of why people are willing to pay $100-$200 for a keyboard like this, but just know that there are good reasons.
I'd be willing to bet you haven't looked very hard. Sure the Apple keyboards look nice but the feel and responsiveness of the keys are far from the best.
The keys are honestly terrible in that they wear down quickly. The plastic is soft, which feels nice, but eventually rubs or scrapes away way faster than the harder plastic in older keyboards.
That aside, the low-travel feel is fantastic and it's worth the trade-off.
I personally have the code TKL and like it quite a bit with the thicker O-rings (reduces travel and noise), but I'd really like something like a higher-quality laptop-travel scissor switch which actuates a mechanical key switch.
I thought it meant "nice contribution to the conversation". It's easy to come to this conclusion when you think down-vote means "you're not contributing". I up-voted many comments I totally disagree and down-voted many I agree (because they were unrelated to the discussion). Am I a minority?
Well, the HN guidelines[1] do not mention any rule as what constitutes 'right' voting criteria. As a regular HN user of over 6 years it feels even surreal to be in a discussion about the basic features of this wonderful platform. It's never wrong to question the basic premises of life, though(;
I do believe we have the a similar kind of understanding for when to up-vote. What is a 'nice contribution to the conversation' other than arguments or facts that 'I do agree with' in them being a nice contribution to the conversation.
I fear we would have to have a meta-discussion on the concepts of good and bad and how they are flawed in that there are no montains without valleys^^
Upvoting based on "this comment brings up good points and arguments" rather than "this comment says things that I think are true" helps fight against the community becoming an echo chamber.
Exactly. It's not that interesting to be in a forum where people are only awarded for being in line with the popular opinion. The alternative is to award constructive contributions.
Add a separate +1/thumbs-up button next to the arrow. It doesn't really need to do anything more than show that people are in agreement (better even if it can do it without showing numbers).
This is why you don't let "Editor-In-Chief" do web development. Sounds to me like someone's too lazy to learn JavaScript. When will people stop trying to make HTML into an all-in-one product? It was built to be simple, to provide markup and that's it. That's the magic behind the troika of HTML-JS-CSS. They all deal with individual, meaningful functions to make a site work. Blending function with markup is just bad coding. Thumbs down.