前言

這是IT修真院自問自答系列第十五篇,同樣是乾貨和硬廣混雜。

 

一 程式設計師的困惑

第一個跟我說這個的是小丁丁。

小丁丁在論壇時代的修真院,就已經是比較出名的了,他的學號是016。

 

在線上自學的時候會用Flex佈局,還會做Gif動畫。

當他說要來線下學習的時候,算是我第一個比較期待的人。

 

是的,那個時候我每天都會看他們的日報。

 

後來小丁丁成了修真院的睡袋師兄,幾乎所有的線下師弟,在修真院打地鋪的時候,都會找小丁丁買睡袋。

他也確實成長的很快,很快就可以獨立完成一個專案了。

 

這很不容易,特別是在修真院的教學體系還不完善的時候。然後我把呆萌奎和小丁丁都留了下來,他們算是公司的第一批從學員轉過來的正式員工。

 

可是沒多久,小丁丁跟我講,他想離職。

我說過,如果在工作中遇到任何問題,都可以跟我談,可是如果你一旦說出來離職這兩個字,就絕對不會開口挽留。

 

可還是簡單問了問。小丁丁說,他已經有兩個多月沒覺得自己有進步了。

總是在做重複的東西,除了自己的程式碼更熟練之外。

 

而且,修真院一直都很苦,幾乎是沒日沒夜,熬幾個通宵的事很正常。

而我的脾氣也不好,經常把他們罵的狗血噴頭。

 

當然薪水也不高,任何一個人從修真院出去,薪水翻倍還算是比較正常的。

小丁丁那個時候,算是剛入行4個月,還是6個月,我不記得了。

 

那個時候我其實是還是比較BS說做專案程式碼沒進步的。

我自己寫了很多很多程式碼,最喜歡的其實往往就是不斷的重構程式碼,不斷的提升自己的效率。

 

如果我覺得我在反覆的做一件事,那麼我就會想辦法讓這件事變的高效一些,所以這幾年寫了很多程式碼生成的東西,儘可能的讓自己的時間和精力用在架構設計,重構和測試上。

 

我覺得小丁丁根本沒理解什麼叫程式碼。

可是小丁丁自己很糾結,他本打算是一直跟著我的。

 

是的,我其實也打算是帶著小丁丁一起飛的。可是我不喜歡糾結的人,所以我說。沒事兒,我幫你推薦工作。

於是幫他介紹到了一個朋友的公司,那邊面試完之後,給出的薪水是12K。

 

對的,修真院就是這麼一種尷尬的境界。當時宸寶的薪水才3K,可是他帶出來的學員,3個月出門,就可以拿到8-12K了。

小丁丁也不開心,對他來講,也是一樣的。

 

一邊是工作壓力大,一邊是薪水拿的低,一邊是明顯不如自己的人,可以拿到更好的薪水,而自己又沒有了進步。

 

所以小丁丁很困惑。

他收到offer之後,說要請我吃餃子。

 

於是半夜12點多,公司樓下,我們在十字路口的大街上路邊小攤要了兩份餃子。

小丁丁第一句話就是:老大,他們給我Offer了。

第二句話就是:可是我捨不得你。

 

然後就是哭。

我笑。說:哭毛線啊?找到份12K的薪水不挺好麼。

 

第三句話,他說:老大,我不走了。你讓我再留下來吧。

我說:好。可是我得跟我的朋友解釋清楚,不然以後我沒法做人了。還有。沒有第二次了。

 

小丁丁說好。

於是我又給朋友打電話,果然,被朋友罵的狗血噴頭。

 

可是沒過兩個月,小丁丁還是決定走。

於是我又給他推薦了另一家朋友的公司,那邊也比較喜歡小丁丁,還是願意給他12K。

 

小丁丁又拒絕了。

直到第三次,我實在忍不了,跟小丁丁說:趕緊滾。

 

這次沒給他推薦工作,他自己找到了一家公司。薪水是10K還是12K,我不記得了。

但是總算是平定下來了。

 

可是我記得很清楚,這是第一次有人跟我說,覺得自己沒進步,遇到了瓶頸。

 

大概之前也有過,可是那基本上都是工作三到五年的,想要我指點一下接下來怎麼走。

我還從沒遇到剛剛工作4個多月和小半年就覺得有瓶頸的。

 

後來,呆萌奎也這麼跟我說。

跟著是古塵,剛剛又是宸寶。

 

我想了很久,覺得還是有必要再理一理思路,試著去總結一下,一個程式設計師,什麼時候會遇到瓶頸期,又該怎麼去渡過。

特別是在做專案程式碼的時候,會不會覺得自己沒有收穫。

 

畢竟,我是見過有些人,不喜歡做專案,做事總是能推就推,就喜歡看書看原始碼提升自己的技術實力的。

 

二 程式設計師的分級

之前講過程式設計師的分級。分成了自己獨立完成專案,這個叫初級程式設計師。

能帶Team完成專案,並且能夠了解專案框架中的原始碼,思想,能夠做一些改進,這個叫做中級程式設計師。

能獨立寫框架,寫演算法,這個叫做高階程式設計師。

 

我覺得這三種就夠了。高階程式設計師全世界也就那麼幾個,初級程式設計師也好衡量,不是高階也不是初級的,就是中級。

 

沒必要再分。

 

這種分法第一次出現在知乎的時候,就被一些人嘲諷,這也是符合知乎價值觀的事兒。

先不談這個話題,只說小丁丁,宸寶,古塵,呆萌奎,這幾個工作不到一年的小菜雞的瓶頸從哪來。

 

在他們剛入行的時候,確實進步很快,因為每天都在學新的東西。

我看到之前有人在我的貼子裡反覆的跟我說:老大求更新。

我都默默的說一句,更新個毛線呢,早就寫到修真院的官網上去了。

 

所以實際上,以WEB工程師為例,他們大概會花3~5周的時候去學習CSS,包括自適應,響應式,Bootstrap和Less,以及Html5和CSS3的一些東西。

 

這裡的學,並不僅僅是學,而是指他們真的可以寫出來程式碼。

 

所以在這段時間裡,每天都會感覺到進步,因為每天都會學習到新的技能點。

這些技能點也是整理在修真院的技能樹中。

 

跟著會花6~8周,或者是更長的時候去學習JS。

這包括原生JS,JQuery,AngularJS。我沒再要求他們學RequireJS和GruntJS。

或者是其他的React。會AngularJS就夠了,其他的必須要在他們工作中去使用了。

 

所以在這段時間裡,他們也是在每天都學會新的東西,而且總會有新鮮感。

前3個月或者是4個月,基本上都是這樣。

這個時候,也會有人遇到困難,但是大多數都是沒長進,而不是沒什麼東西可以學。

 

顯然 ,小丁丁他們不是這樣的,他們是沒有東西可以學了,不知道自己要學什麼,總覺得自己只是熟練度上升,而不是深度有所增加。


 

所以可以簡單的理解為,對WEB工程師來說,前3~4個月,都屬於新手技能學習階段。

那麼接下來呢?

首先,並不是沒有東西可以學了。WEB永遠不缺新鮮的框架,也不缺少對於框架底層的理解,而是到了一個必須把自己學會的東西沉澱和積累的過程。

 

你到了一個學有所成,必須要動手反覆做專案的時候了。

這個時候的重點是什麼?

 

是業務知識的積累,編碼規範的積累,最佳實踐的積累,開發流程的積累。

而這些,有誰一開始就意識到,對於一個出色的工程師來講,以上四個方面都是非常非常重要的技能點呢?

 

比如說,業務知識,現在的趨勢是越來越偏於行業的融合。有幾個有明顯行業特徵的,像金融,醫療,汽車,財務,電信。這些沒有業務知識是很難寫程式碼的,寫出來的也只是一堆又一堆無意義的垃圾。

 

再比如說,支付,IM,地圖,第三方登入分享,微信公眾號,微信小程式。這些同樣是沒有太多技術含量,但是你必須要去理解的。

 

除些之外還有更多通用的設計,表單驗證,圖形驗證碼,檔案上傳,語音播放等等等等。而這些很難會給人一種深度的體會,更多的時候像是堆積在一塊兒。

 

困惑也會來自於此。做一個專案,少於也要2周,大點的,可能要2個月,做3~4個專案下來,一年就已經過去了。

算起來,是不是自己除了業務知識熟悉了點,開源框架多用了點,其實沒有什麼長進的?

 

可是你們不知道,業務知識和業務邏輯,也是程式設計師的重要技能之一。同樣的沒有速成,只有入了一個行業,才會真正的感受一個行業。


 

再說第二個,編碼規範。曉進已經工作2年多了,之前跟她說的很多東西,她到現在才慢慢的理解,比如說,數字要換成常量。很多時候當我們說起來的時候,大家都懂,可是自己寫的時候,還是會忘。

 

這個不是真懂,這是看起來懂了。什麼時候才會懂?真正吃過虧的時候。曉進最近在接手一丁寫的程式碼,要麼就是培宇寫的,反正當看到>=1這種程式碼的時候,真的是一臉蒙逼,對,不要想著有太多註釋,連常量都懶得替換的人,怎麼可能會有註釋。

 

而且 註釋 又怎麼樣?程式碼更新了,註釋 沒更新的時候多了去了。反而是增加了更多的文件不一致而已。

 

然後曉進才真正懂的用常量來代替數字的含義。

這些道理前人總結過了很多次,可是有些坑你不去踩,是真的不會理解的。

 

特別是對後端而言的日誌規範。

這些沒有大量的專案做支援,你是不會感同身受。而有時候,寫程式碼,就在於這種小的細節。

 

第三個是最佳實踐。

 

說起最佳實踐,這些東西沒有半年到一年的時間是沒辦法理會的。

怎麼說,沒有持續的維護一個專案,很難理解自己的程式碼倒底是怎麼樣的。

 

沒有需求變更,沒有程式碼交接,根本不會知道什麼是正確的程式碼。

實現一個功能有很多種方式,很多人僅僅會聚焦在原始碼,框架,演算法,語法上,可是更多的時候你都是在寫一個可持續維護的系統 。

 

我現在跟他們說,怎麼樣才是一個好系統 ?並不是僅僅是說,我給你一個需求,你花了半個小時做完才是好系統,而是要看需求變動後,要花多少時間才能完成。

 

如果你能又快又好的完成一個系統,又可以在需求變動後很快的完成,這是一個設計良好的體系,而且非常注重和業務的結合,在系統設計的時候必須合理的去預測哪些需求是有可能變化的。

 

永遠不要相信產品經理那張嘴。所謂的最付款實踐就是這樣,當你遇到問題的時候,當你遇到需求變更的時候,你的程式碼才會是真正的展現出來價值。

 

程式設計師工作的環境永遠是在線上,很多人都有習慣,說我程式碼寫好了,我提交到SVN上了。這算個毛線。

 

跟沒做是一樣的。

所以說,最佳實踐也是需要大量的專案積累,特別是需要有一個長期的維護,沒有一個持久的專案,很難理解什麼才是最佳的實踐。

 

我們每次CodeReview都在盡力將最佳實踐整理出來。這個時間,我覺得至少也是需要半年到一年的鞏固時間。

 

第四個是開發流程的積累。

開發流程其實是比工程師的能力更重要的事情,或者說,他是將一種鬆散的行為規範化的情況。

合理的開發流程都並非是人為設定,而是遇到了各種實際的問題,從解決問題的角度出發而給出的方案,並且是不斷的修訂中完善的。

 

我寫程式碼這麼多年,感受最深的其實就是開發流程。修真院這家公司,在前一年半,我都沒敢提流程這件事,因為大家都太菜了,菜到根本就沒辦法按流程去走的地步。整整一年半的時候我都是用放養的方式去做,所以流程最核心的概念是為了提高效率,避免問題。而不是人為的束縛,很多工程師其實是不太理解這個的,也比較難看到價值。

 

最近差不多半年多,都在教他們怎麼遵守流程,怎麼去解決開發流程中遇到的問題。

太多坑不踩是不知道的了。

 

以上這四點,都是在初學者,從0基礎到2年之內最容易遇到的問題。在這個時間階段,你可有會覺得自己並沒有學會什麼新技術,只是在做重複的勞動,甚至會有一些疲憊。也會想要去認真把一門技術學深,卻總覺得沒有時間。

 

這也是我在最近一段時間裡經常會聽他們講到的。

我和他們不同的就是,我從來不認為這是一個沒有任何長進的過程,如上所述,我覺得這是在業務知識,編碼規範,最佳實踐,開發流程的積累。

 

如果你自己發現以上這四點也沒有任何的進步,那才可能是真正的出了問題。

很多時候,你學習一門知識可能只需要幾個小時,把它用好卻可能需要10年。

 

與此同時,還包括解決問題的能力,學習新技術的能力,都是在潛移默化的改變成。1萬小時定律我沒太具體瞭解是什麼,也沒仔細去推敲,但是大概的意思我猜測就是一個多練習的過程。

 

所以我自己其實是有點反感知乎上各種動不動就叫人看原始碼,談演算法的2B們,也懶得爭執。

特別是這個問題下,又出來幾個人蹦噠著說點老一套。

 

說起來沒睡太好,寫的有點亂,但是第二部分的重點就是在於提醒,覺得自己遇到瓶頸,沒有長進的小夥伴,仔細分別一下自己倒底是屬於哪種情況。我能百分百的確定說,如果你在業務知識,編碼規範,最佳實踐和開發流程上有進展,那麼你並不是沒有進步,而是你沒有意識到他的價值。

 

所以什麼時候才到了應該去看原始碼,去看更底層更核心的階段呢?

解決問題。

 

但你遇到了一個問題,想想別人是怎麼解決的。

先去自己猜想問題解決的思路是什麼,然後再去看他原始碼實現。

所有的流行的開源框架都是為解決問題而生。

自己瞎折騰解決不了實際問題的框架也根本不會流行。

 

比如說Bootstrap是為什麼存在?

Https是為了什麼出現?

WEBSocket又是怎麼回事兒。

TCP的三次握手為什麼要這麼設定。

 

如果你在寫程式碼的過程中,首先是看自己遇到的問題是什麼。

大到設計模式,小到底層協議,先確定這是不是你會經常遇到的問題。

暫時拋開不是你當前最著急需要解決的問題,著重點放在最容易出現的問題上。

 

先去找解決方案,看看大家都是怎麼解決的,有沒有通用的解決問題的方案。

再看看這些通用的解決的問題的方案,是否適應你的情況。

如果不是,應該怎麼優化,怎麼改進。

 

這才是順理成章的去讀原始碼的步驟。

那些什麼問題都沒遇到,就動不動去談看了多少原始碼,看了多少書的,倒底是為了學知識還是為了裝逼還是為了給自己加談資?

 

我也很不喜歡面試官在面試的時候裝逼的。以前經常有人問看過JDK的原始碼沒,看過Spring的原始碼沒,我就經常在心裡罵傻逼。如果你問我說,JDK的GC演算法都有幾種,適合什麼場景,有沒有可以再優化的空間,我會覺得很喜歡。

 

所有的技術都源自於解決實際的問題,甚至包括在實驗室裡寫學術論文也一樣。總是先去優化和改進一個具體的點,這樣才有實際的意義。

 

所以當你真的是對技術感興趣,是一個Geek,那麼更應該去從解決實際的問題出發,想辦法提升自己的效率和解決實際的問題。

 

當然,公司的環境和氛圍會給你很大的幫助。但是所有的學習最是要從內心發起的吧?


 

最後整理一下,我給出來建議:

1:0~6個月 學習技能和術語和思維方式的階段

2 :3~24個月 學習業務知識,編碼規範,最佳實踐,開發流程的階段

3 :6~120個月 抽象梳理問題,尋找解決方案,參加其他人解決問題的思路,給出自己解決方式的階段。

 

所以親們,如果覺得自己沒有像初學的時候進步那麼快了,不要慌,你可能是在用一種方式前進。

 

當然更多的人,可能一開始就學了假語言,上了假知乎,自以為是一個真程式設計師。


 

這個回答依然是很主觀,不負責。看到評論裡有說為毛我正經回答的答案也靠後的,顯然是被踩的多了啊。

但是沒關係,早說過我沒能力把所有的人都教會,我只願意去教願意聽我話的人~

 

其實感覺還有很多東西沒梳理出來,也是自己平常總結的太少。先這麼著吧~~

技能樹.IT修真院 http://www.jnshu.com

“我們相信人人都可以成為一個工程師,現在開始,找個師兄,帶你入門,學習的路上不再迷茫。這裡是技能樹.IT修真院,初學者轉行到網際網路行業的聚集地。"

 

加QQ群:

1群 2000人 18***188(已滿)

2群 1000人 42***1650 (已滿)

3群 500人 49***6441(已滿)

4群 500人 580***6624 (已滿)

5群 500人 604****59 (已滿)

6群 1000人 254078081(已滿)

7群 200人 562814359(招募中)