許式偉:畢業 2 年成為首席架構師,我的技術學習方法論 | 極客時間
你好,我是許式偉。
今天想和大家聊聊架構,和架構以外的二三事。
在過去的工作經歷裡,我看到不少架構師都傾向於把架構看作一項純技術性的行為。他們的工作流程是這樣的:產品經理根據使用者的需求做出產品設計,架構師再依據產品設計給出實現,也就是軟體的架構設計方案。
在我看來,這恐怕是個誤解。我們做架構,空有一身技術是遠遠不夠的,知識的深度和廣度,往往會對架構能力起著決定性的作用。而這些知識,從你踏入 IT 行業那一刻起,甚至更早就應該開始儲備了。
關於如何學技術,怎樣儲備知識,我想聊聊我的個人經歷,希望給你一些別樣的啟發。
一、學技術不能過於專精,需要橫向理解,向廣度挖掘。
大學時,我接觸到《理論物理》這門課,發現拉普拉斯方程式可以解高中的所有物理問題,《現代數學》中的分形幾何也讓我頗為著迷,不僅將圖書館裡所有關於分形和混沌的書都看了個遍,還專門寫了程式,將接觸過的分形模型都用計算機模擬了一遍。
這兩門課讓我看到了許多事物之間的內在聯絡,並開始思考和探究背後的原因。
這種思維方式對我後來的工作有很大影響,舉個例子,很多人認為,儲存不就是把東西存到磁碟裡嗎,跟數學有什麼關係呢?但我發現往高深去做,儲存系統和數學有非常緊密的關聯。
通常的儲存服務要保證資料不丟,必須存多份,這樣會增加儲存成本,經典的 3 副本儲存,冗餘度是 3。想用更低的成本儲存,就要用到域代數。域代數遵循自然代數的加減乘除規律,但資料值控制在有限區域,不管怎麼算,結果都在 0 到 255 這個域裡面,所以稱作域代數。
儲存檔案可以認為是 0 到 255 的一個序列,舉個例子,一個 100K 的檔案拆成 10 份,每份是 10K,存在 10 個地方,但檔案仍然是一份。這時用域代數裡的加法(其實就是計算機中的異或操作),從這 10 份資料裡取出一份校驗資料,資料變成了 11 份,它的冗餘度是 1.1。
這是一種基於校驗碼的儲存方式,成本比較低,但效果和雙副本差不多,其中任何一個資料丟了,都能恢復回去。利用域代數降低成本,是儲存領域發展的必然方向,七牛的[儲存2.0][3]就已經採用了這種方式。
所以,任何一個方向的技術要做到頂峰,都必須橫向地去理解,因為世界上一切事物都彼此關聯。學技術是不能過於專精的,在專精的過程中遇到瓶頸,就要往廣度方向去挖掘。
二、任何一件事情,想做到極致,就要當成學科去研究。
2000 年我加入金山,當時分配給我的任務是軟體的讀盤和存檔模組。這個模組當時的重要性並不高,看著也比較簡單,但我發現了不少有意思的挑戰,其中之一,是要求你理解軟體的所有功能,以及每個功能的資料表達方式。
這讓我無意中觸及到軟體系統最核心的東西——資料。順著這條線索,我研究了微軟 Office 各個功能模組的資料儲存方式,並把一些有趣的實現方法分享給同事,他們吸收了其中有益的部分,並據此修改了原有的軟體設計。
一年後金山開始研發 WPS 2002,新版本被稱作“格式相容之戰”,為了實現對微軟 Office 檔案格式的相容,I/O 成了戰略層面的技術,存檔功能從邊緣模組,一下變成了整個 WPS 研發的核心模組。
於是,在 2002 年底,我作為首席架構師,開始領導 WPS 的整體架構設計,用了 3 年的時間做出了 WPS Office 2005,完全重新架構開發,做三大相容:檔案格式相容、二次開發介面相容、使用者操作習慣相容,產品定位:先立後破,做 Office 的替代品。
我們在軟體架構層面做出創新,引入一個資料層,抽象出所有資料的儲存過程,改變了此前只能通過對命令的反操作來實現的傳統“撤銷/重做”功能,讓所有資料可天然回滾,輕鬆支援多版本存檔、Undo/Redo(撤銷/重做),以及各種非同步操作。
這個創新並不是對微軟的簡單模仿,其靈感來源於對增量存檔的思考。Office 有個“快速存檔”概念,使用者正在編輯的內容,如果已經存過了一次盤,修改過後再次存檔,只需在原基礎上補加資料。
相當於對同一個檔案,存了兩個版本的資料。於是我想,既然可以做快速存檔,就不必關心使用者到底做了幾個操作,要實現撤銷和重做功能,只需要基於資料狀態做前進和回退即可。
資料層的架構大大降低了研發的複雜度,在當時的金山起到了非常重要的作用。乍看上去,我像是運氣很好,做的東西從邊緣模組變成了核心模組。但我相信之前很多人都接觸過存檔,但有多少人深入思考過其中的原理呢?
我始終認為,任何一件事情,想要做到極致,就必須把它當成一個學科來研究,把它琢磨透。假設這個東西很好玩,你要去思考,如果把它做到極致,最終應該是什麼樣子。如果僅僅當成一個簡單的任務完成,能取得的成果會很有限。
三、光有技術遠遠不夠,必須理解業務及其運作方式,思考產品和商業的關係。
2006 年是我職業發展的分界點,WPS 雖然累計了不少使用者,但並沒有取得商業上的成功。如果產品無法讓使用者買單,從某種意義上說,你的價值並沒有被認證。
彼時,國內盜版軟體盛行,金山開始探索辦公軟體的網際網路化。辦公軟體不同於遊戲,遊戲能成功轉身,很重要的原因在於每個遊戲都有其生命週期,但辦公軟體是工具,必須沿襲使用者的習慣,網際網路化相對難很多。
如果僅僅把辦公軟體在 Web 上做一套,能夠為使用者提供什麼新的價值呢?辦公網際網路化,最終必須顛覆原有形態,而不是做一個 Web 上的 WPS,但在當時,我們實在找不到更好的方式。
於是突然我意識到,光有技術遠遠不夠,必須理解業務及其運作方式,思考產品和商業的關係。為了拓寬眼界,我一方面廣泛參加行業裡的會議、沙龍,找不同朋友聊產品方向;另一方面,我做了一個技術社群 ECUG,探討 Server 端相關技術演進。
這期間,我逐漸跳出辦公,橫向接觸其它領域。在研究搜尋引擎時,我發現分散式儲存的技術門檻相對較高,並且可以發展出獨立的商業模式。當時移動網際網路正處於萌芽期,雷軍已經開始投資這個領域的初創公司。
所以,我預想一旦手機開始流行,鍵盤就不會再是人與人互動的主要形式,圖片、語音、視訊等富媒體會成為潮流,這將導致未來儲存的需求出現爆發式增長。
雖然確定了新的方向,但如果想以此創業,我感覺自己還是太技術化了一點,欠缺的東西很多,於是我從零開始組建團隊,建立了金山實驗室,自由探索新產品,重點放在分散式儲存研發,並承接了金山一些內部專案,好讓自己的儲存產品落地。
四、選擇和資訊的對稱程度有關,當你對某個領域瞭解得足夠透徹,決策過程會非常自然。
在我剛剛成立七牛時,最初的產品方向是網盤,9 月中旬產品釋出,10 月我就決定轉向底層儲存,期間只花了一個月時間思考。這個決定做得很艱難,但從公司的核心競爭力考慮,必須做調整。
原因有 2 點:其一是當時國內雲端計算環境還不夠好,七牛如果做網盤,很難找到一個第三方儲存供應商,同時做底層儲存和網盤應用,精力上會比較分散;其二,團隊的基因偏極客,對終端使用者瞭解不夠深入,而程式設計師是我們最熟悉的群體,所以,權衡之下,我選擇了雲端儲存這條路。
同時,七牛也是國內第一家選擇 Go 語言做服務端主體語言的公司,儘管當時 Go 的語法特性還未完全穩定,這個決定看上去有點激進和冒險,但實際上是經過我嚴格論證的,並非隨意為之。
我一直認為:選擇和資訊的對稱程度有關。你越不瞭解一個東西,越會趨向選擇保守性的方案,而當你對某個領域瞭解得足夠透徹,你的決策過程會非常自然。
在做決策時,我的方法論是:
- 先試圖瞭解整個背景,看別人一般會怎麼做
- 有哪些新興的 idea,這些 idea 是否靠譜
- 如果我來做,會傾向於往哪個方向走
當你深入研究了新技術的思考方式,以及它要解決的問題,就會知道它和自己要解決的問題有多大的相關性,這要求你具備嚴謹的思維方式。或許在很多人眼裡,嚴謹是古板的,會扼殺創新。
但在我看來,嚴謹不是創新的對立面,而是創新的基礎。奇思妙想再好,如果不經過嚴謹的推理過程,就無法變成行動力。用這樣的方式去分析,可能會出現一些比較大膽的選擇,但並不是隨意為之。
做架構也是一樣,需要做嚴謹的設計推演。這就要求我們建立完整的架構知識體系,看書學習當然是一個非常好的方式。但我發現,當我想推薦一本經典的架構書時,並不能快速想到推薦哪本。細數我接觸過的那些與架構相關的圖書,大概有以下幾類:
- 架構思維類。通常從一些著名的架構理論講起,比如開閉原則、單一職責原則等等。其弊端在於過度理論化,而電腦科學歸根到底屬於工程技術類,應該實踐第一。
- 設計模式類。這類一般上來就進入架構的區域性細節,每個模式的來龍去脈並不容易理解。就算理解了某個具體的模式,也很難真正做到活學活用。
- 分散式系統架構設計類。通常從服務端的通用問題如一致性、高可用、高併發挑戰等話題講起,闡述大型業務系統面臨的挑戰。這些知識雖然非常有價值,但無法延伸至通用業務架構,對大部分企業的架構實踐不具備真正的指導意義。
- 重構類。主要講如何如何改進程式碼,其實是最實用的一類。但在我看來,一個模組最初的地基是最重要的,基本決定了這座大廈能夠撐多久,而重構更多側重於大廈建成之後,在服務於人的前提下怎麼去修修補補,延長生命。
這些架構類的圖書並沒有達到我個人的期望,在我看來,它們都沒有揭開架構設計的全貌。所以一直以來,我就心存這樣一個念頭:“寫一本不一樣的架構書”。這個念想,正是《許式偉的架構課》這個專欄的由來,它和你現在能看得到的大部分架構書都不太一樣。
在專欄中,我會通過理解軟體架構的巨集觀視角,從零開始構建出整個資訊世界,在這個過程中,闡述了架構思維正規化,以及這些正規化在日常工程實踐中應用。
在內容設計上,我希望這是一個門檻最低的架構設計專欄,不僅幫助到想成為架構師的初學者,還可以讓已經成為架構師的技術人規避一些錯誤的經驗。在行文上,我會盡量避免深奧的術語,以通俗易懂的文字描述資訊世界構建者們的所思所想。
關於「我」
我是許式偉,七牛雲 CEO,ECUG 社群發起人,一個開源愛好者。曾就職於金山、盛大,在搜尋和分散式儲存相關技術領域有十幾年的研發經驗。
在金山,以首席架構師的身份主導了 WPS Office 2005 的架構設計和開發。在創立金山實驗室後,作為技術總監主導分散式儲存開發。後加入盛大創新院,推出了“盛大網盤”和“盛大雲”。2011 年,我成為一名創業者,建立了七牛,專注企業級儲存服務。
在我目前的職業生涯中,前後大概做過十幾次的架構類的演講,但這些零星的演講,對於傳遞架構設計思維來說,遠遠不夠。
這個專欄,是我第一次完整、系統地分享自己的架構經驗和思考,我會將近 20 年的經驗毫無保留地分享給你,相信你一定能夠學有所得。
註釋:本文部分內容首發於由獨立媒體人 Gracia 創立和維護的技術人攻略訪談。
《許式偉的架構課》
專欄上線僅 1 周,已有超過 12,000 人加入學習,戳此試讀或訂閱。
20 年經驗沉澱,好評如潮,評價可以參考:
一頓飯錢,就能看到老許 20 年的經驗總結,獲得與頂尖架構師更近一步的機會,幾年後的你,會感謝自己今天的投資。
戳此訂閱,跟著老許學架構。
更多專欄詳情,可以檢視《七牛雲 CEO 許式偉:首次完整架構經驗分享》。
相關文章
- 許式偉的架構課-許式偉-極客時間架構
- 讀《許式偉的架構課》有感架構
- 從0開始學架構-李運華-極客時間架構
- 技術與商業案例解讀-徐飛-極客時間
- 前豆瓣首席架構師:如何保持團隊的技術氛圍?架構
- AI技術內參-洪亮劼-極客時間AI
- 李道兵:輟學的首席架構師架構
- 朱贇的技術管理課-朱贇-極客時間
- 企業架構師、解決方案架構師和技術架構師的異同 - Briqi架構
- 微服務架構核心20講-楊波-極客時間微服務架構
- 我的“技術架構”之旅架構
- Python核心技術與實戰-景霄-極客時間Python
- Kafka核心技術與實戰-胡夕-極客時間Kafka
- 微服務架構實戰160講-楊波-極客時間微服務架構
- 我的學習方法論
- 我的極客時間專欄結課了!!!
- 技術管理實戰36講-劉建國-極客時間
- 大前端時代,我為什麼支援前端程式設計師學習原生技術?前端程式設計師
- Nginx學習筆記3--(極客時間-陶輝)Nginx筆記
- 機器學習40講-王天一-極客時間機器學習
- 程式設計師的數學基礎課-黃申-極客時間程式設計師
- 系統架構設計師學習(二)系統架構設計師緒論架構
- 在阿里架構師眼中構建一個較為通用的業務技術架構就是如此簡單阿里架構
- Adaptive AUTOSAR 學習筆記 8 - 乾貨小結:背景、技術、特徵、架構、方法論和 ManifestAPT筆記特徵架構
- 技術領導力300講-TGO鯤鵬會-極客時間Go
- Java核心面試技術36講-楊曉峰-極客時間Java面試
- 怎樣學習一個新的架構技術架構
- 技術最好的程式設計師,為什麼當不了首席?程式設計師
- Spring Cloud微服務分散式雲架構 - 整合企業架構的技術點SpringCloud微服務分散式架構
- 布客技術評論 241012:致我們艹蛋的社群合夥時光
- 阿里架構師耗時一個月整理的《java架構師學習路線》太全了阿里架構Java
- 重學前端-程劭非-極客時間前端
- 轉轉首席架構師 孫玄:如何成為一個有情懷的工程師?架構工程師
- 華為雲服務認證首席架構師邀你免費學習課程,參加限時活動領音響!架構
- (二)spring cloud微服務分散式雲架構 - 整合企業架構的技術點SpringCloud微服務分散式架構
- (二)spring cloud微服務分散式雲架構-整合企業架構的技術點SpringCloud微服務分散式架構
- Swift核心技術與實戰-張傑-極客時間-返現24元Swift
- Java架構師如何學習?Java架構