工作這幾年來,經歷了很多。從小白到中級(手機裡有一款叫中國象棋的遊戲,裡面給對弈中電腦水平分為小白、菜鳥、新手、入門、初級、中級、高階、大師、特級大師,程式設計我暫且按照這樣來區分)。
學校教給我的是從小白到入門(當然也不乏某些學霸直接跳過這些成為高階甚至大師級別,就大多數普通人來說都是從小白到入門)。
但每個人從小白到入門的過程是不一樣的。有的人是天資聰明,也有的人是基礎牢固(如果你數理化很不錯,那麼學程式設計也是一件很容易的事情),還有的人是勤奮苦練(我覺得我就屬於這一類的)。
後來畢業後的第一份工作讓我成為一名初級程式設計師,經過幾年的磨練後,算是成為一箇中級程式設計師。
為什麼是”算是”而不是”是”?
按照年限來說,一年初級,三年中級,五年高階。那麼我達到了三年,剛好是中級。
三年的中級,讓我有了獨立開發網站的能力。
獨立開發網站的能力包括哪些?
- 需求理解、需求分析、資料建模。
- 前後端開發能力(包含開發過程中的問題解決)。
- 運維能力(寫一個專案部署到Linux伺服器、搭建各種軟體環境和安裝各種軟體、監控伺服器(CPU、記憶體、硬碟、軟體執行是否正常)、線上問題排查等)。
- 測試能力(功能測試、效能測試(壓測))。
- 一定的專案管理能力。
- 技術選型和框架搭建能力。
- 二次開發能力。
- “抄”能力。
但三年的中級並未讓我感到多麼的高興,因為於我而言還有很多要學習的,遠遠還沒達到我心目中的”中級”。
不過有一點我還是很慶幸,因為這三年以來我還是處於不斷成長當中。並沒有將一年的工作經驗重複三年。
這三年當中,給了我很多教訓,也讓我思考很多,於是便有了今天這篇文章。
迴歸正題,作為Java程式設計師,我覺得有兩項通用能力,這兩項通用能力,如果讓大家來說?
有人會說:
- 編碼能力(點(演算法)、線(設計模式、組織程式碼)、面(框架和學習、理解和應用)、體(作業系統、計算機網路、編譯原理等))
- 業務能力(理解需求或問題能力、溝通和協調資源能力、預估和安排計劃能力、調研和解決問題能力)
也有人會說:
- 學習能力
- 解決問題能力
- 溝通能力
我今天所說的兩項通用能力,不是溝通,也不是學習,也不是解決問題。而是深入理解Java和資料庫。
因為在我看來學習能力、解決問題能力、溝通能力這些,是一個人無論工作也好還是上學也罷,必需的能力(就好像穿衣吃飯是必需的,無時無刻我們不在學,不僅僅是工作也包括生活,無時無刻我們不在解決問題,不僅僅是工作也包括生活,無時無刻我們不在溝通,不僅僅是工作也包括生活)。
如果一個人22歲工作(上了四年大學),按照60歲的退休標準,職業生涯長達38年。
另外作為IT來說,就國內這個環境,大多數程式設計師不可能一輩子都是程式設計師(有人幹了幾年幹不動了轉行了,有人走向管理層,有人繼續搞技術)。
同時程式設計師也不一定60歲退休,也許50歲或者40多歲。那麼怎麼算,至少20年。
20年時間,世界會發生天翻地覆的變化。人不學習很難適應社會。
學習的目的可以理解為兩個方面,一個是不想被世界淘汰,另一個方面是不被解僱(工作是為了生存,也是為了生活,但是老闆僱傭你來是解決問題的而非製造問題)。
社會是共同生活的人們通過各種各樣社會關係聯合起來的集合(這樣看來溝通是必不可少的)。
為什麼說Java和資料庫是Java程式設計師的通用能力?
我的理由如下:
第一、熟練掌握並深入理解一門程式語言決定你能走多遠。
第二、任何商業應用軟體都需要儲存,而且資料庫是最多的,而其中SQL能力是基礎,也是最重要的一個。
為什麼說熟練掌握並深入理解一門程式語言能決定你能走多遠呢?
第一、當你熟練掌握一門程式語言時,接下來你去學其它的程式語言,你會發現是一件非常容易的事情(因為程式語言有很多共通之處)。
第二、學習和使用該程式語言相關框架也是一件非常容易的事情。
那麼最難的是什麼?是理解,理解這門程式語言。
理解包含兩個方面,一個是淺度,另一個是深度。
作為一個Java程式設計師,說真的,我對Java至今都處於淺度方面的理解而非深度(對於深度,我覺得讀懂原始碼是必要條件)。
同時我也覺得不少人和我一樣處於淺度理解。淺度理解並不影響實際開發工作的展開(但有些時候卻成為生產當機或突發問題的原因,我曾經的一個程式碼問題就把生產環境搞亂了),也不影響學習任意的框架或其它。
其實,我很痛恨淺度。因為淺度是一件很有危害的事情。原因如下:
- 程式是由演算法和資料結構組成,而開發軟體中你不一定會用演算法,但是資料結構是必不可少的,如字串、連結串列、陣列、雜湊、堆、棧、樹等
- 看似程式碼寫的沒問題,但如果不理解對應的方法(原始碼),可能會出問題(面試常考的一個,也是Java開發中用的最多的,如equals和==,你不理解寫的就會出問題)
- 資料最終會存入資料庫,但也會從資料庫中拿出來展示,展示過程中不管你是XML還是JSON,你都需要用到資料結構(Java相關的如String、Array、List、ArrayList、LinkedList、Vector、Map、HashMap、Set等,Java程式設計師們一定不陌生)
- 某些時候當機的原因並不是因為使用者多了,而是程式碼寫的有問題(不僅僅是邏輯問題,也是寫的方法有問題。舉個例子,在創業公司開發智慧酒店專案時,曾有段時間頻繁當機,為此我臨時寫一個shell指令碼監控著,如果當機,自動重啟,為了保障能用,只得如此了,最後某天仔細排查,發現就是一段程式碼問題,程式碼問題反映的不僅僅是邏輯,也是對這門程式語言的深度理解)
我們延伸一下,回到個人職業生涯上看:
淺度等同於不深入,不深入意味著普通和平庸,普通和平庸意味著可替代性很強。可替代性很強就意味著很容易被替換。這也就解釋了為什麼程式設計師會有中年危機(不僅僅是程式設計師這一行,其它行業也是通用的)。
那麼我們如何避免淺度而更好的深度呢?
我的導師,給了我一個很好的意見,這裡我分享給大家。
就是從讀一些自己常用的程式碼開始(如String、ArrayList、HashMap、FastJSON等相關的)。因為常用,避免陌生感,同時因為常用讀起來也就是更有意義。同時也可以參考相關的優質博文,看看前人是如何深入理解的,不過在看前人寫的之前,自己必須要有自己的意見(因為這代表著你思考過)。
接下來我也會寫相關的原始碼理解文章。寫的目的也是希望自己不再是一個”API搬磚工人(這裡我就不用碼農了)”。
也許有讀者朋友疑惑,為什麼資料庫也被我列為Java程式設計師的兩項通用能力之一呢?
以MySQL為例,我對於INNODB和MyISAM(單單一個InNODB沒有真正的弄懂)、索引原理、檢視和觸發器、儲存過程和遊標等,僅僅是瞭解而非真正弄懂。
雖說即便不懂,也能正常進行簡單業務、較複雜業務、複雜業務的CRUD。絲毫不影響業務開發。但是不真正弄懂的話,會成為真正高階Java開發工程師的瓶頸,到時候即便年限到了5年,理所當然成為一名高階研發工程師,但是實力並未達到,等到去面試的時候,一問三不知,最後可能會被面試官說:五年的工作經驗,連這都不知道,怎麼好意思要這麼高的薪資呢?
我之前公司一個領導T哥曾對我說過,深入掌握Java和資料庫對於一個Java程式設計師是非常重要的,因為無論你到那家公司,這兩項都是必需,而非所謂的業務能力(每家公司的技術棧相差不是特別大,業務相差是比較大的,但對於程式設計師而言,業務知識不一定要求你精通100%,最多也就是20%~30%左右,業務知識通常可遷移性不是特別強,比方說,你從外包到自主創業公司或者是從創業公司到其它行業公司都可以,沒有什麼限制,當然了,金融方面可能對業務知識方面要求高一些)。
其實仔細想來,這些年開發過的CRM、OA、ERP、CMS、智慧酒店和門鎖、物聯網雲平臺、電商、程式設計平臺、教育平臺等專案(其中也包括二次開發),排除其中的程式語言(因為有用到Node.js、Python、PHP等),基本上資料庫都是共性,而且用的都是MySQL。仔細在從另外一個角度來看,一個專案從0到1,最終上線投入運營使用,包含高可用、高併發、高效能等,都與資料庫緊密相關,因為這考驗著你的資料庫設計是否合理,一個設計不合理的資料庫,會無限增大成本(伺服器的投入,為了保證”三高”,最簡單的辦法就是加機器,不斷的加機器,但如果設計的合理,機器可以加少點,加少點同時也意味著降低企業成本,當然也不排除一些公司盈利不錯,盈利不錯,意味著這些成本可以不忽略不計)。
再回過頭來,即便是資料庫也有值得深入研究並掌握的?
以MySQL為例,我首推INNODB。因為INNODB儲存引擎是用的最多的。
同時還有一點十分重要,那就是SQL能力(包含能夠寫複雜的SQL、優化SQL、知道如何加索引等)。基本上可以說,如果你的SQL能力不錯,那麼工作效率和工作質量將會上一個檔次或者高好幾個檔次。以Java的三層架構,資料訪問層、業務邏輯層、檢視層(又稱UI層),其中的資料訪問層就考驗你的SQL能力,業務邏輯層依賴於資料訪問層(SQL能力),如果你的資料訪問層寫的不好有問題,那麼自下向上都會受到影響,關於一點我深有體會過(曾經也深受其害)。
最後,我的這些年的經驗教訓告訴我Java程式設計師的兩項通用技能是深入理解Java和資料庫(多次強調過,希望大家不要捨本逐末,追求所謂的新技術,技術是日新月異的,而底層是不變的,把握這個不變,就足以應對萬變)。因為這些是你無論到那家公司都需要的通用能力,相反我覺得框架並沒有那麼重要,而且熟練使用一門框架並不是很難。任何程式語言和框架,最難的就是深入理解而非簡單使用(不僅僅是Java,其它語言也是一樣通用的,深入理解一門程式語言和資料庫,無論到哪你都能戰無不勝)。