今天逛博客園,看到了一篇推薦的文章《淺談程序員的英語學習》,就點進去看了一下,對於文章中的觀點我很是認同,英語是很是重要的,但文章站的高度仍是過高,具體表述的學習方法我不是很認同,也認爲不太實際,剛好以前有一篇一直沒有發表到首頁的文章想從新發布,今天就藉此機會和你們很認真的談一談程序員的自我修養問題。html
先介紹一下利益相關,個人背景:前端
初中開始參加信息學與數學競賽,大學本科軟件工程專業,畢業後在銀行作大數據分析與項目管理,後自主創業,作過傳媒公司、軟件外包公司,如今中國(南京)軟件谷有個工做室,作些本身喜歡的事情。15年編碼經驗,6年創業經驗。主要技術方向是.NET、HTML五、雲服務、應用級開發等,自我總體水平評價爲,資深程序員、初級架構師程序員
首先要談的是,今天的話題所聊的程序員包含哪些人?算法
在說以前,不得不提到一個頗有名的程序員趙劼,他有過一個觀點:「堅定反對北大青鳥等機構」,之前我也很贊同這個觀點,可是如今,我在「贊同的基礎上」,又堅定反對甚至反感趙劼們「發表這種觀點」。由於這種觀點,可以幫助並做用到的人羣,是趙劼們最不可能遇到的基層開發人員,而這些最不可能遇到的人,卻偏偏是在中國的最廣泛的程序員,他們也是趙劼們最不可能甚至不太願意幫助的人。若是一個高階程序員,自恃理科基礎好,邏輯性強,有過完整的語言學習經歷,就認爲至少達到這樣纔是程序員,甚至以爲其餘的不學數據結構的人就不要作程序了,那真是很是的妄自菲薄。數據庫
在中國,寫程序,不只僅是一種興趣,更多的時候,仍是一種普通職業和謀生工具編程
大公司有厲害的程序員,優秀的架構師,但大量的小公司也有不少普通的程序員。在我這些年的工做經歷中,也愈來愈深入的感覺到普通程序員的影響和力量。對於高階程序員,所謂八仙過海各有神通,各有各的成就,各有各的修養,但程序員在達成較高的水平以前,有一些「自我修養」,是最基礎的,是普世的。安全
因此今天的話題面向的程序員,就是全部的正在寫代碼或者曾經寫過代碼的程序員,也包括廣義上的程序員,例如項目經理、架構師等等。微信
作任何事都是有明確目的,那麼網絡
再談一談,程序員提升自我修養是爲了什麼?數據結構
程序寫的好有人崇拜,有妹子喜歡?仍是到博客、論壇、社區發表文章進行分享得到成就?我想這是少數人的追求,也是更高的追求,在這以前
我認爲,在中國,程序員提升自我修養的目的,是爲了
一、更好的融入工做,減小困難,增長成就
二、穩步的提高能力,提升收入,達成財務自由
二、站在更高的層面看待本身的學習和工做,樹立更加適合的人生觀價值觀,家庭幸福,生活愉快
說的更通俗一點,就是用更加合理的方式和方法,賺取到更多的收入
說了這麼多廢話,進入正題
何爲程序員的自我修養?
正面論述很難說清楚,反向描述可能更通俗易懂一些,自我修養的對立面是「沒有修養」,先說一說在這麼多年的工做、學習、生活中,遇到的一些我認爲「沒有修養」的程序員形態:
一、程序員小張遇到了一個開發問題,很着急,想到了有幾個羣,因而到羣裏發了他的問題,坐等回答,發現沒有人回答,就直接對話羣主的QQ,羣主也不回答,因而小張就搜索,忽然搜到博客園有個帖子講解了相關話題,他看完就給博主留言,個人郵箱是:XXXXX@qq.com,麻煩博主把源碼發給我一下,謝謝。
二、程序員小張進公司3個月了,老闆佈置了不少任務,他以爲老闆很沒人性,工資給的不高,加班也不給錢,因而在寫代碼的時候能省就省,客戶反饋有問題也不主動解決,敷衍爲主,又過了一個月,跳槽了。
三、程序員小張正在寫一個功能模塊,須要進行某種加密,到百度搜到了一個編碼模塊,看不明白具體寫了什麼,可是放到程序裏恰好適用,因而就這麼原封不動放進去了。
四、程序員小張要對某個功能進行研發,項目經理對他說,這個功能應該能搜索到,你去搜搜看,小張就在百度搜啊搜,一天過去了啥都沒找到,項目經理來到小張身邊坐下,換了個關鍵詞,1分鐘就搜到瞭解決方案。
五、程序員小張學.NET已經工做3年了,工資仍是10000,和公司提漲工資也沒答應,想跳槽又猶豫,這時某個前輩對他說,你去看書吧,多看一些書,例如 《Visual C# 從入門到精通》,《CLR via C#》《Javascript權威指南》等等,因而小張買回來了, 隨手翻了翻發現有些東西是他已經會的,有些看不懂的好像又用不到,並且書這麼厚,要不要浪費時間去看呢?小張就這樣反覆糾結了半年,依然天天上班工做,下班LOL,偶爾還抱怨一下工資低。
六、程序員小張到了一家新公司,在作一個項目實現某個功能時,想起來之前作過這樣的功能,但是竟想不起怎麼實現了,因而就到本身電腦上找文檔,找了很久也沒找到,只好放棄,最後又折騰了2天,終於仍是把這個功能給實現了。
七、程序員小張某天很是不高興,由於他的項目經理和項目組的產品人員又變動需求了,新的需求又要對整個結構進行大的調整,小張很鬱悶,到一個QQ裏發泄情緒,說了這個事,因而立馬,QQ羣裏面炸開鍋了,程序員小李說,對,產品就是狗日的!程序員小王說,對,他媽的項目經理成天高枕無憂,就知道壓榨開發人員!程序員小孫說,是的是的,我上一家公司也是這樣,壓榨程序員,幸虧我走了。就這樣,在一片罵聲中,幾個程序員心情舒暢了,小張開心的去玩王者榮耀去了。
我想,有些人可能已經明白我要說什麼,有些人可能還不明白,具體的話我也說不出來,只能用一句話來歸納就是:
在編寫代碼的過程當中,善於學習、掌握方法、勤加思考、勤奮努力、鍥而不捨,久而久之,在編程中,你會發現不同的本身。
以上這些仍是比較抽象,那麼
提高自我修養的具體方法有哪些?
程序員具體如何達成「較高的修養」,每一個人各有本身的辦法,我沒法說到很細,就和如何提升作人修養同樣,一句兩句話是說不清楚的,可是有些說法也通俗易懂,好比一個小孩,有教育良好的父母,父母彬彬有禮,小孩從小開始接受正規教育,小學、初中、高中、大學,而後文化課程和社會實踐良好,那麼這個小孩最終的作人修養,必定比沒有經歷過這個過程的小孩更好一些。
一樣的,寫程序也是如是,下面我就講一些最基本的、最淺顯易懂的學習方法和道理,我把它叫作:
一個好的開發人員,應該可以全面、高效、嚴謹的去處理任何軟件程序和業務問題,成爲一個好的開發,是一個頗有意思的話題,不過不管這個話題如何開展,基礎兩個字必不可少,雖然代碼量是衡量開發能力的重要指標,但僅可以熟練的進行代碼編寫是不夠的,更要能深入的理解技術原理和業務邏輯,紮實的我的基礎和技術基礎每每會促進代碼的編寫,更遊刃有餘的解決問題。
下面說的一些基礎,可能絕大部分開發人員都不會在乎甚至忽略,但偏偏這些纔是開發大廈的基石。
成爲開發人員的過程不盡相同,有的是科班出身,有的是興趣愛好,還有的是專業機構的培訓,在這個過程當中,可能全面或者零散甚至沒有學習過計算機基礎學科,但不管是哪種,想要成爲更高層次的開發人員,寫出更高質量的代碼,計算機基礎學科的學習,是很是很是很是(重要的事情說三遍)重要的。具體的來講,基礎學科在實踐應用中,有以下幾門是必定須要的,按照學習順序排列以下
1)數據結構
數據結構課程通俗的說就是告訴你如何用最基本的語言類型、變量,關鍵詞語句等,去處理各式各樣的邏輯問題,咱們稱之爲算法,而平常編程中的各類問題,例如排序、文件夾遍歷操做、數據庫查詢等,均可以在數據結構課程中,找到對應的數學原型。數據結構課程的理解能力,也是一我的數學能力的體現,數據結構學習的好壞,是程序員水平差別的一個重要分水嶺,對於這一塊內容的學習,有以下建議:使用VB、C、C++、Pascal等語言,買一本相關語言數據結構與算法的書,或者在網上下載相關的PDF電子書,完整的學習一邊,並將書本中的全部案例親自編寫運行調試一遍,當可以領悟到某些平常編程中常見手法源於某些數據結構和算法時,就基本達到了學習效果。
2)操做系統
全部編程語言的開發以及應用的運行,都基於操做系統,桌面編程中的大部分場景包括內存、進程、文件系統、網絡通信、用戶界面等,都源於操做系統的定義和概念,完整的瞭解操做系統的起源和組成以及運行邏輯,對多線程、複雜界面、文件管理以及一些難以正常理解編程思路等開發中遇到的場景,有很是大的幫助,不只幫助理解,也能掌握更多有效的程序寫法。具體能夠買一本操做系統的書或者下載相關PDF電子書,完整的瀏覽一遍,作到可以結合實際編程場景來看待操做系統原理,就基本達到了學習效果。
3)數據庫
傳統的關係型數據庫,入門簡單,深刻卻難,每每開發人員可以較快的掌握增刪改查、視圖、索引、存儲過程等基本數據庫操做,卻在編寫複雜查詢、設計主外鍵、優化字段、去除冗餘等時,出現只會依葫蘆畫瓢卻不能自主思考擴展的情況。究其緣由仍是沒能瞭解關係數據庫的根本原理,而數據庫這一門課程,系統的闡述了關係型數據庫的前因後果,瞭解其中的數學原理或邏輯基礎所在,對提高數據庫編程水平有質的影響。建議也是買一本數據庫的相關書籍或者下載PDF電子書,可以把熟練的把第一範式、第二範式等數據庫課程的基本知識點與數據庫編程場景創建起關聯,也基本達到了學習效果。
4)編譯原理
編譯原理是編程語言以及各種語言編譯器的科學基礎,能夠說編譯原理創造了世界上的幾乎全部的IT應用,學習編譯原理的基礎是數據結構和算法,所以編譯原理的學習要花費更多的時間和精力,因爲現代高級編程語言的編譯器,在代碼優化、資源優化方面已經作的足夠智能,所以,編譯原理的學習對實戰的影響愈來愈小,可是正所謂本盛末榮,若是認爲本身對數據結構和算法的學習達到了一個較高的水平和狀態,能夠在編譯原理學習上進一步深刻,最終把本身和普通程序員拉開更大的差距。
二、英語能力
英語的自然特性和字母長度還有學科發展的歷史因素,決定了編程語言必定是基於英語的,在編程過程當中,從語言的關鍵詞到文檔的內容又或是搜索引擎的搜索結果,都不可避免的會遇到英文。大部分編程人員,都具有英語四級左右的英文基礎,卻因爲非專業以及工做環境緣由,逐漸疏遠甚至徹底淡忘了英語。而實際操做中,大部分編程語言資料都是英文,在線編程問答內容也是英文,所以,頗有必要把英語能力從新恢復到一個不用過高但行之有效的水平,達到以下效果:
1)對本身所使用語言,每個關鍵詞都知道具體的英文翻譯、邏輯含義以及讀音。
2)對於本身使用語言所涉及到的相關方法、類庫、框架、工具等,能知道其中每個方法、過程以及參數關鍵詞等的英文翻譯、邏輯含義以及讀音。
3)對常見的編程邏輯和核心關鍵詞,可以用英文組織問題的描述,最簡答的也行,只要能被搜索引擎讀懂就能夠。好比如何在C#中把×××轉換爲字符串類型這個問題,最簡易的英文描述就是 C# Integer Covert To String。
4)在本身技術知識範圍內的任何的英文的技術手冊、文檔、文章或是問題描述,可以讀懂8成的內容含義,可以讀懂完整的技術含義。
任何一個開發人員,都應當具有搜索能力,甚至是必定要具有搜索能力,搜索引擎的寶藏,是無窮無盡的,一樣具有搜索意識的不一樣程序員,卻由於搜索技巧的差別最終在程序開發質量、項目實施效率、甚至是工程產品質量上出現數倍的差別,所以,掌握高效、先進、靈活的搜索方法和技巧,是很是很是很是(重要的事情說三遍)有用的。其中主要的方法介紹以下:
1)搜索源選擇
雖然英文的編程資料更爲準確高效,但中文的編程資料數量上卻佔優,所以遇到問題第一搜索選擇仍是百度
谷歌對於專業中文詞彙的處理能力有時候甚至比百度還要強,並且谷歌能搜出大量的英文資源,所以谷歌也是首選之一,可是因爲谷歌被封鎖,所以須要進行×××、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等。資源類網站須要平時多積累,到用到的時候會很是關鍵。
開發人員,必定要養成業務思惟的模式,所謂的業務思惟,就是在作任何一個項目的時候,寫任何代碼前,須要對項目自己的業務概念和業務邏輯甚至業務流程都要有一個全面的學習和理解,這雖然不是一個項目的強制要求,倒是一個很好的開發習慣,不管本身的以爲是開發者仍是測試員又或是技術總監,掌握了業務原理,纔可以更好的設計或閱讀項目的數據結構和流程結構。程序員的思惟每每和用戶或者客戶是不一致的,擺脫技術思惟模式,習慣於用業務思惟解決問題的程序員,不必定最優秀,但必定是一個很容易溝通的程序員
有的人說愛乾淨浪費時間,因此不修邊幅,但歸根結底這仍是習慣問題,當養成清潔衛生的習慣並使之成爲生活慣性時,每每就不會耗費更多的時間,反而顯得乾淨幹練。寫程序一樣如是,有一些編程習慣,看似不足爲道,看似浪費時間,但是若是堅持下去,最終都能收到意想不到的奇效。下面列舉一些特別重要的習慣。
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萬小時的道理等等同樣,但真正去認真思考並實踐的屈指可數,也許,堅持纔是程序員最大的修養,和各位共勉!
更多內容請關注微信公衆號:it_haha