1. 程式人生 > >從抄書到開源之巔:章亦春的程式人生

從抄書到開源之巔:章亦春的程式人生

春哥的程式設計之旅起於抄書,就算如今已是罕見的程式設計高手,春哥依然逢人大力推薦他的抄書學程式設計之法。春哥先後在中國雅虎、淘寶、Cloudflare 就職,但開源世界是他如一的眷念。如今,春哥已全身心投入 OpenResty 的嶄新藍圖,期待 OpenResty 未來能在工業界、網際網路行業引領“機器程式設計”革命。很榮幸這次圖靈訪談可以對話春哥,讓我們來一起了解一下春哥的快意程式人生。

640?wx_fmt=png&wxfrom=5&wx_lazy=1

春哥,本名章亦春,開源專案 OpenResty 建立者和推動者。

春哥的時間線(畢業之後)

2007 年也就是我大學一畢業,加入中國雅虎搜尋技術部。當時的中國雅虎已經是阿里旗下的一家公司了。那次工作機會源於我在畢業前夕受邀在 PerlChina 北京大會上作的開源分享,而那次大會正好是在中國雅虎總部舉行的,當時有幸認識了中國雅虎的搜尋團隊(又稱 4E 團隊)。

2009 年 被調到淘寶資料產品與平臺部,集中力量和同事們一起基於 OpenResty 開發淘寶量子統計這款產品,主要面向淘寶賣家。

2011 年我離開阿里,和夫人(當時還是我的女朋友)一同前往一個陌生的南方小城福州,過了一年所謂的“田園生活”,在家裡全心從事 OpenResty 等開源專案的工作。

2012 年我受 Cloudflare 公司邀請,舉家來到美國灣區,全職從事 OpenResty 開源開發,以及基於 OpenResty 的全球 CDN 網路的軟體系統的研發和完善。

2016 年晚些時候我離開了 Cloudflare,並於 2017 年初在美國創辦了 OpenResty Inc. 公司。

母親、賽揚與抄書

我的程式設計起點

我最早和程式設計結緣,說起來還是託我媽的福。上初中那會兒,記得是 1999 年的時候,她正在準備計算機二級自考,於是家裡買了一臺賽揚 330MHz CPU 的機器,裝的 Windows 98。她也弄了一本譚浩強的《C 語言程式設計》教材,經常放在家裡。自然,我經常去玩機器,系統裡唯一一個開啟來不知道該幹嘛的應用程式,就是那個奇怪的 Turbo C 程式設計環境。雙擊開啟後,藍色的螢幕上游標一閃一閃的,我完全不知道該幹嘛。這激發了我強烈的好奇心,一心想著也能把它玩轉,就像使用 MS Word、AutoCAD 這些不用人教就能熟悉的應用程式那樣。 

初中畢業之後,我就“偷”走了那本《C 語言程式設計》,仔細研讀起來。我媽當時是強烈反對我學習程式設計的,她認為我這是“不務正業”

。當時,身邊除了我媽沒有人懂程式設計,我便只能靠自學。由於完全沒有程式設計的概念,即使從第一頁開始一個字一個字地手抄,也還是一頭霧水,不知所云,感覺很鬱悶。2000 年,我剛剛高一開學,當時我所在的高中——鎮江一中,發給我們的一本《計算機基礎》教材,裡面有講解 Visual Basic(VB)的章節。我覺得貌似比 C 語言容易很多,於是又開始手抄這本教材裡的 VB 章節。我每抄完一段,就反覆研讀。這樣折騰了幾周,終於明朗起來,有了程式設計的基本概念。於是,又回過頭來繼續手抄那本 C 語言教材,抄到一半左右的時候,我終於感覺到可以不用繼續手抄了。然後,我就陷入琢磨如何用 C 實現各種連結串列和其他複雜資料結構的細節中去了。高一寒假的時候,我又開始手抄 Thinking in C++。寒假結束時,我對 C++ 語言算是比較熟悉了,也就不再滿足於 Turbo C,開始玩更高階的 IDE,像 Borland C++ 和 Visual C++ 。

回過頭看,抄書是我自學程式設計的法寶。話說抄書這種學習方法是我意外間發現的。初三時,我酷愛化學,總是纏著當時的初中化學老師提各種奇怪的問題,老師拗不過,借給我一本他當年大學時用的課本《分析化學》。我如獲至寶,愛不釋手,但借的書總要還,但又不能立馬消化,於是我便抄書,抄了整個暑假,結果意外地發現了抄書的奧妙——那就是延緩閱讀速度,不至遺漏每一個重要的細節:眼到,手到,心到

其實不僅書抄得,程式碼也抄得。記得我剛進入淘寶時,想學習 Nginx 原始碼。於是白天上班就對著 Kindle 抄 C 源,同時就已暗記於心;晚上回家在房子裡來回踱步,在腦海中反覆回放白天抄過的原始碼,直至融會貫通,深得其奧妙。這段日子持續了一兩個月後,便大徹大悟了。

教機器解題

程式設計和高考之間的平衡木

入門以後,我就對程式設計越來越有興趣。只要不上課,我就會跑到新華書店去看一些程式設計類的書。整個高中三年,那裡都是我最愛待的地方。同時,以高考為目的的學校教育也愈發讓我反感,我覺得完全是在浪費時間。雖然我上的是當地的重點高中,學校也倡導所謂的“研究性學習”和“素質教育“,但高考的壓力從高一就開始了。一方面是程式設計的巨大樂趣,另一方面是高考為指向的應試教育,這讓我非常痛苦,甚至都動過輟學的念頭。

我於是和爺爺討論解決的辦法,因為我倆既是祖孫也是朋友。他當時幫我出了個主意,就是想辦法把程式設計和高中學習結合起來。具體怎麼結合,只能我自己去想了,我爺爺也完全不懂計算機。認真想了很久,我決定親自教機器去解答各科的高考題。而要教機器解題,我自己首先得學會如何解題。這給了我繼續應試教育的理由。

當然,教機器解高考題對於一個沒有人指點的高中生而言,顯然是一個很大的挑戰。那些高考題即使對於人類也是很有難度的。我不得不拼命自學了很多艱深的計算機專業的課程,像編譯理論、自動機理論、專家系統、人工智慧,還閱讀了一些論文,比如定性推理之類的研究成果。

機器解題與人類解題的一大區別是,機器不能運用人類直觀來輔助解題。比如幾何題裡作輔助線,或者其他基於視覺的解題方法,這些對於機器都是不適宜的。機器需要精確的推理方式,需要把一切都形式化。我不得不研究了很多反常規的解題方法,因為其中一些方法運用了高等數學的知識,在真正的高考中也是不宜使用的。記得高三時,我還自己定義了一種簡單的數學系統,可以漂亮地證明任意立體幾何的定性證明問題,而不依賴於任何人類直觀或輔助線。可惜的是,以當年的數學素養,我只能證明數學系統的內部相容性,卻無法證明完備性。不過,當時蒐集到的高考題都可以用那個自動證明系統證明。(上了大學,我才有時間完成證明系統的程式碼實現)。

高中三年對我來說是極為豐富的三年,也是非常辛苦的三年。當然,高考成績並沒有那麼理想,我想,是因為追求的深度和廣度無法很好的兼顧吧。幸運的是,高考分數還是超過了本一線,應該也是當時班上的倒數了吧。我在江蘇大學的四年也是非常充實和享受的,自認為真正實踐了高中母校“研究性學習”的口號,走出了一條適合自己的路。

我非常感謝爺爺當年的鼓勵和啟發,讓我堅持完成了學校的教育,也從人工智慧和機器解題的角度發掘了學校教育動人的一面,優美的一面。這是我最初無論如何也無法預見的。

大學,步入開源世界

大學時代,最成功的事情有兩件。

一件是繼續高中時的學習方式,教機器自動求解和證明大學課程的各種題目和問題,比如非線性電路的自動分析、離散系統的模擬引擎、實現 x86 CPU 指令集的指令譯碼器的硬體設計、計算機程式的自動形式化證明,等等。另外,在計算機上編碼並測試那些高中時設計好但一直沒空實現的高考題求解系統。 

另一件事情是,接觸並融入到開源世界。直到現在,我還記得第一次給一個開源網站寫電子郵件時的激動心情。雖然只是報告了一處筆誤,沒想到網站的維護者很快回復了並感謝我的報告,一下子整個人都欣喜若狂了。大三時,我開始關注 Perl 6 這個開源專案,每天都要仔細翻看他們在 freenode 伺服器上的 IRC 頻道上的聊天記錄。我發現這些“老外”說話的方式和從前在英語課本上看到的有很大不同。有非常多的習慣表達方式,也有一些網際網路上專用的俚語。就這麼通過聊天記錄,我掌握了開源世界的口語,也熟悉了頻道里經常說話的大牛的脾氣和說話方式。認真“潛水”了一年之後,我開始在那個頻道里說話,漸漸融入了社群。 

隨後,我也積極地做了不少有趣的開原始碼專案,貢獻給了 Perl 6 社群。大四時做了一個Perl 6 語法分析過程的視覺化除錯工具,居然得到了Perl 的發明人 Larry Wall 的讚揚,這是莫大的鼓勵!Larry 在 IRC 頻道里是這麼評論我的工具的:“agentzh: please allow me to say I'm amazed!”聊天頻道里有各種各樣的人,有的是美國某大學的博士研究生,有的是西方某藝術學校畢業改行做程式設計師的,有的是像 Larry Wall 這樣的重量級宗師,擁有各種性格、背景、文化的人在一起相互碰撞,相互交融。這種體驗讓我沉醉其中,無法自拔。開源社群和 IRC 把我和整個世界緊緊地聯絡在一起。

大學的歲月比高中自由了很多,輕鬆了許多,身心得到了前所未有的解放,下面這些瞬間讓我印象深刻。

  • 白天在江蘇大學藏書豐富的圖書館裡淘書,面對著各個學科的英文版教材,心中充滿敬畏與喜悅之情;

  • 晚上在網上和開源社群跟分佈在世界各地的黑客一起做各種有趣的開源專案;

  • 夜裡回到男生宿舍熄燈後,又跑到對門宿舍和志同道合的同學海闊天空,熱烈地討論我的一些有趣的新想法——當然,一般是和科學或技術相關的了,經常被查房的大爺打斷。即使後來我不再住學校宿舍,也會經常去那間宿舍坐坐;

  • 累的時候在江蘇大學那優美寬廣的校園裡一圈一圈地漫步,心中思考著一個又一個有趣的科學或技術問題,有種“天高任鳥飛,海闊憑魚躍”的豪邁感。

640?wx_fmt=jpeg

配圖由春哥提供

英語

聯結全世界優秀的程式設計師

英語是國際化的前提之一。前面提到,第一次通過電子郵件和國際開源世界發生聯結時,我才真心體會到熟練使用英語的巨大力量。如果程式語言讓我們和機器聯結,英語則讓我們和全世界優秀的程式設計師聯結在一起。

高中時,我還主要看中文版的技術書和科學書,步入大學,我就只看英文版圖書了。必須承認的是,最先進的技術通常源自中國以外,以英語書寫。所以中譯本會大大滯後原英文版,很多比較生僻的領域,甚至都找不到中譯本;另外可能是譯者專業水平和語言功力的原因,中譯本的錯誤也比較多。舉一個例子,裘宗燕老師曾經翻譯過《程式設計實踐》一書,高一時買來反覆精讀了好幾遍。上了大學以後,我在圖書館裡竟意外地看到了英文原版,不得不感慨原版還是要清晰和流暢許多。

出於國際化的考慮,從大學時代開始我做的開源專案也都用英文寫文件,只有極少數情況下我會加上中文譯文,因為翻譯對我來說確實是很無趣的工作。英語是和世界溝通的橋樑,OpenResty 後來的國際化也得益於此。

工作,最難得的是:跟對人

參加工作之後的這些年,經常收到一些關於工作與實習的諮詢。我個人的觀點是:只要有機會跟著牛人幹,不論具體做什麼,都是會有很多收穫的。工作內容不重要,跟對人最重要。如果能有機會和自己景仰的人一起工作,不給錢我都願意。當然,這個確實要看機緣,是非常難得的事情。

畢業後,剛加入中國雅虎的時候,我做的工作經常被一位比較資深的後端工程師批評,最狠的一次算是“垃圾批量製造”這樣的話。但我從他那裡零零碎碎地學到了很多高效能網際網路應用系統的實現方法和設計思路。再後來加入淘寶以後,我拜了一位當時看來很“神”的工程師為師。他也經常把我罵得狗血淋頭,在他的指導下我們一起建立了第二代 OpenResty 平臺,我也學到了很多基於 C 的系統程式設計技術。

不過話說回來,開源世界確實沒有什麼門檻,只要自己努力、有意願,就完全有機會和不同的世界級牛人一起協作,不必拘泥於同一家公司共事的形式。從另一個角度看,公司的工作環境一般會比較複雜,也遠沒有開源社群那麼簡單和純粹(當然,開源社群也有政治鬥爭,敬而遠之便是了)。

所以,我建議還在學校的同學多擁抱開源,最好是參與國際性的開源專案,加入對應的國際性開源社群。以我自己的親身經歷來看,開源世界的工作是最好的簡歷。大學畢業之後,我基本上沒有主動找過工作。阿里的工作機會也好,美國 Cloudflare 的工作機會也好,都是工作找過來的。我在阿里待了 4 年,在 Cloudflare 工作了 4 年半。 

身邊的牛人

欣賞、學習與超越

經常有人問我,崇拜技術界哪些大牛?我不喜歡“崇拜”這個詞,因為我並不想去崇拜任何人,崇拜本身就是非理性的欣賞的牛人倒是非常多,我把他們當作老師想盡量從他們那兒多學習一些精華,然後超越他們。隨便舉幾位老師作為例子吧。

高三時,我非常欣賞 Perl 的祖師爺 Larry Wall 老師。和其他過程式語言相比,Perl 在風格和性質上都展現了獨特的一面,因為 Larry 把語言學和哲學的思想也融入了 Perl 當中。我喜歡 Perl 展現出的文化和哲學,直到今天,它依然是我在程式設計世界的“母語”。

2012 年初,我著迷於 Brendan Gregg 老師在動態追蹤領域的開創性工作,就精讀了很多他的技術部落格文章,也買了他的書來閱讀。到美國以後,終於有機會在 Cloudflare 的全球網路中實踐了他的很多方法和思想,快速定位了不計其數的線上“詭異問題”,有時甚至還有意外的發現。基於 Brendan 的工作,我也做了進一步地探索和創新,在一些方面還實現了超越,比如把火焰圖技術延展到了記憶體洩漏檢測和 off-CPU 時間分析等全新的維度。Brendan 在他的一次技術分享中,還專門用一張幻燈片介紹了我在這個領域的工作。

說明:Brendan Gregg,Netflix 資深效能架構師,著名效能調優專家,著有 Systems Performance: Enterprise and the Cloud(中文版《效能之巔:洞悉系統、企業與雲端計算》,電子工業出版社)

最近幾年,我也非常欣賞 LuaJIT 的作者 Mike Pall。針對 Lua 程式語言的 Just-in-Time 編譯器——LuaJIT,在設計方面十分精巧,精巧到我都開始懷疑他究竟是不是人類(笑)。和 Mike 的郵件溝通給我很多啟發,所以每次收到郵件後我都會反覆研讀每一句文字,生怕遺漏重要的提示。有時候,Mike 甚至會推薦他認為不錯的論文給我參考。

程式碼之外,閱讀、游泳與漫步

除了寫程式碼,我喜歡讀書,包括電腦科學、技術、數學,還有佛教研究方面的。在灣區這幾年,我很喜歡在山林湖泊中漫步,思考一些艱深卻有趣的技術問題。對我來說,這是一種很大的享受。此外,幾乎每天都會去游泳,晚上會修習佛教早期的經典禪法,以清淨內心獲得奇妙的寧靜和喜悅。在我看來,最本初的佛學其實是一門哲學,這與後世在中國傳播的大乘佛教有著極大的差別,後者真的是一門宗教,是神學了(當然,慧能之後的禪宗倒是有很多相似之處)。

灣區的生活,非常接近我理想中的“田園生活”。我對“田園生活”的願景起源於初中語文課本里的一篇散文,題目是《釣勝於魚》。文中講一位美國大學的老教授經常乘著一條小船,在湖光山色中一邊釣魚一邊研究學術問題。釣上來的魚又經常被他放回湖中。從少年時代起,這樣的生活就根植於我心中,成為我理想的生活和工作狀態。

640?wx_fmt=jpeg

配圖由春哥提供

OpenResty

機器程式設計革命“魂器”

OpenResty 是一個開源的 Web 平臺,用於開發高效能和高動態的 Web 閘道器或者 Web 應用。OpenResty 最早是為了支援全網搜尋引擎周邊的相關搜尋的 API 介面,後來我們基於 Nginx 和 LuaJIT 重寫了 OpenResty,用於支援淘寶量子統計這款產品的所有資料 API,再後來,我加入美國的 CDN 公司 Cloudflare,使用 OpenResty 驅動 Cloudflare 全球 CDN 網路的動態 http 和 https 代理系統。

從出生的第一天起,OpenResty 就是開源的。這些年來,OpenResty 社群嘗試把它用於各種不同的業務場景,有些場景甚至是我們完全無法想象的。比如有的公司使用它構建分散式網路儲存系統的前端和後端(比如網盤應用);有的用它來構建完整的 Web 應用,像電商平臺的商品詳情頁的生成和大型體育賽事的 Web 管理系統;也有的公司基於它構建大型的網際網路廣告平臺,或者更復雜的 Web API 管理系統;還有的公司拿它來驅動小流量排程的硬體盒子,或者驅動家居陪伴型機器人;當然,更多的還是用於實現那些流量非常龐大的 Web API。[似乎和流量相關的工作都有機會用到 OpenResty,我們也有使用者使用完全基於 OpenResty 的權威 DNS 伺服器。] 

OpenResty 的優勢在於小巧靈活、高性動態。基於 Nginx 事件模型和 Lua 的協程,我們實現了基於 I/O多路複用的高效 I/O 排程器,引入了“輕量級執行緒”和“協程 socket“(又稱cosocket)等強大的抽象。Lua 的動態性使得程式碼在請求和連線級別的按需載入和熱替換、熱解除安裝變得非常容易和安全。這種能力在動態 CDN 場景下顯得尤為關鍵,因為那裡經常需要處理幾十萬乃至上百萬不同站點的配置,而且這些配置可能一直都處於動態變化中,需要很高的生效速度,即使是全球網路的規模也是一樣。

我們正在開發中的 OpenResty 新版本將包含很多重要的新功能,比如新建的後端連線遇到連線池滿了的狀況會自動排隊和等待 ,協程 socket 在 Lua 級別主動進行listen() 和 accept() 的功能,在 Lua 中以非阻塞管道方式與新建的其他系統命令的子程序的標準輸入輸出裝置進行高效通訊。另外,在效能方面,Lua 處理程式的固有開銷會顯著下降,最簡單的 hello world 介面在整體效能上會有百分之幾十的提升。

我對於 OpenResty 一直有著巨集偉的願景:希望 OpenResty 未來能在工業界、網際網路行業引領“機器程式設計”革命。人類只需要向機器輸入行業知識和意圖,機器就能自己編寫高效可靠的實現程式碼,自行測試,進而生成人類可讀的文件,最後毫無差錯地佈署在大規模的計算機系統上。就像現在的製造業裡,機器人流水線大批取代工人一樣,未來的程式設計師也可以從業務編碼中解放出來,去做更有趣、更富創造性的工作。

640?wx_fmt=jpeg配圖來自 OpenResty 中文社群

使用者給予動力

不斷推進 OpenResty

OpenResty 的發展比較迅速,動力來自 OpenResty 的廣大使用者。這其中既包括我之前的僱主,也包括開源社群的廣大個人使用者和企業使用者。我曾經收到使用者的電子郵件,專門為我在 OpenResty 專案上的工作表示感謝;也經常收到中國和海外使用者的捐款,也許大部分的捐款並不多,但每次都讓我心裡暖暖的。每年的 OpenResty 大會上,我都有機會見到OpenResty 的使用者,還有社群貢獻者和開發者。大家的分享激勵我去不斷地開發新玩法和新功能。OpenResty 社群就像一個溫暖的大家庭,世界範圍的大家庭。廣泛連線產生的幸福感和大學時每天泡在 #perl 6 IRC 聊天頻道的感受很類似,只不過我成了曾經 IRC 頻道里的“教主”角色!

最近兩年,我們在香港專門成立了一家非盈利機構——OpenResty 軟體基金會,負責接收捐款處理、OpenResty 大會支援,以及社群貢獻者和開發者的獎勵工作。OpenResty 軟體基金會和 OpenResty Inc 商業公司是平行的關係,彼此獨立運作。

商業級別技術支援和解決方案

成立 OpenResty Inc

我對 OpenResty 一直都抱有很高的期望。如果一直為其他公司工作,出賣時間的話,我就不能完全專注於 OpenResty 藍圖的實現。雖然之前的幾位老闆都很支援我在 OpenResty 上的工作,但畢竟拿人工資,還是要優先保證僱主的業務需求,這是基本的職業操守。

另外,隨著 OpenResty 滲透到越來越多的公司和行業,社群卻無力提供商業級別的技術支援和理想的解決方案。這也是開源專案運作上普遍存在的侷限。

在淘寶工作的時候,我曾成功地實踐了一種構造複雜業務軟體系統的方式,即教機器寫程式的方式,極大提高了複雜業務系統的構造速度,同時改善了系統在可理解性和執行效率方面的質量。所以,一直以來我都想著能有機會在工業界推廣這種“機器程式設計”的革命。顯然,教機器寫程式的靈感源自我高中時教機器解高考題的有趣經歷。這些經歷又以我們不曾意料到的方式啟發、推進成長。

於是 2016 年的一個晚上,我突然有了要把 OpenResty 商業化的想法,藉助商業的力量召集 OpenResty 開源社群的志同道合者組建一個屬於我們自己的團隊。當然,OpenResty 的開源性是絕對不會變的。公司主要基於 OpenResty 構造上層的商業產品和商業解決方案,面向需求較高、挑戰較大的企業使用者。雖然商業版的 OpenResty 可能會有一些開源版所不具有的高階功能,但隨著技術的不斷創新,也會有越來越多的商業版特性被陸續移植到開源版中來,供全世界自由享用。

OpenResty Inc 的定位是一家面向企業的軟體服務公司,希望探索未來 Web 系統構建和優化的新方式。我們主要銷售企業級的伺服器端軟體和服務,為企業客戶提供基於 OpenResty 和 Linux 的技術解決方案,藉助“機器程式設計”的全新思路和方法,OpenResty Inc 極大地提高了複雜應用軟體的開發速度和質量。網際網路行業的工作經歷讓我清楚地認識到傳統的軟體工程方式已經越來越不能滿足日益增長的複雜業務軟體系統的需求。讓機器來自動處理業務軟體的複雜性,才是出路!

“機器程式設計”是一個龐大的世界,我們目前的入手點選得比較小:使用“機器程式設計”的方式構造和銷售高度靈活的分散式流量管理軟體——OpenResty Edge。我們目前的商業客戶有較大規模的 CDN 廠商,也有自建 CDN 的大型網站,還有把我們的軟體用於網站流量入口,即跑在 CDN 網路的後面,把流量分發到後端各個不同的業務線系統。我們在產品中提供了類似文件說明書的“小語言”方便客戶直接用業務語言,而不是程式語言,來表達各種複雜的業務需求和業務邏輯,然後我們的產品會自動生成各種不同型別的高度優化的程式碼,執行在較大的叢集網路之上。

我們公司今年也計劃推出分散式的動態追蹤平臺,叫做 OpenResty Trace,可以對大規模的分散式網際網路系統進行各種有趣的效能分析和 Bug 追蹤,而無需應用系統的任何配合,也不用下線或重啟任何線上服務。相當於給線上軟體系統拍活體 X 光片,或者核磁共振片,可以隨時隨地看到從作業系統核心到應用軟體的指令碼語言程式碼的方方面面,把整個軟體棧作為一個隨時間動態變化的整體來看待。自然地,這裡也會大量用到“機器程式設計”和“機器推理”的方法和技術。

創業難題之多少

創業過程中的困難不少。首先是角色上的巨大轉變,我從一個僱員變成了僱主,從一個打工者變成了一個老闆。這在思維方式和做事方式上,都需要進行非常大的調整。我還需要學習很多不曾接觸過的東西,比如融資、公司股權結構、公司財務、稅務、法務、智慧財產權、銷售與商務,等等。

其次,OpenResty Inc 從成立起就是一家“跨國公司”,跨越了中美兩個國家,所以會涉及資金的跨境流動、智慧財產權的地域性設定與分配、不同國家的稅法要求等很多方面的問題。

再次,雖然我們在美國灣區和珠海各有一間辦公室,但大部分員工還是遠端工作的。如何讓團隊緊密協作和高效運作,就成了一個較大的挑戰。反過來講,這對於我們也是一大優勢,可以吸收世界上任意地點的人才加入團隊,而不用擔心新員工的搬遷和移民問題。另外,遠端工作的巨大自由度也可以吸引到那些喜歡有獨立工作空間的黑客。

最後這個小主題是個特別版塊,我們邀請春哥對初學程式設計的朋友們,講幾句掏心窩子的話。

勇敢地走自己的路

對初學程式設計的朋友們,我只想鼓勵大家勇敢地走自己的路!我相信每個人都有最適合自己的成長道路,而主流的教育和培訓總想著趨同化,流程化,我最反感這種學習和教育。就該不拘一格,自己認準的路就值得堅持。主流的技術和思想總在快速變化中,像趕時髦那般一味地追逐是沒有意義的。希望大家能不忘初心,始終保護好最初對程式設計的好奇和興趣。

如果時光倒流,我能回到最初學程式設計的歲月,我希望自己能及早地給我所有的機器都安裝上定時強制休息軟體。另外,能早點做到經常去游泳,這樣今天的我就不會有程式設計師的那些個職業病(比如脖子疼)。另外,我希望高中時的我能少花些時間在琢磨某些大軟體廠商的私有技術上面,比如微軟當年的 OLE、COM、COM+ 這些技術(估計今天很多年輕一代的程式設計師都很少聽說這些名詞了),能早點擁抱開源世界和開源技術。最後,希望當年的我能更加深入理論電腦科學及周邊數學分支的學習和研究。進入工業界之後,我才發現這些基礎理論研究才是追求“極致程式設計”和解決最難的工業問題的根基,而這些是最容易被普通工程師所輕視和忽略的。

640?wx_fmt=jpeg

配圖由春哥提供

640?wx_fmt=gif

推薦閱讀:

覺得有幫助?請轉發給更多人!

640?wx_fmt=jpeg

架構師小祕圈,聚集10萬架構師的小圈子!不定期分享技術乾貨,行業祕聞!彙集各類奇妙好玩的話題和流行動向!長按左側圖片,掃碼加入架構師微信群!

相關推薦

開源程式人生

春哥的程式設計之旅起於抄書,就算如今已是罕見的程式設計高手,春哥依然逢人大力推薦他的抄書學程式設

Python貓薦系統《Python最佳實踐指南》

在介紹今天的書目之前,我想先跟大家介紹一下這個薦書系列。本系列打算聚焦Python領域的書籍,初期選書的標準主要有兩條:一是要有中文版,二是要有免費開源的線上資源,原因很簡單,技術書籍由於其特殊性,線上閱讀的體驗是最佳的,不管是排版、獲取原始碼、摘錄筆記還是分享交流,

Python貓薦系列Python高效能程式設計

  稍微關心程式語言的使用趨勢的人都知道,最近幾年,國內最火的兩種語言非 Python 與 Go 莫屬,於是,隔三差五就會有人問:這兩種語言誰更厲害/好找工作/高工資…… 對於程式語言的爭論,就是猿界的生理週期,每個月都要鬧上一回。到了年末,各類榜單也是特別抓人眼球,鬧得更凶。 其實,它們各有

Java併發程式設計入門到精通 第四 執行緒安全的集合類

java.util.HashTable:-1 說明:Hashtable函式均為同步,是執行緒安全,key,value均不能為null。-2 基本方法:get(), put(), remove(), clear(), putAll(), contains(),containsK

效能Linux網路效能分析工具

編者按:InfoQ開設新欄目“品味書香”,精選技術書籍的精彩章節,以及分享看完書留下的思考和收穫,歡迎大家關注。本文節選自格雷格著《效能之巔:洞悉系統、企業與雲端計算》中第10.6節,介紹了其中Linux部分網路效能分析工具的使用方法。 本文介紹基於Linux作業系統的

Python貓薦系列Python入門書籍有哪些?

本文原創並首發於公眾號【Python貓】,未經授權,請勿轉載。 原文地址:https://mp.weixin.qq.com/s/

C++禿頭第一個C++程式

經典的程式,列印hello,world:   //C++的第一個程式,列印hello world #include <iostream> //標頭檔案 意思:stdio in out stream using namespace std; int main()

字串匹配拼寫錯誤檢查程式

DNA的匹配畢竟離生活還是遠了點,既然是字串匹配,可不可以做個拼寫錯誤檢查呢? 首先要引入一個概念,編輯距離(Edit Distance)。編輯距離指的是一個字串修改到另一個字串所需要的工序。通常有三種情況: 1.插入:"ac" -----> "abc",編輯距離為1

上海開始我的程式人生

9月的上海,天空湛藍。比起西安,這裡要涼快多了,經過1年多的學習,終於要開始我的程式生涯了。用了近2周的時間,把工作搞定。雖然才4k多,但公司環境不錯,氣氛輕鬆,web組剛成立。雖然比較混亂,但以後自己可學習的東西很多。後來又有一個公司給我6k,把我外包到惠普,但聽朋友說外包

nginx變數學習初步-讀的部落格做個筆記

nginx學習筆記 set – location /hi{ set $a "hi"; return 200 "hello"; } 這裡的set $a會建立一個變數,並賦值為hi,注意的是,nignx啟動時,變數已建立,但是

SDS趨勢開源軟件定義存儲

sds 開源存儲 大家都知道IT圈有個非常著名的曲線圖,就是Gartner的新興技術成熟度曲線(Hype Cycle),昨天看了一下Gartner 2016的存儲成熟曲線圖,今天給大家簡單聊聊,多多指教。:) 廢話不多說,直接上圖先簡單說說這個曲線圖,成熟曲線圖將每種技術的優點與Gartner所期望其

程序員修煉小工到專家

合作人 測試 AI 附錄 修煉之道 資源 color 例子 項目 下載地址:網盤下載 內容簡介 · · · · · ·《程序員修煉之道:從小工到專家》內容簡介:《程序員修煉之道》由一系列獨立的部分組成,涵蓋的主題從個人責任、職業發展,知道用於使代碼保持靈活、並且易於改

《逐夢旅程Windows遊戲編程零開始》學習筆記GDI框架

register 開發 操作 程序 turn use 繪制 cal 完整 1 //===========================================【程序說明】=================================== 2 //

《Python編程入門到實踐》第10 筆記

import 我沒 r+ 數據結構 中新 1.5 err 因此 重構 備註:以下按照Python 2的規則編寫代碼。 在jupyter notebook中運行直接顯示結果。 10 文件和異常 10.1 文件中讀取數據 10.1.1 讀取整個文件 """file_reade

無盡手機到萬物

手機AI在上個世界60年代,麥克盧漢曾經提出過一個概念,即“媒介是人的延伸”。這裏的媒介指的不是媒體,而是是廣義的媒介,例如火車是人雙腿的延伸,電話是人耳朵和嘴的延伸。科技的發展改變了時間與空間的關系,因而也改變了人的感知能力。這一點在移動時代體現的更加淋漓盡致,通過社交媒體和通訊軟件,我們可以毫無延遲的感知

(轉)Django學習 第三動態Web頁面基礎

只有一個 即使 typeerror 方法 對象傳遞 power int() 擔心 意圖 上一章我們解釋了怎樣開始一個Django項目和運行Django服務器 當然了,這個站點實際上什麽也沒有做------除了顯示了"It worked"這條信息以外。 這一章我們介紹怎樣使用

React入門到放棄前奏(1)webpack4簡介

product uglifyjs 創建 serve process str output lec 需要 接觸webpack是好久之前的事情了,最近看了下webpack沒想到都到4了。 webpack 是一個現代 JavaScript 應用程序的靜態模塊打包器(module

《浪潮》十八十九筆記

這一 普通 轉化 如果 購物 領導 規律 摩托羅拉 基因 前文中,作者一直在說公司的基因,他認為每個公司的發展趨勢都遵循著某個固有的規律,這個規律就是公司的基因。而有些公司,打破桎梏,用創新開拓市場,最終獲得成功。諾基亞公司原本是一家經營木質品的公司,它在擴張的道路上因為鋪

《浪潮》第二十一筆記

衍生 prim 發生 影響 公司 什麽 危機 能力 消費 前面幾章早已講到了科技公司與金融力量之間的關系,而當這個金融力量發生動亂的時候,這些科技公司又會發生什麽?科技像是我們這個社會的大腦,而金融則是血液。發生金融危機時,就像人的血液出了問題,自然會對與之關系密切的科技公

Aways on故障系列數據庫中有一臺無法同步

系列 意思 ip地址 pin 啟動服務 阿裏雲服務 無法連接 聯通 狀態 服務器用的阿裏雲服務器,自己做的非域Aways On主從同步。 故障描述:某臺從數據庫無法同步主數據庫的數據,查看Aways On的服務器狀態,該服務器已離線。 故障排查:     1.檢查同步面板,