1. 程式人生 > >如果你是個半路出家的程式設計師,請一字一句的看完

如果你是個半路出家的程式設計師,請一字一句的看完

作者並不是行業頂尖技術達人,核心思想是希望通過自己的經驗能讓有緣分看到文章的非科班出身的程式設計師對自己的事業有些思考,少走彎路,沒有批判任何人的意思。

前言不囉嗦太多,資訊時代的迅猛發展造就了資訊產業,為了支撐資訊產業的穩定執行市場上出現了大規模it從業者的工作需求。

也就是說早年如果你想做軟體開發,必須是科班出身並且本身有一定的造詣之後才能順利的踏入這個行業,而如今呢,我們的市場膨脹速度越來越快需求的it技術從業者也就越來越多,進而產生的結果就是從學校以及專業場所產生的技術人員不足以滿足市場的工作數量需求,加上技術迭代給予很多技術棧實現了低入口,這樣大量的非科班出身it從業者湧入了這個行業。

這篇文章主要想闡述的觀點就是,對於專業的it從業者來說,如果你自身遇到了下文描述的問題,希望可以有所思考,對自己的職業以及未來做一個仔細的規劃,不要把更多的時間用在走彎路上。

首先:

第一個要闡述的內容就是對於非科班出身的程式設計師普遍存在一個硬性的問題:知識斷層嚴重,就拿最大眾java開發行業,舉個栗子。可能你之前是做建築的,做醫療的,做餐飲的,做保險或銷售等行業的,雖然偏差大,但是對於這些人群來說,它們原有的行業經驗也並不是對軟體開發沒有作用,原有公司行業的業務流程工作流程也是一種給軟體開發保留的經驗,因為做軟體離不開生活,離不開各行各業,做的程式都是為千百種行業提供支撐的,所以這些經驗對於過去有其他行業經驗的人來說也是很寶貴的,下面進入正題。關於知識斷層,看到的時候不要先想辦法反駁,比如,我在專業的培訓機構或補習班以及自我學習中我都學習過基礎知識,實際上我要說的知識斷層不是對於你理不理解變數理不理解程式碼關鍵字,函式,修飾符等,大多數人的斷層是對計算機軟體執行過程,編譯過程,以及軟體生命週期,作業系統等知識的匱乏,我敢說絕大多數專業的it從業者學習的大都是web行業的開發,比如php,java等技術,受到的教育過程實際上是一種速成的方法,也就是短時間內你學會了怎麼開發服務端應用,開發網站等,但是你所寫的大多數是基於框架之上,基於外掛之上,大多數人做的實際上是填空一樣的工作,比如把兩種框架結合到一起,按照規則把空填好,這樣程式就可以跑起來了。這種工作相當於電腦代工廠,就是各個硬體廠商把硬體發過來,工廠按照插槽的要求把各種硬體插在主機板上並且裝上外殼,這樣電腦就可以正常的運作起來了,但是如果你問這個工廠能生產電腦嗎,它們一定不能。

所以,在這種情況下很多程式設計師是可以開發固定模式的應用的,但是如果靜下來思考一下,假如做一個java專案不使用框架的情況下基於伺服器做原生開發,你還能不能區分mvc,還能不能把程式碼結構梳理出來,假如前端的介面不可以使用JQuery這種開源庫,你還能不能修改一些常用的介面功能了。這是最簡單的一個想法,接下來還關係到,為什麼現在會衍生出大量的前後端技術棧,它們的出現到底有沒有意義。

再舉個例子,有java和php程式設計師問過我,使用jsp的模版語法或者php的smarty語法就可以實現資料的遍歷判斷等功能去渲染介面,為什麼現在會出現mvvm形式靠js去渲染介面,這是矛盾的,為什麼好好的專案明明只需要跳轉一個jsp或者php介面就搞定的事兒,一定要把專案拆分成前後分離的專案,對於傳統的很多java程式設計師來說它們覺得這種新的架構是一種痛苦。

在這裡可以解釋一下,有句話叫存在即合理,世界上存在的東西都是有存在意義的,每個出現的新事物代表有需要這個事物的東西,所以為什麼要用js做一套模版語法來代替jsp php等動態網頁的模版語法,然後又把專案拆分成前後端完全分離,這也是適應時代發展的一個表現,如今的專案介面複雜度越來越高,需要渲染的特效以及動態效果越來越密集,前端介面的數量以及涉及到的業務也越來越複雜,那麼如果有人覺得動態網頁比這種架構好的話說明這個人可能對伺服器和客戶端的理解還不到位,對於jsp的編譯過程也不理解,如果用動態網頁的表示式去渲染網頁的話他的執行過程是請求這個介面時伺服器通過找到請求的jsp目標檔案,通過jsp引擎把它解釋成java檔案解釋的過程中還要將表示式進行java的轉化,再通過編譯這個生成的java檔案來把請求的資料渲染成靜態頁面的程式碼通過瀏覽器的解析來呈現的。也就是說這個工作是全部又伺服器完成的,而使用js模版介面他的工作流程是使用者請求到靜態網頁直接由瀏覽器編譯網頁資料,這個過程中去服務端把介面需要的遠端資料拿回來並且通過js模版渲染到瀏覽器對應的標籤中。也就是說如果食用jsp的模版渲染介面,整個過程的90%以上是需要伺服器來完成的,而使用靜態介面的工作90%以上是在瀏覽器中完成的。

這兩種情況就有了本質的區別

1.兩端分工,客戶端有無數個,服務端只有一個(簡單架構),那麼如果把渲染介面資料的工作全部由伺服器來處理的話那麼有一個訪客時伺服器需要處理的是一遍,如果有10000+訪客時伺服器要處理的是10000+遍,如果把這個工作交給瀏覽器來處理,那麼每個人只需要在每個人的瀏覽器上處理一遍,這個帶來的結果就是給伺服器卸掉了一個非常有重量級的任務釋放了更多的能力去接受更多的訪問。

2.介面渲染速度,雖然java這種編譯型語言可以將編譯好的檔案重複執行看起來效率會高一些,但是如果這些介面是由服務端去渲染帶來的結果是我們每次要看到這個介面必須由伺服器把這個介面的所有程式碼編譯之後送到我們的瀏覽器上,這個帶來的結果就是在資料傳輸的路上每一次要帶著介面的所有內容去傳輸,兩個缺點,耗時,浪費流量。現在的應用更多的出現在移動裝置上,而使用者是需要自己負擔流量產生的費用的,所以在這種情況服務端渲染的介面帶來的結果也是不好的,而瀏覽器端呢,在載入過介面檔案之後需要與伺服器溝通產生流量的資料體積就僅僅是這個介面中需要顯示的文字類或媒體類的資訊,在使用者訪問介面的時候不需要伺服器每次把介面的所有程式碼傳輸回來,只需要把對應的資料物件傳輸回來,這樣傳輸資料的體積變小了,自然速度也會有提升

這是一個很簡單的例子,這個例子主要想表達的是,看待不同的技術棧時要客觀的去看待,要有研究後再表達,最重要的一點就是,如果知識有斷層,是沒法真正的理解你做的到底是什麼事情,我在這裡不是鼓勵初學者造輪子,而是如果你在使用輪子的時候連輪子是什麼都不懂的時候你是沒法真正的明白為什麼要用這個輪子。因為有很多的程式設計師實際上是坐在別人的車上行駛,而自己卻以為自己已經可以跑的如此之快了

如果知識有明顯的斷層,是無法在技術行業有實質性的提升的。

下面要說的就是如果想在技術上走的更久遠

關於做學問

這裡就要出現兩個單詞,軟體工程師 和 碼農 不難聽的說這兩者的區別都是天與地。為什麼呢,很多人可能覺得碼農是程式設計師的自嘲,實際上也是如此的,但是有相當一部分人曲解了這個意思並且成為了真正的碼農。

在上面的內容中提到了使用框架,造輪子等內容,這裡還是舉電腦工廠的例子

軟硬體技術無一不是在迅速進步的比如電腦的cpu的工藝從um級別做到nm級別精度越來越高,記憶體條從mb級別做到了10gb以上的級別,其他的不多說了,但是如果你還是一家電腦裝配工廠,你在裝配電腦的時候會發現這些硬體在外觀上以及插槽是沒有多少改變的,它們雖然變化巨大但是你的裝配流程一如既往的沒有變化

這說明的問題是什麼?

如果你把自己看做電腦工廠,那麼那些硬體就是你在使用的框架以及外掛,你會發現,開發一個應用的時候,你和十年前一樣,操作步驟和流程都是如此,程式碼結構也沒有特別大的變化,但是呢,在這個階段裡每個外掛和框架的變化是巨大的,是你毫無察覺的,這就是進步與不進步。

這裡不針對群眾,在佔比來說,科班出身的程式設計師大都會有這種技術危機感,而大多數的非科班出身的程式設計師由於之前說的知識斷層,會有一個自我滿足的假象,有一些稍微有點經驗的程式設計師表露出得狀態就是,常見的需求沒有解決不了的,任何的軟體都能想到解決方案,進而有一種這些都是自己完成的假象成就感,但是歸根結底還是上個例子的問題:組裝電腦的工廠能生產電腦嗎?

這種情況對每個人的現狀是沒有多大影響的,但是這是及其限制個人進步的,如果十年之後你能做的還是把硬體拼成電腦,那你的前途在哪裡?

所以如果你仔細的思考一下,如果僅僅使用一些開源庫就可以拼成應用,那這個應用也必定會不值錢,那麼公司也不需要前端架構師,系統架構師,運維總監等等職位。如果你真的想在技術上走出一條大路,不要滿足現狀,雖然大多數人都覺得輪子有了,我就用就行了沒必要知道怎麼做的,不過要想明白一點,好的架構,好的應用,是不會使用那麼多通用的開源庫和現成外掛的,就算使用一部分,依然會在原始碼上做出相應的改動,為什麼呢?

你如果用過jquery,你會知道他封裝了大量的功能,比如動畫,比如ajax,還有他衍生的一系列jquery外掛,這些單單看起來都是非常好的,應用於普通的專案也沒有不好的地方,但是如果你仔細考慮一下你寫過的程式碼,你在使用這個庫的時候,是把所有的元件都用過了嗎?比如echarts這個圖表外掛,他能描繪的圖示可能已經涵蓋全世界的所有圖表了,但是你的專案裡是不是僅僅的使用了柱狀圖,折線圖,餅圖,或者k線圖,這就是通用庫的第一個問題,通用庫的作者考慮的是巨集觀的,多類目的,不是針對某個人的某個專案去設計功能,所以他會把有的,可能會有的,未來可能會有的,都寫到庫中,這樣就帶來了,你在使用時,其實可能僅僅用了他不到百分之十的資源,我見過一個後臺管理的介面引用了30多個不同的js外掛的,這不是開玩笑,大多數程式設計師是沒有製作輪子能力的,而且大多數的前端功能都是困擾程式設計師的一個長期病,所以如果你看一個java程式設計師寫後臺管理介面時通常都會看到這麼多的外掛,每個外掛都會用來實現專案中的部分功能。

按照剛才我們分析jquery,得到的估算結果,也就是說,應用這麼多外掛的程式碼利用率可能不到百分之十,那麼三十多個外掛就無端端給專案帶來了大量的無效程式碼看個很長的圖片:


這還只是一部分而已,可能很多人會覺得這正常,但實際上這是一個極其可怕的事情,如果你細心檢視過國內外科技前沿公司的網站,你會發現,它們引用的第三方js等外掛,還有它們的開源庫中提供的其他程式碼框架和元件,都不是平時大家熟悉而常用的開源庫,這裡面你還會發現,它們多數都是以公司自己命名的,所以實際上,如果說針對你自己的專案而言,真正好的是使用一個為這個專案量身定做的外掛,這個帶來的好處是什麼呢,是你的外掛每一個英文字母都不會浪費,他一定是你們專案必要的,而且是使用中的。

所以,我們還是舉個例子,這個例子可能很多開發者都感同身受的,尤其是後端開發者

有很多剛開始開發web後臺管理系統的人曾經問過我,除了寫java程式碼以外它們還需要解決一些前端的常用功能,比如樹形選單,比如一些選項卡功能,一些按鈕功能,但是這些功能對他們來說是一個噩夢,有些人可以用jquery勉強實現,有些人使用jquery也沒有實現思路,所以在網上搜索一些外掛,這個解決思路是正確的,滿足時下工作狀態的情況,但是很多人還遇到了一個問題就是外掛使用進來之後風格和效果與自己的專案格格不入,這個原因就是因為封裝通用庫的人不會針對某個人的專案去為其專門設計,那麼這樣一來想改動這個效果又大費周章,還產生了很多不必要的程式碼,實際上總結一下,這個現象說明了個人的技術棧儲備量不夠,思路不夠,帶來開發上的門檻,也就是技術斷層。那麼很多從這裡摸爬滾打出來的程式設計師可能已經攢了幾個自己順手的外掛來解決大部分問題,並且當你提出一些需求的時候它們可以快速的提出解決方案,如同拼裝電腦一樣把應該用的外掛列出來。以上的情況都是正確的,沒什麼不對的,但是僅限於時下你的工作情況而言這麼做毫無問題,但是不知道大家有沒有坐下來自己反思一下,自己對未來技術道路的規劃,還是要一如既往的拼電腦插板子嗎?

為什麼你工作了10年還進不去技術領域的尖端公司,不是你的專案經驗不夠,而是你只會插板子

為什麼工作10年,業務哪都通,需求全實現,但是bat不要我,因為你做的工作一直停留在“組裝電腦的階段”,難道bat不需要組裝電腦的人嗎?它們也是需要的並且是大量的,但是它們需要的插板子的人不是一個有著10年插板子經驗的人,而是一個年輕,素質高,懂得插板子,並且在這個過程中進而學習生產板子的人

所以如果上文中提到的故事有你的影子在,如果你到現在為止還沒有想過,我是誰,我在哪裡,我應該往哪走,那麼是時候想想未來的路應該怎麼規劃了,這對每個人都有好處。

尾聲

學習就像在爬樹

當我們在樹根往樹幹爬的時候,每一天都覺得有成就感,有目標,有收穫,每一天,我們的高度都在提升

而當我們跨越了樹幹後

會突然發現眼前的路不再是一條而是多條

並且每一條路都在無限延伸無限的發散,岔路越來越多

這個時候每個人都會迷茫起來,該怎麼選,該怎麼走,因為就算拿出全部人生,也不可能每條路都走一遍,

那麼在選擇之前,請對每條路都做一個簡單的考察,看看自己適合走什麼樣的路

不要停在一個地方重複一樣的事,人一生的時間是固定的,不要在停止思考的活下去

希望這篇文章能讓看到的人得到幫助

希望每個程式設計師都能對自己的技術生涯做好規劃,成為一名改變世界的軟體工程師,不要放任自己,甘心當一個程式碼的搬運工