很認真的聊一聊程序員的自我修養
首先要談的是,今天的話題所聊的程序員包含哪些人?
在中國,寫程序,不僅僅是一種興趣,更多的時候,還是一種普通職業和謀生工具
大公司有厲害的程序員,優秀的架構師,但大量的小公司也有很多普通的程序員。在我這些年的工作經歷中,也越來越深刻的感受到普通程序員的影響和力量。對於高階程序員,所謂八仙過海各有神通,各有各的成就,各有各的修養,但程序員在達成較高的水平之前,有一些“自我修養”,是最基礎的,是普世的。
所以今天的話題面向的程序員,就是所有的正在寫代碼或者曾經寫過代碼的程序員,也包括廣義上的程序員,例如項目經理、架構師等等。
做任何事都是有明確目的,那麽
再談一談,程序員提高自我修養是為了什麽?
程序寫的好有人崇拜,有妹子喜歡?還是到博客、論壇、社區發表文章進行分享獲得成就?我想這是少數人的追求,也是更高的追求,在這之前
我認為,在中國,程序員提高自我修養的目的,是為了
1、更好的融入工作,減少困難,增加成就
2、穩步的提升能力,提高收入,達成財務自由
2、站在更高的層面看待自己的學習和工作,樹立更加適合的人生觀價值觀,家庭幸福,生活愉快
說的更通俗一點,就是用更加合理的方式和方法,賺取到更多的收入
說了這麽多廢話,進入正題
何為程序員的自我修養?
正面論述很難說清楚,反向描述可能更通俗易懂一些,自我修養的對立面是“沒有修養”,先說一說在這麽多年的工作、學習、生活中,遇到的一些我認為“沒有修養”的程序員形態
1、程序員小張遇到了一個開發問題,很著急,想到了有幾個群,於是到群裏發了他的問題,坐等回答,發現沒有人回答,就直接對話群主的QQ,群主也不回答,於是小張就搜索,突然搜到博客園有個帖子講解了相關話題,他看完就給博主留言,我的郵箱是:[email protected],麻煩博主把源碼發給我一下,謝謝。
2、程序員小張進公司3個月了,老板布置了很多任務,他覺得老板很沒人性,工資給的不高,加班也不給錢,於是在寫代碼的時候能省就省,客戶反饋有問題也不主動解決,敷衍為主,又過了一個月,跳槽了。
3、程序員小張正在寫一個功能模塊,需要進行某種加密,到百度搜到了一個編碼模塊,看不明白具體寫了什麽,但是放到程序裏剛好適用,於是就這麽原封不動放進去了。
4、程序員小張要對某個功能進行研發,項目經理對他說,這個功能應該能搜索到,你去搜搜看,小張就在百度搜啊搜,一天過去了啥都沒找到,項目經理來到小張身邊坐下,換了個關鍵詞,1分鐘就搜到了解決方案。
5、程序員小張學.NET已經工作3年了,工資還是10000,和公司提漲工資也沒答應,想跳槽又猶豫,這時某個前輩對他說,你去看書吧,多看一些書,例如 《Visual C# 從入門到精通》,《CLR via C#》《Javascript權威指南》等等,於是小張買回來了, 隨手翻了翻發現有些東西是他已經會的,有些看不懂的好像又用不到,而且書這麽厚,要不要浪費時間去看呢?小張就這樣反復糾結了半年,依然每天上班工作,下班LOL,偶爾還抱怨一下工資低。
6、程序員小張到了一家新公司,在做一個項目實現某個功能時,想起來以前做過這樣的功能,可是竟想不起怎麽實現了,於是就到自己電腦上找文檔,找了好久也沒找到,只好放棄,最後又折騰了2天,終於還是把這個功能給實現了。
7、程序員小張某天非常不高興,因為他的項目經理和項目組的產品人員又變更需求了,新的需求又要對整個結構進行大的調整,小張很郁悶,到一個QQ裏發泄情緒,說了這個事,於是立馬,QQ群裏面炸開鍋了,程序員小李說,對,產品就是狗日的!程序員小王說,對,他媽的項目經理整天高枕無憂,就知道壓榨開發人員!程序員小孫說,是的是的,我上一家公司也是這樣,壓榨程序員,幸好我走了。就這樣,在一片罵聲中,幾個程序員心情舒暢了,小張開心的去玩王者榮耀去了。
我想,有些人可能已經明白我要說什麽,有些人可能還不明白,具體的話我也說不出來,只能用一句話來概括就是:
在編寫代碼的過程中,善於學習、掌握方法、勤加思考、勤奮努力、持之以恒,長此以往,在編程中,你會發現不一樣的自己。
以上這些還是比較抽象,那麽
提升自我修養的具體方法有哪些?
程序員具體如何達成“較高的修養”,每個人各有自己的辦法,我無法說到很細,就和如何提高做人修養一樣,一句兩句話是說不清楚的,但是有些說法也通俗易懂,比如一個小孩,有教育良好的父母,父母彬彬有禮,小孩從小開始接受正規教育,小學、初中、高中、大學,然後文化課程和社會實踐良好,那麽這個小孩最終的做人修養,一定比沒有經歷過這個過程的小孩更好一些。
同樣的,寫程序也是如是,下面我就講一些最基本的、最淺顯易懂的學習方法和道理,我把它叫做:
程序員基礎的基礎
一個好的開發人員,應該能夠全面、高效、嚴謹的去處理任何軟件程序和業務問題,成為一個好的開發,是一個很有意思的話題,不過無論這個話題如何開展,基礎兩個字必不可少,雖然代碼量是衡量開發能力的重要指標,但僅能夠熟練的進行代碼編寫是不夠的,更要能深刻的理解技術原理和業務邏輯,紮實的個人基礎和技術基礎往往會促進代碼的編寫,更遊刃有余的解決問題。
下面說的一些基礎,可能絕大部分開發人員都不會在意甚至忽略,但恰恰這些才是開發大廈的基石。
1、科學基礎
成為開發人員的過程不盡相同,有的是科班出身,有的是興趣愛好,還有的是專業機構的培訓,在這個過程中,可能全面或者零散甚至沒有學習過計算機基礎學科,但無論是哪一種,想要成為更高層次的開發人員,寫出更高質量的代碼,計算機基礎學科的學習,是非常非常非常(重要的事情說三遍)重要的。具體的來說,基礎學科在實踐應用中,有如下幾門是一定需要的,按照學習順序排列如下
1)數據結構
數據結構課程通俗的說就是告訴你如何用最基本的語言類型、變量,關鍵詞語句等,去處理各式各樣的邏輯問題,我們稱之為算法,而日常編程中的各種問題,例如排序、文件夾遍歷操作、數據庫查詢等,都可以在數據結構課程中,找到對應的數學原型。數據結構課程的理解能力,也是一個人數學能力的體現,數據結構學習的好壞,是程序員水平差異的一個重要分水嶺,對於這一塊內容的學習,有如下建議:使用VB、C、C++、Pascal等語言,買一本相關語言數據結構與算法的書,或者在網上下載相關的PDF電子書,完整的學習一邊,並將書本中的所有案例親自編寫運行調試一遍,當能夠領悟到某些日常編程中常見手法源於某些數據結構和算法時,就基本達到了學習效果。
2)操作系統
所有編程語言的開發以及應用的運行,都基於操作系統,桌面編程中的大部分場景包括內存、進程、文件系統、網絡通訊、用戶界面等,都源於操作系統的定義和概念,完整的了解操作系統的起源和組成以及運行邏輯,對多線程、復雜界面、文件管理以及一些難以正常理解編程思路等開發中遇到的場景,有非常大的幫助,不僅幫助理解,也能掌握更多有效的程序寫法。具體可以買一本操作系統的書或者下載相關PDF電子書,完整的瀏覽一遍,做到能夠結合實際編程場景來看待操作系統原理,就基本達到了學習效果。
3)數據庫
傳統的關系型數據庫,入門簡單,深入卻難,往往開發人員能夠較快的掌握增刪改查、視圖、索引、存儲過程等基本數據庫操作,卻在編寫復雜查詢、設計主外鍵、優化字段、去除冗余等時,出現只會依葫蘆畫瓢卻不能自主思考擴展的狀況。究其原因還是沒能了解關系數據庫的根本原理,而數據庫這一門課程,系統的闡述了關系型數據庫的來龍去脈,了解其中的數學原理或邏輯基礎所在,對提升數據庫編程水平有質的影響。建議也是買一本數據庫的相關書籍或者下載PDF電子書,能夠把熟練的把第一範式、第二範式等數據庫課程的基本知識點與數據庫編程場景建立起關聯,也基本達到了學習效果。
4)編譯原理
編譯原理是編程語言以及各類語言編譯器的科學基礎,可以說編譯原理創造了世界上的幾乎所有的IT應用,學習編譯原理的基礎是數據結構和算法,因此編譯原理的學習要花費更多的時間和精力,由於現代高級編程語言的編譯器,在代碼優化、資源優化方面已經做的足夠智能,因此,編譯原理的學習對實戰的影響越來越小,但是正所謂本盛末榮,如果認為自己對數據結構和算法的學習達到了一個較高的水平和狀態,可以在編譯原理學習上進一步深入,最終把自己和普通程序員拉開更大的差距。
2、英語能力
英語的天然特性和字母長度還有學科發展的歷史因素,決定了編程語言一定是基於英語的,在編程過程中,從語言的關鍵詞到文檔的內容又或是搜索引擎的搜索結果,都不可避免的會遇到英文。大部分編程人員,都具備英語四級左右的英文基礎,卻由於非專業以及工作環境原因,逐漸疏遠甚至完全淡忘了英語。而實際操作中,大部分編程語言資料都是英文,在線編程問答內容也是英文,因此,很有必要把英語能力重新恢復到一個不用太高但行之有效的水平,達到如下效果:
1)對自己所使用語言,每一個關鍵詞都知道具體的英文翻譯、邏輯含義以及讀音。
2)對於自己使用語言所涉及到的相關方法、類庫、框架、工具等,能知道其中每一個方法、過程以及參數關鍵詞等的英文翻譯、邏輯含義以及讀音。
3)對常見的編程邏輯和核心關鍵詞,能夠用英文組織問題的描述,最簡答的也行,只要能被搜索引擎讀懂就可以。比如如何在C#中把整形轉換為字符串類型這個問題,最簡易的英文描述就是 C# Integer Covert To String。
4)在自己技術知識範圍內的任何的英文的技術手冊、文檔、文章或是問題描述,能夠讀懂8成的內容含義,能夠讀懂完整的技術含義。
3、搜索方法
任何一個開發人員,都應當具備搜索能力,甚至是一定要具備搜索能力,搜索引擎的寶藏,是無窮無盡的,同樣具備搜索意識的不同程序員,卻因為搜索技巧的差異最終在程序開發質量、項目實施效率、甚至是工程產品質量上出現數倍的差異,因此,掌握高效、先進、靈活的搜索方法和技巧,是非常非常非常(重要的事情說三遍)有用的。其中主要的方法介紹如下:
1)搜索源選擇
- 雖然英文的編程資料更為準確高效,但中文的編程資料數量上卻占優,因此遇到問題第一搜索選擇還是百度
- 谷歌對於專業中文詞匯的處理能力有時候甚至比百度還要強,而且谷歌能搜出大量的英文資源,因此谷歌也是首選之一,但是由於谷歌被封鎖,因此需要進行VPN、SSH等FQ操作,或者在百度搜索“谷歌鏡像”關鍵詞,通過谷歌的鏡像網站進行訪問。
- 除了搜索引擎,專業的技術網站、論壇、社區也是非常直接有效的搜索源,比如國外的StackOverFlow網站,國內的Cnblogs博客園、OSChina開源中國等,都具備搜索功能,將問題關鍵詞輸入其中,也許也會很快的得到相關答案。
- 對於QQ群,建議不要使用,除非QQ群主或者成員是非常閑或者非常非常熱心的人,否則在QQ群詢問技術問題,是非常低效率的搜索方式。
2)關鍵詞構造
搜索關鍵詞的構造,直接影響搜索效率和正確結果的過濾,沒有什麽特別的技巧,關鍵在於搜索積累,但是總體遵循的原則是,準確和簡潔,比如當出現一個描述,如何用C#對XML進行序列化和反序列化,非常愚蠢的關鍵詞構造就是“如何用C#對XML進行序列化和反序列化”,而正確高效的關鍵詞則是“C# XML 序列化 反序列化”,或者在谷歌裏面搜索則是“C# XML Serialization”。在平時的編程中,一定要註意相關方法和經驗的積累
3)聯想搜索
聯想搜索,不屬於搜索引擎的範疇,卻是在搜索中很有用的高級技巧,舉一個通俗的例子,比如想使用C#,利用某個.NET類處理一種HTTP通訊,但是一直搜索不到完美的結果,不過換個思路,考慮到VB.NET也是.NET體系,和C#完全相通,那麽也可以試著用VB.NET關鍵詞進行搜索,搜索到完美代碼後再臨摹成C#代碼。這樣的聯想搜索,不僅能夠幫助搜索正確結果,也是對大腦思維的訓練,值得多多嘗試。
4)資源搜索
開源的框架、產品、工具、控件等開發輔助類東西越來越多,穩健性和叠代性越來越強,去尋找一款成熟的工具或者插件,也成為了大量開發者的必備方法和技能,而如何高效的搜索出想要的資源,也成為了一門學問,其核心方法就在於知曉資源網站的地址,常見的例如有開源中國、Github、CSDN下載、pudn等。資源類網站需要平時多積累,到用到的時候會非常關鍵。
4、思維模式
開發人員,一定要養成業務思維的模式,所謂的業務思維,就是在做任何一個項目的時候,寫任何代碼前,需要對項目本身的業務概念和業務邏輯甚至業務流程都要有一個全面的學習和理解,這雖然不是一個項目的強制要求,卻是一個很好的開發習慣,無論自己的覺得是開發者還是測試員又或是技術總監,掌握了業務原理,才能夠更好的設計或閱讀項目的數據結構和流程結構。程序員的思維往往和用戶或者客戶是不一致的,擺脫技術思維模式,習慣於用業務思維解決問題的程序員,不一定最優秀,但一定是一個很容易溝通的程序員
5、工作與編程習慣
有的人說愛幹凈浪費時間,所以不修邊幅,但歸根結底這還是習慣問題,當養成清潔衛生的習慣並使之成為生活慣性時,往往就不會耗費更多的時間,反而顯得幹凈幹練。寫程序同樣如是,有一些編程習慣,看似不足為道,看似浪費時間,可是如果堅持下去,最終都能收到意想不到的奇效。下面列舉一些特別重要的習慣。
1)快捷鍵的使用
無論是使用Windows、Linux操作系統,還是在IDE中,快捷鍵都是系統本身的標配,事實上,Ctrl+C、V這樣的操作,大部分人都能嘗到在節省時間上的甜頭,把這個概念進一步擴散,如果在IDE中編寫代碼,除了代碼本身,將其余所有的鼠標操作、鍵盤定位操作,都用快捷鍵來代替的話,在時間上將會有數量級的節省,然而看上去這麽好的事情,真正堅持去執行並形成習慣的人屈指可數,因此,在初期的改變習慣,記住快捷鍵,會是一個長期的過程,需要不斷的堅持。
2)代碼註釋
一個開發人員隨著年齡和經驗的增長,所參與的項目,再也不是靠一個人或者幾個人就能完成的。系統的重構、代碼的重構、工作的交接、對新進人員的培訓等等類似的事情,會越來越多的遇到,這些事情無一例外都會把已經寫過的代碼重新或者重復閱讀,如果在初始編寫代碼時,就做到完整、清晰明了的代碼註釋,對後續工作會有巨大的幫助。不僅提高工作效率,還能增強合作好感。事實上,就算只是自己看自己的代碼,如果有註釋,也能加深印象,縮短代碼查找時間。因此,任何開發人員,都應該養成良好的代碼註釋習慣。
優秀的代碼註釋應該能做到:
- 每一個函數、每一個屬性甚至是變量的劃分,都可以找到對應的解釋。
- 多使用越來越被IDE支持的XML註釋方式,不僅有註釋文字,更有詳細的參數描述。
- 對程序結構、模塊、組成部分劃分等也加以註釋
3)命名規則
具備一定規模的軟件公司,在代碼編寫上都有一套自己的命名規則,涵蓋項目、模塊、函數、變量等等,標準化命名的好處不言而喻,然而被動、被迫去遵守命名規則和主動習慣於使用命名規則是完全不一樣的。一個優秀的開發人員,應當發自內心的希望各種代碼命名都是有規則的,易讀的,而不是糾結於命名規則會增加碼字長度。
4)不將就的編程邏輯
所謂不將就的編程邏輯,其對立面就是不講究的編程邏輯,不講究的編程,不僅是一種很壞的編程習慣,也體現了低下的生活品質,很多開發人員,因為個人習慣、趕工期、客戶要求不高等多種原因,在編程時特別隨意,體現在比如為了實現某個功能,百度出一段代碼,直接套用,10行的代碼只理解8行,有兩行看不懂也放到程序裏去使用,很多這樣的小細節,就好比在項目中埋下了無數的定時炸彈,不僅有很大概率形成返工,更是為項目埋下了風險。編程人員,應當有擔當有態度,養成不將就的編程邏輯,不勉強自己,也不輕視程序。
5)數據備份
誤刪、誤操作、電腦斷電、文件遺失等等狀況是每一個開發按人員都可能遇到的問題,如果不希望辛勤的勞作被浪費,不希望偶然的意外影響工作,那做好備份是必不可少的,在較大規模的公司,會有完整的源代碼管理以及信息安全防護,而無論是在大公司工作,還是身處較小公司或者在實現個人代碼價值時,都要做好代碼和文檔的數據備份,備份方式的選擇靈活多樣,有使用在線的CVS、SVN、TFS、Git源代碼管理,也可以手工拷貝文件至雲空間或者本地硬盤,甚至可以在個人電腦上組成RAID磁盤陣列等等,養成周期性、規律性的備份習慣。
6)郵件工作方式
溝通是進步的源泉,如果說開發小組的熱烈討論是性格和激情的體現,那郵件的工作方式也是另一種穩重和高效。無論是公司層面的工作溝通,還是開發小組的問題交流,郵件的作用包括問題正規化描述、工作留檔留痕、工作流程流轉、責任分工明確等等,習慣於將重大問題、重要事項通過郵件的方式與同事、主管等進行溝通,將會非常有助於團隊協作。
以上這些方法,是我這麽多年來的感受和體會,也給了我很大的幫助,希望也能夠幫助到大家,不能說一定可以“提升修養“,但也是”提升修養”的有效方式。
最後還想再說一說堅持的力量
分享一個真實的小故事,公司有兩個開發人員,1個做.NET好多年了,但是很油滑,做事能省就省,抓到可以偷懶的機會就偷懶,讓他學點新知識新方法總是自以為是覺得自己都會;還有1個毫無.NET基礎,一直做低級語言開發,從15年才開始學習.NET和Web前端,但是做事很積極,幾乎每天都自己抽空學習,遇到不懂的都琢磨清楚,遇到不會的場景就上網或者找人尋求幫助,項目結束後還反復思考有什麽地方可以改進。從15年到現在,短短1年,這兩個人的發展已經是天壤之別,工資差距也越來越大,後者已經能夠獨自操盤中小型軟件外包項目,而前者還在混著日子,以後他們各自的發展也完全可以預見。
我想說的是,本篇裏面分享的一些道理和方法,都是通俗易懂的,就和常聽到的例如101%和99%的365次方的故事、1萬小時的道理等等一樣,但真正去認真思考並實踐的屈指可數,也許,堅持才是程序員最大的修養,和各位共勉!
很認真的聊一聊程序員的自我修養