工作這幾年來,經(jīng)歷了很多。從小白到中級(手機里有一款叫中國象棋的游戲,里面給對弈中電腦水平分為小白、菜鳥、新手、入門、初級、中級、高級、大師、特級大師,編程我暫且按照這樣來區(qū)分)。

          學校教給我的是從小白到入門(當然也不乏某些學霸直接跳過這些成為高級甚至大師級別,就大多數(shù)普通人來說都是從小白到入門)。


          但每個人從小白到入門的過程是不一樣的。有的人是天資聰明,也有的人是基礎(chǔ)牢固(如果你數(shù)理化很不錯,那么學編程也是一件很容易的事情),還有的人是勤奮苦練(我覺得我就屬于這一類的)。

          后來畢業(yè)后的第一份工作讓我成為一名初級程序員,經(jīng)過幾年的磨練后,算是成為一個中級程序員。

          為什么是”算是”而不是”是”?

          按照年限來說,一年初級,三年中級,五年高級。那么我達到了三年,剛好是中級。

          三年的中級,讓我有了獨立開發(fā)網(wǎng)站的能力。

          獨立開發(fā)網(wǎng)站的能力包括哪些?

          * 需求理解、需求分析、數(shù)據(jù)建模。
          * 前后端開發(fā)能力(包含開發(fā)過程中的問題解決)。
          * 運維能力(寫一個項目部署到Linux服務(wù)器、搭建各種軟件環(huán)境和安裝各種軟件、監(jiān)控服務(wù)器(CPU、內(nèi)存、硬盤、軟件運行是否正常)、線上問題排查等)。
          * 測試能力(功能測試、性能測試(壓測))。
          * 一定的項目管理能力。
          * 技術(shù)選型和框架搭建能力。
          * 二次開發(fā)能力。
          * “抄”能力。
          但三年的中級并未讓我感到多么的高興,因為于我而言還有很多要學習的,遠遠還沒達到我心目中的”中級”。

          不過有一點我還是很慶幸,因為這三年以來我還是處于不斷成長當中。并沒有將一年的工作經(jīng)驗重復(fù)三年。

          這三年當中,給了我很多教訓,也讓我思考很多,于是便有了今天這篇文章。

          回歸正題,作為Java程序員,我覺得有兩項通用能力,這兩項通用能力,如果讓大家來說?

          有人會說:

          * 編碼能力(點(算法)、線(設(shè)計模式、組織代碼)、面(框架和學習、理解和應(yīng)用)、體(操作系統(tǒng)、計算機網(wǎng)絡(luò)、編譯原理等))
          * 業(yè)務(wù)能力(理解需求或問題能力、溝通和協(xié)調(diào)資源能力、預(yù)估和安排計劃能力、調(diào)研和解決問題能力)
          也有人會說:

          * 學習能力
          * 解決問題能力
          * 溝通能力
          我今天所說的兩項通用能力,不是溝通,也不是學習,也不是解決問題。而是深入理解Java和數(shù)據(jù)庫。


          因為在我看來學習能力、解決問題能力、溝通能力這些,是一個人無論工作也好還是上學也罷,必需的能力(就好像穿衣吃飯是必需的,無時無刻我們不在學,不僅僅是工作也包括生活,無時無刻我們不在解決問題,不僅僅是工作也包括生活,無時無刻我們不在溝通,不僅僅是工作也包括生活)。

          如果一個人22歲工作(上了四年大學),按照60歲的退休標準,職業(yè)生涯長達38年。

          另外作為IT來說,就國內(nèi)這個環(huán)境,大多數(shù)程序員不可能一輩子都是程序員(有人干了幾年干不動了轉(zhuǎn)行了,有人走向管理層,有人繼續(xù)搞技術(shù))。

          同時程序員也不一定60歲退休,也許50歲或者40多歲。那么怎么算,至少20年。

          20年時間,世界會發(fā)生天翻地覆的變化。人不學習很難適應(yīng)社會。

          學習的目的可以理解為兩個方面,一個是不想被世界淘汰,另一個方面是不被解雇(工作是為了生存,也是為了生活,但是老板雇傭你來是解決問題的而非制造問題)。

          社會是共同生活的人們通過各種各樣社會關(guān)系聯(lián)合起來的集合(這樣看來溝通是必不可少的)。

          為什么說Java和數(shù)據(jù)庫是Java程序員的通用能力?

          我的理由如下:

          第一、熟練掌握并深入理解一門編程語言決定你能走多遠。

          第二、任何商業(yè)應(yīng)用軟件都需要存儲,而且數(shù)據(jù)庫是最多的,而其中SQL能力是基礎(chǔ),也是最重要的一個。

          為什么說熟練掌握并深入理解一門編程語言能決定你能走多遠呢?

          第一、當你熟練掌握一門編程語言時,接下來你去學其它的編程語言,你會發(fā)現(xiàn)是一件非常容易的事情(因為編程語言有很多共通之處)。

          第二、學習和使用該編程語言相關(guān)框架也是一件非常容易的事情。

          那么最難的是什么?是理解,理解這門編程語言。

          理解包含兩個方面,一個是淺度,另一個是深度。

          作為一個Java程序員,說真的,我對Java至今都處于淺度方面的理解而非深度(對于深度,我覺得讀懂源碼是必要條件)。


          同時我也覺得不少人和我一樣處于淺度理解。淺度理解并不影響實際開發(fā)工作的展開(但有些時候卻成為生產(chǎn)宕機或突發(fā)問題的原因,我曾經(jīng)的一個代碼問題就把生產(chǎn)環(huán)境搞亂了),也不影響學習任意的框架或其它。

          其實,我很痛恨淺度。因為淺度是一件很有危害的事情。原因如下:

          * 程序是由算法和數(shù)據(jù)結(jié)構(gòu)組成,而開發(fā)軟件中你不一定會用算法,但是數(shù)據(jù)結(jié)構(gòu)是必不可少的,如字符串、鏈表、數(shù)組、哈希、堆、棧、樹等
          *
          看似代碼寫的沒問題,但如果不理解對應(yīng)的方法(源代碼),可能會出問題(面試??嫉囊粋€,也是Java開發(fā)中用的最多的,如equals和==,你不理解寫的就會出問題)
          *
          數(shù)據(jù)最終會存入數(shù)據(jù)庫,但也會從數(shù)據(jù)庫中拿出來展示,展示過程中不管你是XML還是JSON,你都需要用到數(shù)據(jù)結(jié)構(gòu)(Java相關(guān)的如String、Array、List、ArrayList、LinkedList、Vector、Map、HashMap、Set等,Java程序員們一定不陌生)
          *
          某些時候宕機的原因并不是因為用戶多了,而是代碼寫的有問題(不僅僅是邏輯問題,也是寫的方法有問題。舉個例子,在創(chuàng)業(yè)公司開發(fā)智能酒店項目時,曾有段時間頻繁宕機,為此我臨時寫一個shell腳本監(jiān)控著,如果宕機,自動重啟,為了保障能用,只得如此了,最后某天仔細排查,發(fā)現(xiàn)就是一段代碼問題,代碼問題反映的不僅僅是邏輯,也是對這門編程語言的深度理解)
          我們延伸一下,回到個人職業(yè)生涯上看:

          淺度等同于不深入,不深入意味著普通和平庸,普通和平庸意味著可替代性很強??商娲院軓娋鸵馕吨苋菀妆惶鎿Q。這也就解釋了為什么程序員會有中年危機(不僅僅是程序員這一行,其它行業(yè)也是通用的)。

          那么我們?nèi)绾伪苊鉁\度而更好的深度呢?

          我的導(dǎo)師,給了我一個很好的意見,這里我分享給大家。

          就是從讀一些自己常用的代碼開始(如String、ArrayList、HashMap、FastJSON等相關(guān)的)。因為常用,避免陌生感,同時因為常用讀起來也就是更有意義。同時也可以參考相關(guān)的優(yōu)質(zhì)博文,看看前人是如何深入理解的,不過在看前人寫的之前,自己必須要有自己的意見(因為這代表著你思考過)。

          接下來我也會寫相關(guān)的源代碼理解文章。寫的目的也是希望自己不再是一個”API搬磚工人(這里我就不用碼農(nóng)了)”。

          也許有讀者朋友疑惑,為什么數(shù)據(jù)庫也被我列為Java程序員的兩項通用能力之一呢?

          以MySQL為例,我對于INNODB和MyISAM(單單一個InNODB沒有真正的弄懂)、索引原理、視圖和觸發(fā)器、存儲過程和游標等,僅僅是了解而非真正弄懂。


          雖說即便不懂,也能正常進行簡單業(yè)務(wù)、較復(fù)雜業(yè)務(wù)、復(fù)雜業(yè)務(wù)的CRUD。絲毫不影響業(yè)務(wù)開發(fā)。但是不真正弄懂的話,會成為真正高級Java開發(fā)工程師的瓶頸,到時候即便年限到了5年,理所當然成為一名高級研發(fā)工程師,但是實力并未達到,等到去面試的時候,一問三不知,最后可能會被面試官說:五年的工作經(jīng)驗,連這都不知道,怎么好意思要這么高的薪資呢?

          我之前公司一個領(lǐng)導(dǎo)T哥曾對我說過,深入掌握Java和數(shù)據(jù)庫對于一個Java程序員是非常重要的,因為無論你到那家公司,這兩項都是必需,而非所謂的業(yè)務(wù)能力
          (每家公司的技術(shù)棧相差不是特別大,業(yè)務(wù)相差是比較大的,但對于程序員而言,業(yè)務(wù)知識不一定要求你精通100%,最多也就是20%~30%左右,業(yè)務(wù)知識通??蛇w移性不是特別強,比方說,你從外包到自主創(chuàng)業(yè)公司或者是從創(chuàng)業(yè)公司到其它行業(yè)公司都可以,沒有什么限制,當然了,金融方面可能對業(yè)務(wù)知識方面要求高一些)。


          其實仔細想來,這些年開發(fā)過的CRM、OA、ERP、CMS、智能酒店和門鎖、物聯(lián)網(wǎng)云平臺、電商、編程平臺、教育平臺等項目(其中也包括二次開發(fā)),排除其中的編程語言(因為有用到Node.js、Python、PHP等),基本上數(shù)據(jù)庫都是共性,而且用的都是MySQL。仔細在從另外一個角度來看,一個項目從0到1,最終上線投入運營使用,包含高可用、高并發(fā)、高性能等,都與數(shù)據(jù)庫緊密相關(guān),因為這考驗著你的數(shù)據(jù)庫設(shè)計是否合理,一個設(shè)計不合理的數(shù)據(jù)庫,會無限增大成本(服務(wù)器的投入,為了保證”三高”,最簡單的辦法就是加機器,不斷的加機器,但如果設(shè)計的合理,機器可以加少點,加少點同時也意味著降低企業(yè)成本,當然也不排除一些公司盈利不錯,盈利不錯,意味著這些成本可以不忽略不計)。

          再回過頭來,即便是數(shù)據(jù)庫也有值得深入研究并掌握的?

          以MySQL為例,我首推INNODB。因為INNODB存儲引擎是用的最多的。

          同時還有一點十分重要,那就是SQL能力(包含能夠?qū)憦?fù)雜的SQL、優(yōu)化SQL、知道如何加索引等)?;旧峡梢哉f,如果你的SQL能力不錯,那么工作效率和工作質(zhì)量將會上一個檔次或者高好幾個檔次。以Java的三層架構(gòu),數(shù)據(jù)訪問層、業(yè)務(wù)邏輯層、視圖層(又稱UI層),其中的數(shù)據(jù)訪問層就考驗?zāi)愕腟QL能力,業(yè)務(wù)邏輯層依賴于數(shù)據(jù)訪問層(SQL能力),如果你的數(shù)據(jù)訪問層寫的不好有問題,那么自下向上都會受到影響,關(guān)于一點我深有體會過(曾經(jīng)也深受其害)。


          最后,我的這些年的經(jīng)驗教訓告訴我Java程序員的兩項通用技能是深入理解Java和數(shù)據(jù)庫(多次強調(diào)過,希望大家不要舍本逐末,追求所謂的新技術(shù),技術(shù)是日新月異的,而底層是不變的,把握這個不變,就足以應(yīng)對萬變)。因為這些是你無論到那家公司都需要的通用能力,相反我覺得框架并沒有那么重要,而且熟練使用一門框架并不是很難。任何編程語言和框架,最難的就是深入理解而非簡單使用(不僅僅是Java,其它語言也是一樣通用的,深入理解一門編程語言和數(shù)據(jù)庫,無論到哪你都能戰(zhàn)無不勝)。

          友情鏈接
          ioDraw流程圖
          API參考文檔
          OK工具箱
          云服務(wù)器優(yōu)惠
          阿里云優(yōu)惠券
          騰訊云優(yōu)惠券
          京東云優(yōu)惠券
          站點信息
          問題反饋
          郵箱:[email protected]
          QQ群:637538335
          關(guān)注微信

                日本护士献身取精xxxxx | 丰满bbwbbw高潮 | 日韩黄片在线 | 啊啊啊啊啊啊好深 | 欧美深夜福利 |