好程序員的標準

無數的人問過類似的問題, 怎麼樣才能做一個好的程序員? 在回答這個問題之前, 首先得明白什麼是好的程序員, 這樣纔有方向和目標, 可是這事情太主觀, 可能各人的標準千差萬別, 不談那些傳奇性的獨自一人做出偉大事情的特例, 也不談什麼上天入地, 上帝大牛的詭論, 以下是我比較認可的, 在通常的項目開發中, 一個好程序員的標準.

目錄:

解決問題的能力

在項目開發中, 一個程序員的能力等於其解決問題的能力. 假如想有個尺度來衡量這個能力的話, 一個程序員的能力可以用能完成任務的規模和難度來衡量.

因爲難度上不好那麼簡單的劃分, 並且在一般的項目開發中(非研究性項目), 任務的難度主要來自於任務的規模帶來的複雜度, 這裏把任務從規模上大致的劃分爲1個函數=>1個類=>1個功能=>1個模塊=>1個項目

更細緻的劃分時,函數, 類, 功能, 模塊, 項目本身也有簡單和規模大小之分.

  • 一個初學編程的人總是從最小的函數和類開始學習的.
  • 一個程序員能基本無誤的完成項目中的一個功能算是合格, 在此之前, 對項目的生產力爲負, 即爲他佈置任務, 溝通, 和爲他修補bug的時間其實要多於自己直接完成該功能的時間. 也就是說, 項目中存在這個水平的程序員純粹是爲了培養人才.
  • 能較好完成一個完整模塊的程序員算是較好的程序員, 也是一般項目中的主要開發者.
  • 能完成整個項目的程序員才能算是好的程序員. 在多人項目中可做主程.

不同規模的任務主要的問題也體現在不同的方面:

  • 對於初學者來說, 寫好一個函數和類的難點在於語言本身的語法上.
  • 對於完成一個功能來說, 難點在於理解這個功能, 以及很好的在現有的代碼中加入此功能, 完成的功能不是獨立於項目之外的, 而是要融入項目本身, 除了功能本身和其他功能銜接正常無誤外, 特別重要的就是注意功能實現後不能對其他功能產生預期外的影響, 作爲遊戲開發來說, 典型的例子就是你完成的UI不能讓其他該顯示的UI顯示有問題, 不該顯示的UI又沒有消失.
  • 對於完成一個模塊來講, 暴露給外部的接口設計比內部實現的設計同樣重要(甚至更加重要), 合理易使用的接口設計決定了一個模塊的好壞. 模塊內部實現不好尚可更改, 接口實現不好, 更改起來可能是災難性的.
  • 對於一個項目來講, 在正確的地方使用正確的解決方案是最重要的事情, 最開始的技術選型直接決定項目的成敗, 模塊的劃分能決定項目的開發速度, 架構的設計能決定項目的維護難度和增加需求時的痛苦程度. 對於多人項目來說, 主程讓正確的人去做正確的事情也是無比的重要.

什麼決定了一個程序員解決問題的能力呢? 我認爲有如下幾個因素:

知識積累

在同等水平的程序員之間, 一個對某領域問題有所瞭解, 一個對該領域完全不瞭解, 完成該領域同樣任務的效率差了不止一個數量級. 這就是我們通常所說的"經驗"的作用, 這種經驗可以看作是知識積累,

一個程序員的知識積累很大程度上決定了其解決問題的能力.

有意思的是, 因爲經驗這個事情不太好有準確的衡量標準, 我們爲了簡單, 常常就拿工作幾年說事, 但是這種粗暴的標準有很大的問題, 工作年限同樣長的人水平差異可以是巨大的.

按老話說, 用一年的經驗工作二十年並不等同於二十年工作經驗.

自學能力

這是一個知識大爆炸, 知識刷新頻率讓人無法追趕的時代. 一方面, 面對一個稍有難度的任務, 難免會有超出自己現有的知識範圍的時候, 此時自學能力決定了你能多快的完成此任務(或能否完成此任務). 另一方面, 你的自學能力決定了在平時的工作過程中, 你積累知識的多少.

自學能力強的人, 即使沒有人指點也總能在項目的代碼中學到東西. 而反過來, 學習意願弱的人寫的代碼被別人重構後, 也不會想想, 這段代碼是否改的更好了以及爲什麼. 同時, 一個自學能力強的人也更有希望主動的在業餘去學習更多的知識, 而不是直到工作中碰到纔去被動學習.

從較長的尺度上(比如一個人的工作生涯)來看, 一個程序員知識積累的多少隻決定於其自學能力和他對編程本身的興趣.

品味

本來我是想把一個程序員的品味單獨列出來的, 後來仔細想想, 一個程序員的品味其實不是一種天生的能力, 而是基於現有知識的積累, 形成的對事物的看法. 所以把品味放在自學能力下面的. 同樣的, 其實通常說的正確的思維模式和方法, 其實也是來自於知識的積累. 這裏我就根本不提這一條了.

品味往往用於形容一個人對時尚衣着, 食物等的看法, 其實對程序員來說, 品味也很重要.

不同的品味不僅決定了不同的語言設計者怎麼設計編程語言, 也決定了一個程序員在做項目時會使用什麼語言, 什麼框架.
不同的品味決定了你會選擇什麼樣的操作系統, 什麼樣的工具, 用什麼樣的代碼規範.

不同的品味甚至還決定了你會選擇什麼樣的職業發展方向, 什麼樣的平臺, 開發什麼東西.

對代碼的品味決定了你看到一段不好的代碼就能"聞到壞味道", 對解決方案的品味決定了你在 開源/閉源, 激進/保守, 簡單/功能強大但複雜 等解決方案之間的選擇.

對於代碼的品味, 我覺得沒有什麼比The Zen of Python更有意思的了:

關於品味, 想順面提及的是對設計的品味, 比如一個網站的設計, 一個博客的設計. 我最開始寫博客是在CSDN(http://blog.csdn.net/vagrxie), 最大的好處就是免費, 並且不用我維護, 但是後來慢慢的就感覺模版風格沒有符合我品味的, 而修改模版又麻煩, 彈出框也挺煩人的, 寫文章的方法也嘗試了很多, 總沒有找到一個合適的. 建了獨立博客後(http://www.jtianling.com), 剛開始就是照搬了酷殼的模版, 然後在線寫, 後來感覺模版看着不舒服, 自己從wordpress的默認模版上改了一套自己的, 主要的改進就是文章內容頁面改爲了合適寬度的單獨一列, 代碼段用pygments的default風格做高亮, 因爲我覺得這樣才適合閱讀並且美觀, 而寫博客的方法在在嘗試了很多方法後, 現在使用Vim + markdown來寫, 用git管理, 感覺很順手. 在最新的服務器中, 我甚至把apache改成了lighttpd, 一起下來花費的時間可真不少, 花了那麼多功夫, 其實僅僅是對自己品味的追求而已.

這裏順面推薦兩篇關於品味的文章, 雖然和本文沒有太大關係:

  • 程序員的品味說: 如果你不在乎博客給人的第一印象如何,我不相信你對文章質量能有多在乎.
  • 創造者的品味認爲品味不是主觀的, 就是有客觀的好壞.

瞭解正確的做事方法

這裏提及的正確的做事方法不是指寫代碼這個層面上的, 而是指一個項目進行過程中碰到問題的解決方法, 比如在需求不明確的時候知道需要先明確需求, 知道自己需要先理解問題了然後再開始真正的進入代碼層面的工作, 知道碰到什麼問題能自己獨立的解決, 知道碰到什麼問題自己需要先和其他人溝通了再決定. 知道自己需要先測試才能保證自己代碼的質量等.

這些問題說起來簡單, 但是不這麼做的話, 常常帶來讓人無語的後果. 一個好的程序員, 起碼要先了解這些.

溝通的能力

知識的積累很大程度上決定了一個程序員解決問題的能力, 但那好歹是隻要努力就能學到的東西, 而以下這些, 我甚至都不明白差異的形成是在我們很小的時候就定下來了, 還是在工作中還能繼續學習.

在一個分工明確的項目中, 程序員需要和產品(策劃)溝通以理解產品, 和上級溝通以理解自己的任務, 和同事們溝通以正確的理解要接入的模塊. 無論哪一個方面溝通出了問題都不是小事情, 同時, 程序還需要正確的給產品(策劃)傳達設計的實現難度, 以及在自己完成模塊時讓別人正確的理解模塊的接口. 在不寫文檔時, 正確的口頭溝通非常重要, 需要寫文檔時, 文檔的寫作能力也算做是溝通能力的一部分.

如上所述, 溝通的能力非常重要, 但是好的程序員似乎天生就不太會溝通, 你會發現很多技術頂尖的人, 其實本身就是有社交障礙或者自閉症, 因爲自閉, 才能心無旁騖的潛心鑽研技術, 達到更高的技術水平, 很難想象一個"社會活動家", 他哪有那麼多功夫去學習, 沒有時間學習, 又怎麼能成爲一個技術頂尖的人. 這是一個兩難的問題. 就理想的情況來看, 一個程序員最好是溝通能力足夠好(能正確完成上述溝通工作), 但是又能足夠的靜下心來學習和鑽研. 當然, 這是最理想的情況, 在實際中, 兩者之間的較大波動範圍都算是可以接受的好程序員標準.

對工作負責, 對代碼有追求

對工作態度消極, 代碼總等到別人來測試, 寫代碼以完成功能爲唯一標準, 也不管bug是否成堆, 代碼是否醜陋不堪, 這種程序員就算是工作一萬年也成不了好程序員.

一個好程序員就該對自己的工作負責, 對自己的代碼有追求, 不僅要完成功能, 還要代碼優美, 不說要把代碼寫成藝術品, 起碼也要當作自己的臉面來維護. 一個程序員不能容忍自己的臉上亂七八糟, 那麼也同樣不應該能容忍自己的代碼亂七八糟.

事實上, 別的程序員在瞭解你之前, 先看到的是你的代碼, 通過代碼, 就能知道你是怎麼樣一個人. 項目緊, 隨手寫, 以後改都不能成爲寫爛代碼的理由.

一個好程序員, 起碼是想要把任務完成好的, 起碼是想要把代碼寫好的, 不然如何能稱其爲"好".

怎麼提高自己解決問題的能力?

其實轉了這麼大個彎, 怎麼樣做一個好的程序員的問題可以轉爲問怎麼提高自己解決問題的能力.

溝通能力, 對工作負責任的態度, 對代碼的追求, 很大程度上由性格決定, 我不知道實際中怎麼簡單的去提高, 這裏只稍微的談談我對知識積累的一些看法吧.

  1. 培養興趣(我也不知道興趣究竟能不能培養), 技術工作總是辛苦的, 編程尤其如此, 假如你對此沒有濃烈的興趣, 不能從編程本身找到很多樂趣, 那最好就不要奢求能成爲一個好的程序員了. 對編程的興趣也是我一般招聘初級程序員時最大的要求.
  2. 什麼樣的環境決定你有什麼樣的知識積累過程, 決定了你的品味, 決定了你會以什麼方式來做事. 這個除非有強大的意志力(極少見), 不然概莫能外. 所以, 慎選你的工作環境, 特別是剛畢業的時候.
  3. 不要停留在自己學習的舒適區, 假如你的工作僅僅是以前工作的簡單重複, 你會工作的很輕鬆, 同時, 也很難有提高.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章