我是程式設計師。大眾口中非科班的那種,帶著高中時期對二進位制的恐懼,在大學參加科研比賽後保研,再到和校友一起創業,現在在某大型網際網路公司做前端開發,一路走來都是靠自己學習。
前端框架 VUE 的作者尤大說過一句話:以前所學的東西並不影響以後要學的東西。這句話也是,我對前二十多年從義務教育,到自學程式設計的深刻體悟。
下面,我跟大家分享一下,我是如何踏上程式設計這條路的。這篇文章斷斷續續寫了一個星期,文字很普通,希望大家有所收穫。
計算機初印象
我最早接觸計算機是 2008 年,那時候我在浙江讀初中。不得不說,沿海地區的教育確實比內陸地區的教育要快半拍。(我小學在四川唸的)
學校裡已經有了微機室,課上微機課老師教我們打字,練習結束的同學,有網就上 4399 玩狂扁小朋友,沒有網就玩本地單機遊戲紙牌,掃雷。
電腦在當時的我看來,都是玩票性質的,比如下載音樂,打遊戲。從來沒有想過它的原理是什麼,系統是什麼,軟體是什麼,統統不知道。對我來說,電腦就是一個黑盒。
到了高中,呆了兩年都不知道微機室在哪裡,封閉式管理的教育環境,網咖是不可能接觸到的。所以,說出來大家可能都不信,高中兩年都沒有接觸過計算機。
高三了,我們那時候高中有個通識性考試,叫會考。其中一個科目就是計算機原理。在考試前幾周,一個自稱是計算機老師的來給我們上了課,
計算機課總共就上了兩節。卻給我留下了非常嚴重的陰影:我不是學計算機的料。
在課上,那個老師引入了二進位制的概念,採用速問速答的形式,讓我們計算二進位制的結果。結果別的同學都答出來了,就我還在想為啥:1+1,怎麼就變成 10 了?
不科學,不合理呀,九年義務教育加這兩年的高中教育,都不是這麼教的啊。
當時一直糾結這個點,導致後半節課全程懵。二進位制轉十六進位制,什麼鬼?反碼,補碼,什麼碼?記憶體外存,什麼存?
曾經有個男生上數學課,彎腰撿了一塊橡皮,從此再也沒有聽懂過數學課。就是這種感覺!總之,一堂課下來,我突然覺得計算機不好玩了。
本以為還可以多上兩節課,把問題搞清楚。沒想到剛上完課的計算機老師就 “生病” 了,由數學、英語、語文幾位重要學科的老師補位。
雖然會考還是憑藉我的 “努力”—— 背題,通過了會考,還是全優,但這個陰影對我的影響非常大,導致我高中畢業都沒有考慮過跟計算機相關的專業。
直到我上了大學,情況發生了變化。
程式設計萌芽
高中生涯留下了很多美好的東西,也有很多不堪回首的往事。高考考了三年以來最差的成績,帶著遺憾和不甘,我選擇硬著頭皮選一所 211 大學讀書。
巧的是,當年母校的錄取分數線和當年四川的一本分數線一樣,而我的分數線也和一本分數線一樣。對,哥就是那麼幸運,我的分數 === 一本分數線 === 母校調檔線 === 518 分(2012 年四川重點分數線),我不用復讀了!
母校現在肯定是比一本分數線高了不少。說起來,我是幸運的。應了那句話:上帝給你關上一道門的同時,也會給你開一扇窗。別放棄,朋友。
大學的第一年,家裡經濟條件還是一如既往地困難,全寢室就我一人沒有買電腦。不過學校有專門的微機室了,還給我們發了上機卡,足夠一個學期的學習。
當時參加軍訓的教官很有趣,經常跟我們說一些冷笑話,同學們之間也會講一些有趣的段子。我就把他們說的簡單記錄在手機上,等休息的時候,我就跑到微機室,花上一兩個小時,整理成文件儲存下來,順便練習一下打字。
到了軍訓結束的那天,我把文件列印下來,分給教官和同學們,都是滿滿的回憶,憑藉這點,我被推選為班長。
剛開始,我大學的目標和很多同學一樣:玩得開心。所以參加了很多社團,用微機室的電腦做策劃,寫一些劇本拍微電影之類的。還是和初中一樣,玩票性質的。
事情到了大一下學期發生了一些變化,專業課增加了一門 VB,全稱是 Visual Basic。我還記得,是一位非常漂亮的女老師教的,我聽得挺認真,最後拿了筆試 92 分,機試滿分,算是比較高的分數了。
VB 算是我第一次接觸的程式語言,學會了 Function,條件判斷,迴圈處理,輸入輸出等比較基礎的操作。但除了應付考試,我還是不會幹別的。一個非計算機專業還要啥自行車,我對計算機還是沒興趣。
這中間發生了一件比較比較尷尬的事情,我會寫程式,但不太會做 PPT,第一份 PPT 是在英語課上介紹自己的 Hometown,最後我上鋪的兄弟幫忙做了。
大一上學期因為貪玩,學習成績在年級中等吧,不過通過大一下學期的努力,逆襲到了年級前五。還拿了一個獎學金,於是給自己買一臺戴爾電腦,在這臺電腦上,我裝了好多軟體,按照教程重灌過系統,對作業系統熟悉了不少。
到了大二學期,我想讀研了,而且瞭解到學院有保研的名額,但只有一個外推機會。仔細瞭解了一下保研的細則,做科研打比賽能加很多分,於是我和系裡的老師都溝通了一遍,最後確定了一個計算機背景的老師作為我的科研競賽導師。
這位老師當時說是畢業了以後就擔任了系裡的講師,一邊工作還一邊讀哈工大的博士,方向是資料視覺化。在他的影響下,我接觸了 Flex 虛擬模擬軟體,Matlab 等做模擬的工具,同時也發現了 R 語言這類指令碼語言的美。
慢慢地,我會用 R 語言統計分析資料,用 Matlab 做模擬模擬,還用 Flex 做了一套物流分揀系統。參加了大大小小的比賽,比如數學建模比賽,挑戰杯之類的,都拿到不錯的成績。
看起來對於一個非計算機專業的同學來說,做到這種程度已經比較不錯了。但我還是不滿足門外漢的現狀,只是會使用而已,不知所以然,比較痛苦,尤其是當時用 Dreamweaver 做了一個網站,不知道怎麼部署上線。
直到畢業,參加創業。
創業磨練
大學畢業那年,我已經拿到中山大學的保研 Offer,沒有畢業就失業,而且把注意力投入到創業去了。
回顧了一下大學生活,社團,校內機構,志願活動,科研,比賽,都玩了一遍,還剩一個創業沒有玩。
憑藉一腔熱血,和幾個校友同學,一個猛子扎進了 “萬眾創新,大眾創業” 的浪潮中。
投入創業以後,才猛然發現。我們得有分工,你做運營,我做研發,商量著來。
一直以來對計算機愛舍難分的我,選擇了開發這個硬骨頭。從最基礎的 CSS,HTML,Javascript,開始學起來。
認真學了一個多月,糧食吃了不少,但網站的蹤影沒見著。運營的同學已經把粉絲積累到 20 多萬了,我們卻連個官網都沒碼出來。
於是,我們找到一個做網站的公司。對方報價 12 萬,不講價,不給程式碼。奶奶的,我們啟動資金也才 20 多萬,還是 11 個同學湊的,最少的拿了 5000。
回來以後,我們痛定思痛,還是自行研發。這不過這次,我們找了一個老師 —— 濤哥。
濤哥是西安一家軍工背景的 IT 工程師,在網上錄製了一些課程,偶爾接一些外包的工作。我們找到他,希望他幫忙帶帶我們,作為技術顧問的身份參與我們的創業。
在濤哥的帶領下,我們的技術得到了很大的提升。並且採用了前後端分離的方案,一部分同學學前端 React 框架,一部分同學學後端 Java Springboot。
框架確實很好,理解了基本的思想以後,我們就能上手開發了,再也不用學那些枯燥無味的基本原理,比如繼承,閉包什麼的。所以,對於大部分人來說,學程式設計最好的方式是學以致用,而不是像大學那樣上來就啃基本原理,大學的學習方式有它的好處,能把基礎打得比較牢固,但與此同時學習的激情會很快就會喪失。
回到我們的創業程式上來。經歷了濤哥三個月的魔鬼訓練,我們已經能開發出基本的中後臺頁面的。前端使用的框架是:Dva 腳手架 + React 全家桶 + Ant Design 元件庫 + Restful Api。後端我沒有太多關注,使用的框架是 Nginx + Mysql + Springboot。
你看,我們其實並不是特別高階的工程師,只能說會使用 Api 的框架師。但這並不影響我們創業,學東西,搞事情,賺錢錢。創業也就那麼回事。把一些工具和人聚合在一起,做出功能,服務使用者,然後收錢。
17 面 2 月份,剛上了研究生半年,我決定效仿一下賈伯斯,休學搞創業。當時也沒有想太多,國家比較鼓勵休學創業,萬眾創業,大眾創新。
在和我導師商(Chao)量(Le)以(Yi)後(加 Jia),我踏上了北上之路。關於創業的故事可以看這個系列的文章:我的創業故事。
在這次創業過程中,我一邊學 React,一遍研究一些更有趣的框架比如 Css 的預編譯框架 Less,空閒的時候還在知乎和部落格上寫一些心得,進步還算比較快。我覺得輸出是非常重要的,高中的時候,我就喜歡給別人講數學題。只有自己真正懂了,才能把別人給講懂。所以,對於輸出我樂此不疲。學習程式設計也是一樣的。
除此之外,為了解決團隊程式碼管理混亂的問題,自學了 Git 程式碼管理系統的基本操作。其實基本的命令就夠用了,不需要學得特別深,特別複雜。因為複雜的操作平常工作中也用不到,想要用了,去手冊查一下就可以了,沒有必要把命令都背下來。
後來為了給產品增加批改作業的能力,還學了 Canvas 和 Svg。就這樣前端的基本工作,我都能應付了,已經成為一個初級開發工程師了。讓我知道離高階開發工程師還遠得很的,還是秋招。
創業暫停,重啟學業。
回爐深造
創業很有趣,一路走來,我收穫的不僅僅是出售股權賺的幾十萬,還有對人性的深刻解讀。
18 年 2 月,我回到學校繼續讀書。對於我來說,創業暫時離我而去,學位拿到手是比較重要的,未來有機會再來便是。這也是我去創業之前,做的最壞的打算:哪怕啥都撈不到,最後也學了一身技術。
我在中山大學的研究方向是面向交通場景的資料視覺化。資料視覺化的前提就是得有資料,交通場景的資料豐富,視覺化目前都在 Web 上展示,能和前端開發結合,所以我正好可以繼續學習前端開發。
說實話,在學校的時間,學習效率反而沒有創業的時候高。因為在學校要看論文,學一些演算法,沒有太多應用場景,頂多是針對研究成果做視覺化展示。
碩士三年,加上休學的一年,四年時間很快就過去了。我當時面臨繼續創業,還是找工作,我選擇了後者。創業還是要創業的,我秉承一種觀念:無論在哪裡都要給自己打工,所以在公司幹活,還是自己開公司獨立創業,對我來說差不多,等哪天不想打卡上班了,再獨立也可以。
所以 2020 年 3 月份,我開始準備春招,想著先去一個公司實習,看看行情。我當時投遞了網易,騰訊,阿里,三個大廠。剛開始我比較沒有底,也不知道看網上的面經,連牛客網也很少上。
結果可想而知,一面都沒能通過。經此一役,我總算知道自己的水平在哪裡了,依然是一個框架師,對於很多基礎性的東西一問就倒。於是,我一邊準備畢業指標(我們畢業需要一篇 SCI),一邊惡補前端基礎知識,俗稱背八股文,方便麵試的時候造飛機。
6-7 月,我才正式看紅寶書。越看越覺得自己看晚了,裡面很多基礎的知識點,我看完有種恍然大悟的感覺,原來之前有些框架用 A 方案而不用 B 方案,是因為 A 方案的特性更合適框架要解決的業務場景。面經上的很多問題,在書裡也找到了答案。
這兩個月除了前端的 JS,CSS,HTML,我還準備了前端工程化,前端安全,網路協議,演算法和資料結構,幾大方向的內容。這些我都總結了,放在 Github 上,有需要的自取,我在完善中,歡迎 Star。
8-9 月,秋招開始了。真正的面試開始了,我發現自己還是很菜。剛開始筆試過不了,後來刷 Leetcode,掌握了一些技巧,能過一些公司的筆試了。
緊接著的面試也不是很順利,為此我還在牛客網上寫了一個記錄貼,別人在 8 月份開始比較 Offer 了(提前批的同學),我面試還老碰壁,可見當時我有多慘。
不過面試期間,我發現了很多自己的不足,每一次面試結束,我都把知識點記下來,去查去總結,用 A4 紙手寫下來,手上的資料厚厚的一疊。
最後 9 月(具體時間),終於來了第一個 Offer,深圳一加手機的前端開發工程師,一加當時還給了我 Sp,我很感激它。這家公司也是比較有調性的公司,比較注重儀式感,發 Offer 的時候,還給我們開香檳慶祝,我很喜歡那個調調。現在的手機也換成了一加。
不過,我女朋友小樑當時準備去北京讀研,所以我依然在爭取北京的 Offer,結果都還不錯,拿到了美團和小米的 Offer。
確定好 Offer 以後,我覺得自己的技術應該能勝任公司的工作,所以沒有去實習。而是轉頭參加了騰訊組織的小程式比賽,對小程式的那一套寫法有了進一步的瞭解。
對前端的學習,在拿到 Offer 以後我擱置了一段時間。興趣轉移到了理財上,研究了一些套利和低風險理財,自學了很多關於理財的知識,用 Python 寫了一些小工具,收穫也還不錯,年化收益在 15% 左右。在我看來,理財和程式設計一樣,都是需要長期投入,並且以實踐為主。
得益於之前的創業經歷,加上不錯的自學能力,我工作起來還算遊刃有餘,得到了同事們的肯定。未來希望在前端領域有所突破,尤其是用前端視覺化技術提升團隊效能方向。
寫在最後
對於程式設計,我覺得自學是完全 Ok 的。關鍵是得學以致用,光看書不練習,永遠都學不會。所以我總結了學習程式設計最有效的三招:
- 一看。看三本權威書籍,反覆看,做筆記。
- 二做。做一個產品,比如搭建自己的個人部落格網站、開發一款個人小程式都可以。
- 三面。面試過程中知道自己的知識點哪些有缺陷,隨時補充。這個無論是在校大學生還是工作了的職場人都適用。
推薦我自學以來看過的書籍(持續補充~):
前端:
《JavaScript 高階程式設計(第 4 版)》
《JavaScript 設計模式》
《CSS 權威指南(第四版)》
演算法:
《圖解演算法》
《啊哈!演算法》
入職快一年了,在職場中學習又有了新的體會,等我下一篇:如何在職場中自學程式設計。