I remember it like it was yesterday. It was the year 2000, Dr. Pargas was standing at the front of our data structures class talking about some data structure-y topic while an SSH session was projected on the wall in front of us. Someone asked a question, and he said something along the lines of "Well, if you want to be a real computer scientist you need to start using vi". I think he was smiling as he said it, and in hindsight his statement wasn't even slightly true, but being young and easily influenced like I was I went back to my dorm room and immediately took up training myself how to use vi. It was rough going for quite a while, but once I started to get the hang of things I realized that I could work really quickly in vi.
Flash forward 6 years, and I was enamored with TextMate. I was working a job doing Java development, but at the same time learning Rails and working on Rails projects in my spare time. It felt like every article I read and screencast I watched was demonstrating how to accomplish text editing zen with TextMate. The fact that I was using Eclipse every day was filling me with nerd rage. So I bought a Mac and within 10 minutes of turning it on had purchased TextMate.
I can honestly say that neither text editor change made me a much better programmer.
Great tools just don’t make you that much better. Your tools are really important. They’re wonderful, in fact. But Tiger Woods would beat all of us with a junky set of clubs, Messi would outplay us without any boots on, and Rafael Nadal could probably beat any of us on a tennis court with a classic wooden racket from the 60′s. Heck, he could probably beat me with a ping pong paddle. The skills, knowledge, and experience that you’ve built up are the most important part of the equation.
So tools don’t make the programmer. What does? I think many aspects of what makes for a great programmer depend on what you’re working on and the people that you’re working with, but I’ve seen some common traits in people who have had a lot of success in software development that I felt were worth sharing. I’m not sure if these are skills that you can pick up or if they’re things that you’re born with, but I feel pretty strongly that I’d be in a great position if I worked a bit more on these traits and a bit less at switching text editors.
The best programmers that I’ve known put people first. They’ve realized that the software that they’re writing is for people, even if it’s just the back end of a complicated system or a protocol that no one but other developers will ever use. They write documentation because it’s important. They help people use their code. They’re willing to work extra and deal with a bit more complexity to give the people using their software the right solution.
Amazing programmers are ridiculously hungry for knowledge. They’re always telling you about something new or interesting. They tend to read a ton (whether online or offline) and they tend to love to try things out and learn from experiences as well. They’re not afraid of trying out new languages or new platforms.
Once you’ve been writing software for a while you start to see problems arise that look awfully similar to other problems you’ve dealt with. Being able to recognize those and transform past solutions to work in your current situation is a really valuable skill. Being able to improve on the solution each time is even better.
Note, though, that this doesn’t mean you blindly say that because a past solution could work it must work. That’s where skillfully applying problems pattern matching comes into play. You’ve got to have an eye for knowing when it’s right to apply a past solution and when it’s not.
My brother took a Python class his Senior year of high school, and when I asked him how he liked it, he told me I was insane to be a programmer and that it was the one of the most boring things he had ever done. To some extent, I think he’s right. I talk to computers way more than I talk to people most days. I get a huge thrill from the fact that I get to turn line after line of basically jibber jabber into working software. Not every person out there loves doing these things, but the best programmers that I’ve met absolutely love making software.
Software development is pretty much always slower than anyone wants it to be. It takes time. Sometimes you have to just be patient enough to crank out the code you need to write. Sometimes as developers we get to write really fun code, but sometimes we get the displeasure of writing a lot of code that we’ve basically written a hundred times before. I think the best developers keep going because they can see the big picture of what they’re working on and they love the process of building that end result piece by piece.
These are a few traits that I think make for a really good programmer, but it is by no means an exhaustive list, so I’d love to hear your take. What do you think makes for a great programmer?
原文地址:
http://thinkvitamin.com/code/what-makes-a-great-programmer/
译文
这件事仿佛发生在昨天一样令我印象深刻。那是2000年,帕尔加斯博士站在我们的数据结构课教室的前方,讲解着一些y型数据结构的内容,同时把一个SSH 的窗口投影在我们前面的墙上。有人提出了一个问题,随后他用下面的话回答道:“如果你想成为一个真正的计算机科学家,你就得开始用 Vi 。”我感觉他在说这些话的时候还在微微笑着,而事后发现他说的这个观点根本不对。 但是由于年轻并且易受影响,当时的我回到宿舍后立刻了开始了自学如何使用 Vi 。我度过了很长一段艰苦的时间,但是当我开始变得对其熟悉的时候,我意识到我用 Vi 会干的非常快。
六年之后的我爱上了TextMate。我当时的工作是Java开发,而在那同时我也在闲暇时间学习 Rails 并制作 Rails 项目。我感觉我看过的所有文章和视频都在讲述如何使用 TextMate 来完成文本编辑的苦行。其实,每天使用Eclipse 使我像书呆子一样脾气暴躁。于是我买了台Mac,并且十分钟之内就购买并安装上了 TextMate.
老实说,我并没有因哪款文本编辑器而成为一个更优秀的程序员。
特别好用的工具并不能让你变得突飞猛进。你所使用的那些工具的确很重要,或者说,它们其实非常好用。然而老虎伍兹就算用一套烂球杆也会打败我们所有人,梅 西就算不穿球鞋都能胜过我们,拉斐尔·纳达尔也许用一把六十年代的老式木质球拍就能在网球场上击败我们中的任何一个人。见鬼,估计他用一个乒乓球拍就能打败我。你所积累的那些技术,知识和经验才是最重要的部分。
工具并不能使你变成一个程序员。那什么可以呢?我认为,成为一个优秀的程序员在很多方面取决于:你做什么工作,你和什么人一起工作。然而我发现,在软件开发领域取得很大成功的人身上都有些共有的特质,是值得我们分享的。我不确定这些是你需要去特地学习的技巧亦或是你与生俱来的能力,但我非常确定的是,我若在这些方面多花些心思,少花些功夫更换文本编辑器,那么我一定比现在的职位更高。
1. People First 以人为本
我所认识的最好的程序员们会把人放在第一位。他们已经意识到就算他们编写的软件,其实只是个复杂系统的后台或是只有开发者会使用的协议,它还是给人们使用的。他们为软件编写文档,因为这很重要,他们为别人重用他们的代码伸出援手。他们愿意去做额外的工作,并且处理更复杂的问题,只为了给使用他们软件的人们一 个最好的解决方案。
2. Appetite for Learning 求知若渴
那些出类拔萃的程序员们都对知识如饥似渴。他们总是告诉你一些前沿的或有趣的东西。他们读着成百上千的书(既有在线读物也有离线读物),而且他们似乎总是乐于亲手尝试,也乐于在经验中汲取知识。他们不惧怕尝试新语言或者新平台。
3. Skillful at Problem Pattern Matching 擅长匹配问题
当你写了一阵软件程序后,你开始发现问题的存在。那些问题和你曾解决过的问题看起来相似得让人头痛。认识到这件事情并把原来的解决方案应用到当前状况,这种能力是非常重要的。如果你能每次改进你的解决方案那就更好了。
注意,就算如此,你也不应该盲目的说什么“因为用这个旧方案解决过老问题,所以它肯定可以用来解决新问题”。 这个部分才是应用“问题模式匹配”的技巧所在。你必须拥有一双可以甄别应用旧方案是否可行的慧眼。
4. A Little Bit Insane 少许疯狂
我的兄弟在高中四年级上了Python课程,当我问起他喜不喜欢这个课的时候,他表示我想当程序员这个主意真是疯了,那个课是他上过的最无聊的课程之一。在某些程度上,我同意他的观点。我和计算机交流的时间比和人交谈的时间更多。我能把一行行基本上称之为胡言乱语的东西变成可以运行的软件,这一事实令我大吃一惊。并不是所有的人都热爱这些东西,但是那些我所认识的最好的程序员们绝对是热爱制作软件的。
5. Persistentence 坚持不懈
软件开发总是比所有人想象的都要慢。它很花时间。有时候你只能足够耐心的去做出你需要写的代码。有时,作为开发者,我们想去写一些很有趣的代码,但是有时我们也会因为要去敲打那些已经写了上百遍的代码而厌烦。我相信那些最棒的开发者们能坚持下来,是因为他们可以看到一幅他们正在干的事情的宏图,并且他们喜欢为最终结果而添砖加瓦的过程。
以上这些特点是我认为一个真正优秀的程序员所应该具备的,这当然不尽完善,所以我也乐于了解你们的意见。你觉得要怎样才成为一个卓越的程序员呢?