程序員需要具備的基本技能

軟件開發是一個跨度很大的技術工作,在語言方面,有C,C++,Java,Ruby等等等等,在環境方面,又分嵌入式,桌面系統,企業級,WEB,基礎系統,或是科學研究。但是,不管是什麼的情況,總是有一些通用的基本職業技能。

這些最基本的職業技能通常決定了一個程序員的級別,能否用好這些技能,直接關係到了程序員的職業生涯。很多程序新手也是因爲缺少、達不到或是不熟悉在這些基本技能,所以,他們需要有老手帶,需要努力補齊這些技能。而高級程序員應該非常熟悉這些基本技能,而且有能力勝任並帶領其他經驗不足的程序員。

下面這些基本職業技術可以用來做爲對一個程序員的評估,很明顯,下面的這些技能都可以用來做面試。雖然,還有很多非技術的因素,但對於評估一個程序員的技術能力來說,其應該是足夠的了。

下面是程序員所應該具備的基本職業技能:

 

基本技能技能描述
閱讀代碼 這個技能需要程序員能夠具備讀懂已經存在的代碼的能力,這樣的能力可以讓程序員分析程序的行爲,瞭解程序,這樣才能和開發團隊一起工作,繼承維護或是改進現有的程序。
編寫程序 編寫程序並不包括程序設計。不要以爲編程是一件很簡單的事情,很多程序員都認爲編程只需要懂得程序語言的語法,並把設計實現就可以了。但是這離編寫程序還遠遠不夠,使用什麼樣的編碼風格成爲編寫程序員最需要具備的基本技能。能否使用非常良好的編程風格直接決寫了程序員的級別。
軟件設計 這一能力直接決定了需要吏用什麼樣的代碼技術達到怎麼樣的功能,而系統架構設計直接決定了軟件的質量、性能和可維護性。並不是所有的程序在這一方面都非常優秀,但每個程序員都需要或多或少的明白和掌握這一基本技能。
熟悉軟件工程 每個程序員都應該明白軟件工程是什麼東西,都應該知道,需求分析,設計,編碼,測試,Release和維護這幾個階段。當然,幾乎所有的人都知道這些東西,但並不是每個人都很清楚這些東西。現在很多高級程序員都會混淆“需求規格說明書FS”和“概要設計HLD”。另外,程序員還需要知道一些軟件開發的方法論,比如:敏捷開發或瀑布模型。
使用程序庫或框架 一個程序員需要學會使用已有的代碼,無論是標論的程序庫,或是第三方的,還是自己公司內部的,都需要學會做。比如:C++中,需要學會使用STL,MFC,ATL,BOOST,ACE,CPPUNIT等等。使用這些東西,可以讓你的工作事半功倍。
程序調試 程序調試是分析BUG和解決問題最直接的能力。沒有人能夠保證程序寫出來不用調試就可以運行正常,也沒有人可以保證程序永遠不會出BUG。所以,熟練使用調試器是一個程序員需要具備的基本技能。
使用IDE 學會使用IDE工具也會讓你的工作事半功倍。比如,VC++,Emacs,Eclipse等等,並要知道這些IDE的長處和短處。
使用版本控制 一定要學會使用版本控制工具,什麼叫mainline/trunk,什麼叫tag,什麼叫branch,怎麼做patch,怎麼merge代碼,怎麼reverse,怎麼利用版本控制工具維護不同版本的軟件。這是程序員需要明的的軟件配置管理中最重要的一塊。
單元測試 單元測試是每個程序都需要做的。很多單元測試也是需要編碼的。一定要學會在xUnit框架下進行單元測試。比如JUnit, NUnit, CppUnit等等。
重構代碼 每個程序員都需要有最基本的能力去重構目前已有的代碼,使代碼達到最優但卻不能影響任何的已有的功能。有一本書叫《軟件的重構》,每個程序員都應該讀一下。
自動化編譯 程序員需要使用一個腳本,其能自動化編程所有的工程和代碼,這樣,整個開發團隊可以不停地集成代碼,自動化測試,自動化部署,以及使用一些工具進行靜態代碼分析或是自動化測試。

當然,還有很多的基本技術也是非常重要的,比如,與人的溝通能力,語言的表達能力,寫作能力,團隊協作能力,適應變化的能力,時間管理能力,多任務處理能力,自我學習能力,故障處理能力,等等,等等,這裏只是列舉了和技術相關的能力,這些是程序最最最基本的能力,只要是程序員就必需要有的能力。

 

 

優秀程序員的十個習慣

在這個世界上,有數百萬的人熱衷於軟件開發,他們有很多名字,如:軟件工程師(Software Engineer),程序員(Programmer),編碼人(Coder),開發人員(Developer)。經過一段時間後,這些人也許能夠成爲一個優秀的編碼人員,他們會非常熟悉如何用計算機語言來完成自己的工作。但是,如果你要成爲一個優秀的程序員,你還可以需要有幾件事你需要注意,如果你能讓下面十個條目成爲你的習慣,那麼你才能真正算得上是優秀程序員。

1. 學無止境。就算是你有了10年以上的程序員經歷,你也得要使勁地學習,因爲你在計算機這個充滿一創造力的領域,每天都會有很多很多的新事物出現。你需要跟上時代的步伐。你需要去了解新的程序語言,以及瞭解正在發展中的程序語言,以及一些編程框架。還需要去閱讀一些業內的新聞,併到一些熱門的社區去參與在線的討論,這樣你才能明白和了解整個軟件開發的趨勢。在國內,一些著名的社區例如:CSDN,ITPUB,CHINAUINX等等,在國外,建議你經常上一上digg.com去看看各種BLOG的聚合。

 

2. 掌握多種語言。程序語言總是有其最適合的領域。當你面對需要解決的問題時,你需要找到一個最適合的語言來解決這些問題。比如,如果你需要性能,可能C/C++是首選,如果你需要跨平臺,可能Java是首選,如果你要寫一個Web上的開發程序,那麼PHP,ASP,Ajax,JSP可能會是你的選擇,如果你要處理一些文本並和別的應用交互,可能Perl, Python會是最好的。所以,花一些時間去探索一下其它你並熟悉的程序語言,能讓你的眼界變寬,因爲你被武裝得更好,你思考問題也就更爲全面,這對於自己和項目都會有好的幫助。

3. 理性面對不同的操作系統或技術。程序員們總是有自己心目中無可比擬的技術和操作系統,有的人喜歡Ubuntu,有的人喜歡Debian,還有的人喜歡Windows,以及FreeBSD,MacOSX或Solaris等等。看看我的BLOG(http://blog.csdn.net/haoel)中的那篇《其實Unix很簡單》後的回覆你就知道程序員們在維護起自己的忠愛時的那份執着了。只有一部分優秀的程序員明白不同操作系統的優勢和長處和短處,這樣,在系統選型的時候,才能做到真正的客觀和公正,而不會讓情緒影響到自己。同樣,語言也是一樣,有太多的程序員總是喜歡糾纏於語言的對比,如:Java和Perl。哪個剛剛出道的程序員沒有爭論去類似的話題呢?比如VC++和Delphi等等。爭論這些東西只能表明自己的膚淺和浮燥。優秀的程序並不會執着於這些,而是能夠理性的分析和理心地面對,從而才能客觀地做出正確的選擇。

4. 別把自己框在單一的開發環境中。 再一次,正如上面所述,每個程序員都有自己忠愛的工具和技術,有的喜歡老的(比如我就喜歡Vi編輯程序),而有的喜歡新的比如gedit或是Emacs等。有的喜歡使用像VC++一樣的圖形界面的調試器,而我更喜歡GDB命令行方面的調式器。等等等等。程序員在使用什麼樣的工具上的爭論還少嗎?到處都是啊。使用什麼樣的工具本來無所謂,只要你能更好更快地達到你的目的。但是有一點是優秀程序員都應該瞭解的——那就是應該去嘗試一下別的工作環境。沒有比較,你永遠不知道誰好誰不好,你也永遠不知道你所不知道的。

5. 使用版本管理工具管理你的代碼。千萬不要告訴我你不知道源碼的版本管理,如果你的團隊開發的源代碼並沒有版本管理系統,那麼我要告訴你,你的軟件開發還處於石器時代。趕快使用一個版式本管理工具吧。CVS 是一個看上去平淡無奇的版本工具,但它是被使用最廣的版本管理系統,Subversion 是CVS的一個升級版,其正在開始接管CVS的領地。Git 又是一個不同的版本管理工具。還有Visual SourceSafe等。使用什麼樣的版本管理工具依賴於你的團隊的大小和地理分佈,你也許正在使用最有效率或最沒有效率的工具來管理你的源代碼。但一個優秀的程序員總是會使用一款源碼版本管理工具來管理自己的代碼。如果你要我推薦一個,我推薦你使用開源的Subversion。

6. 是一個優秀的團隊成員。 除非你喜歡獨奏,除非你是孤膽英雄。但我想告訴你,今天,可能沒有一個成熟的軟件是你一個人能做的到的,你可能是你團隊中最牛的大拿,但這並不意味着你就是好的團隊成員。你的能力只有放到一個團隊中才能施展開來。你在和你的團隊成員交流中有禮貌嗎?你是否經常和他們溝通,並且大家都喜歡和你在一起討論問題?想一想一個足球隊吧,你是這個隊中好的成員嗎?當別人看到你在場上的跑動時,當別人看到你的傳球和接球和搶斷時,你的團員成員能因爲你的動作受到鼓舞嗎?

7. 把你的工作變成文檔。 這一條目當然包括了在代碼中寫註釋,但那還僅僅不夠,你還需要做得更多。有良好的註釋風格的代碼是一個文檔的基礎,他能夠讓你和你的團隊容易的明白你的意圖和想法。寫下文檔,並不僅僅是怕我們忘了當時的想法,而且還是一種團隊的離線交流的方法,更是一種知識傳遞的方法。記錄下你所知道的一切會是一個好的習慣。因爲,我相信你不希望別人總是在你最忙的時候來打斷你問問題,或是你在休假的時候接到公司的電話來詢問你問題。而你自己如果老是守着自己的東西,其結果只可能是讓你自己長時間地深陷在這塊東西內,而你就更本不可以去做更多的事情。包括向上的晉升。你可能以爲“教會徒弟能餓死師父”,但我告訴你,你的保守會讓你失去更多更好的東西,請你相信我,我絕不是在這裏聳人聽聞。

8. 注意備份和安全。 可能你覺得這是一個“廢話”,你已明白了備份的重要性。但是,我還是要在這裏提出,丟失東西是我們人生中的一部份,你總是會丟東西,這點你永遠無法避免。比如:你的筆記本電腦被人偷了,你的硬盤損壞了,你的電腦中病毒了,你的系統被人入侵了,甚至整個大樓被燒了,等等,等等。所以,做好備份工作是非常非常重要的事情,硬盤是不可信的,所以定期的刻錄光盤或是磁帶可能會是一個好的方法,網絡也是不可信的,所以小心病毒和黑客,不但使用軟件方面的安全策略,你更需要一個健全的管理制度。此外,儘量的讓你的數據放在不同的地方,並做好定期(每日,每週,每月)的備份策略。

9. 設計要足夠靈活。 可能你的需求只會要求你實現一個死的東西,但是,你作爲一個優秀的程序,你應該隨時在思考這個死的東西是否可以有靈活的一面,比如把一些參數變成可以配置的,把一些公用的東西形成你的函數庫以便以後重用,是否提供插件方面的功能?你的模塊是否要以像積木一樣隨意組合?如果要有修改的話,你的設計是否能夠馬上應付?當然,靈活的設計可能並不是要你去重新發明輪子,你應該儘可能是使用標準化的東西。所謂靈話的設計就是要讓讓考慮更多需求之外的東西,把需求中這一類的問題都考慮到,而不是隻處理需求中所說的那一特定的東西。比如說,需要需要的屏幕分辨率是800×600,那麼你的設計能否靈活於其他的分辨率?程序設計總是需要我們去處理不同的環境,以及未來的趨勢。我們需要用動態的眼光去思考問題,而不是刻舟求劍。也許有一天,你今天寫的程序就要移植到別的環境中去,那個時候你就能真正明白什麼是靈活的設計了。

10. 不要搬起石頭砸自己的腳。程序員總是有一種不好的習慣,那就是總是想趕快地完成自己手上的工作。但情況卻往往事已願違。越是想做得快,就越是容易出問題,越是想做得快,就越是容易遺漏問題,最終,程序改過來改過去,按下葫蘆起了瓢,最後花費的時間和精力反而更多。欲速而不達。優秀程序員的習慣是前面多花一些時間多作一些調查,試驗一下不同的解決方案,如果時間允許,一個好的習慣是,每4個小時的編程,需要一個小時的休息,然後又是4個小時的編碼。當然,這因人而異,但其目的就是讓你時常回頭看看,讓你想一想這樣三個問題:1)是否這麼做是對的?2)是否這麼做考慮到了所有的情況?3)是否有更好的方法?想好了再說,時常回頭看看走過的路,時常總結一下過去事,會對你有很大的幫助。

以上是十條優秀程序員的習慣或行爲規範,希望其可以對你有所幫助。

 

十個糟糕的程序員的行爲

1) 情緒化的思維

如果你開始使用不同顏色的眼光來看待這個世界的話,那麼你可能會成爲一個很糟糕的程序員。情緒化的思維或態度很有可能會把自己變成一個怪物。相信你經常可以看到很多很糟糕的程序會使用下面的這些語句:

我的程序不可能有這種問題。
Java就是shit。
我最恨的就是使用UML做設計。
需求怎麼老在變,沒辦幹了。
受不了這些人,他們到底懂不懂啊。
…… ……
這些帶着情緒化的思維和態度,不但可以讓你成爲一個很糟糕的程序員,甚至可以影響你的前途。因爲,情緒化通常都是魔鬼,會讓你做出錯誤的判斷和決定,錯誤碼率的判斷和決定直接決定了你的人生。

 

2) 懷疑別人

糟糕的程序總是說:“我的代碼一定是正確的,我懷疑編譯器有問題”,“我這應該沒有問題吧,STL庫怎麼這麼難用啊”。我曾經見過有程序員這樣使用STL類:map<char*, char*>,當他發現這樣放入字符串後卻取不出來,覺得那是STL庫的BUG,然後自己寫了一個map!我的天啊!

某些時候,過早的下結論是一個很不好的習慣,任何事情都有其原因,只有知道了原因,你才能知道是誰的問題。一般來說,總是自己出的問題。

3) 過多關注實現,陷入問題細節

有些時候,當我們面對一個問題或是一個需求的時候,糟糕的程序員總是會馬上去找一個解決方案或是實現,這是一個很不好的習慣。設計模式告訴我們,“喜歡接口,而不是實現”就是告訴我們,認清問題的本質和特性要比如何實現更重要。

對於一個客戶的問題來說,首先應該想到的是如何先讓用戶正常工作,如何恢復正在“流血”的系統,而不是把用戶放在一邊而去分析問題的原因和解決方案。
對於解決一個bug來說,重現bug,瞭解原來程序的意圖是首先重要的事,而不是馬上去修改代碼,否則必然會引入更多的BUG。
對於一個需求來說,我們需要了解的需求後面的商業背景,use case和真實意圖,而不是去討論如何實現。只有瞭解了用戶的真實意圖,實際使用的方式和案例,你才能真正如果去做設計。
糟糕的程序總是容易陷入細節,爭論於如何實現和實現難題,以及問題的根本原因,而忽略了比這些更重要的東西。只有看懂了整個地圖,我們才知道要怎麼去走。

4) 使用並不熟悉的代碼

糟糕的程序員最好的朋友是 Ctrl-C 和 Ctrl-V ,有些時候,他們並不知道代碼的確切含義,就開始使用它,有證據表明,由拷貝粘貼引發的bug佔了絕大多數。因爲,代碼總是只能在特定的環境下才能正常地工作,如果代碼的上下文改變了,很有可能使得代碼產生很多你不知道的行爲,當你連代碼都控制不住了,你還能編出什麼好的程序呢?

5) 拼命工作而不是聰明的工作

對於糟糕的程序員,我們總是能看到他們拼命地修正他們的bug,總是花非常多時間並重復地完成某一工作。而好的程序可能會花雙倍的時間來準備一個有效的開發環境,工具,以及在開發的時候花雙倍甚至10倍的時間來避免一些錯誤。好的程序員總是會利用一切工具或手段來讓自己的工作變得更有效率,總是爲在開發的時候儘可能得不出錯。後期出錯的成本將會是巨大的,而且那時改正錯誤的壓力也是巨大的。所以,糟糕的程序通常會讓自己進入一種惡性循環,他們看上去總是疲憊的,總是很辛苦的,所以更沒有時間來改善,越沒有時間來改善,就有越多的問題。所以,拼命工作有些時候可能表明你不是一個好的程序員。

6) 總是在等待、找藉口以及抱怨

當需求不明確的時候,當環境不是很滿意的時候,他們總是在等待別人的改善。出現問題的時候,總是在找藉口,或是抱怨這也不好,那也不好,所以自己當然就沒有做好。糟糕的程序員總是希望自己的所處的環境是最好的,有明確的需求,有非常不錯的開發環境,有足夠的時間,有不錯的QA,還有很強的team leader,以及體貼自己的經理,有足夠的培訓,有良好的討論,有別人強有力的支持……,這是一種“飯來張口,衣來伸手”的態度,這個世界本來就不完美,一個團隊需要所有人去奮鬥,況且,如果什麼都變得完美了,那麼,你的價值何在嗎?driving instead of waiting, leading instead of following.

7) 滋生辦公室政治

有句話叫“醜女多作怪”,意思是說如果一個自己沒有真實的能力的話,那麼他一定會在其它方面作文章。糟糕的程序員也是這樣,如果他們程序編不好的話,比不過別人的話,他們通常會去靠指責別人,推脫責任,或是排擠有能力的人,等等不正常的手段來保全自己。所以,糟糕的程序通常伴隨着辦公室政治。

8 ) 說得多做得少

糟糕的程序員總是覺得自己什麼都懂,他們並不會覺得自己的認識和知識都是有限的。這就是所謂的誇誇其談,是的,什麼都做不好的程序員能靠什麼混日子呢?就是吹啊吹啊。

另一個表現方式是他們在評論起別人的程序或是設計,總是能挑出一堆毛病,但自己的程序寫得也很爛。總是批評抱怨,而沒有任何有建設性的意見,或是提出可行的解決方案。

這些糟糕的程序員,總是喜歡以批評別人的程序而達到顯示自己的優秀。

9) 頑固

當你給出一打證據說明那裏有一個更好的方案,那裏有一個更好的方向的時候,他們總是會倔強的認爲他們自己的做法纔是最好的。一個我親身經歷的事例就是,當我看到一個新來的程序員在解決一個問題的時候走到了錯誤的方向上時,我提醒他,你可能走錯了,應該是另外那邊,並且我證明了給他看還有一個更爲簡單的方法,有。然而,這位程序員卻告訴我,“那是我的方法,我一定要把之走下去,不然我會非常難受”,於是,在三天後的代碼評審中,在經過頑固地解釋以及一片質疑聲中,他不得不採用了我最先告訴他的那個方法。

這些程序員,從來不會去想,也不會去找人討論還有沒有更好的方法,而是堅持自己的想法,那怕是條死路都一往直前,不撞南牆永不回頭。

10) 寫“聰明”的代碼

他們寫出來的代碼需要別的同事查看程序語言參考手冊,或是其程序的邏輯或是風格看上去相當時髦,但卻非常難讀。代碼本應該簡潔和易讀,而他們喜歡在代碼中表現自己,並嘗試另類的東西,以顯示自己的才氣。是的,只有能力有問題的程序員才需要藉助這樣的顯示。

記得以前的一個經歷,一位英語很不錯的程序員加入公司,本來對我們這些英語二把刀來說,我們喜歡看到的是簡單和易讀的英文文檔,然後,那位老兄爲了展示他的英語如何牛,使用了很多GRE中比較生僻的短語和詞彙。讓大家閱讀得很艱苦。最有諷刺意味的是,有一位native的美國人後來在其郵件中詢問他某個單詞的意思。呵呵。

你是一個糟糕的程序員嗎?歡迎你分享你的經歷。

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