編程十七年心得與流水賬

前言:

好些年沒有寫部落格了。

最近公司很忙很忙,在從早到晚連軸轉的情況下,感覺需要花點多思考思考自己的事情。從03年高一正式學習編程算起,已經經過了17年了。工作也十年了。回想起這17年,突然有種想記錄一下流水賬:一方面不希望有些東西之後忘記了,另一方面也希望自己的經歷和教訓能夠幫助到別人。

高中三年 (2003-2006):

我03年上高一,高中是全國比較有名的搞電腦競賽的學校,出了幾位OI金牌和銀牌。這點上是一個很好的機遇,之前對電腦是非常的愛好,那時候是比爾蓋茨、喬布斯的年代,為了學習編程,剛上高中就開始了編程競賽訓練。當時高中時期就經常做ACM題庫的訓練,也做了美國的電腦競賽的題目練習(USACO)。高一的那次競賽準備時間很短,成績很不理想,做到高二的時候已經對動態規劃,各種搜索之類的非常熟悉了,差不多刷了PKU、USACO前前後後幾百道題。寫個堆啊快排啊BFS啥的也基本上可以閉著眼睛寫完。高二的那次省賽也沒什麼包袱,還記得400分的總分拿了380分,扣掉的20分是有一個搜索剪枝沒有寫好。當時信心爆棚覺得自己應該半隻腳踏進清華了。

後來沒有想到自己在省隊選拔賽裡面做得非常不理想,現在都還記得當時有個Dijkstra需要用堆來優化的演算法沒有寫好,所以與省隊失之交臂,基本上是煮熟的鴨子都飛掉的感覺。然後後面的選擇就是,要麼靠著省賽一等獎的高考20分加分去高考,或者參加自主招生免掉高考。因為我對應試考試並不擅長,差不多也就能考600分出頭,加上加分差不多能夠上10名左右的大學。所以我就幾乎無腦去參加自主招生了。

自主招生總體是個很愉快的過程,第一次獨自一人,去跑了幾個城市,最後拿到了華科的資格,專業選擇了自動化,因為感覺自動化是一個跟機器人相關的專業,而機器人是一個未來的專業。華科的自動化的專業排名很高。然後就去了。

另外高中競賽時期,在編程之外,很愉快地和小夥伴們在機房裡面玩星際,極品飛車,並且在保送後的三四個月裡面瘋玩因為不需要再考慮高考的事情了。也算是一個很特別的高中回憶。

對我來說,省選失敗的經歷應該是遠遠超過了獲獎,任何獲得的獎都是過去的榮譽,而失敗的教訓卻適用於之後的一生。這個經驗一直到現在都無比的好用。

另外最近幾年回學校去跟之前的老師聊天,這幾年的小同學做OI比賽要更加有針對性了,為了加分和保送,並且電腦專業的大火也讓很多高中同學更多的參與。不過看下來少了一些純粹和個人的動力,有些時候覺得從長遠來看未必最好。

大學的四年(2006-2010),武漢:

上了大學之後才發現自動化跟機器人確實有一些關係,不過博士的研究課題裡面可能更多一些。控制理論那些東西看到就覺得沒勁,也沒興趣學習傅里葉變換、拉普拉斯變換之類的。對於電路、晶片編程還有感測器也是興趣寥寥,可以說自動化的專業課程直到畢業的時候一點都不會。

不過好在華科除了學習考試以外,有幾個跟電腦相關的比賽可以搞一搞,比如說微軟創新杯,ACM ICPC之類的。本來被拉去參加ACM集訓,後來去了幾天感覺做的事情跟高中刷題沒差別,就沒再去了。後來看到微軟創新杯好像有些有趣的項目,我大學的前兩年參加了兩次,因為對遊戲比較感興趣,參加項目是給一個類似於RTS的遊戲寫AI,控制機器人採礦交戰之類的。第一年沒有做好,第二年進了全球第二輪,具體名次記不住了,大概能排到全球前20。

第三年的時候就覺得不想參加這個遊戲AI的比賽了,後來想了一個架起來的自行車加感測器做輸入設備,在3d的世界中騎行的一個項目。類似於 https://zwift.com/ 這種項目。當時整個暑假開始召集小夥伴,然後沒日沒夜的做這個項目。後來用這個項目去參加微軟創新杯的軟體設計比賽,進入了中國前八。不過很遺憾沒有進去中國前三,錯過了那年在埃及辦的決賽。

創新杯回來後,萌生了用這個項目去創業的想法,跟一些天使投資人聊了一下,也寫了一些創業計劃書什麼的。後來聊了一圈之後覺得這個市場並不好做,體育這個領域也並不是自己很喜歡的領域,我連環法都沒有好好的看過。並且真的沒有找到人願意做天使,第一次創業未遂就這麼草草結束了。

後來一轉眼就到了大四,當時在考慮要不要去讀個研,身邊人都勸自己最好去讀一個不然會碰到天花板之類的。我當時的想法是,如果能保研到一個還不錯的學校那麼就去讀一下,考研的話就算了,本校我也興趣不大。後來找好朋友推薦了一下一個清華的老師,過去跟這位老師聊了一下感覺比較好,他也非常希望我過去,做一做搜索引擎和AI相關的東西。但是需要我搞定一個華科外推保研的名額。但是華科的推研成績要top 15%,我的成績估計是bottom 10%,要推研需要特批。後來想辦法找到同學要了校長李培根(根叔)的電話,在某個晚上打電話給他自我介紹了一下,看看是否能有辦法特批。根叔當時答應說會幫忙找教務處問問,然後就再也沒有消息了。

後來感覺自己去工業界混混也應該能夠學到不少的東西,三年讀研不是一個很短的時間,然後我很快就開始找工作了。現在回想起來,這個可能是最明智的決定之一:研究生學位在公司招聘的時候如果候選人專業水平類似的時候可能會看看,在水平差不多的情況下,反而本科優勢更大。

因為自己之前對3D的東西比較喜歡也有一些積累,自己也用D3D來寫了一些玩具級別的3D引擎,最初的想法是找一個遊戲的公司。騰訊遊戲和網易遊戲面試後希望我能加入他們,不過我發現自己對騰訊和網易的遊戲產品(當時主要是網遊)毫無興趣,總覺得是坑害無知青少年的工具。直到現在我都幾乎沒有玩過他們的遊戲。後來聽了阿里雲王堅關於雲的宣講,突然一下感覺到眼前一亮,那是我第一次關注到雲和企業市場,覺得會是一個非常有趣的市場。因為在解決複雜問題的同時還能給企業帶來各種各樣的幫助。後來順利面試完,就加入阿里雲(北京)了。

在阿里雲(2009-2011),北京

阿里雲在當時看起來應該是一個最有矽谷特質的中國公司,公司是滿滿的工程師文化,很新潮的感覺。加入的團隊是阿里雲的演算法團隊,實習的時候就開始做了一些機器學習演算法的研發,主要跟文本分類還有聚類相關的一些東西。後來在實習完,正式入職的時候團隊碰到Reorg(阿里就是Reorg多),之前我實習時候的團隊就已經散夥了,幾位同事去了淘寶。

加入之後做了一些跟數據處理平台相關的東西,也就大概一兩個月,所以細節記不太清楚了,自己的興趣也不是特別大。過了不多久碰到新老闆品數入職,我就毛遂自薦加入內部叫做XLab的一個項目,之後是ODPS的前身。那段時間就天天拿著MPI去寫矩陣運算的程式,和一位數學PHD搭檔,他負責研究公式,我負責把公式實現成MPI並且做性能測試。也給MPI寫了一個Adapter讓MPI可以跑在飛天(阿里雲內部自研類似於Hadoop的系統)上。另外就花了很多時間學習機器學習的知識,這個部落格裡面關於機器學習的文章基本上都是那個時期寫出來的。

其中跟團隊一起搞出的成就是超大規模的矩陣SVD分解等矩陣操作,晚上的時候就在東三環北路附近吃肯德基,還是非常快樂的時間。

入職的前半年(一直在2011年初)的阿里雲也是路子很野的時期,一方面公司的士氣高昂,希望自研所有的大數據系統,基本上把上古神仙如盤古女媧之類的名稱都用了一個遍。另一方面自研系統缺少理性的思考和全局的架構,導致很多系統做了一半之後發現不可用。工程師陷入加班寫碼,重新推倒,再加班寫碼的循環之中。

後來阿里雲也有一些內部的危機,由於飛天的性能一直上不去,關鍵的業務也不敢跑在飛天上。所以阿里雲在集團內部備受質疑。在工作之中也接觸了一些開源項目,同事在討論的時候也經常說哎呀這個東西Hadoop都有了,我們也實現一下吧等等。所以我當時的想法是,與其在飛天的基礎上做,還不如做真正的開源Hadoop。後來收到了EMC Greenplum Hadoop團隊的邀請,就去了上海。

如果要復盤的話,當年在阿里的技術選擇還是比較正確的,雲計算,機器學加上大數據。如果按我現在的心智可能當時跳槽的時候還會再穩一穩,至少不會因為內部或者的質疑而輕易換工作,因為每個工作不開心的地方其實都差不多,當時年幼的我可不懂這些,而這些也往往只有跳過幾次槽之後才領悟得到。不過從另一個方向來看,出去走走也是很有意思的事情。

EMC Greenplum / Pivotal (2011-2014),上海

2011年是Hadoop剛開始在企業市場裡面開始火起來,Hadoop的名字基本上是和大數據連在一起的,說起大數據,人們的第一反應就是Hadoop。那一年也是Hortonworks成立的時候。後來Greenplum,CloudFoundry從EMC和VMWare裡面分出來,成立了Pivotal,所以我就把他們寫在一起了。

在Pivotal裡面花了大幾個月做了跟Hadoop周邊的一些數據ETL的工具,類似於Hadoop Distcp的++版本。不過後來真正一個有趣的項目是叫做Hamster (MPI on YARN),當時Pivotal挖來了年過半百的Ralph Castain (OpenMPI的創始人之一)。Hamster把OpenMPI跑在Hadoop上面(Hadoop And openMpi on the Same cluSTER)。當時Pivotal對Hadoop有源碼有比較深入認知的工程師非常少(雖然慚愧說來我們是主打Hadoop的團隊),後來跟Ralph聯繫了一下,Ralph也是很開心的跟我一起合作。

但是為了完成Hamster這個項目,YARN那邊其實有很多跟資源調度的功能還不具備,比如說Gang Scheduling。另外一方面為了給用戶提供一個完整的體驗,我們希望mpirun後面的事情都是用戶不會看見的,所以需要對OpenMPI做深度訂製。後來跟Ralph一起參與了很多MPI社區的會議和討論。這個其實算是我第一次融入進開源社區的溝通之中。

另外一個重要的經歷是參與了Hadoop社區:記得最早使用YARN的時候,那時YARN還主要稱為MRv2。那時YARN很多東西都不完善,當時針對做MPI on YARN需要的一些功能,在社區裡面提出了好一些JIRA,其中花時間最多的是YARN Container的垂直擴縮容的功能。花了兩周的時間寫了設計文檔、程式碼等等,結果沒想到社區反響挺大,當時Spark社區在猶豫是否用Container的垂直擴縮容還是後來的動態申請新的Container的功能。如果能夠有垂直擴縮容對Spark的幫助比較大。通過參與Hadoop也感覺到了Hadoop社區和MPI社區的不同,個人更喜歡Apache社區更開放的方式,也堅定了繼續在Hadoop項目裡面繼續走下去的決心。

Hortonworks/Cloudera (2014-今天)

做Hadoop YARN哪家強呢?當然就是Hortonworks了,當時覺得Pivotal內部做開源還是限制太多,社區裡面也幾乎沒人能夠幫得到忙,另外自己也想去矽谷工作看看(12年的時候出差去過一次,印象還是挺不錯的)。所以當時就想著找找Hortonworks試試看,結果幾面下來很順利就有了Offer,而且是最心儀的YARN團隊。

後來四月入職Hortonworks,先在中國短暫的工作了幾個月,十月份去了美國。身邊都是都是各個Apache項目的committer,短暫的適應了之後就開始程式碼的貢獻了。Hortonworks算是一個很誠心經營社區的公司,公司在開始的幾年內對開源幾乎是無保留的狀態,很多項目從內部到開源幾乎不需要什麼批准,Hortonworks的貢獻在很多時候也被大公司比如說AWS、Azure不費一分錢就可以拿去盈利,並且幾乎不貢獻回社區。由於這種吃免費午餐的公司太多,這幾年開源的生態也變化很多。

在Hortonworks的四年多裡面,經歷了Hadoop與大數據從鼎盛到被人唱衰的完整周期。最開始的時候只要是Hadoop相關的東西都會得到極大的關注,Apache Mahout這種粗製濫造的項目都可以火確實從另一方面證實了泡沫也多大。

後來Hortonworks與Cloudera合併,我也轉行做了管理, 現在編程不是義務而是愛好,更多的時間也是花在項目管理、團隊設計和架構設計方面。這兩年還是投入了很多時間到開源社區和mentoring新人和現有的項目。也有機會把幾個項目比如說Submarine, YuniKorn 推進到Apache裡面,建立社區、讓更多的公司能夠使用,也能夠讓自己的公司有機會從這幾個項目中取得商業的價值。

因為開源的緣故,可以接觸到非常多的公司,從最開始的Yahoo是社區中流砥柱,到後來Microsoft大舉進入,然後Yahoo的從如日中天到被Verizon Media賤價買入。到後面的Linkedin、Uber進入,這幾年中國的公司也在開源領域發力。在過去的六年最有意思的事情是在開源的世界裡面認識了很多的朋友,也儘力的幫助各個公司參與開源。這幾年幾乎走遍了矽谷所有的大公司(不只是蹭飯 ?),這個經歷很獨特也很有趣。

開源也是一個複雜的小世界,有各種真心無私的、幫助社區的人,也有盯著功名利祿、用開源作為跳板的人。有真心開源、無私奉獻技術的公司、項目,也有只是用開源作為幌子,掛羊頭賣狗肉的商業公司。

雖然 「Business is business」,不過從做技術的角度來說,真心開源的公司和人比開源為跳板要可愛很多。

總結一下這幾年最重要的經驗吧:

  • 失敗永遠是無所謂的,不多嘗試多失敗不可能成功。
  • 這很多年觀察下來,從工作的成就而言,個人的動力的正面影響往往會超過物質的回報。而在強烈的個人動力驅動下,物質的回報只是一個副產品而已。
  • 真心幫助別人是很重要的(而不求回報),雖然現在開源社區的一些同學發的郵件和問題我很難一一回復,不過我也會盡量的幫助別人找到需要的資訊。雖然商業社會提倡互惠而非單方向的幫助,不過個人的觀察下來,在能力相當的情況下,抱著理想主義的giver會走的比taker更遠。

好吧流水賬先寫到這裡。