原文出處:Top 10 Traits of a Rockstar Software Engineer
http://0rz.tw/o7QTb
這是一篇很有意思的短文。文中條列出不多不少
總共十項優秀軟體工程師所應具備的特質
並且很微妙地將軟體工程師比喻成搖滾明星
你是公司的主管嗎?按照這些特質尋找人才就對了!
你是在學的學生嗎?按照這十項特質的方向努力學習就沒錯了!
在這十個特質中,我認為最關鍵、同時也是寫得最為貼切的莫過於第一點:
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) 層面:
第一,使用同儕已經撰寫好並且經過測試的系統架構;
第二,善用第三方團體所提供的函式庫;
最後,則是利用某些網路服務所提供的便利功能。
正確地善用既存的程式碼,才能使程式設計者專注於真正重要的任務上,也就是應用程式本身。
也知道在大型的系統中,這些區塊何時會如同謎題般巧妙地拼湊組合起來。
熱愛撰寫程式的工程師所獲得的喜悅感,
就像是作曲家完成一首交響樂所感受到的狂喜;
而也正是這種興奮感以及成就感,使優秀的程式設計者們真心熱愛程式設計。
我個人非常、非常地喜歡以上整段的敘述。
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)
不使用其他人撰寫的元件,堅持所有的功能都要由自己親手完成,究竟是自大、自爽、自衛還是自慰?
請搞清楚自己的目的、專案的目標,以及核心關鍵的任務。
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 所需具備的十項基本特質。
看完上述十點特質之後,是不是覺得好像還少了點什麼?
是不是有某個很重要的特質沒有被列入其中?
還有什麼樣的態度、能力或特徵,是你認為做為一位優秀的程式設計者所不可或缺的呢?歡迎提出來討論喔~ ^_^
中文出處
http://0rz.tw/d44Vy
無論程式設計者為消費性軟體公司或者投資銀行工作,專注的焦點同樣在於可用性。
優秀的程式設計者會非常努力地工作,只為了使系統更加簡單並且更為容易使用。
他們無時無刻都會想到使用者,不會撰寫出錯綜複雜只有怪咖能夠理解的系統。
這是一項經常被忽略的重要特質。有時候,程式設計者寫得太開心太入迷,
往往會忘了撰寫出來的程式,是需要交給其他使用者使用的東西。
對於程式設計者來說,使用者的角色其實存在於許多不同的面向中,
包括專案中的主程式、企畫設計者,以及遊戲成品的玩家,都是開發過程中需要「常在我心」的使用者。
8. 撰寫可維護的程式碼 (Writes Maintainable Code)
工程師界的小秘密:撰寫好程式碼或者壞程式碼,所花費的時間一樣多!
紀律良好的工程師,會從第一行程式碼就開始思考維護性以及程式碼未來的演化。
絕對沒有任何理由寫出醜惡的程式碼、橫跨數個頁面的函式,或者帶有稀奇古怪名稱的變數。
每一字、每一句、每一行的程式碼,都應該恰如其份地展示出它們原先擁有的意涵。
不要總是認為以後、未來或者某一天,一定會有機會回頭改寫那些從前寫不好的程式碼,
因而和自己做出妥協,寫出只是暫時堪用的程式碼。
事實上,不遵守紀律的程式撰寫方式,不僅難以節省開發的時程,更無法順利推動專案的進度。
重構的觀念與程序並不是偷懶的藉口,也不能拯救一個病入膏肓的系統架構。
維持良好的寫作風格、命名規則以及嚴謹的設計架構,都是非常重要的基本守則。
9. 能夠以任何程式語言撰寫程式 (Can Code in Any Language)
優秀的程式設計師或許會有個人喜愛的程式語言,但從不固執迷信於其中。
在很多的情境中,程式語言的重要性往往不如那些伴隨程式語言而來的函式庫。
優秀的程式設計者能夠體認這項事實,
並且願意去學習新的程式語言、新的函式庫以及新的方法以建造出更好的程式系統。
對於知識,要求知若渴;對於自己,要能虛懷若谷。
保持開放的心態,對新鮮的事物保持孩子般的好奇心;
而不是像個「大人」般被冷漠的態度與嘲諷的言語佔據內心,困守在象牙塔中而不自知。
電腦科學與軟體程式設計領域的進展飛快無比,不止要從書本中獲取知識,
更要盡可能地從網路、研討會,甚至身邊的同儕,學到那些經過真實歷練的經驗與智慧。
10. 瞭解基礎的電腦科學 (Knows Basic Computer Science)
優秀的工程師需要紮實的基礎。也許你沒有資訊科系的學位,
但你不能不認識其中的基礎知識:資料結構與演算法。
明星級的程式設計師不但需要瞭解,更要能夠內化這些基本知識,
因為擁有這些知識基礎,將能夠幫助我們在軟體系統中做出正確的設計決定。
在 90% 的狀況中,我們不會需要使用複雜可怕的資料結構或令人畏懼的演算法,
但是請至少先瞭解其中最基本首要的部分。
什麼時候該用 vector?什麼時候可以用 list?如果使用 deque 的話有什麼差別?
應該優先考慮執行效能,或者優先考慮記憶體空間,甚至是未來擴充的彈性?
不同的資料結構與演算法之間,有沒有不同的取捨?招式是死的,
用的人是活的,能夠順應局勢見招拆招,才是好本事!
以上,就是為了成為超級星光大道的 Super Star Programmer 所需具備的十項基本特質。
看完上述十點特質之後,是不是覺得好像還少了點什麼?
是不是有某個很重要的特質沒有被列入其中?
還有什麼樣的態度、能力或特徵,是你認為做為一位優秀的程式設計者所不可或缺的呢?歡迎提出來討論喔~ ^_^
中文出處
http://0rz.tw/d44Vy
全站熱搜
留言列表