一直沒有寫年末總結的習慣,今年想寫,年前懶癌發作,元旦後也一直沒抽時間,也很久沒寫文章了,掘金的活動可以算是一個動因吧,在這個比較重要的一年裡,寫一篇比較長的文章,也盤點一下平時思考過的一些東西。
個人履歷
首先簡單自我介紹,我是2019應屆本科生,哈爾濱一所不知名學校軟體工程專業,前端開發者。今年過後,多年的學生生涯也到此結束了,盤點一下大學已經過去的三年半,真的沒白讀。
我的經歷其實就是一個普通人的經歷,上大學之前,對軟體開發一無所知,不過我選擇這個專業還真不是道聽途說的“賺得多”,最初的認知來自於我是用的第一部智慧手機。時至今日智慧手機動輒10+128,也許很少有人能理解 RAM 512MB ROM 150MB的手機使用起來是一種什麼樣的感受,那個時代獲取root精簡系統是多麼重要。那個手機我用滿了三年,也使我相信我可以做這個工作。然後一切就和我想的一樣,我選擇到了一個合適的學校的對應的專業。
剛到大學的時候真的不懂,學校的課程設定的也不是很好,大一上學期只有c一門專業課,藉著學校ACM校隊舉辦的集訓活動,學校c語言課上的基本內容在十一假期就學會了。然後我就在思考我應該做什麼。當時沒人指點我,我也不知道獲取有效資訊的渠道,我只知道我想要在大二結束前能自己寫出android app,我只知道我需要先學會java(當時可不能用kotlin也沒有flutter)。我買過很侮辱智商的從入門到精通系列的書,當然後來主要是靠看視訊資料,懵懵懂懂的知道了物件導向是什麼,開始拿起郭霖老師的第一行程式碼,正式開始學習開發android客戶端,前前後後半年左右吧,算是能寫本地應用了(不聯網那種)。大二的時候申報大學生專案,我也跟著參與了一下,想做app需要後端開發,說起來慚愧,就像我現在看外行人一樣,當時一個很外行的我是無論如何也不能理解,你看上去只有一個會聯網的app,看不到的是不知在何處的某一臺機器上執行著提供服務的另一個應用。普通使用者不用知道server端存在,這並不是壞事,但是作為一個開發者,這可是極其不專業了。既然java能進行web程式設計,那我就用java寫吧,省的再學其他程式語言了(naive)。ps:此時我還不知道我要學的那個東西叫後端。
java web學習這段路可以說是拐的很偏了,現在回來看這段經歷,其實也是少不得的,一會還會再說。眼下,我就要開始學習java web了,當時主要的學習資料就是imooc上面的那些比較老的視訊(當時就處在過時的邊緣,現在真的沒必要看了),一邊學一邊還在想,jsp是不是寫頁面的嗎,這不是前端嗎,那我學這個幹什麼(根本不知道有後端),迷迷糊糊地就這麼學著(當時我是抱著留後路的態度,android開發已然趨於平靜,因為崗位的特殊性註定了機會不會很多,而且就是那一年小程式剛剛出現,多一種選擇未嘗不是好事)。後來跟著就是ssh(簡單看過而已,沒學),ssm,還有封裝好的spring boot,這時其實我在java的路上走的已經比較遠了,我也已經知道了web後端是什麼,前後端分離是什麼,我也考慮做一個java工程師,當時大概大三了,寫app這個目標已經實現了,我要做java,我開始考慮技術的廣度和深度。從jvm原理到框架原始碼,從javaSE基礎到web框架熟練使用,從基礎演算法到分散式中介軟體,坑還是很深的。其實這個時候,接下來學習java發展究竟如何,其實我是不確定的,但是由於之前的積累,我已經相信了程式語言只是工具而已,解決問題的方式有很多,在需要的時候選擇合適的就可以。而真正讓我選擇前端,大概是從node.js開始。
node.js聽說過很久了,但是不知道是幹什麼的,之前也和很多不瞭解情況的人一樣,js肯定是前端框架了,後來使用hexo搭建部落格,安裝了node.js環境,不過並不知道為什麼要安裝。說來慚愧,第一次知道node.js是因為一家培訓機構的廣告。很多學校都有那種,培訓機構來學校做推廣的課程,我第一次知道node.js,它是用來開發後端的,它主推的非同步流程和我熟悉的多執行緒同步模型截然不同(當時並不知道vert.x,Netty是什麼,只是聽說過)。培訓機構我不喜歡但是也不排斥,但是我絕對不認同一點:不是所有的本科學生都沒有自學能力,雖然這是大概率,但是否認所有人的論調就是會讓我覺得不舒服,換一門語言又不是不能寫增刪改查,試試就試試。我開始瞭解node.js,我知道學會js之後有機會學習前端,我順便關注了一些前端話題(那個時候我還記得,當時正是vue作者尤雨溪老師和谷歌angular中國區佈道者大漠窮秋老師在知乎大戰的時候,沒入前端門先認識了前端娛樂圈,ps:後面也真的是,每隔幾個月必有大新聞)。學習node.js時候我已經完全知道自己在做什麼了,前後端分離的邊界在哪,每一部分需要做的是什麼,js語法什麼的,已經不存在什麼很大的問題了,知道想要學什麼,尋找需要的東西去學習就可以了。在學習node.js時候要感謝我們學校jser club騰哥的幫助,他是Node.js Foundation的成員之一,我是在他推薦後瞭解的egg.js(迄今為止我最喜歡的node.js web框架,不管阿里出品口碑如何,egg.js絕對是我心中相當優秀的框架,又免費廣告了一波,天豬老師大概也不會看到),後來寫第一個正式專案時候,參考了騰哥之前寫的一個工程。node.js當然不只有web一部分,各種其他功能我也瞭解過,我也知道它作為前端工程師的工具,發揮的作用是極其巨大的。時機差不多了,我正式開始學習前端了。
前端的門檻在門裡邊,html,css,以及對於一個寫過node人來說的js,入起門來其實很容易。簡單看了看基本經典的基本資料圖書,之後就開始學習vue.js了,選擇vue最主要是因為漸進性學習路線,可以從使用script標籤引入開始學習,最後到webpack工程化的學習。學習vue主要得益於黃軼老師的音樂播放器視訊(這裡也不是廣告,不過實名推薦,我心中目前最好的學習視訊,沒有之一),這個專案基本上涵蓋了從零開始搭建完整vue工程的每一個方面,吹爆。之後我使用vue和egg獨立完成學校的一個大學生專案,這是我第一次使用vue,也是第一次使用egg,一上來就完成完整專案既是實戰也是學習,此後算是正式入門前端。我和大多數前端都不一樣,我不是從html,css開始學起的,我也沒有過寫靜態頁面的常規練習,可以說是路子比較野了。我此時完全堅信也印證了一點,軟體工程理論真的是相通的,所謂的客戶端開發也好服務端開發也罷,瀏覽器開發原生開發,它們各有各的特點,但是總能抽象出共通的東西來。再以後就是大三下學期了,從寫js開始到入門前不到半年的我開始尋找實習了,機緣巧合吧,去了我第一家實習公司。之後面試了幾家暑期實習,也通過了幾家,最後選擇了我現在的公司。在這段前後的時間接觸的新東西不多,但是成長還是有的,個人開發和企業開發本身有很大差距,創業型公司的實踐模式和大型網際網路公司的實踐模式還是有一定差別的,等等諸多不便細表。後面的故事就是因為工作時間原因,我沒參加秋招(算是小遺憾吧),拿到了現在公司的offer,目前待畢業入職狀態(也可能還看機會)。
覆盤回顧
整個大學就是這樣的,現在回顧過去,有時候確實會想,是不是有些彎路沒必要走?有些東西學習了之後對我現在有幫助嗎?如果讓我重新選擇一次我會怎麼走?等等一系列問題,接下來也算是自己回答自己,做一個覆盤。
為什麼幾經波折最後選擇了前端?
我是一個用情不專的人嗎?我是一個看什麼好就幹什麼什麼都想做的人嗎?我覺得我不是,我做的每一個決定都有自己的道理,我不能說自己是對的,但是絕對是符合我個人意志的。學習android開發是因為最初的興趣點,而且時至今日大前端的發展我用js仍舊可以開發android也算是繞了一圈不忘初心了。java後端開發是我冷靜思考過後選擇的正路,按照我當時的見識和眼界,這是最合適的東西,而且也是常規選擇,不能說沒幹正事。至於為什麼後來又變了,因為對我而言,放棄java學習前端的原因之一是我對網際網路公司的追求(網際網路公司是個神奇的東西,至於我選擇網際網路公司的道理,一句兩句話說不清楚,在此不展開了)。首先一個事實就是,後端語言多種多樣,java只是其中之一,而且java廣泛應用於傳統軟體行業,在網際網路行業裡面,java的應用多但是沒有絕對優勢,而網際網路前端,js是繞不開的。如果我學習的是其他一門後端程式語言,我大概就不會改了,但是java,這是一個在傳統行業大放異彩的東西,我要學習一個在網際網路行業中有這麼高地位的東西。另一點也是最重要的一點原因是現在前端工程師所發揮的作用越來越大,大前端的概念個人認為沒那麼誇張,但是是存在的。時至9012年要是還有人認為前端只是切圖的,那他是絕對的外行了。如果是曾經的逐個靜態頁面分別開發的時代,我是不可能喜歡前端的。我覺得現在的前端行業是真正的工程,它還在發展,它正在日漸完善,這裡面有我想要的東西。
學習前端之前的學習經歷有意義嗎?
答案是肯定的,不但有,甚至一點也不能少。android客戶端開發是使用者端開發,其實web前端開發也是客戶端開發,它們只是做同一件事的不同方式,在實際開發中遇到的問題也有很多相似性,比如android中資料變化需要同步ui展示,而web中也需要做這個同步處理,而各種現代資料驅動的web開發框架,其中的一件重要的事就是實現了這個同步過程的自動化,這些東西我在android中理解了在web前端中也就懂了。更重要的一點就是,在那個時間點上,學習android編寫的大量java程式,使我從迷迷糊糊到徹底弄懂物件導向,而學校最早接觸物件導向的課程是在半年多之後。還有一點算是很幸運也可能是很不幸,我選擇的程式語言java,它是教科書式的物件導向程式語言(至於為什麼說不幸,下面會說)。
後來的java web學習真的是走了不少彎路,但是,它的不可替代性在於,通過這段學習我真正弄懂了前端後端都是什麼,前後端分離是什麼,為什麼要ajax非同步請求,http請求與響應之間資料是怎麼流動的……這些東西時至今日也是極其受用的。而且這段時期的大量編碼真的是很巨大的成長,可以說,直到此時,我才開始具備成為開發工程師的基本條件。
之後的node.js,如果把它作為後端js的執行環境,可能大多數時候都只存在於個人專案中。但是當它作為前端工程師的基本工具時,它的地位可以說是非常重要了。其實很多時候我們會需要一些小工具,它們可以用來自動化的解決遇到的重複性問題。這些東西其實任何一門程式語言都可以做到,但是要考慮執行成本,實際上更多時候由指令碼語言來充當這個任務。對於其他工程師而言,python是一個不錯的選擇,但是對於前端工程師而言,js已經是一門強大的程式語言了,node.js又可以讓它走出瀏覽器,自然成為了開發這類工具的絕佳選擇。而且我先學習的node.js,ES6,typescript接觸的都非常早,這對於現代前端開發是有很大意義的。
如果成新選擇一次,我會選擇前端嗎?
會
聊聊技術
我認為不得不說的技術之外的事
談一談我對技術工作的看法。曾經不短的時間裡,我和很多人一樣,認為作為一個開發者,技術就是全部,要不斷學習新的東西,提升自己的程式設計能力。這些話不能說不對,但是現在看來,還是眼界太窄。
我只是一個還沒畢業初入職場的年輕人,我做的話只代表個人看法。我知道很多技術從業者,包括我在內,一直在心中存在一個矛盾:在公司大多數人在寫業務,無非就是擰螺絲的工作,而個人成長需要提升技術能力,公司做的很low的工作我不想去做,他不會給我帶來什麼好處。這個觀點不能說錯,但是要考慮一個問題,開發工程師創造的價值在哪?要知道對於資本家而言,他們根本不會關注產品開發的過程,一切的收益都會以創造的商業價值為準。誠然,一些框架類庫的開發提升了開發人員的工作效率,但是之後呢,高效的開發目的也是要節約開發維護的成本,要用更少的投入來創造更大的價值。從這個角度來看,一個商業化產品,無論是產品、設計、推廣、開發、運營,每一各環節都只不過是其中之一而已,如果單純只通過技術的角度來看一個產品,無異於管中窺豹。
這不代表技術不重要,而且術業有專攻,該做好的事本應該做到足夠專業。我想說的是,這種看問題的方式,影響了一個開發工程師的眼界。其實我們工作的時候只要能夠抽象建模,所有遇到的問題最終都不過是UI和資料流的處理。但是我們為什麼要去了解業務?為了能夠建模,這只是其中的原因之一。瞭解業務之後整個開發過程中我們可以不把自己當做一個只會寫程式碼的,我們可以從產品本身出發,思考為什麼要做?如何去做?帶來的價值是什麼?這個過程也是我們思考自己工作意義的過程。
我的前端技術棧
成為前端工程署之前,首先要是一個軟體開發工程師,計算機網路,作業系統,演算法資料結構等等東西,包括設計模式,軟體工程理論等等在學校學的東西東西不能丟了。說它們沒用只能說是因為太菜了,做的工作太low以至於根本不需要這些東西。學校教的有時候不夠,加上自己學習的,這部分有一個簡單的知識體系。
作為前端開發者,首先肯定要學習html,css,javascript了,雖然我早期沒寫過大型靜態頁面,但是html,css至少是過關的,css3動畫寫的相對少一些,JavaScript的書我看過不少。自己不是一開始就從前端學起來的,和他們相比基礎知識沉澱的時間不夠長,,所以在學習的早期基礎知識方面投入的比較多,我認為能用原生js思考問題很重要,用不用和會不會是兩個概念。
框架工具在工作中主要使用的是vue,當然我覺得技術總是用來解決問題而存在的,框架之爭沒什麼意義。我自己比較喜歡寫react,純屬個人喜好問題,自己寫東西我就使用react寫了。
node.js還是不能丟的,在前端中主要是各種自動化工具,輔助開發的。node.js做web開發在生產中可能沒機會實踐,但是如果是我自己寫東西玩,我就直接用egg了。
typescript是一個很好的東西,不是跟風,怎麼說呢,用的時候起初我真沒感受出來好,多寫了很多型別介面定義,甚至一度覺得自己是給自己找麻煩。可是當我一旦再回去寫js時候,我驚奇地發現我曾經覺得沒那麼糟糕的js原來這樣難用(我用過java,熟悉靜態型別,但是js些時間久了我覺得動態型別也挺好的,直到遇上ts)。用了就很難回去,大概感受它的到好處的人才會懂吧。
跨平臺技術一直是大家的熱點話題,目前我寫東西主要用react native,因為它的生態相對完整,雖然至今沒出1.0,但是有不少生產環境使用的案例,一些常見問題也都有比較成熟的解決方案。flutter是比較熱門的,從設計理念來說,它是更先進的,如果發展的好,可能未來真的會成為主流,目前還很年輕,觀望中吧。
以微信為首的各種小程式也屬於前端工程師的開發範疇,這類東西我寫的不多,如果有需要的話會去學習。
我很樂意去學習函數語言程式設計相關的東西,FP和OOP本身並不是針鋒相對的,二者也沒有誰好誰壞,解決問題的方式很多,選擇哪種需要考慮的點也很多。在公司中自然要統一程式設計風格,如果是自己寫東西,我很願意適當的使用fp解決問題。對我來說一個比較大的挑戰可能是有時候思想被OOP限制了,有些東西還是要不斷地去學習,包括響應式的Rx.js等等。
還有很多值得了解的,graphql,pwa,ssr,electron,webassembly等等,這些東西我會去找機會學習,有需要我也願意主動去使用它們。要了解的東西很多,人的精力有限,對我而言二者之間的平衡點在於,這個東西是否值得。
大概是學習規劃吧
目前的任務大概是做畢業設計,寫論文。畢業設計中也可以學習react native,electorn等等東西,後面可能還會去了解一些docker等等工具,整個完成提升的可能不僅僅是技術能力,還有對於產品設計,對於開發流程把控等等方面能力。然後我會去補充學習一些前面提到的值得了解的東西,隨時保持一個比較新的狀態。此外還有基礎的沉澱。另一方面就是技術的深度,包括各類工具的底層原理,公共類庫的內部實現方式等,這方面的學習一方面能加深對於這些工具本身的認知,另一方面通過閱讀也能提升自己的能力。還有一些效能問題等實際生產中才會遇到的問題,這些東西也是工作之後的一些認識吧,有機會需要提升一下。最後還是我的觀點,技術只是一小部分,要提升自己的眼界。
一點想說的話
其實也曾經問過自己,累嗎?後悔嗎?我的學校很普通,也沒遇上相關愛好的組織,身邊的同學準備讀研自然也沒人和我同路。我自己堅持的動力大概來自於編故事的某乎社群。別人都行我為什麼不行,我就是想有一天也可以像他們一樣輕描淡寫的一句–這東西一學就會了,這東西看看文件就能上手,這東西很簡單。我知道背後的不易,但是我覺得我可以。不過真正到了今天,最後的我什麼都不想說了,以後回首往事,我會很感謝今天的自己。(其實這裡之前寫了很多話,又刪了)
最後感謝所有人,還有最愛的她。