我的IT之路
注:此文較長,有六千餘字。其中第一部分是生活相關,程式猿可以跳著看;第二部分專業內容較多,普通讀者可以跳著看。第三部分老少咸宜。
初識
在我小學的時候,我爸自己買配件,組裝了我們家第一臺電腦。至今我仍然記得它的核心配置:奔騰的CPU,256M記憶體,一兩百G(具體的忘了,只記得不是很大)的硬碟,沒有獨立顯示卡。普通的主機配置,配上了個當時挺先進的液晶顯示器,5000大洋就這樣花出去了,顯示器和主機對半分——在當時那個主流是CRT顯示器的年代,據說液晶顯示器對眼睛好,於是我爸就買了。就是這臺現在看來Low到不行的桌上型電腦,完成了我的計算機以及網際網路啟蒙,也讓我萌生了以後從事IT行業的念頭。
那時的電腦雖說已經開始普及了,但也不算很多。我對電腦知之甚少,除了看我爸操作之外,也沒有老師。於是,剛開始那幾天我就喜歡拿著滑鼠在那瞎點:這個是什麼?這裡有什麼?這個型別是“應用程式”,好像可以開啟,開啟試試。這個好像是遊戲耶,玩玩看?程序是什麼?好像沒啥用,結束試試?居然不讓結束……通過各種瞎操作,我慢慢熟悉了怎麼玩電腦,哪裡有什麼功能,哪裡有遊戲玩,哪些東西是重要的檔案不能刪除。而學習代價是,家裡的電腦重灌過好幾次。不過因禍得福,我從中學會了怎麼重灌系統,以及在使用中需要注意的一些小技巧,比如說,桌面不要放東西,C盤不要放重要的文件(當然,現在不需要注意這些事情了,只要硬碟沒壞檔案都能恢復)。喜歡折騰,敢於折騰,直到現在我都是這樣。
除了折騰系統,我還折騰過各種應用,首當其衝的就是office。Word和Excel簡單玩了下就棄了,覺得沒意思,用不著。PPT玩了比較長的一段時間,各種動畫配上音效,感覺十分有趣,所以多玩了會。還記得我曾經花了一天的時間做了個PPT,配上我自己用畫圖畫的簡筆畫,加上了超連結、圖示、聲效和動畫效果,介紹了我自己和我的小夥伴們。當我把PPT放給我爸媽看時,我爸媽全程保持微笑,最後給了個“做得不錯”的評價(因為確實太簡陋了,缺乏內容,而為了追求“炫酷”加了很多亂七八糟的音效和動畫效果,反而讓整體表達很凌亂)。在當時我的眼裡,這就是我的得意之作了,而這個叫做PowerPoint的軟體有點意思。等到了初中,我們老師開始用PPT輔助教學,我才意識到:原來我小時候玩的那個PowerPoint,居然可以玩得這麼好!
電腦不僅僅可以用來折騰,還能用來玩。熟悉了電腦之後,我會經常和夥伴們一起玩遊戲,沉迷於“三維彈球”(打上過300W分,傲視“群雄”)和4399,玩各種Flash遊戲,也會下各種小遊戲。當時最喜歡的,是和隔壁的小夥伴一起玩格鬥遊戲,玩累了就一起玩下炸彈人,人多了就一起玩三維彈球,不亦樂乎。而後,見識到了《紅色警戒》和《帝國時代》,當時就讓我震驚了:居然還有這種遊戲?!相對當時簡陋的flash遊戲,還有一些幾M的小遊戲,這種經典RTS遊戲不管是從畫面還是遊戲性都不是一個量級的,這對我造成了很大的衝擊。雖然我不會也沒有機會玩(家裡不讓,自己太小也玩不動),但是我會圍觀啊!和小夥伴們玩累了,就跑去看別人打紅警打帝國。於是後來,老媽在樓下找不著我,就會去樓上抓我注1 ,一抓一個準,一度讓我爸媽覺得我是個網癮少年,不過還好沒有送我去楊教授那裡(雖然說當時還沒有出現楊教授)。
就現在看來,這段經歷對我影響很大。首先,擴大了我的視野,讓我知道遊戲其實是可以做得很豐富的。“曾經滄海難為水,除卻巫山不是雲”,見識過優秀的遊戲之後,就不會再執著於普通的遊戲了。在未來的人生中,除了中間踩了下MMORPG的坑,對所有遊戲都能保持一顆平常心,以娛樂的心態去玩。“我在玩遊戲,而不是遊戲玩我。”當然,這樣也會引起一個問題:在對抗性比較強的遊戲,比如MOBA遊戲(類dota遊戲,LOL這樣的),沒有很強的求勝欲就很難玩,或者說,顯得太菜了。其次,讓我產生了“我不僅要玩遊戲,還要做這樣的遊戲給別人玩!”這樣的想法。當時就有很強的慾望去學習程式設計學習做遊戲,然而因為年少無知,只是聽說寫程式要會各種各樣的“函式”,就想著“哎呀自己現在太小了,函式(數學上的)要等到初中才會接觸,我現在學起來太早了學不會”,於是就將這個想法暫時擱置了。等我高中真正開始接觸程式設計的時候,才發現,雖然都是function,雖然都翻譯成函式,但是在計算機領域和數學領域兩者的含義完全不同啊摔!就算是小學的知識水平也是可以玩的啊!即使完全不懂資料結構和演算法,做一些簡單的東西也還是可以的。只可惜當時自己並不知道這些,等到7年後才明白過來。
踏上征途
高中的時候,被我們計算機老師推薦去參加NOIP注2 ,由此踏上了程式設計之路。當時入門學的是Pascal語言,它非常適合入門,因為,你寫的有一點不規範它都會報錯給你看……Pascal語法簡單,寫法固定,內建的函式不多但是夠用,對新手來說非常好上手。新手可以很快學會語法,然後開始專注於演算法,十分適合我當時的需求。雖然說自己水平太渣,最後沒能拿到一等獎獲得保送資格,但對此我也只是稍微有點遺憾而已。我在大學遇到了很多不錯的小夥伴,大學生活雖不完美但也算滿意,足夠了。而且,在這一年多的學習中,我學到了非常重要的能力:解決問題的能力,即演算法。語法其實並不重要,雖說每種語言都有其不同的語法,但一通百通,頂多是對語法糖不夠熟悉,需要多寫幾行程式碼而已;而演算法是靈魂,是程式的核心。尋求解決問題最佳演算法的能力,對程式猿而言尤為重要。用恰當的資料結構和演算法去解決問題,事半功倍。只知道複製貼上的碼農還在加班搬磚的時候,優秀的程式猿已經造好輪子把磚搬完了。
資料結構和演算法在高中的時候已經打好基礎了,我在高中畢業之後,就開始橫向擴充套件學習了。在高中畢業的那個暑假,我買了一本C的學習教程開始學習。我在這個過程中,C和C++傻傻分不清楚,後來C學了一點點就直接轉投C++懷抱了,只是因為我更喜歡用cin
和cout
,喜歡用各種好用的庫。更重要的是,我寫了接近兩年的面向過程程式設計,想知道下什麼是面向物件程式設計。暑假結束了,我也成功專職為一名C++新手程式猿。
在大學,大一的時候選修了Visual C++
,老師講的核心內容是MFC,主要靠自學,踩坑無數……但踩的坑都是有價值的,這些坑讓我知道了Windows介面程式的大概機制,以及基於事件的編碼模式。課程的期末作業,我做了個可以自定義配置的掃雷遊戲,拿了90+。
大二的時候選修了安卓開發,見識到了安卓這個大坑。還好之前修了Visual C++
,對於安卓的一些概念理解起來非常輕鬆,但是坑踩起來還是比較艱難。在這個過程中,學會了基本的Java用法(只敢說基本用法),更加深入地瞭解了各種設計模式,學會了不少東西。結業之後,寫了個有聯絡人匯入匯出功能的簡訊群發器,春節的時候用過兩次,十分好用(但是後面安卓更新了就不能用了)。在這得說一句,安卓水太深了。咋一看好像安卓誰都能做,按照教程來很容易就可以做一個簡單的APP。君不見移動端火的適合,安卓培訓機構一大堆,如今還有幾何?想要做一個稍微大一點的商業用APP……在沒有大牛的情況下就是異想天開。
大二下學期加入了一個實驗室,從此踏上了Web後端的不歸路。大二末的那個暑假,整個暑假都在學校,從零開始做一個網站。真的是從零開始,我們選了個PHP框架,所有的資料就只有W3C手冊和PHP框架文件,我們就這樣艱難地把這個網站做出來了,而且還上線使用了!快取?不存在的,用了大半年之後才知道有快取這個東西,後面才加的。模板引擎?那是什麼?還是後面老師給我們找了個大牛,我們才瞭解到原來還有這樣一個好用的工具,然而已經沒有機會去改了。原始的Windows+apache+php+mysql技術棧,除了一個簡單的PHP框架外,乾乾淨淨。前端就只有jquery,依賴原生PHP渲染頁面。現在想想,真的是初生牛犢不怕虎,一共12個人花了2個月的時間就把一個網站基本懟完了,還是挺厲害的。而我在其中扮演的角色是PHP工程師,但我做的最有意思的工作,卻是給前端寫的兩個模組:一個路由模組,另一個是分頁模組。其中分頁模組在使用中不斷地優化,被我推薦給了所有與我合作的前端,用起來還不錯,直到前端框架的出現,它才壽終正寢。說起來,在我當前公司,還是在我的推動下才用起了前端框架……
大三的時候,憑藉開發經驗,和朋友小林一起嘗試了下CTF注3 。三人隊,我們兩個人去參加,肝了一整天,做了幾個題,拿了二等獎。獎品是200元京東卡,剛好被我們平分了,還是挺不錯的。我對安全略有興趣,因為本身做網站開發,身邊也有做安全的,對安全比較重視。但對CTF只是淺嘗輒止,深入下去就是走安全方向了,安全的坑太深太深……但在玩CTF的過程中,接觸到了Python,才知道,Python大法是真的好。
大學的尾巴嘗試了一下和朋友一起創業,發現自己除了寫寫程式碼,一無是處,並不適合創業。畢業後開始工作,依靠PHP和Python兩門語言,做各種專案都算得心應手。中間花了一個春節加上約半年的空餘時間,用TypeScript給VScode寫了個外掛,適用於自己用的PHP框架,極大地提高了自己的工作效率,至今已經有98K的下載量了。嗯,沒錯,就是這麼騷:用前端語言給自己後端框架寫專用外掛。感覺很有意思:)
感悟
興趣是最好的老師。
有興趣,才會有熱情,學習起來會更有效率。即使沒有興趣,很多人從事這個行業只是為了生存,為生活所迫才去學習,這也是可以理解的——有時候生活的壓力反而讓人更有學習的動力。但,不管哪行哪業,持續學習都是必不可少的。單純因為生存壓力下的學習,很難主動、持續。
有一些人,只是呆在自己的舒適區裡,麻木度日。早期辛苦學習之後,通過面試拿到工作了,於是暫緩甚至停止學習,工作中遇到新東西才去被動學習一下。搬磚也僅僅只是搬磚,不會考慮、抑或沒有能力去考慮怎麼更快更好地去搬磚。大牛寫的工具,只知其然不知其所以然,會用就好。在廣大普通的公司裡面,這樣的人很常見。事實上,這樣的人其實也有其價值:成本低,可替代性高。一群碼農用大牛寫的工具開發應用,一塊塊磚堆上去,一個應用就成了。做的過程中大牛時不時監督下,核心功能自己來做,做好了測試一下,最後丟給甲方——很多外包公司就是這樣的套路。甚至在一些換皮的遊戲公司,這樣的事情會更極端更多。
只是,對於個體來說,其職業天花板會非常低。
其實解決的方法即簡單又複雜,就是多學、多做。簡單是因為這兩點大家都知道,複雜也是因為大家都知道,但是能做到的不多。是要多學,但是到底要學什麼?是要多做,但是多做就是多加班多搬磚嗎?
多學的背後,其實隱藏的是個人的職業規劃。以前端為例,能找到工作一般代表你會jquey,會用前端框架,css也比較熟悉了。那麼,你會用css前處理器嗎?你真的懂vue的元件嗎(本人只玩過VUE,所以只能以此舉例)?你會自己封裝元件嗎?vue資料驅動模型你瞭解嗎?webpack你玩過嗎?nodejs做中間層做過沒有?……廣泛使用的Echarts
是前端專案,bilibili的H5播放器也是前端專案,VScode和Atom也是基於nodejs來做的,前端們瞭解一下?當然,這個例子極端了,我只是想說明,根據個人的職業規劃,可以走的路有很多,可以學習的也有很多。根據個人基礎知識的不同,其職業天花板也會有所不同,但,肯定比盲目搬磚好多了。最不濟,根據所學自己造兩個合用的輪子,可以節約很多搬磚的時間!多點時間留給自己,豈不美哉?
多做,不是指重複搬磚。同樣的磚搬十年,就代表有十年的工作經驗?並不是這樣。多做會涉及重複,但是重複不是目的,在重複中找到共同點才是目的。找到共同點,想辦法提取出來,實現複用,這才有價值。類似的程式碼,遇到一次兩次還能直接複製貼上。如果再遇到,還是選擇複製貼上嗎?還是做成庫,以後一行程式碼解決問題?甚至更進一步,能不能用程式碼去生成程式碼?類似腳手架一樣,類似的東西一行命令就生成出來,自己只需要再小小修改下就行。在做的過程中思考這些問題,才算是真正的“多做”。像遠古時期的WEB端,哪裡有什麼框架,都是亂七八糟的。隨著專案的發展,有識之士發現自己重複做的東西有點多,於是開始建立庫。再後來,庫變得越來越大,框架的雛形就出來了。這樣的歷史程序,代表了“多做”的意義(這段沒有史實依據,只是基於合理推測,有異議可以留言討論)。
然後聊聊“全棧工程師”這個話題。在很久以前,“全棧工程師”是個很高大上的詞,一般只有知識面很廣的大牛才敢這麼說。而後,隨著這個行業的發展,越來越多隻是粗泛了解其他語言的人都在宣傳自己是“全棧工程師”。於是,有人感嘆“世風日下,人心不古啊”。但其實大可不必,隨著行業的發展,知識面能橫跨多端會變得越來越難,而宣傳自己“全棧”不代表大家會認同,真正有才能的人也不會被埋沒。會php+js+html+css就自以為是全棧從而沾沾自喜,“從前端到後臺我一個人可以包了耶!我是全站工程師,我好厲害!”,但老程式猿只會微微一笑,然後各個方向問兩個問題,這個人是有真才實學還是隻會泛泛而談,就一目瞭然了。“全棧”其實是一個努力的方向,指的是一個人需要一專多能,對行業涉及的各個範疇能多去了解。懂得多了,可供選擇的餘地也會更大,而且也能減少很多矛盾。
就以維持長連結為例,如果這個人只會PHP,那麼他要去找個合適的框架,去學習怎麼用,然後踩坑實踐。如果遇到涉及多執行緒多程序的需求,就會比較麻煩,因為PHP在設計之初就不是為了解決這樣的問題而存在的。當然,沒有什麼需求是解決不了的,只是時間等代價問題而已。然而,如果他涉及的面廣一點,會一點Python,或者JAVA,那麼這個問題就非常好處理了,解決這樣的問題會非常輕鬆。所以說,懂得多了,可供選擇的餘地也會更大,解決問題也能更輕鬆。
在這裡要吐槽一下“PHP是世界上最好的語言”這句話。不知道這句話是腦殘粉還是黑子說出來的,流傳甚廣,但因此而瘋狂崇拜抑或貶低PHP都是很愚蠢的行為。沒有什麼“最好”之說,C執行效率那麼快,能說“最好”嗎?JAVA用的人那麼多,能說“最好”嗎?Python庫那麼多,能說“最好”嗎?都不能。那麼PHP是最愚蠢的語言?它在網站上的使用率還是挺高的,用它的人都愚蠢?雖然因為一些歷史原因,PHP確實有些問題,但瑕不掩瑜,在開發網站上有其一席之地。就語言的靈活度、開發效率和執行效率,PHP有其價值。任何語言都有其獨到之處,揚長避短,用合適的語言做合適的事情,這樣可以節約很多時間。
而涉獵廣泛也有助於溝通和解決問題。就說前段時間爆火的“讓APP的顏色和手機殼顏色一樣”這個需求,真正做事的人都知道這是搞笑的需求,也無怪乎程式猿和產品真人PK了。知乎上有關於這個事情的提問,眾答主紛紛吐槽產品經理的不靠譜。很多時候都是這樣,程式猿和產品的矛盾,在於對對方的不理解。程式猿不理解產品為什麼會想出這樣一個需求,因為產品一般是從使用者的角度來思考問題,合理的想法與需求有利於使用者體驗,雖然有時候確實實現難度大,但是當產品覺得這樣做有價值的時候,程式猿應該去實現。而對於產品經理來說,他們不懂編碼,不知道什麼需求實現起來方便,什麼需求實現起來麻煩,甚至是不太可能。他們覺得這個使用者體驗好,就不管實現,直接丟給程式猿去做。在產品主導的公司,如果產品強勢但水平不夠,程式猿的生存環境會非常糟糕。但如果,產品懂一點程式碼,或者雙方都善於溝通,產品能理解需求實現的代價,程式猿能理解需求對於使用者的重要性,那麼事情會好很多。
同樣的,即使都是程式猿,不同方向的人溝通時也會有矛盾。我見過後端和移動端吵架:“我直接把資料從資料庫讀出來給你就行,為什麼還要我處理資料變成這樣奇怪的格式?”後端不懂移動端解析資料的方式,對於移動端來說,整理好了的資料格式,處理起來會方便很多很多,這點處理的代價由相對方便的後端來做比較划算。從整體來說,這樣是最佳的實踐。可如果是在移動端沒有話語權的公司,可能就只能讓移動端默默地去改程式碼,花更多的功夫去做同樣的事情。但,如果移動端懂後端知識呢?他可以寫一個demo,懟到後端眼前:這樣做,你加一點就夠了,我要加這麼多,你改起來方便,以後你來!Talk is cheap, show you my code.
最後,以這句話結束此文:
PHP工程師?我早已不是了。
注1:小時候在爸媽工作的廠區住,職工房。一般我會和小夥伴一起在一樓做遊戲,在樓上的職工宿舍圍觀別人玩遊戲。
注2:NOIP全稱是National Olympiad in informatics in Provinces,全國青少年資訊學奧林匹克競賽,考的核心是資料結構與演算法。有初中組和高中組,高中組在2010年前拿到國家一等獎可以去申請保送資格,2010年後就只有加分資格了。大學有ACM,相對知名度更高,更有含金量。
注3:CTF,奪旗賽,是一種流行的資訊保安競賽形式。我們在學校參加的是最基礎的比賽,內容都很簡單,所以我們才能拿獎。