一個優秀的程序員應該具備的技能和修養
本文采自華仔的采訪中~
https://www.csdn.net/article/2014-10-20/2822190
Q:在你眼中,一個優秀的程序員應該具備哪些技能和修養?
首先是“快速學習能力”。
這里不是說一定要去快速去學習各種各樣的新技術,而是說當有需要時,能夠快速的學習。很多人開始學新的技術和技能時,一開始就一頭扎進去寫樣例、寫Demo、看源碼,我認為這不是好的方法,而且比較耗費時間,收效也不明顯。
我給大家分享我的4W2H快速學習方法。我在學習新的技術的時候,都是按照這樣的步驟去了解的:
1)這個技術能解決什么問題(why)
2)比較適合在哪些場景應用(where + when)
3)這個技術跟我已經掌握的哪個知識或技能類似,有什么差別、有什么特點、 有什么優點和缺點(what)
4)了解前面的問題后,我才會開始去嘗試寫寫Demo,或者更進一步去應用(How to use)
5)覺得有興趣或者其實現很牛逼的情況下,我就去研究一下原理機制,看看源碼等 (How it implements)
其次是“良好的理解能力”。
程序員需要將產品人員或者用戶用自然語言表述的需求翻譯成程序語言。自然語言有一個特點就是通俗但不嚴謹,而程序語言必須是非常嚴謹的。如果對產品人員或者用戶提出的需求沒有很好的理解,即使程序語言寫的再漂亮,技巧再高,最后做出來也是一個不符合要求的產品。
記得有一個關于“美女”的笑話:人聽到“美女”后的反應是想到“天使面孔魔鬼身材童顏巨乳”,而豬聽到“美女”后的反應是“烏克蘭大白豬”,貓聽到“美女”后的反應是“有著金色光滑皮毛的波斯貓”。如果程序員給了貓一個“天使面孔魔鬼身材童顏巨乳”的美女,貓一定會覺得很難看。
第三是“持續不斷的學習”。
軟件開發領域設計的知識和技能太多了。從廣度上來說,有操作系統、數據庫、編程語言、網絡、設計等,編程語言又有幾十種;從深度上來說,操作系統、數據庫、編程語言等都是可以不斷深入去學習的。無論你是從事對技能廣度要求更高的業務開發,還是從事對技能深度要求更高開發專項系統,都需要不斷的學習,這樣才能不斷的提升自己的能力。
第四是“樂于分享”。
如果單純從個人完成工作的能力來看,可能確實也有很多程序員不愛分享但確實很厲害。但我認為真正優秀的程序員一定是除了自己優秀外,還能讓其他人也變得優秀,或者能夠貢獻優秀的開源項目以降低別人的重復工作。分享的途徑有很多種,可以給公司人員做培訓,可以寫博客,可以貢獻開源項目等。
Q:學習方法
“方法”。掌握正確的方法,能夠讓我們事半功倍,更快的提升,一些常見的方法我就不啰嗦了,這里特別分享獨家秘方:
一個秘方是“寫博客”,注意這里不是“看博客”,也不是“轉載博客”而是“親自寫博客”。哪樣東西你覺得你比較懂了,那么你就寫成博客。當你真正去寫的時候,你會發現,其實還有很多不懂或者不清楚的地方,這樣就會促使你又去學習研究;當你的博客發表后,其他人除了能夠從你的博客中學到東西外,也能夠幫你發現一些問題或者錯誤,這樣你就更進一步的掌握了;
另外一個秘方就是“鏈式學習”。形象點說,就是你抓住了一個鏈條的一個鏈,然后慢慢慢慢把所有的鏈都拉出來。舉一個很簡單的例子:socket sever編程。很多人在編程的時候,都是去搜索引擎搜索一下“socket server樣例”,然后對照樣例很快就寫完功能了。然后呢。。。。。。很多人沒有然后了,完成任務就不管了。其實這樣做就錯過了一次提升自己的好機會。
“鏈式學習”則不一樣,它是這樣做的:我通過搜索引擎搜索到樣例完成工作后,我會問自己很多問題:樣例中的api每個參數都是什么含義,有哪些注意事項,還有其它API么?為了解決這些問題,我就可能去找本書看,某個編程語言的socket編程;看完以后我知道socket編程的全貌和一些注意事項,而這些是通過搜索引擎搜索的樣例中沒有的;知道socket編程的全貌后,我又會問自己:操作系統是怎么做的呢? 那我又會去看《UNIX網絡編程》,看完后我就對操作系統層面的又掌握更多了;看完《UNIX網絡編程》后,我又知道socket是和tcp/ip相關的,那我又會去看《TCP/IP協議詳解》。。。。。。
這樣去做就是一條學習鏈: socket server編程 -> socket 編程 -> UNIX網絡編程 -> TCP/IP協議,后面還可以繼續不斷拓展下去。如此不斷的拓展和深入,一個很小的契機就能初始你學到很多東西,而這些東西在以后的工作中某些時刻就派上用場了。
我之前在華為是在Windosw平臺上用MFC開發,后來到了UC轉為Linux平臺開發,用這種方法,大約用了2年就熟練掌握了Linux平臺相關的開發技術,包括Linux、MySQL、C++、Java、PHP等
第三個秘方就是“閉環學習”。“鏈式學習”適合于一組相關聯的知識或者技能的學習,而“閉環學習”更適合業務、相互配合的知識和技能的學習。由于軟件開發是需要多個團隊分工合作的,所以絕大部分人都只負責整個系統或者全流程中的一環,這樣導致很多人以為只需要將自己負責部分精通就可以了。其實這樣不利于個人的發展,一個原因是自己負責的一般都比較窄,可學習和提升的空間可能不多,另外一個原因是很難設計整體上優秀的方案。
而“閉環學習”則不一樣,它是這樣做的:了解整個功能或者業務的全流程實現,涉及了哪些模塊和系統,每個模塊和系統主要負責什么功能,涉及到什么技術,性能怎樣,有什么注意點。舉一個我做個的HTTP的業務樣例:從用戶點擊一個url開始,經過了 瀏覽器 -> 網絡 -> CDN -> Nginx -> PHP -> MySQL -> PHP -> Nginx -> 網絡 -> 瀏覽器,最后呈現在用戶面前。我開發的時候只是用PHP開發,但并不只局限于PHP本身,閉環學習就要求全流程中的每個環節都要去了解和熟悉,這樣你就可以學到了“瀏覽器、Nginx、CDN、MySQL”等很多知識。
有的朋友可能會問:這樣做有什么用呢?其實用處非常大,一個是當出現問題的時候,有了閉環學習掌握的知識和技能,你就知道哪些地方可能有問題,應該如何處理;另外一個用處是,當你考慮設計方案的時候,就不局限于PHP本身了,也許某個功能Nginx或者CDN或者前端能做的更好,用PHP實現反而很蹩腳。

浙公網安備 33010602011771號