1. 程式人生 > >如果你不知道做什麼,那就學一門雜學吧

如果你不知道做什麼,那就學一門雜學吧

多年以後,面對人工智慧研究員那混亂不堪的程式碼,我會想起第一次和 S 君相見的那個遙遠的下午。那時的 B 公司,還是一個僅有 6 個人的小團隊,Mac 和顯示器在桌上依次排開,大家坐在一起,不需要稱呼姓名,轉過臉去,對方就知道你在和他說話。一切看起來都那麼美好,我們所有人,都希望自己和這個公司能夠一起成長。

彼時 S 君剛從加拿大回來,老闆把他介紹給我們,於是 S 君作為資料產品經理跟我有了專案上的接觸。

創業公司裡面,每一個人都需要會很多的技藝,於是 S 君開始自學 Python。

有一天,S 君問我:“你玩 MineCraft 嗎?“

“玩,但我更喜歡在 B 站上看別人的世界。”我答道。

“我覺得我現在寫程式,像是在玩我的世界。” S 君笑著說道。

“是不是覺得你已經掌握了 Python 的基本語法,看著別人把 Python 用的溜溜轉,而你自己卻不知道用它來做什麼?”

“是這樣的,你懂我。”

“那你學一門雜學吧。”

於是 S 君被我誘拐過來跟我一起寫爬蟲。

後來,S 君離開了 B 公司。

三個月後,我也離開了。

從此,我們再也沒有見過。

寫爬蟲與三峽大壩

有一天,S 君興沖沖地跑來跟我說:“我體會到三峽大壩的偉大功能了!”

“你是爬蟲工程師還是水利工程師?”

“你知道嗎,不管上游的水勢多麼凶猛,從大壩出來以後總是安全而穩定。” S 君並沒有回答我的問題,而是自顧自地說道。

“原來你開始用 Kafka。不錯,孺子可教。”

S 君吐了一下舌頭:“還是師傅教導有方。”

前不久,S 君的爬蟲剛剛達到了日產資料千萬條的目標。然而他只高興了一天。因為他發現,資料寫到資料庫以後,讀起來很麻煩。

S 君有多個數據分析的系統需要從資料庫裡面讀取爬蟲爬好的資料,但是從每天千萬量級的資料中尋找特定的資料是一個很慢的過程。如果程式遇到異常導致崩潰,又得從頭開始讀。

S 君問我:“現在我每一個數據分析的指令碼都要從資料庫裡面讀一次資料,做了太多重複的工作,單機單節點的資料庫快要撐不住了。我是不是要去學習分庫分表搭建叢集啊?”

我告訴 S 君:“這個後面你自然是需要去做的。但現在,你可以先試一試 Kafka,我已經搭建好了一個 Kafka 的叢集了,你這樣使用……”。

後來,S 君讓所有爬蟲把爬到的資料到直接送進了 Kafka,然後再從 Kafka 裡面讀資料出來,一個 Group 用來備份原始資料,一份 Group 用來生成中間表,一份 Group 用來監控報警,一份 Group 用來繪製 DashBoard。無論爬蟲塞給 Kafka 的資料有多少,有多快,從 Kafka 讀資料的地方都能按照自己的節奏來消費和使用。

程式設計最重要的能力是變通

S 君是一個老實孩子。

在開發一個爬蟲的過程中,網站介面返回給他的資料看起來是 JSON 格式,於是他就用 Python 自帶的 JSON 庫去解析。結果解析失敗了。因為這些所謂的看起來像 JSON 的東西,竟然沒有雙引號。

難道是 JSON 的超集? S 君一通搜尋,發現用 YMAL 庫也許可以解析這種資料。於是安裝 YMAL 庫,一解析又報錯。

難道這些資料直接就是 Python 的字典?於是 S 君用上了邪惡的 eval。又報錯,因為裡面有 null 和小寫的 true。

“你為什麼不試一試直接用正則表示式呢?”我對 S 君說。

“靠!” S 君一拍桌子,旁邊的老闆嚇得把搪瓷杯子裡面的快樂水灑在了白襯衣上。

然後 S 君用正則表示式花了 10 秒鐘結束了戰鬥。

既然收集了資料就要讓它發光發熱

S 君在加拿大留學時學的專業是金融數學和統計。所以他對資料分析也很有興趣。在他爬蟲收集的資料夠用以後,我跟他講了如何使用 Pandas 來分析資料。

S 君把他分析的酒店價格變化資料給分享給了我們。不愧是金融+數學+統計學背景的高階知識分子 + 超級強大的 Pandas + 超級好用的 Jupyter。這份資料不僅完美再現了過去一年的價格走勢,還預測了未來的任何變化,多達四十六張圖表似乎窮盡了所有的組合。

你小學上課傳過紙條嗎

“我現在能體會那些半路攔截紙條的人是什麼心態了。”這是 S 君第一次使用 Charles 時對我說的話。

從此以後,我很少看到 S 君分析網頁了。因為他學會了在爬蟲開發的過程中,首先通過中間人攻擊技術分析微信小程式和手機 App。這種方式往往能夠直接獲得資料,拿到資料以後就能直接儲存,再也不用寫煩人的 XPath 或者長的跟表情符號一樣的正則表示式了。

有一天,我在玩一個網頁版的黑客解密遊戲,在網頁上尋找某個地方隱藏起來的密碼,然後輸入每一關的回答框中,答對才能進入下一關。

遊戲有 12 關,而我卡在了第 6 關。只見 S 君拿著電腦走到我面前,指著第 12 關的通關頁面跟我炫耀。

“你是不是用 MITMProxy 替換了這個網站的 Js 檔案?”

“果然還是瞞不過師傅你啊。”

“你攔截了別人的紙條,做了修改,然後又疊好繼續傳下去,你有考慮過發紙條的人和收紙條的人的感受嗎?”

“我小學時候不傳紙條,都是妹子直接約我的。”

加密?不存在的

“前端沒有祕密”。S 君在成功逆向了一個網站的 Js 檔案以後如是對我說。

“那是因為這個網站的 Js 程式碼就赤裸裸地放在你面前,完全沒有混淆。”我對 S 君說道。

“不怕,我可以用 Node.js 來執行混淆過的程式碼。我已經搭建好 Node.js 服務了,只要把 Js 程式碼傳進去,他就會把結果給我返回回來。” S 君對此似乎一臉自行。

“你什麼時候學會的 Node.js ?”

“這不是師傅你說過技多不壓身嗎?既然做爬蟲需要動 JavaScript,那我順手就把 Node.js 給學了。” S 君毫不畏懼的表情,似乎證明他已經猜透了我要問什麼。

“那如果目標沒有網站,只有 App 呢?”

“不怕,Android 逆向工程我也順便研究了一點。Java 我也看得懂。”

“看來這些已經不需要我再教你了。”

你肯定薅了直播答題的羊毛吧

去年年底的直播答題著實火了一把。那個時候,我和 S 君分開已經有一段時間了。我相信,在全民答題的每一個夜晚,S 君的電腦上一定連著不少於六臺安卓手機。這些手機執行著不同的答題平臺,能夠自動讀取螢幕上的問題並自動選擇答案。

我把安卓自動化測試技術教給 S 君,本來是讓他結合爬蟲,實現群控從而抓取一些難以處理的資料,但我相信他肯定會用來答題。

變通,這一點他學的越來越好了。

只希望他不要成為羊毛黨。