《Top 10 Traits of a Rockstar Software Engineer》:明星程式設計師必備的十項特質

原文出處:Top 10 Traits of a Rockstar Software Engineer

這是一篇很有意思的短文。文中條列出不多不少、總共十項優秀軟體工程師所應具備的特質,並且很微妙地將軟體工程師比喻成搖滾明星。你是公司的主管嗎?按照這些特質尋找人才就對了!你是在學的學生嗎?按照這十項特質的方向努力學習就沒錯了!

在這十個特質中,我認為最關鍵、同時也是寫得最為貼切的莫過於第一點:Loves to Code

1. 真心喜愛程式 (Loves to Code)

程式設計,是一種發自於內心、不求回報的付出 (Labor of Love)。如同任何的職業一樣,唯有具備滿滿的熱情,才能完成真正偉大的事情。一般人的誤解,常認為撰寫程式是一種機械化,或者純然科學化的行為。事實上,最棒的軟體工程師是工匠 (Craftman),能夠將能量、巧思以及創造力注入每一行的程式碼當中。優秀的工程師,知道程式碼區塊何時被琢磨至完美的程度,也知道在大型的系統中,這些區塊何時會如同謎題般巧妙地拼湊組合起來。熱愛撰寫程式的工程師所獲得的喜悅感,就像是作曲家完成一首交響樂所感受到的狂喜;而也正是這種興奮感以及成就感,使優秀的程式設計者們真心熱愛程式設計。

我個人非常、非常地喜歡以上整段的敘述。Labor of Love 是一個非常棒的形容詞,幾乎將我內心最深層的感動,完整無缺地表達了出來。是否有時會覺得累、覺得倦,或是覺得不知所做為何?不妨回頭找找自己最初的本心吧。

2. 把事情完成 (Gets Things Done)

有些技術人喜歡只說不做,而優秀的工程師是會真正去做事的人。有些人為了找出最佳的方法解決問題,會花費數週的時間設計出複雜且多餘的系統架構與函式庫;真正優秀的程式設計者應該問自己:什麼才是解決問題最容易的途徑?

請記得我們身處現實世界中,而非傳說中的理想境界,沒有所謂的完美解決方案存在。做為程式設計者,我們所應當盡力去做的事情,就是利用手邊既有的各種資源,以最有效率的方式完成交派的任務。如果不能夠把事情完成,再神妙的構思與設計都只能活在白日夢,以及那些不著邊際的大話裡。

3. 持續地重構程式 (Continuously Refactors Code)

撰寫程式,與雕刻非常相像。就像藝術家會不斷地改善自己的創作作品,程式設計者也會持續性地改造自己的程式碼,只為了以最好的方法達到需求的目標。

不要變成老舊程式碼的奴隸。當這些程式碼是由其他人撰寫的時候,你或許可以輕易地推卸責任或者怪罪於別人;但是在多數的情況下,當這些可惡的程式碼,是由你自己所撰寫的時候,才是最令自己捶胸頓足、欲哭無淚的時候。請拿出細心、耐心與愛心,勇敢地挑戰那些殘破不堪的老舊程式碼吧。

4. 使用設計模式 (Uses Design Patterns)

所謂的模式 (Pattern),是不斷重現在自然界與人類行為中的各種情境以及機制;而軟體工程也不例外。優秀的工程師能夠辨認出系統中所使用的設計模式,並且善加利用各種設計模式,同時也不受制於它們。

設計模式是前人智慧的結晶,幫助我們解決重複出現的類似設計難題,同時也成為程式設計者之間的溝通橋樑;但請記得,它們絕對不是程式設計中的萬靈藥:不要為了使用設計模式而使用設計模式;設計模式並不能使原來就很差勁的程式碼變得比較高明。

5. 撰寫測試 (Writes Tests)

有經驗的程式設計師,總是能夠瞭解撰寫測試程式碼的價值所在。測試的存在,能夠證明撰寫完成的系統運作無誤,並且確保過去曾經發生過的臭蟲問題不會再次重現。

為了進行測試而撰寫多餘的、與功能無關的程式碼?專案的進度怎麼辦?還有許多功能項目需要完成?所有的理由都是忽略撰寫測試程式碼的好理由。直到被臭蟲痛咬一口之前都是。花費心力在關鍵的程式碼區塊中撰寫測試,將能夠為你節省下難以計數的除錯時間;但很遺憾地,就我所知,目前台灣的業界並沒有撰寫測試程式碼的風氣,仍然亟待改進。

6. 善用既存程式碼 (Leverages Existing Code)

重新發明輪子一直都是軟體產業中的大問題。優秀的工程師會專注於三種不可或缺的復用 (Reuse) 層面:第一,使用同儕已經撰寫好並且經過測試的系統架構;第二,善用第三方團體所提供的函式庫;最後,則是利用某些網路服務所提供的便利功能。正確地善用既存的程式碼,才能使程式設計者專注於真正重要的任務上,也就是應用程式本身。

不要再寫第一千零一個 Linked List 類別了!不使用其他人撰寫的元件,堅持所有的功能都要由自己親手完成,究竟是自大、自爽、自衛還是自慰?請搞清楚自己的目的、專案的目標,以及核心關鍵的任務。

7. 專注於可用性 (Focuses on Usability)

好程式設計師專注於使用者。無論使用者是事業體或者個人,無論程式設計者為消費性軟體公司或者投資銀行工作,專注的焦點同樣在於可用性。優秀的程式設計者會非常努力地工作,只為了使系統更加簡單並且更為容易使用。他們無時無刻都會想到使用者,不會撰寫出錯綜複雜只有怪咖能夠理解的系統。

這是一項經常被忽略的重要特質。有時候,程式設計者寫得太開心太入迷,往往會忘了撰寫出來的程式,是需要交給其他使用者使用的東西。對於程式設計者來說,使用者的角色其實存在於許多不同的面向中,包括專案中的主程式企畫設計者,以及遊戲成品的玩家,都是開發過程中需要「常在我心」的使用者。

8. 撰寫可維護的程式碼 (Writes Maintainable Code)

工程師界的小秘密:撰寫好程式碼或者壞程式碼,所花費的時間一樣多!紀律良好的工程師,會從第一行程式碼就開始思考維護性以及程式碼未來的演化。絕對沒有任何理由寫出醜惡的程式碼、橫跨數個頁面的函式,或者帶有稀奇古怪名稱的變數。每一字、每一句、每一行的程式碼,都應該恰如其份地展示出它們原先擁有的意涵。

不要總是認為以後、未來或者某一天,一定會有機會回頭改寫那些從前寫不好的程式碼,因而和自己做出妥協,寫出只是暫時堪用的程式碼。事實上,不遵守紀律的程式撰寫方式,不僅難以節省開發的時程,更無法順利推動專案的進度。重構的觀念與程序並不是偷懶的藉口,也不能拯救一個病入膏肓的系統架構。維持良好的寫作風格、命名規則以及嚴謹的設計架構,都是非常重要的基本守則。

9. 能夠以任何程式語言撰寫程式 (Can Code in Any Language)

優秀的程式設計師或許會有個人喜愛的程式語言,但從不固執迷信於其中。在很多的情境中,程式語言的重要性往往不如那些伴隨程式語言而來的函式庫。優秀的程式設計者能夠體認這項事實,並且願意去學習新的程式語言、新的函式庫以及新的方法以建造出更好的程式系統。

對於知識,要求知若渴;對於自己,要能虛懷若谷。保持開放的心態,對新鮮的事物保持孩子般的好奇心;而不是像個「大人」般被冷漠的態度與嘲諷的言語佔據內心,困守在象牙塔中而不自知。電腦科學與軟體程式設計領域的進展飛快無比,不止要從書本中獲取知識,更要盡可能地從網路、研討會,甚至身邊的同儕,學到那些經過真實歷練的經驗與智慧。

10. 瞭解基礎的電腦科學 (Knows Basic Computer Science)

優秀的工程師需要紮實的基礎。也許你沒有資訊科系的學位,但你不能不認識其中的基礎知識:資料結構與演算法。明星級的程式設計師不但需要瞭解,更要能夠內化這些基本知識,因為擁有這些知識基礎,將能夠幫助我們在軟體系統中做出正確的設計決定。

在 90% 的狀況中,我們不會需要使用複雜可怕的資料結構或令人畏懼的演算法,但是請至少先瞭解其中最基本首要的部分。什麼時候該用 vector?什麼時候可以用 list?如果使用 deque 的話有什麼差別?應該優先考慮執行效能,或者優先考慮記憶體空間,甚至是未來擴充的彈性?不同的資料結構與演算法之間,有沒有不同的取捨?招式是死的,用的人是活的,能夠順應局勢見招拆招,才是好本事!

以上,就是為了成為超級星光大道的 Super Star Programmer 所需具備的十項基本特質。看完上述十點特質之後,是不是覺得好像還少了點什麼?是不是有某個很重要的特質沒有被列入其中?還有什麼樣的態度、能力或特徵,是你認為做為一位優秀的程式設計者所不可或缺的呢?歡迎提出來討論喔~ ^_^

18 Replies to “《Top 10 Traits of a Rockstar Software Engineer》:明星程式設計師必備的十項特質”

  1. 自嗨,不是,自回一下。 XD

    除了作者在原文中所提到的十點必備特質以外,另外我認為對於程式設計者來說最重要的能力,應該就是溝通技巧了。

    球不是一個人可以踢的,遊戲更不是一個人可以做的。在大多數的情況中,不論我們面對的是企畫、美術或者程式同儕,都會需要在開發的過程中不斷地溝通、協調、確認與再確認各種事項。這也是人與人之間相互合作的基本能力。

    有時需要想出令雙方都能滿意的作法,有時需要做出妥協與退讓,而有時也需要正面的衝突與碰撞。沒意見不代表就是好意見;事實上,有些時候衝突是必要的。但是要如何拿捏其中進退的分寸,就是所謂溝通的藝術了。

    另外,Labor of Love 一詞其實有個非常貼切的中文翻譯:
    「就是因為愛啊啊啊啊啊~~~!」(閃亮)

    例句:Programming is a labor of love.
    翻譯:程式設計就是因為愛啊啊啊啊啊~~~!(閃亮)

    這樣瞭解了嗎? XD

  2. 丢下程序设计很久了,在看完这篇文章后终于有干劲了.感谢岛民提供连接,感谢Blog主啊XD

  3. @TED:
    你好,
    列表中的第二項,把事情完成 (Gets Things Done) 就是「解決問題的能力」囉。這項能力排第二名的確無庸置疑~

    @lsk:
    謝謝你幫忙回應~ XD

  4. 我似乎有點忘了”最初的本心”,我記得,我小時候,接觸了第一款線上遊戲”仙境傳說”。

    從此我開始想學著寫遊戲,高中沒唸到資訊科。大學選了資工系,學了C語言Java,一下結束加入了老師研究室學習Android

    漸漸的,好像離我想做的越來越遠,也有點無心無力。

    剛好搜尋了NDS遊戲設計,發現了您的學習筆記,我還沒開始看。不過我希望我會有時間把他看完。

  5. @Ming:
    你好,

    既然你就讀於資工系,你已經擁有很好的程式設計學習機會。無須因一時的迷失而失去志向,只要你能夠把握在學校裡的時間,多讀多學多做多嘗試,找出自己真正想要前進的方向,不論未來是否選擇進入遊戲界,你都能夠成為自己人生的掌舵者。

    相信自己,加油。 :)

  6. 10条都是站长亲手翻译的吧?

    翻的太好了,完全没感觉到是英文转的,

    so..看到原文链接是英文的时候,心里小小震动了一下,赞!

    今年10月就要找工了,可惜自己的能力还是太不够太不够,

    C++,数据结构,算法有点基础,做过一些acm比赛,但是都在控制台下写程式,很少用到STL

    所以对windows api,STL都相对用的不熟,

    图形学都只算有个基础,学过点DX,引擎也就刚学了点Ogre

    感觉离进游戏公司感觉还差好远好远,剩下就几个月了,不知道怎么才能达到入行的标准啊

  7. @非常喜欢站长在那个PPT里引的,村上春树的关于长跑的话:

    “人这种东西,生来似乎就是喜欢的事情自然可以持续下去,不喜欢的事情就无法持续。

    其中可能和意志之类的,稍微有一点关系。不过不管意志多坚强的人、多好胜的人,不喜欢

    的事情终究没办法长久持续。还有就算做到了,对身体应该反而有害。”

  8. @wcfairytale:
    你好,

    謝謝你的讚美,這是我個人所寫的翻譯沒錯。 :)

    村上春樹先生所寫的東西,即使運用在工作與人生上也同樣受用。現在距離十月還有整整一季的時間,足夠將 STL 與繪圖 API 學習到更好的程度。你只要記得,這一切都是為了你所喜愛的事情,即使一時遭遇挫折,也可以擁有再次出發的原動力!

    P.S. 我幫你把錯字改過來囉。

  9. @cchmark:
    你好,

    這不是企業老闆找人的條件規章,而是一份軟體工程師與程式設計師對自我的期許及努力方向。

  10. 您好,我現在是專科學生,小時候也很想要夢想當程式設計師,現在專3的資管科,雖然國二的時候跑到書店買了本c++回去看而且也能寫出個簡易的類別的程度,專一的時候暑假再去買了8086組合語言研究,寫出個簡單的方格子動畫(用直接把16進制數字丟到繪圖區的記憶體的方式),但是最近這學期因為一度忙課業和發生各種問題的打擊而對遊戲程式設計師的夢想感到非常大的挫折(比如我聽說業界根本不會用沒能力的新人,業界比較會錄取資工系的人之類的)曾一度想放棄,但是心情經整理後還是想在試試,所以前陣子整理了一些directx的資料想說自己研究看看如果能做出個作品的話說不定會有較高的錄取率,但是還是有點害怕自己可能會做不好,直到看見前輩您的文章後對我有很大的鼓勵,謝謝!!我想我會在試試看把directx好好研究完後試著做出作品來的!!因為我小時候的夢想也是做遊戲程式設計師!如果前輩您有空的話可以有些關於directx上的問題可以請教您嗎?(因為學校老師沒有走遊戲程式的,英文的論壇對我還是有點難度…不過目前有詢問一些大陸的程式師論壇)

  11. @張恩典:
    你好,

    只要你真的有心,願意犧牲享樂時間,用心攻讀程式設計,其實是不是念資工系的關係不大。最主要還是看你有沒有足夠的程式設計能力,以及實際的程式作品!從專科開始努力學習的話,絕對不會太晚,重要的是不要光讀書,而是必須多多動手寫程式,甚至是做出簡單的遊戲作品!

    現在很多手機遊戲App,不論2D或3D,其實都是用OpenGL做的喔。比起DirectX我更建議你學OpenGL,因為它的門檻較低,在手機遊戲上又有廣泛的應用,對你來說可能更有幫助。

  12. @張恩典:
    能寫出讓人眼睛一亮的作品,比空有大學文憑的新人有競爭力多了!
    加油!

Leave a Reply