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.
People First
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.
Appetite for Learning
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.
Skillful at Problem Pattern Matching
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.
A Little Bit Insane
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.
Persistent
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 堅持不懈
軟體開發總是比所有人想象的都要慢。它很花時間。有時候你隻能足夠耐心的去做出你需要寫的代碼。有時,作為開發者,我們想去寫一些很有趣的代碼,但是有時我們也會因為要去敲打那些已經寫了上百遍的代碼而厭煩。我相信那些最棒的開發者們能堅持下來,是因為他們可以看到一幅他們正在幹的事情的宏圖,并且他們喜歡為最終結果而添磚加瓦的過程。
以上這些特點是我認為一個真正優秀的程式員所應該具備的,這當然不盡完善,是以我也樂于了解你們的意見。你覺得要怎樣才成為一個卓越的程式員呢?