《程序員進階攻略》學習筆記(中)

修行:由術入道

計劃

理解計劃

咱們爲何要計劃?要回答這個問題,你得先理解自身的需求,還有本身的生涯發展,最後是一我的生終極問題,你若是想本身不留遺憾,計劃是很是重要的。html

需求模型

制定計劃以前,先了解馬斯洛的需求模型。程序員

該理論認爲個體成長髮展的內在力量是動機,而動機是由多種不一樣性質的須要所組成,各類須要之間,有前後順序與高低層次之分,每一層次的須要與知足,將決定個體人格發展的境界或程度。 其層次模型的經典金字塔圖示以下:算法



馬斯洛把底層的四類需求:生存、安全、歸屬、尊重歸類爲 「缺失性」 需求,它們的知足須要從外部環境去得到。數據庫

而最頂層的「自我實現」 則屬於 「成長性」 需求。成長就是自我實現的過程,成長的動機也來自於 「自我實現」 的吸引。就像不少植物具備天生的向陽性,而對於人,我感受也有天生的 「自我實現」 趨向性。編程

人生最激盪人心的時刻,就在於自我實現的創造性過程當中,產生出的一種 「高峯體驗」 感。正由於人所固有的需求層次模型,咱們纔有了願望,願望產生目標,目標則引起計劃。後端

生涯發展

著名生涯規劃師古典有一篇文章《你的生命有什麼可能?》對生涯提出了四個維度:高度、寬度、深度和溫度。這裏就借他山之玉,來談談個人理解。緩存

  1. 高度:背後的價值觀是影響與權力。表明性關鍵詞有:追逐競爭、改變世界。
  2. 深度:背後的價值觀是卓越與智慧。表明性關鍵詞有:專業主義、工匠精神。
  3. 寬度:背後的價值觀是博愛與和諧。表明性關鍵詞有:多種角色、豐富平衡。
  4. 溫度:背後的價值觀是自由與快樂。表明性關鍵詞有:自我認同、精彩程度。

每一個人的人生髮展路線都會有這四個維度,只是不一樣人的偏好、願望和階段不一樣致使了在四個維度分佈重心的差別。在不一樣維度的選擇,都表明了不同的 「生涯」,每一種 「生涯」 都須要必定程度的計劃與努力。安全

雖有四種維度,四個方向,但不表明只能選其一。雖然咱們不太可能同時去追求這四個維度,但能夠在特定的人生不一樣階段,在其中一個維度上,給本身一個去嘗試和探索的週期。網絡

因此,這就有了選擇,有了計劃。而計劃會有開始,也會有結束,咱們須要計劃在人生的不一樣階段,重點開始哪一個維度的追求,以及大概須要持續的週期。數據結構

回首無悔

有研究說:「咱們最後悔的是沒作什麼,而不是作過什麼。」

計劃,就是作選擇,你在爲將來的你作出選擇,你在選擇將來變成 「誰」。若是你還在爲今天的本身然後悔,那就該爲明天的本身作出計劃了。

人生的征程中,先是恐懼驅動,地獄震顫了你,想要逃離黑暗深淵;後來纔是願望驅動,星空吸引了你,想要征服星辰大海。

逃離與征服的路,是一條計劃的路,也是一條更困難的路,而 「你心裏確定有着某種火焰,能把你和其餘人區別開來」 才讓你選擇了它。

制定計劃

目標

富有成效的計劃的第一步,即是肯定目標。

在設定目標這個領域,國外一位研究者馬克·墨菲(Mark Murphy)曾提出過一種 HARD 方法。HARD 是 4 個英文詞的首字母縮寫:

  1. Heartfelt 衷心的,源自心裏的
  2. Animated 活生生,有畫面感的
  3. Required 必須的,需求明確的
  4. Difficult 困難的,有難度的

如其解釋,這是一種強調心裏願望驅動的方法。按這個標準,一種源自心裏的強烈需求在你頭腦中造成很具體的畫面感,其難度和挑戰會讓你感到既顫慄又激動,那麼這也許就是一個好目標。

應用到我的身上,HARD 目標中的 H 體現了你的興趣、偏好與心靈深處的內核。就拿寫做這個事情來講吧,於我而言,興趣只是驅動它的一種燃料,而另外一種燃料是心裏深處的表達慾望。寫做自己不是目標,經過寫做去完成一部做品纔是目標,就像經過寫代碼去實現一個系統,它們都是做品,其驅動內核就是一種 「創造者之心」。

而 A 是你對這個目標造成的願景是否足夠清晰,在頭腦中是否直接就能視覺化、具象化。就拿我我的來講,我很是喜歡讀書,常在夜深人靜的時候,默默潛讀,掩卷而思,和做者產生一種無聲的交流。這樣一種畫面,慢慢烙在腦海中,漸漸就激發起了想要擁有一部做品的目標。

R 則是由上一篇文章中的馬斯洛需求模型層次決定的。寫做一方面本是自帶屬於第三層次的社交屬性,但另外一方面更可能是一種成長性的自我實現需求在激發。完成一部做品,須要明確一個主題,持續地寫做,一開始我從每個月寫,到每週寫,再到寫這個專欄,做品也就漸漸成型。

而最後的 D 是其難度,決定了目標的挑戰門檻。太容易的目標不值得設定,太難或離你現實太遠的目標也不合適。基於現實的邊界,選擇溫馨圈外的一兩步,可能就是合適的目標。於我,從寫代碼到寫做,其實也真就只有那麼一兩步的距離。

假如,你以爲現狀很差,沒法基於現狀延伸出目標。那麼也許能夠試試這樣想:假如我不作如今的事情,那麼你最想作的是什麼?一般你當前最想作的可能並不能解決你的謀生問題,那麼在這二者之間的鴻溝,如何去搭建一條橋樑,可能就是一個值得考慮的目標。

咱們爲何要立 HARD 目標?有一句話是這麼說的:

Easy choices, hard life. Hard choices, easy life. 容易的選擇,艱難的生活;艱難的選擇,輕鬆的生活。

方法

目標是願望層面的,計劃是執行層面的,而計劃的方式也有不一樣的認識維度。

1、時間維度

從時間維度,能夠擬定 「短、中、長」 三階段的計劃:

  1. 短時間:擬定一年內的幾個主要事項、行動週期和檢查標準。
  2. 中期:近 2~3 年內的規劃,對一年內不足以取得最終成果的事項,能夠分紅每一年的階段性結果。
  3. 長期:個人長期通常也就在 5~7 年週期,屬於個人 「一生」 的概念範圍了,而 「一生」 當有一個願景。

短時間一年能夠完成幾件事或任務,中期兩三年能夠掌握精熟一門技能,長期的 「一生」 達成一個願景,實現一個成長的里程碑。

2、路徑維度

從路徑維度,訂計劃能夠用一種 SMART 方法,該方法是百年老店通用電氣創造的。在 20 世紀 40 年代的時候,通用電氣就要求每個員工把本身的年度目標、實現方法及標準寫信告訴本身的上級。上級也會根據這個年度目標來考覈員工。這種方法進化到了 20 世紀 80 年代,就成了著名的SMART原則。

SMART 也是 5 個英文詞的首字母縮寫:

  1. Specific 具體的
  2. Measurable 可衡量的
  3. Achievable 可實現的
  4. Relevant 相關的
  5. Time-bound 有時限的

今天 SMART 已經很是流行和常見,我就不解釋其具體含義了,而是講講我如何經過 SMART 來跟蹤我的年度計劃執行的。按 SMART 方式定義的計劃執行起來都是能夠量化跟蹤的,我一般用以下格式的一張表來跟蹤:



其實,一年值得放進這張表的就那麼幾件事,每件事又能夠分解爲具體的幾個可量化的任務,再分解到一年 50 周,就能夠很明顯地看出理想計劃和現實路徑的曲線對比。以下,是我 2017 年的一張計劃與實際執行的對比曲線圖:



按 SMART 原則方法使用計劃跟蹤表的優勢是:簡單、直接、清晰。但缺點也明顯:即便百分百完成了全部的計劃,也都是預期內的,會缺少一些驚喜感。而由於制定目標和計劃會有意識地選擇有必定難度的來挑戰,因此實際還很難達成百分百。

說到目標的難度與挑戰,使用 SMART 方法最值得注意的點就是關於目標的設定和方法的選擇。鑑於人性和現實的因素,制定計劃時極可能是這樣一種狀況:基於現實掌握的方法,考慮計劃的可達性。這樣制定出來的計劃看起來靠譜,但卻失去了真正挑戰與創新的可能。

有時你可能會以爲計劃沒有變化快,或者計劃好的人生,過起來好機械,沒勁。其實計劃是準備,變化纔是永恆,而計劃就是爲了應對變化。爲此,我常常會把計劃表按優先級排得滿滿的,但我永遠只作那些計劃表頂部最讓本身感到 HARD 的事情。

變化來了,就把它裝進計劃表中,看這樣的變化會排在哪一個位置,和以前計劃表前列的事情相比又如何。若是變化的事總能排在頂上,那麼說明你的人生實際就在不斷變得更精彩,作的事情也會讓你更激動。而若是變化總是那些並不重要卻還老是緊急的事情,老打斷當下的計劃,那麼也許你就要從新審視下你當前的環境和自身的問題了。

這樣,計劃表就成了變化表,人生沒法機械執行,只有準備應對。

最後,找到屬於你的 HARD 目標,開始有計劃且 SMART 的每一天;這樣的每一天,走的每一步也許會更重些、累些,但留下的腳印卻很深、很長。

檢視計劃

時間與週期

一年咱們可支配的時間,大約2400 小時。能用來計劃的時間並很少,須要仔細挑選合理的事項,放進計劃表,並真正地執行。而實際,一年中你還須要把時間合理地分配在 「短、中、長」 三種不一樣週期的計劃上。

  1. 短時間:完成事項,獲取結果,獲得即時反饋與成就感(好比:寫這個專欄)。
  2. 中期:學習技能,實踐經驗,積累能力(好比:學一門語言)。
  3. 長期:創建信念,達成願景(好比:成長爲一名架構師)。

你能夠從時間的維度,看看你計劃的時間安排是否合理分配在了不一樣週期的計劃事項上。若是計劃的事項和週期匹配錯了,計劃的執行就容易產生挫敗感從而致使半途而廢。

要讓計劃可行,就是選擇合適的事項,匹配正確的週期,創建合理的預期,獲得不斷進步的反饋。

興趣與承諾

既然時間有限,那該如何選擇有限的事項,纔可能更有效地被執行下去呢?

其中有一個很重要的因素:興趣。

有的人興趣可能普遍些,有的人興趣可能少一些,但每一個人多多少少都會有些我的的興趣愛好。對於興趣普遍的人來講,這就有個選擇取捨問題,若不取捨,都由着興趣來驅動,計劃個十幾、二十件事,每樣都淺嘗輒止。實際從理性上來講價值不大,從感性上來講只能算是豐富了我的生活吧。

我建議你能夠從興趣做爲出發點,由於這樣更容易啓動;而對於中期目標,像學習提高一項技能,只靠興趣是不足以驅動去有效執行的,甚至達不到預期效果。關於此,吳軍有一個觀點:

凡事從 0 分作到 50 分,靠的是直覺和經驗;從 50 分到 90 分,就要靠技藝了。

憑藉興趣驅動的嘗試,結合直覺和經驗就能達成 50 分的效果,而要到 90 分就須要靠技藝了。而技藝的習得是靠刻意練習的,而刻意練習一般來講都不太有趣。要堅持長期的刻意練習,惟一可靠的辦法就是對其作出鄭重的承諾。

經過興趣來啓動,但要靠承諾纔能有效地執行下去。感興趣和作承諾的差異在於,只是感興趣的事,到了執行的時候,總能夠給本身找出各類各樣的緣由、藉口或外部因素的影響去延期執行;而承諾就是這件事是天天的最高優先級,除非不可抗力的因素,都應該優先執行。

興趣讓計劃更容易啓動,而承諾讓計劃得以完成。

而在現實生活中,讓計劃不可行或半途而廢的常見錯誤有:

  1. 覺得一年以內本身有足夠多的自由支配時間;
  2. 對計劃的事情誤判了其開發與成長的週期;
  3. 興趣不少,一直在嘗試,卻不見有結果。

放進計劃表的事項是你精心識別、選擇並作出的承諾,而承諾也是一種負擔,若承諾太多,負擔可能就過重,會讓你感受本身不堪重負,最後就可能放棄了,到頭來又是一場空。其實,一年下來,重要的不是開啓了多少計劃,而是完成了幾個計劃。

因此,可行的計劃應該是:有限的時間,適合的週期,興趣的選擇,鄭重的承諾。

評估計劃

成本與機會

從經濟學思惟的角度,作計劃就是作選擇;而選擇了這些事情,就意味着放棄了另外可能作的事情,這裏面的成本就是機會成本。機會成本是放棄的代價,選擇這些事情從而放棄的其餘可能選項中擁有最高價值的事情。

就好像一樣一個晚上,有人選擇了用來玩網絡遊戲,你覺得的成本是幾小時的點卡錢,但實際你放棄的是用來學習、看書等其餘事項的潛在價值與收益。

學習計劃是我的成長計劃中的一部分,而成長計劃中,最大的成本依然是時間。在你早期的學習階段,雖然時間沒那麼值錢,但把錢和時間都花在加速成長上,實際上是「成本有限,潛在收益巨大」的選擇。

因此,時間在不一樣的階段,價值不一樣,那麼成本也就不一樣。你要敏感地去感知本身時間的成本,去提高時間的價值,根據時間的價值再去調整本身的計劃和行動。成長過程當中,早期的成本低而選項多,後期的成本高且選項少。

結果與收益

計劃獲得了執行,產生了預期的結果,纔會有指望的收益。

計劃趕不上變化。但其實,變化以後的計劃,只是一份更契合實際的計劃,而非再也不存在。不少外部因素是你沒法預測和控制的,總會來干擾你的計劃,因此這給了你足夠的客觀緣由。但不管有多少客觀緣由,你作計劃的初衷是:一點點嘗試去控制本身的生活,而後獲得本身想要的結果。

在得到結果的路上,這個世界上彷佛有兩類人:

  1. 第一類人,本身給本身施加約束,保持自律並創建指望;
  2. 第二類人,須要外部環境給予其約束和指望。

在我讀高中時,現實中就有一種巨大的社會指望和約束施加己身,那就是高考。在這種巨大的社會外部約束和指望下,第二類人能夠表現得很是好,好到能夠考出狀元的分數。但進入大學後,這樣的外部約束和指望會瞬間降低,最後可能也就泯然衆人之間了。

通俗點說就是,若是有人(能夠是別人或本身)對你的指望很高,你會不自覺地行動去知足並符合這種指望;若周圍沒有這樣的指望,最終你可能就是一個符合周圍人羣平均指望的人。而所謂的自驅力,就是你對本身的指望所造成的推進力量。

要得到好的結果,你就要作第一類人,須要對本身有更高的指望,須要有自驅力。

有時候學習,賺取的不是直接的經濟收益,而是間接的結構性收益,加強直接收益結構價值。

那麼如何理解收益結構?以我現階段的狀態來講,已有三個直接收益結構:

  1. 專業
  2. 寫做
  3. 理財

專業,天然是指程序專業技能,經過出售本身的時間和人力資源來獲取一份相對穩定的工資收入來源。寫做,到今天這個專欄出品後,終於能夠經過做品的形式產生直接收益,它只需一次性投入時間來完成做品。而理財屬於資產性收益,就是任何等價於錢的家庭動產或不動產,能產生利息、分成或租金的收入,它須要長期的收入結餘積累。

而英語技能的提高對這三個直接收益結構,都能產生增益做用。程序行業自沒必要多說,行業裏最好的文章、書籍或專業論文材料等可能都是英文的,只有少部分被翻譯了過來,但翻譯老是有損失、有誤差、有歧義,能直接高效地閱讀英語對提高你的專業技能和能力幫助巨大。

而寫做,英語給我提供了另一個更廣闊世界的寫做素材和看待世界的角度。因此,我在時間分配上不只看中文文章,也看一些英文媒體文章和書籍。

至於理財,英語讓我更直接高效地接收中文世界之外的信息,從某種角度來講,具有了更多元化的視角和思惟結構。而思惟和視角是投資理財的核心能力,在這個領域全是選擇題,只有作對選擇的機率高於作錯的機率,纔可能得到正收益。

這就是我選擇一項長期計劃時關於結果與收益的思考,而成長計劃的收益,從經濟價值來講,都是遠期收益,是爲了變得更值錢。也許指望的結果達成,目標實現,真的會變得更值錢。

在考慮付出與收穫時,後來讀到一句話,大意以下:

生活也許不會像計劃那樣發生,但對待生活的態度能夠是:期待偉大的事情發生,同時也要保持快樂和幸福,即便它沒能發生。

如此,面對真實的生活,也當釋然了。

計劃的障礙

計劃執行的各個階段,都存在障礙。

計劃的醞釀期,最大的障礙來自心裏:理性與感性的衝突。計劃的目標是源自心裏的,但也是有難度的,如果垂手可得的事情,也就不用計劃了。這些須要堅持的事情,一般都 「很差玩」,而人是有惰性的,心裏裏其實並不肯意去作,這是咱們感性的部分。但理性告訴咱們,去完成這些計劃,對本身是有長遠好處的。這,就是衝突的地方。

計劃的啓動期,是計劃從靜止到運動的早期階段;這階段的最大障礙是所謂的「最大靜摩擦力」。因此纔有一句俗語叫:「萬事開頭難」。

計劃的執行期,是計劃實現過程當中最漫長的階段;這階段的最大障礙就是容易睏倦與乏味。漫長的人生,你須要爲本身講好一個故事。萬維鋼的一篇文章《堅持堅持再堅持》裏也提到:故事的價值不在於真實準確,而在於提供人生的意義。

計劃執行時你還會遇到挫敗,遭遇挫敗,你會進入一種心情與情緒的低谷,這個時候有很高的機率作出放棄的決策。而個人經驗是,不要在挫敗的情緒低谷期進行任何的選擇與決策。能夠暫時放下這件事,等待情緒迴歸到正常,再從新理性地評估計劃仍是否該堅持。每經歷一次挫敗以後,你還選擇堅持,那麼就已經收穫了成長。

計劃的節奏

計劃半途而廢,很大多是出在節奏上。

一個計劃被制定出來後,咱們一般會根據它的週期設定一個執行的節奏。

一個長期的目標能夠是五年,也能夠是十年,因目標而異。要精熟一門技能領域,好比編程,確切地說應該是編程中的某一分支領域,對於通常人來講,可能就須要三五年不等了。而像精通一門外語,可能須要的時間更長。

一箇中期的目標,也許是一年。好比,計劃用一年時間寫一本書,假如一本書 20 萬字,那每週大約須要完成 4000 字,再細化到天天就是800 字左右。這就是咱們作一年計劃的方式,計劃成型後,相應作出分解,分解到周這個級別後,基本的計劃節奏就出來了。

一個短時間的目標,多是幾個月。好比,我這個 「極客時間」 專欄,計劃就是幾個月內完成的事情。它上面已經造成了每週三篇更新的節奏,這樣的寫做節奏對於我來講基本已經算是全力衝刺了,因此時間就不能拉得太長。

計劃的節奏,就像中學物理課上假設的理想的無摩擦力環境,而現實中,摩擦力則老是難以免的,因此你要學會慢慢習慣並適應這真實而有點「意外」的節奏。

他人的節奏

跑馬拉松的時候,一大羣人一塊兒出發,最後到達終點時倒是稀稀拉拉。這說明每一個人的節奏是不一樣的,即使同一人在不一樣階段的節奏也是不同。

執行長期計劃,就如同跑馬拉松,原本是一羣人一塊兒出發,慢慢地你們拉開了距離,再以後你甚至先後都看不到人了。是的,正如《那些勻速奔跑的人你永遠都追不上》那篇文章所說:

勻速奔跑的人是那些能夠耐住寂寞的人,試想當你按照本身的節奏鍥而不捨默默努力地去作一件事情時,是極少會有夥伴同行的,由於你們的節奏各不同,即使偶爾會有也只是陪你走過一段。

有時太急迫地「追趕」,最後反而阻擋了你穩步前進的步伐和節奏。

本身的節奏

找到並控制好本身的節奏,才能長期勻速地奔跑,才能更高效地利用好本身的時間和注意力。

對於每日計劃的執行節奏,我本身的經驗是:把本身的時間安排成一段一段的,高度集中和高度分心交叉分佈。

假如某段時間須要高度集中注意力,就能夠處理或思考一些比較難的事情。好比,50 ~ 60 分鐘,集中注意力處理工做事務,遠離手機信息推送及其餘各類環境的打擾;而後休息一下子,10 ~ 15 分鐘左右,回覆一些聊天或郵件這類其實不須要那麼高注意力的事情。

有時,當你想去處理一件複雜困難的事情,好比寫做,這是一種短期內須要高度集中注意力的活動,但這時腦中老是在同時想着其餘不少事情或者被動地接收一些環境信息(周圍的談話聲之類的),還控制不住,很難集中注意力。這種狀況下,就不用勉強開始,我一般會經過切換環境,從外部去排除一些干擾。

另外,若是感受是比較疲憊,則更不能立刻開始了,這種狀態下,通常我都是馬上去小憩片刻或者閉目養神一段時間(20 ~ 30 分鐘),進入一種淺睡眠狀態再恢復過來,精力的恢復感會比較好。

而另一種中長期目標的執行節奏,控制起來可能要更困難一些。

你要找到本身的節奏,就是在天天略感挑戰的狀態下,造成不斷加速前行,直到一個最終接近勻速的狀態。勻速是咱們能長期堅持的臨界點,它能讓咱們跑得更久,跑得更遠。


精進思惟

信息:過載與有效

在信息大爆炸的時代,咱們對信息愈加敏銳,信息就越會主動吸引咱們,讓咱們產生一種過載的感受。

在面對這股信息與知識的洪流時,有時咱們會不自覺地就進入到了 「疲於奔命」模式中。

進入了疲於奔命狀態,咱們不斷給大腦喂任務,且不停地切換大腦任務,讓它永遠處於繁忙甚至超頻狀態。這樣每一個任務的執行效率都會降低且效果也不佳,因此致使執行任務的時間反而延長了,這就給咱們營造了一種「忙碌、充實而疲倦」的虛幻假象。

人腦畢竟不是 CPU,它須要休息,持續的過載與奔命,並不能讓咱們學會更多,但卻會減小咱們創造新的可能。

那面對大量的信息和知識,咱們該如何應對?這能夠從兩個角度來考慮:

  1. 信息和知識自己的價值
  2. 我須要怎樣的信息和知識

第一點,信息和知識的價值是一個主觀的判斷,有一個客觀點的因子是獲取門檻。若是一個信息或知識隨處可得,你們都能接觸到,甚至變得很熱門,那麼其價值可能就不大。吳軍老師有一篇文章講了個道理叫:「衆利勿爲,衆爭勿往」,這在對信息和知識價值的主觀判斷上也是通用的。

第二點,就提出了一個關於如何篩選信息和知識的問題。心理學上有一個 「心智模型」 :

「心智模型」 是用於解釋個體對現實世界中某事所運做的內在認知歷程,它在有限的領域知識和有限的信息處理能力上,產生合理的解釋。

每一個人都有這樣的 「心智模型」,用來處理信息,解釋行爲,作出決策。

不過只有少部分人會更理性地認知到這個模型的存在,並且不斷經過吸取相關信息和知識來完善這個模型。

更多的衆人依賴的是所謂的 「感受」 和 「直覺」。但實際上 「感受」 和 「直覺」 也是 「心智模型」 產生的一種快捷方式,只是他們沒有理性地認知到這一點。

「心智」 這兩個字合在一塊兒是一個意思,分開爲 「心」 和 「智」 兩個字又能夠分別解釋爲:「心」 是你對須要的選擇,從心出發;「智」 是對價值的判斷,智力的匹配。

儲備了信息,創建了知識,最終都是爲了應用。

沒有目的的學習是徒勞的,它僅僅是在咱們的頭腦中流過一遍,流過的痕跡很快又會被新的信息沖刷乾淨。

因此,學習也要有選擇和取捨。萬維鋼的一篇文章中有句話是這麼說的:

注意力是一種有限的資源,你要是不擅長不集中注意力,你就不擅長集中注意力。

你得挑選那些真正值得作和學的東西去讓大腦滿負荷運轉,但凡投入決心去作的事情,就須要百分百投入。這就是專一於少而精的東西,深刻了解這些東西,進入到更深的層次上。

深能夠無止境,那到底多深才合適?個人答案是:讓你的心裏對取得的效果感覺到滿意的深度層次上。它的反面是:但凡心存疑慮,不是那麼肯定要全力投入的事情,乾脆就不作了。


領域:知識與體系

我的的成長有不少方面,但對於程序員的成長最重要的就是知識體系的構建,這其實就是一個 「點線面體」 的演進過程。

進入任何一個知識領域,都是從一個點開始的。

以下圖,是我從大學進入軟件開發領域所接觸的一系列的點,我將其從左到右按時間順序排列。紅色的部分是目前還屬於我 「掌握」 與 「瞭解」 的領域,其餘灰色的部分則是要麼被時代淘汰了,要麼已經被我放棄了維持與更新。



在你入行後,你可能也會由於時代、公司或項目的緣由,有很大的隨機性去接觸不少不一樣的技術點。但若是你老是被客觀的緣由驅動去隨機點亮不一樣的 「點」,那麼你終究會感到有點疲於奔命,永遠追不上技術的浪潮。

當造成的點足夠多了後,一部分點開始造成線,而另外一些點則在技術趨勢的演進中被天然淘汰或本身主動戰略放棄。

那你到底該如何把這些零散的點串成線,造成本身的體系與方向呢?以下圖,是個人一個成長 「T 線圖」,它串聯了現在我沉澱下來的和一些新發展的 「點」。



我從成爲了一名 Java 程序員開始,在這條 「T線」 上,先向下走,專一於解決業務需求碰到的技術問題。先天然地要向下至少走一層,接觸 Java 的運行平臺 JVM。而又由於早期作了幾年電信項目,要和不少網絡設備(包括各種網元和交換機等)通訊,接觸網絡協議編程;後來又作了即時消息(IM)領域的工做,網絡這一塊就又繼續加強了。而網絡編程依賴於操做系統提供的 I/O 模型和 API,天然繞不過 OS 這一塊。

在 Java 領域走了多年之後,之前涉獵的技術點就逐步暗淡了。而再從程序員到架構師,就開始往上走,進入更純粹的 「架構與設計」 領域,在更寬的範圍和更高的維度評估技術方案,作出技術決策與權衡,設定技術演進路線。

可是,再好的技術方案,再完美的架構,若是沒有承載更有意義的業務與產品形態,它們的價值和做用就體現不了。因此不可避免,再往上走時就會去了解並評估 「業務與產品」,關注目標的價值、路徑的有效性與合理性。

在整個縱向的技術線上,最終彙總到頂點,會造成一種新的能力,也就是我對這條縱向線的 「掌控力」。到了這個 「點」 後,在這裏能夠橫向發展,如圖中,也就有了新的能力域:領導力和組織力。

一個個點,構成了基本的價值點,這些點串起來,就造成了更大的價值輸出鏈條。在這條路上,你也會有一條屬於本身的 「T線」,當這條線成型後,你的價值也將變得更大。

線的交織,將造成面。

當我試着把我最近六年多在電商客服和即時通信領域的工做畫出來後,它就織就了下面(如圖所示)的這個「面」。



我從最先的聚焦於某個業務點和技術棧,逐步延伸擴展到整個面。由於 IM 這個產品自己具有很深的技術棧,並且也有足夠多元化的應用場景,這樣整個面就能夠鋪得特別寬廣。這也是爲何我已經在這個面上耕耘了六年多之久。

但事實上,我並不掌握這個面上的每一個點,整個團隊纔會分佈工做在整個面上,每一個個體貢獻者也只會具體工做在這個面上的某個或某些點。但咱們須要去認清整個面的價值體系,這樣才能更好地選擇和切入工做的點,創造更大的價值。

而有時候,我也瞭解到有些程序員的一些說法是這樣的:在相對傳統的行業,作偏業務的開發,技術棧相對固定且老化,難度和深度都不高,看不到發展方向,指望找到突破口。若你也出現這樣的狀況,那就說明你從事的業務開發,其單個技術點的價值上限較低,而選擇更新、更流行的技術,你就是指望提高單個技術點的價值,但單個技術點的價值是相對有限的。

反過來,若是很難跳脫出自身環境的侷限,那麼也能夠不侷限於技術,去考慮這些傳統的業務價值,從技術到業務,再上升到用戶的接入觸達,考慮產品的場景、形態和人羣是如何去爲這些用戶提供的服務、產生的價值。

當你對整個業務面上的價值點掌握的更多,能抓住和把握核心的價值鏈條,去爲更廣、更大的價值負責,那麼你就能克服本身的成長髮展困境,找到了另一條出路了。

同時,你也爲本身織就了一張更大的領域之網。在整個面造成了一個領域,在這個面上你所能掌控的每條線就是你的體系。在這條線的 「點」 上,你解決具體問題,是作解答題;但在整個面上你選擇 「線」,是作選擇題。

體是經濟體或其中的單元。

你的 「面」 附着在什麼 「體」 上決定了它的價值上限。若是 「體」 在高速增加並造成趨勢,你就可能得到更快的發展。

從電力時代到信息時代再到智能時代,互聯網、電商、移動互聯網,這些都是 「體」 的變化。今天互聯網行業的軟件工程師,他們面臨的挑戰和難度不見得比傳統的機械或電力工程師更大,只不過他們所從事的 「點」 所屬的 「面」,附着於一個快速崛起的 「體」 上,得到了更大的加速度。

「體」 的崛起,是時代的機遇。

總結來講,就是:在領域知識體系中,「點」 是利器,「線」 是路徑,「面」 是地圖;而就咱們個體而言,「點」 是孤立知識點的學習掌握,而 「線」 是對這些點的鏈接,「面」 則構成了完整的知識體系網。


轉化:能力與輸出

我的,創建好了知識體系,各方面都明瞭了,但有時作起事來卻還會感受發揮不出來。

團隊,牛人衆多,但感受作出的事情效果卻很通常。

這類問題的癥結,多就出在從體系積累到輸出轉化的環節,它涉及兩個實體的轉化問題:

  1. 個體
  2. 團隊

個體

咱們從學會一個知識,到可以熟練應用其去輸出能力,大概會經歷以下過程:



因此,對於個體而言,剛創建起一個初步的知識體系,到能真正充分發揮出這個體系的力量,才僅僅是剛開始。

團隊

團隊的強弱就由兩方面決定,一是團隊中全部個體造成的體系力量之和,二是由流程規則、工具系統和規範共識共同決定的轉化效率。

沒有流程規則,團隊就不知該如何運轉;缺少工具系統支撐,就無法監視和控制這個體系的運轉效率與效果;而若是未能在團隊造成共識並達成規範,團隊就不可能「和諧」運轉起來。

流程規則,創建其運行軌道;工具系統,支撐其高效運行;規範共識,造成了協調合奏。

轉化

從個體到團隊,都是經過搭建體系來積蓄力量,再經過體系的運轉來輸出能力。

這裏的共同思惟方式是:體系化、工具化。

這是一種標準的工程師思惟模式,巧妙的是它依然能夠用在非工程的領域。體系,從工程維度看就像生產流水線,而體系的運轉就是開動了生產流水線。搭建並調校出一條高轉化輸出能力的體系生產線,是真正具備核心競爭力和護城河的事情。

要想產生更大的成果,取得更大的成功,咱們須要找到放大個體或團隊能力的槓桿支點。曾經,也許咱們也作出過好的產品,產生過好的結果,多是咱們能力不錯,但也有可能只是運氣不錯。也就是說,好產品或好結果並不能成爲支點,不斷產出好結果或好產品的 「體系流水線」 纔是。

咱們須要作的就是不斷打磨這條流水線,提高轉化輸出好產品或好結果的效率與良品率。

個體和團隊的強弱,一方面取決於咱們在體系中積蓄的力量的總量,另外一方面在於體系運做的轉化輸出率。體系決定了力量的總量,而轉化決定了拳拳到肉的痛感。


並行:工做與學習

在工做中,你應該碰到過一些這樣的狀況,有同事工做的時間不短,常常加班加點,工做也很勤勉,但往往晉升時卻碰壁了。你可能還會爲其仗義執言過。難道這真的只是不公平或者運氣不佳嗎?

其實這種狀況,隱藏在背後更深層次的緣由是:工做陷入了循環與重複,今後中止了成長。

那麼,你該如何在工做的同時,保持學習,並持續成長與進階呢?我想,能夠先從分析「程序員的工做本質是什麼」開始着手。

工做

程序員,工做以產出代碼爲主,從初級到高級,代碼的負債屬性逐步下降,資產屬性不斷提高,最終成爲高品質的我的貢獻者。而從完成到追求品質和完美的路上,不只僅是靠工做實踐的經驗積累,還須要有意識地持續學習。

學習

持續學習,是讓你突破不斷循環怪圈的不二法門。

現現在是個信息爆炸與知識過載時代,因此學習必需要有選擇性。而有選擇性的學習就須要找出真正與你近期規劃有關的學習路徑。

假如你工做入職後公司使用 Java 爲主要開發語言,而大學裏你一直學習使用 C 或 C++ 編程練習,這裏再假設你對計算機相關的基礎性學科和知識掌握良好,好比:操做系統、數據庫、網絡、組成原理、編譯原理、算法基礎、數據結構等等。那麼爲了更好地完成工做任務,就須要你先主動學習 Java 編程語言、開發框架等編程技術相關的知識。

而對於學習語言自己我以爲最高效的方法就是看一本該領域的經典入門書。好比,對於 Java 就是《Java 核心技術》或《Java 編程思想》,這是我稱之爲第一維度的書,聚焦於一個技術領域並講得透徹清晰。

在有了該語言的一些實際編程和工程經驗後,就能夠看一些該領域第二維度的書,好比:《Effective Java》《UNIX 編程藝術》等,這些是聚焦於特定領域經驗總結型的書,這類書最有價值的地方是其聚焦於領域的思想和思路。

而另一些技能,像 Java 開發工做須要大量使用的開源框架又該如何學習?張鐵蕾曾寫過一篇《技術的正宗與野路子》,其中介紹瞭如何用真正 「正宗」 的方式去學習並快速掌握這些層出不窮的開源新框架和技術。

這裏就借用原文裏的一張圖(從新按統一風格繪製了下),每一項開源框架或技術相關的學習資料能夠組織成下面這張金字塔形的結構圖。



Tutorial(指南) 和 API Reference(應用編程接口參考) 層次的信息資料能幫助你快速上手開發,而 Spec(技術規範)和 Code(源代碼)會幫助你深入地理解這門技術。而其餘相關的技術書籍和文章實際上是做爲一種補充閱讀,好的技術書籍和文章應該有官方資料中未涵蓋的特定經驗或實踐纔算值得一讀。

張鐵蕾在文中如是說:

每當咱們接觸一項新技術的時候,都要把手頭的資料按照相似這樣的一個金字塔結構進行分類。若是咱們閱讀了一些技術博客和技術書籍,那麼也要清楚地知道它們涉及到的是金字塔中的哪些部分。

我深覺得然,關於技術學習咱們不能簡單地走馬觀花、複製粘貼、拿來主義,應是去創建你的知識 「金字塔」,造成體系結構,而每次的學習實踐都是在不斷完善你的 「金字塔」。

路徑

保持學習,不斷成長,工做也許還在重複,但成長卻在迭代上升,而後纔會有機會面臨更多可選擇的路徑。

程序員在攀登職場階梯的道路上,走過了高級,後面還會有好些分叉路線。好比,轉到脫離技術的純管理崗或者技術管理崗。技術主管或架構師某種意義上都屬於技術管理崗,不懂技術是作不了這兩個角色的;或者繼續沿着深度領域走,成爲細分領域專家。

面對怎麼選路的問題,我近些年學習的收穫是這樣的:選擇走最適合實現我的價值的路。這就是個人基礎選擇價值觀。

程序員的我的價值該怎麼實現?該如何最大化?程序員做爲我的貢獻者,到了必定的熟練階段,產出基本就穩定了,而技能的成長卻呈現對數曲線的增加特徵。

任何一個你所嘗試提高的事情都有一個增加曲線,這個曲線有兩種形態:

  1. 對數增加形態:這種類型在初期增加很快,但隨後進展就愈加困難;
  2. 指數增加形態:這種類型在初期增加很慢,但存在積累的複利效應。

增加要麼是對數形態,要麼是指數形態,不多有線性的。

對數增加也意味着更容易退步,由於起步階段是如此陡峭(見對數曲線示例圖)。好比,學習一門新的技能,不持續去應用,很快就忘了,退回原點。那你應該如何應對這種「窘況」呢?

我建議你在起初的高增加階段,學習和工做的關注點需放在養成長期習慣上,由於雖然開始增加很快,但須要當心一旦中止努力它可能會向下滑落,因此必定要慎之又慎,堅持造成本身的習慣和節奏。



而指數增加則意味着存在一個拐點的 「突變」 時刻。不少人指望線性增加,但實際倒是按指數增加的,這讓許多人在拐點發生前就放棄了。好比,寫做,在呈指數增加的領域內,處處都是半途而廢者。因此,作本質是指數增加曲線的事情時,柔韌且持久的思惟模式是關鍵。



工做多年後,技能的增加就又進入了對數的平緩區域,一般其回報呈現遞減趨勢。也就是說你在其上花的功夫愈來愈多,但你感到愈來愈難產生洞察以得到新的收益。其難處在於找到新的突破點,從新回到曲線陡峭上升的部分。

這就是所謂成長的瓶頸,你要學會應用指數增加的方法,找到價值貢獻的放大器。

做爲程序員,你有可能很幸運地編寫服務於數千萬或數億人的軟件服務,這是產品自帶的價值放大器。這樣同是寫一份代碼,你的價值就是要比別人大不少。而轉管理者或架構師,這些角色無非都是自帶槓桿因子的,因此也有價值放大的做用。但我的可否適應得了這樣的角色轉換,又是另外一回事了。

到此我總結下今天的分享:

程序員的工做形式是編程產出代碼,本質是完成需求,交付系統;但在工做中容易陷入不斷完成的循環怪圈,要打破它,就須要你持續學習並有意識地關注交付代碼的品質和屬性,一方面提高了交付質量,另外一方面也得到了我的成長。

而學習的路在時間上是永遠持續的,在空間上也是有路徑的;有效的學習須要你關注學習曲線的變化,遵循有體系的技術學習框架,匹配適合當前階段的學習資源。


習慣

時間的習慣

有人把時間看做流水,任其從指間溜走,你卻能夠把它看做石頭,把它們切割成用來建造大教堂的石材。

面對天然產生的天天一塊的「時間原石」,每一個清晨就要肯定:把它切成什麼樣?由哪些石塊組成?哪些是用來建造大教堂的石材?肯定後,將其壓在心上,臨睡前再記錄下今天從心上搬走了哪些石塊,以及花了多少時間。這樣時間於我就真的變成了一塊塊石頭,比輕煙、流水、薄霧更有形,更易抓住,也沒那麼容易悄悄地溜走了。

天天搬的石頭,不必定都適合建造大教堂,而建造大教堂的時間也可能比咱們預期的要長。

位於梵蒂岡的聖彼得大教堂的建造過程先後歷時 120 年,由米開朗基羅設計,而文藝復興時期的大師基本都曾參與其設計。



試試:一種「壞」習慣

「試一試」 的初衷原本就該是好的,它表達了一種好奇心,以及嘗試走出溫馨區的勇氣。可是,「試一試」也可能演變成一種「壞」習慣。

這裏,「試一試」的「壞」習慣的「壞」字之因此加上雙引號,就在於它的出發點本是好的,但若是終點是模糊的,那就「壞」了。

試一試,須要有更清晰的終點。關於終點,你也能夠從下面一些方面來考慮:

  1. 驗證猜測。這個部分程序員就很熟悉了,由於編程中的調試其實最重要的目的就是驗證猜測。引入一種新技術或框架,驗證 API 的調用結果或運行輸出是否如你所想,即便最終否決了,那你也得到了判斷的依據與知識。
  2. 收穫結果。定義清楚你嘗試的這件事,到底能收穫怎樣具體的結果。好比:考試,嘗試的收穫就是要經過。
  3. 體驗過程。有時候結果並不肯定,好比,創業的結果未必就必定是成功,那麼這樣的嘗試難道就沒有意義了嗎?有的,由於創業的超低成功率,因此,體驗過程恐怕多於收穫最終結果。
  4. 理解現實。你嘗試一個新東西或學習一個新知識,有時未必真是爲了未來有朝一日能用上它,而主要是爲了完善你的知識與認知體系,而後再去理解現實爲何是這樣的。

有時候,你由於現實工做須要,可能須要不停地在各類技術棧上切換。而不少技術可能過了那段時間,就再也用不上了,這樣的技術嘗試不免會讓人感受惋惜。但經過我前面列出的關於 「終點」 的方面,再來分析下這個現實場景。

首先,你得面對現實,這樣的技術嘗試在現實中太多太多了,有時就是沒得選擇。當年,我也由於工做緣由,從客戶端桌面編程的 VB、PB、Delphi 到 Web 編程的 JS 語言和一堆相關框架,再到後端編程的 C 和 Java,而現在不少當年學習的技能早已過期了。但這樣的技術切換嘗試,從 「收穫結果」 的維度看仍是解決了當時的問題,知足了須要,得到告終果。

其次,若是以爲僅僅一次性收穫的結果,不值得你投入的時間和精力,那就能夠從 「理解現實」 的角度去挖掘。這些知識,從學以至用的角度很快就過期了,但它們並非徹底孤立的,事實上計算機程序體系內的不少知識都不是徹底孤立的,它們都有相互的聯繫與鏈接點。

從理解的角度,這類技術切換的嘗試事實上擴大了你的知識邊界,嘗試的也許是孤點,但你能夠進一步找到它們的鏈接處,造成體系。由於不少現實的緣由,每一個人的起點和路徑都不會同樣,但咱們都是從某一點開始去慢慢摸索、嘗試,最終走出一個屬於本身的體系來的。

最後,當你有了本身的體系,也可能有了更多的嘗試選擇權,就能夠體系爲中心,去有選擇地嘗試對你更有意義或價值的事了。

總結來講:

試一試,是走出溫馨區的一次行動,這本是一個好的出發點,但若只有一個模糊的終點,那麼它帶來的更可能就是無謂的浪費。

試一試,不只要有一個好的出發點,還須要一個清晰的終點,在這個終點你可能:驗證猜測、收穫結果、體驗過程、理解現實。而在起點和終點之間,你須要選擇一條更現實的路徑,經過不斷地嘗試,走出本身的體系。

試一試,本該是個好習慣,可別把它用壞了。


職場階梯

定義:階梯與級別

程序員的職業階梯有5個:初級、中級、高級、資深和專家。

至於對不一樣級別的定義,我選擇了三個相對容易判斷的維度:

  1. 具有什麼能力?
  2. 解決什麼問題?
  3. 產生多大影響?

初級

通常剛從學校畢業的同窗,能夠作事,可是須要較多的指導;要善於總結概括和分享。

中級

能夠獨立作事,效率和質量有瑕疵;要善於總結概括與分享。

高級

能獨立負責一個大系統中的子系統或服務,能夠高效率、高質量的獨立作事,並能結合業務設計合理的解決方案;除了要善於總結概括與分享,還要進行方法論的沉澱。

資深

資深,有深度和資歷(即廣度)兩個層面,對應到職業生涯路線上,也有兩個方向。

  1. 資深工程師
  2. 架構師

在偏基礎研發、算法和特定技術複雜領域,會向 「資深工程師」 方向發展,屬於深度優先。而在面向業務開發的領域,業務複雜度高於技術複雜度,則會向 「架構師」 方向發展,屬於廣度優先。

但不管深度仍是廣度,進入這個級別即說明你在特定領域都已經具有了至關的積累。這時你是做爲相關領域的專家,深度參與和支持團隊項目,在領域內進行關鍵的技術判斷和決策,進而幫助團隊項目或產品加速成功。

在這個層次上,你面臨的都是一些更復雜的、具有一些灰度(不是非此即彼,而是須要折中權衡)特性的問題,這時就須要你可以全方位、多層次、多角度地深刻理解問題,評估每種方案的收益、成本和潛在將來的長短時間影響等。

這個層次的影響方面,除了經驗分享和方法論沉澱,還有產品和團隊兩個考慮維度:即便是作純技術的東西,最終的影響也是經過技術產品來完成的;而另外一方面則是團隊的梯隊建設、結構調整與協做優化,決定了團隊外在表現。這兩個維度,前者可能資深方向側重多一些,後者則是架構師方向須要側重思考實踐的。

總結一點:能夠指導其餘人高效率、高質量的作事,有兩個方向,廣度(架構師)和深度(資深工程師);經驗分享和方法論沉澱,還要考慮產品和團隊的因素。

專家

某個領域繞不過去的人。


晉升:評定與博弈

晉升的標準維度,可能有如下四項:

  1. 通用能力,包括學習能力、溝通能力和領導能力等;
  2. 業務能力,包括業務理解和領域建模等;
  3. 技術能力,包括深度、廣度和技能應用等;
  4. 影響力,如知識總結、知識傳承和人才培養。

除以上 4 個大維度外,還有一項 「工做業績」 ,不屬於現場技術評定的維度,直接來源於過去一年的工做業績評價。每一個大維度會佔據必定的比重,而後能夠針對每一個大維度去打分。

更直觀的標準是責任域和能力域。

責任域,就是你負責什麼,這個相對容易識別。而能力域則過於抽象,很難清晰識別,在述職這樣的形式中,最容易判斷的僅僅是表達和溝通能力;至於業務和技術能力,雖不那麼容易判斷,但好在其有最好的展示形式:做品。

晉升的本質是承擔更大的責任,而責任和能力是須要匹配的,晉升就是完成這樣一種匹配關係的過程。

保持不斷學習和提高能力,找到並承擔起合適的責任域,那麼後續的晉升並貼上一個相應的職級標籤,就是一件天然而然的事情了。


工程之道

核心:安全與效率

核心

核心,意味着最重要的,一切複雜的工程技術方案都是圍繞着它來運轉。

在深刻核心以前,咱們先講一個電力行業的故事。雖然說電力項目我沒作過,但電站大概的工做原理在中學物理課上就已經學過了,原理很簡單。雖理論上是這麼說,但現實中看到那些大規模的電站後,仍是感受很複雜的。

故事是這樣的:記得有個給咱們上課的主講老師是個鬚髮皆白的老先生,進門後掏出一堆零件放在講臺上。一盞酒精燈、一個小水壺、一個葉片、一個銅光閃閃的小電機、一個小燈泡。老先生往壺裏倒了些水,點燃酒精燈,不一下子水開了,從壺嘴裏噴出了蒸汽,帶動葉片旋轉,而後小燈泡就亮了。

老先生說:「這就是電廠。若是燒的是煤炭,這就是燃煤電廠;若是燒的自然氣,這就是燃氣電廠;若是得到熱能的方式是核裂變,這就是核電廠;若是帶動葉片的能量來自從高處流向低處的水流,這就是水電廠。」

「大家或許會問:那咱們看到的電站怎麼這麼複雜?答案其實很簡單,電站須要複雜系統的目的:一是爲了確保安全(Safety),二是爲了提升效率(Efficiency)。安全與效率的平衡,是全部工程技術的核心。」

聽完這個故事,我覺着所謂 「大道至簡」 大概就是這樣的感受了。

安全

安全,之於信息工程技術領域,包括了 「狹義」 和 「廣義」 兩個方面的安全範疇。以下圖所示:



效率

效率,從程序系統的角度看,一樣也是從 「開發」「運維」 和 「運行」 三個方面來考慮。以下圖所示:



開發效率,能夠從 「個體」 和 「羣體」 兩個方面來看。

個體,就是程序員我的了,其開發效率除了受自身代碼設計與編寫能力的影響,同時還要看其利用工具的水平。

更好的源碼管理工具與技巧能夠避免無謂的衝突與混亂;

代碼模板與開發框架能大幅度提高代碼產出效率;

而持續集成工具體系則能有助於快速推動代碼進入可測試狀態。

羣體,就是一個團隊,其開發效率最大的限制常常是架構致使的。

若是你在一個工程項目上寫過幾年代碼後,多半會碰到這樣一種場景,代碼庫愈來愈大,而功能越改越困難。明明感受是一個小功能變化,也要改上好幾天,再測上好幾天,這一般都是架構的問題,致使了團隊羣體開發效率的降低。

之後端服務架構技術演進的變化爲例,從單體應用到面向服務架構思想,再到現在已成主流的微服務架構實踐,它最大的做用在於有利於大規模開發團隊的並行化開發,從而提高了團隊總體的效率。理想狀況下,每一個微服務的代碼庫都不大,變化鎖閉在每一個服務內部,不會影響其餘服務。

微服務化一方面提高了總體的開發效率,但由於服務多了,部署就變複雜了,因此下降了部署的效率。但部署效率能夠經過自動化的手段來獲得彌補,而開發則無法自動化。另外一方面,每一個微服務都是一個獨立的進程,從而在應用進程層面隔離了資源衝突,提高了程序運行的 「安全」 性。

運維效率,能夠從 「檢查」「診斷」 和 「處理」 三個方面來看。

一個運行的系統,是一個有生命力的系統,並有其生命週期。在其生命週期內,咱們須要按期去作檢查,以獲得系統的 「生命體徵」 的多維度信息數據彙總,以供後續的診斷分析。

運行系統的 「體徵」 數據是在實時變化的,並且數據來源是多層次的,從底層的網絡、操做系統、容器到運行平臺(如:JVM)、服務框架與應用服務。

當異常 「體徵」 指標出現時,很難簡單地判斷到底哪裏纔是根本緣由,這就須要關聯的因果性分析來得出結論,最後智能地發出告警,而不是被告警所淹沒。

準確地診斷以後,才能進行合適地處理。和治病不一樣,大部分的故障均可以經過常見的處理手段解決,極少存在所謂的 「不治之症」。而常見的線上處理手段有以下三類。

  1. 恢復:重啓或隔離來清除故障、恢復服務;
  2. 變動:修改配置或回滾程序版本;
  3. 限制:故障斷路或過載限流。

運行效率,關鍵就是提升程序的 「響應性」,如果服務還包括其 「吞吐量」。

程序運行的高效率,也即高響應、高吞吐能力,全部的優化手段均可以從下面兩個維度來分類:

  1. 更多
  2. 更快

負載均衡器讓更多的機器或進程參與服務,並行算法策略讓更多的線程同步執行。異步化、無鎖化和非阻塞的算法策略讓程序執行得更快,緩存與緩衝讓數據的讀寫更快。

有時在某些方面 「安全」 和 「效率」 之間是相互衝突的,但工程技術的藝術性就偏偏體如今這衝突中的平衡上。

打個比方,若是你的程序就跑在你開的車上,那麼「安全」 特性會讓你開得更放心,「效率」 特性會讓你開得更帶勁。