天天看點

非計算機轉背景開發并入職位元組跳動(三)--跳槽止損,擁抱AI和開源技術

前面講了畢業之後做PHP背景的經曆,因為業務和技術棧都非常簡單,一年下來沒多少成長,也沒什麼幹貨可分享的,幹了一年之後仍然比不上計算機畢業的大學生。

下面介紹下在AI創業公司的經曆,雖然公司規模更小,管理更不規範,但确實是打開了技術大門,擁抱了開源,在技能上有了很大提升,并且空餘時間也多,可以更好的提升自己。

AI創業公司崗位

人工智能即AI是在2016年AlphaGo出現之後才大火的,機器戰勝了人類,非常有想象力的一個場景。這幾年機器學習、深度學習、TensorFlow滿天飛,各種概念讓外行人摸不清頭腦。同時也冒出了一大批創業公司,比較知名的有商湯、依圖、曠世等,大部分都是做計算機視覺的,即圖像處理或視訊處理,以算法和軟體為主。後面也開始做硬體産品,如人臉門禁,人臉簽到。

無論是人工智能還是大資料,在工作當中都是解決問題,一開始不需要關注這麼多概念,而應該多關注問題本身,去弄懂問題是什麼,有哪些解決方式,以前是怎麼解決的,現在是怎麼解決的,是不是徹底解決了,未來的發展方向是什麼。就比如人工智能這個概念太泛太抽象了,那可以先關注計算機視覺,計算機視覺裡範圍還是太大,可以隻關注圖像分類和檢測。就拿圖像分類來說,就要弄懂什麼是圖像分類,為什麼要做圖像分類,怎麼做圖像分類。多問幾個為什麼,就能把一些複雜的概念弄懂。

我去的公司是一家知名度更小的,是以做AI攝像頭為主的公司,另外也有人臉搜尋系統,給公安用的,對于輔助抓捕yifan确實有很大幫助。然後公司借着深度學習這波浪潮準備擴張,找投資,大量招人,做新的業務,比如智慧零售等,是以急缺人。雖然我不懂機器學習、深度學習,背景開發能力也一般,但是正好撞上公司擴招,然後學曆還湊合,是以入職了。

那麼當時拿到offer後對于入職後要做什麼,其實并不清楚,隻是說做機器學習平台,做分布式訓練,具體是幹嘛的,根本不知道。但隻要聽到分布式、機器學習就興奮。是以想着肯定前途一片光明,過來好好幹,以後去大廠絕對沒問題。

入職初期過程

小公司入職很簡單,上午報道,簽合同,拿電腦,下午就開始熟悉環境。對于碼農,最重要的就是電腦,有了電腦在哪都一樣,隻是環境好壞的問題。不過工位環境确實一般,大家都是面對面排排坐的那種,即使老闆也是這樣的工位。現在比較流行這種工位,頭條、阿裡也這樣,對個人驗其實很不好,太小了活動不開,午睡也隻能趴着,但友善溝通。

到了項目組之後認識了一圈同僚,發現都是年輕人,看起來都比較忙。雖然介紹了一圈,但一個也沒記住,對于項目組有多少成員,怎麼分工的,也沒搞清楚。不過leader也沒着急配置設定任務或介紹業務,而是說先配置下自己的電腦,裝下對應的軟體。

裝軟體,配置開發環境那不用說。這邊用的是python開發,雖然python不熟,但好歹pycharm還是用過的。在windows下面裝好了,然後看下旁邊的人。看到同僚的電腦顔色跟windows的不是一個,都是那個紫色的背景,原來大部分都是用的Ubuntu。雖然自己也會Linux指令,也用過Linux伺服器,但直接在PC上裝Ubuntu作為開發和辦公用,确實有疑惑。Ubuntu這系統好用嗎,支援裝那麼多軟體嗎。

沒有那麼多時間考慮,既然周圍的人都這麼用,那多少也得統一,借了個系統盤,開始裝。雖然之前也裝過Ubuntu,但過程都忘了。隻能硬着頭皮上。結果不幸的是給的聯想的筆記本相容性不是很好,裝的過程中出現了很多奇怪的問題。搞的自己很着急,想着就裝個破系統也能搞一天,有點對不起程式員這個稱号。但沒辦法,最終确實就是第一天裝系統就搞到九點多。

确實感到了一些壓力,不過也有些興奮,想着直接用Ubuntu開發,那這邊水準應該高一些。用Ubuntu确實是一個正确的選擇,當你沒有mac pro時,開發人員一定得考慮Ubuntu或Debian,會友善很多,對于水準提高很有幫助。

開發環境好了之後就開始熟悉業務,準備幹活。這個時候小公司的混亂就展現了,發現沒有文檔,工作節奏、項目内容是咋樣的過了一兩個星期才搞清楚,因為leader太忙了,人員分工也不是很明确。基本是哪裡需要了就派個人過去做一下。

另外在熟悉業務的過程中發現自己真的是太水了,git都用不熟,雖然有看過廖雪峰講git原理,但是這東西不用真的就無法掌握。入職初期又是在信心受挫的過程度過,又開始懷疑為啥要做背景開發,為啥要寫代碼,自己是否适合沿着這條路走下去。 想歸想,工作還是得做。

項目介紹

真實的項目情況是這樣的:leader也是入職沒到半年,作為業務負責人,負責了好幾個方向的業務。我所要參與的确實是機器學習平台,因為機器學習這幾年需求非常大,那麼自然就有對平台的需求,可以降低機器學習門檻,提高算法工程師的開發效率。這種平台大廠也都在做了,比如阿裡的PAI平台,騰訊的TIONE,但是沒有開源的,但小廠又是有需求的,是以我們得做個這樣一個平台。做好了可以賣出去,也可以自己用。後面也有類似的平台kubeflow開源了。

leader的技術視野當然更開闊,對國外先進的技術都有了解。知道做這一樣一個平台用docker+k8s+分布式存儲(ceph)是可以搞定并且是最合适的方案。于是leader也自己動手寫了個demo。但是還不完善,還要接着做,并且到我入職的時候也沒什麼文檔,沒有文檔寫明需求、寫明技術方案,對于新來的同僚就很不友好。對于我這種啥都不會的,反正就是懵逼的感覺。不要說k8s沒聽過,就連docker是啥都不知道,雖然面試的時候為了裝逼說docker是輕量級的虛拟化技術,但說真的,我沒用過,也就是docker是做什麼的,怎麼用,為什麼用docker根本不了解。

這裡要提的是之前在的小廠雖然技術不咋的,但是管理還是規範的,該出文檔的出文檔,而且必須得先有文檔。因為必須得想清楚了才開始寫代碼,文檔就是你是否想清楚的證明。并且文檔友善團隊成員熟悉業務進行開發。

leader雖然技術很強,但是項目管理和人員管理上經驗好像一般。當時組内還有其他人,當我問其他人對這個項目的了解、這個平台要做成什麼樣,他們也不清楚。

是以初期就是在知識惡補的過程中度過的,包括git使用、Ubuntu的使用、docker使用、k8s安裝與使用、k8s的原理。雖然這段時間是痛苦的,但不得不說确實學習了很多。接觸的都是最新的開源技術,現在k8s基本上成了服務上雲的标配了,很感謝有這樣一段經曆去安裝使用k8s,了解k8s應用場景和原理。這也展現了周圍環境對個人影響的重要性,有時人就是被周圍的環境推着走的。周圍的人都很優秀,都在不斷學習新的技術,你自然就會跟着去學,自然就會提升。而如果周圍的環境就是上個世紀的技術,你就根本不知道要學什麼,因為你不知道這個世界上還有什麼。 這就有點像小平同志推動改革開放一樣,因為小平同志去過法國,見識過經濟發達的地方社會和人民生活是什麼樣的,就知道要怎麼改,哪裡要先改。

另外發現沒,**其實碼農的很多工作都是學習xx的使用,安裝和使用是學習的第一步,首先得知道這個東西長什麼樣,然後才去了解原理。**而在學校的時候根本沒意識到,隻知道看書,隻知道刷題,是以效率低。在工作中卻會被項目推着走,安裝使用之後再了解原理,會學得更快。

工作日常和技術棧

在熟悉了業務和環境之後,基本上節奏就開始穩定了。這邊因為沒有專職項目經理,是以沒有晨會,感覺瞬間輕松了很多,但還是會有周會,偶爾也在jira上寫寫周報。管理上比較松懈,因為leader沒這麼多精力,全靠大家的自覺。前期招過來的人都比較靠譜,都很自覺的加班學習趕進度。後面新進的部分人水準和态度都不咋的,帶壞了團隊的風氣,摸魚現象特别嚴重。

因為要做的平台是沒有開源的可以參考的,是以需求不明确,隻知道部分需求。也沒有專職架構師做方案設計,是以架構水準很一般。然後自己靠着之前學習的開發規範,逐漸出文檔,寫代碼,做demo。這種開發模式和沒大神帶的情況下,最終出來的大機率是demo級别的。

背景開發是用的python,flask架構。好在這個項目的業務邏輯不是很多,又用的python,是以除了用python之外,也花了很多時間去熟悉python多線程、多程序、GIL鎖、協程gevent等,算是真正的熟悉了python。

因為沒人催幹活,也沒有測試,用到的很多技術也比較新,是以工作日常确實會有很多的時間是在調研和學習。前期工作節奏确實比較舒服,但不可持久,因為公司是有營運壓力的,是要考慮投入産出比的。越到後面項目傳遞的壓力就越大。

項目中期項目組又開始了推cicd,也就是用docker+jekins+dockerhub+k8s+rancher這一套做自動化釋出流程。代碼開發之後就是上線,怎麼減少上線的時間,提升開發效率就是devops要做的,不得不說這套技術颠覆了自己的認知。碼農的創造力确實是巨大的,凡是能提高效率的地方都有碼農的機會。

除了做平台之外,也參與了其他幾個項目,進而接觸了redis,kafka,es,grafana,prometheus,spark這些網際網路廣泛使用的元件。但在這裡還隻是了解這些東西,有些甚至都還沒用過。如果在項目中能用到這些元件,并能自己安裝一遍,并深入其原理,尤其redis和kafka,相信下一次跳槽找工作是非常容易的。

有幸成為面試官,面試經驗上飛速成長

因為去的早,團隊也還沒完全建立好,還在持續招人。是以工作了幾個月之後leader開始讓自己面試。這是個很好的機會,想到可以面試别人有點小興奮。一是可以看别人的履歷,學習别人的經驗,二是想享受下面試别人的快感。初期面試是很爽的,但到了後面有一種厭倦的情緒,因為投小廠的人履歷品質真的一般,問多了就感覺沒有新意。但這段做面試官的體驗對自己的提升很大。

具體的提升就是:

(1)怎麼準備履歷:

當去看一個候選人的時候,面試官最好奇的就是你是哪裡畢業的,你在哪裡工作過。如果是名校畢業大廠工作,面試官對你肯定有興趣。不管你水準怎麼樣,至少想了解下,尤其我這種資曆淺的人,更想學習下。然後就是項目經驗,項目經驗得寫清楚項目是做什麼的,你自己又做的哪一塊,突出關鍵技術。

寫關鍵技術的目的就是給面試官問問題的點。比如你寫了redis、kafka,那麼面試官肯定會問,因為這是比較常用的,可以問很多知識點,也比較容易區分你到底會不會。如果你履歷上通篇沒寫可以讓面試官問的, 那麼很遺憾,面試官真的沒有什麼問的欲望。然後隻能上來就問資料結構和算法,起步一般是排序。

别認為排序簡單就我的面試經曆來看,快排能篩掉70%的候選者,這還僅僅是口頭交流,沒有讓手寫快排。 對于投小廠的人,讓手寫快排基本也能篩掉90%。要麼是沒準備,要麼就是水準是真的差。是以為啥流行手寫代碼,對于面試官來說真的很容易篩選。手寫代碼也是當時leader提的唯一的一個硬性标準。

在做面試官初期的時候,我也寫不出快排,對于快排中常問的點也沒考慮過,比如邊界條件、時間複雜度。後面經曆多了,發現快排是個好東西,每次面試必問,那麼自己當然得搞清楚了,手推了好幾遍。不得不說,面試官想的都是一樣的,在面騰訊的時候騰訊的面試官也問了,然後答的非常順利。

(2)面試官的心态:

面試官一般都是開發人員,日常工作本身就比較繁忙,每次面試除了那種水準相當的想多交流下,其他的都是能快就快,盡量節省點自己的時間。當然一般公司為了給面試者一個好的體驗可能要求面試時長不少于20分鐘。但自己真正面試的時候,一兩分鐘就發現對方太水了就根本不想了解,為啥要再浪費彼此的時間了。

是以面試官問的時候都會挑重點,要麼挑你會的,如果你履歷上啥都不會就會挑面試官自己會的。并且問的時候自己心裡也有了答案,你答的時候不用扯太多,會就是會,不會就是不會。

如果面試官一問你就知道他想了解什麼,說明你的水準已經上來了,這樣雙方溝通起來會比較順暢。但如果你不知道他想了解什麼,說明這是你的知識盲點,也不用着急,就大概的說你了解的,然後盡快結束這個問題,節省雙方的時間,面試官反而會覺得你很實誠,比較好溝通。面試時好的溝通就是不浪費彼此的時間。

比如redis的過期機制,面試官問你了不了解。 如果你知道,那麼就要答過期機制怎麼實作的,并且還要說為什麼這樣做而不那樣做。如果不會,你也可以說下如果你自己去設計,你會怎麼做。要實在想不出就直接說不會。

工作的時候一定争取機會去面試别人,在校生也可以想象下自己是面試官會問哪些。面試别人對個人的成長比你反複出去被别人面試成長會更快,這種逆向思維在很多場景都适用。

面試别人的同時也被别人面試

其實在這家小廠呆的很舒服,雖然後面項目面臨的壓力是有點大,但工作節奏、加班程度和工作氛圍都還能接受。不過工資不漲也是個問題。

于是開始去沖擊大廠,這次工作經曆确實還算是加分的,履歷投出去基本都能過,也都有面試機會,但為了慢慢準備,一開始投的是vivo。vivo的面試中規中矩,跟自己面試别人差不多,隻不過問的知識點不一樣。在vivo這裡的面試發現了自己的一個盲區,就是redis。雖然項目中有用過redis,但自己沒深入了解,比如redis的資料類型、單線程模型、過期處理、叢集方案等。于是一面之後趕緊找資料補了補,有本講redis原理的書挺好,看了之後确實很有幫助,後面再問redis的問題基本都能回答。并且後面也看了redis源碼,确實很值得讀一讀。當然vivo也有手寫代碼,要求不高,最後到了hr的環節,但沒給offer,應該是錢的問題。

offer沒拿到沒關系,信心足了很多**。然後開始了針對性的準備,也去網上找了點面經看,這個時候結合自己的工作和面試經曆再看面經就知道哪些是常問的,并且為什麼這麼問。**那麼針對性的準備了socket網絡程式設計,要熟悉正常的通信過程以及異常情況下的資料處理過程;然後把unix網絡程式設計也看了幾遍,重點看多線程多程序,因為自己不找c++背景開發,是以具體的api沒怎麼看,但騰訊可能會問,IO多路複用的select/poll/epoll重點了解。然後重點練習刷題,重點練習了《劍指offer》的題。這個時候因為有了一定的代碼量,對python也是熟悉了,再來刷題就覺得簡單了。并且結合工作中解決問題的過程:先考慮正常情況,再考慮異常情況,然後在考慮性能,一些簡單的題基本還是有思路的,有些題就還是靠記憶。

刷題這裡還是看運氣,可以重點刷下數組、二叉樹和動歸的題,圖相關的題比較少見。具體會問到什麼題實際跟面試官個人有關,如果這個面試官是打過ACM比賽的,那麼隻能說你運氣差,可能什麼題都會問。如果像我這種,因為我自己會的就不多,那麼我隻能問一些常見的并且難度不大的題。并且面試官自己都會有題庫,隻會從那麼幾個題裡面出,準備太多的題對面試官也是一個負擔。

經曆個把月左右的準備後再投的騰訊和頭條,然後無論是項目、redis/kafka中間件、算法題基本都能過關,最終入職位元組跳動,到了位元組跳動,技術視野又上了一個台階。。。頭條的工作體驗請看下篇(四)

繼續閱讀