系統性能的藝術

遇到系統性能問題是軟件工程師生活中不可避免的方面。 常見性能問題的示例包括:

· 磁盤I / O:例如從磁盤加載應用程序代碼或加載資源

· 網絡I / O:從服務器加載數據或圖像

· 進程間調用:用於進行單點登錄或與操作系統交互

在Java中,大多數這些問題在編寫代碼時不會立即顯現出來。 類負載是隱式的,大多數磁盤IO都被抽象化了,看起來像是普通的方法調用。 實際上,大多數情況下,所有這些功能(網絡IO除外)的執行速度都足夠快,以至於在臨時本地測試中不會引起注意。 代碼加載迅速,因為它仍在上一次運行時保留在內存中,而您正在調用的進程在上一次調用中仍然有效。 即使對於網絡IO,如果內部網絡太快而無法注意到問題,則某些問題可能會拖延到生產中。

如果工程師可以"看到"他們的通話速度變慢,那不是很好嗎?

線程數

平均而言,應用程序需要保持60fps或每幀16ms的幀速率。 為此,UI線程必須在該時間範圍內更新UI。 網絡IO通常需要16ms的倍數,這給了我們2種選擇:在較小的時間片中分塊工作,讓其他人執行工作並返回結果。 在Java中,第二個選項是使用線程實現的。

讓後臺線程執行耗時的工作,需要在UI中顯示結果。 仍然需要將數據從後臺線程傳遞到UI線程。 實際上,可能有幾種模式:

· UI線程訂閱數據事件

· UI線程從共享對象讀取/輪詢數據。

第一種模式更可靠,但需要更多工作。 第二個更自然,但風險更大。 例如,在整個應用程序中,開發人員可能需要了解當前用戶。 但是,在啟動應用程序時,仍然需要從磁盤加載此信息。 這造成了一種有趣的情況,開發人員阻塞了UI線程以等待後臺線程生成的結果。 不幸的是,這種模式使開發人員使UI線程等待後臺結果,這種模式比預期的更為普遍。

如果工程師在調用阻塞方法時可以"看到",那不是很好嗎?

權衡取捨

在UI線程上完成所有工作是最簡單的解決方案,並且它在很多時候都有效。 但是,在現實世界中,某些工作存在嚴重的性能異常。 因此,隨著時間的流逝,開發人員會將大部分工作轉移到後臺線程上。

通常可以直接從後臺線程準備的結果中讀取數據,除非在讀取數據時進行併發寫入時除外。 因此,可以保證通過同步進行獨佔數據訪問。

通過獨佔訪問直接從結果中讀取數據通常很快,除非有時在爭用中獲得對數據的獨佔訪問。 因此,隨著時間的流逝,開發人員會將其中一些工作移至請求-響應模型,UI線程在該模型中訂閱結果。

訂閱數據更改還需要預先計劃,這可能會增加複雜性,從而為用戶提供正確的服務。

如果工程師可以提供一個更簡單的模式來實現正確,高性能代碼的目標,那不是很好。

儘管這些挑戰聽起來似乎很難解決,但是工程師可以克服這些挑戰:

· 向工程師提供相關的運行時信息,以幫助他們在編碼時做出更好的決策: 創建一個插件來顯示數據。

· 原型化反應式/ redux風格的用戶界面,該界面應具有高性能並且易於推理。

不用說,不管工程師的辛勤工作水平如何,這些系統挑戰除具有"硬件"背景外,還需要工程師具備一些"軟"技能。

作為個人貢獻者,工程師有責任將他們的問題和疑慮帶到系統審查會議上。 可能需要考慮創建與經理共享的文檔,提出一個想要討論的主題,並跟蹤承諾。

不要等待公司範圍內的正式調查表或全體會議提出一個複雜的話題。 確保您正在與經理討論艱難的事情。 這都是關於相互信任。

運送產品,並讓所有人知道

在各個公司中,以不同的方式衡量單個工程師的成功。 然而,對於每個想要得到認可和獎勵的人來說,一件事情都是相關的。 這是在運送產品[或相應的系統開發工作-用於基礎架構團隊]。 這應該反映在所有的自我審查和討論中:交付的內容。

如果您解釋您面臨的挑戰以及如何克服挑戰,您將對您的經理大有幫助。 也許您的經理需要一些理由來提名您晉升。 幫助他們成為有力的案例!

進入下一個級別

永遠不要低估校準會議的價值,也不要忘記在組織中找到表現最好的人。 其他團隊中可能已經有高級工程師可能正是因為該校準而被提名晉升!

如果您想獲得晉升,請從下一個級別開始工作,並承擔更大的責任和更大的項目範圍。 不要等到有人要您接手。 只需繼續,併為此承擔責任! 認可將隨之而來。

在下一個級別執行意味著什麼?

系統性能的藝術

大多數科技公司都具有資深級別(他們可能將專業人員稱為"初級","中級","高級","職員",或具有一些相應的代碼,例如IC3-IC6)。 一些公司定義了職業期望:在每個資歷級別上您應該做什麼。 很少見的是職業期望的"交付時間"維度。

例如,如果高級工程師可以在兩週內交付功能X,那麼中級工程師可以在三週內交付功能X。 如果組織希望提名中級工程師來晉升,他們不僅應該交付高質量的工作,而且還要在下一級別的時間範圍內完成工作。

以可持續的方式執行

大多數公司都採用兩種薪酬來表彰其僱員的出色業績。 第一個是獎金,第二個是晉升。 獎金是人們在過去一段時間裡付出的額外努力。 晉升是對他們在下一級的能力和持續表現的認可。 這兩種獎勵並不總是同時存在。 一個好的經理應該發現某人是否全天候工作,並考慮將其標記為不在下一級別工作。

沒有人可以一直24x7全天候工作,因此將來性能可能會下降。 在花費合理的時間工作的同時,請確保您超出預期。

(本文翻譯自The AI LAB的文章《The Art of System Performance for Engineers》,參考:https://levelup.gitconnected.com/the-art-of-system-performance-for-engineers-1c85a398d6f2)


分享到:


相關文章: