1. 程式人生 > >如何成為一名架構師,架構師成長之路

如何成為一名架構師,架構師成長之路

T5+(P6+)

1、實現一個帶超時功能的connect函式

考察點:linux網路程式設計、non-blocking、select/poll/epoll的使用、對底層庫的瞭解程度

預設的connect為阻塞,通過設定socket為non-blocking、監聽寫事件來做到非阻塞超時connect。

參考點:大多數網路庫都有相關或類似實現,最直接的可以看golang net庫原始碼,其DialTimeout的底層實現即是此問題。

引伸點:

(1)若面試者能答出用select或epoll實現,進一步考察select、epoll工作原理,如epoll是如何儲存fd的,如何做到用“回撥機制”將就緒的fd返回,select和epoll區別等;

(2)linux網路程式設計的其他要點或其他函式的使用,如shutdown、reuseaddr,進而可引伸出TCP協議狀態機、TCP協議粘包處理、TCP協議滑動視窗機制、TCP包重發機制等;

(3)IO多路複用處理併發網路連線的基本模型、要點;

(4)對boost asio、libevent、libev或其他庫的瞭解程度;

(5)執行緒池的實現以及要點。

2、實現一個簡單的記憶體池管理,要求在多執行緒環境中高效使用

考察點:記憶體模型、記憶體分配過程、記憶體碎片處理、對tcmalloc之類的庫的瞭解程度、對STL瞭解程度

參考點:主要可參考tcmalloc實現,golang記憶體分配和gc機制也是類似原理。

引伸點:

(1)若面試者能大概答出tcmalloc的架構,可進一步考察使用者空間如何從核心空間申請記憶體,包括相關的系統呼叫;

(2)預設的庫函式malloc/free(new/delete)的不足之處在哪?為什麼要引入這樣的東西?STL預設的記憶體分配器是如何工作的,有沒有什麼問題?

(3)若能答出golang或其他語言的記憶體分配和gc的類似機制,進一步考察對實現細節的瞭解程度;

(4)可引伸至fork、vfork、copy-on-write、無鎖佇列等問題進一步考察。

3、實現一個執行緒安全的單例模式

考察點:c++基礎、設計模式、多執行緒程式設計、各種同步機制

參考點:遍地可找到,如果此問題都答不出,在架構組基本不用考慮繼續面

引伸點:

(1)單例模式的“懶漢”和“餓漢”的區別,如其實現的是“懶漢”模式(通常答的都是這個),考慮讓其以“餓漢”模式實現,可以適當提示,同時,兩種模式各有什麼優缺點?

(2)進一步考察c++基礎問題,考察其對c++的理解程度,包括RTTI、c++物件模型、虛擬函式工作原理、虛表結構等問題;

(3)基於(2),進一步考察如java語言或go語言都填了c++的哪些坑,這樣做的目的是什麼?

(4)c++的一些經典記憶體問題,如建構函式異常、非執行緒安全的析構等,進一步可引伸出智慧指標的原理及使用要點;

(5)進一步考察其對boost、c++0x等對此問題相關的支援及面試者的瞭解程度;

(6)進一步考察多程序、多執行緒的各種同步機制及其差異,可進一步要求其實現一個經典的生產消費者模型;

4、實現hash表動態擴容縮容的過程

考察點:經典資料結構、多執行緒程式設計、“雙緩衝buffer”的類似思想

參考點:redis的hash table動態擴容縮容過程

引伸點:

(1)此問題通常是面試者提到“瞭解、熟悉甚至精通redis”的情況下問出,如其能答出,進一步考察redis其他核心實現的要點,如事件驅動機制、如何寫rdb,redis如何做持久化,持久化的時候又有什麼問題?進而的解決方案是什麼?

(2)進一步可引伸出redis代理,如twemproxy、codis的相關原理及實現;

(3)進一步瞭解其對底層資料結構的掌握程度,如跳躍表、RB樹、B樹等各種對比,進一步可引伸出LSM樹和基於LSM樹的各種DB,如level DB,列式儲存等,進一步可考察mysql架構、mysql各種儲存引擎的對比,mysql如何做分庫分表、sharding、主從同步以及不足之處在哪?

(4)進一步瞭解其對其他第三方開源元件的瞭解程度,如常用的訊息佇列。

5、實現一個簡單的3份資料冗餘同步複製過程或雙機熱備主從同步過程

考察點:分散式儲存經典問題、分散式原理、各種分散式協議

參考點:hadoop的相關實現

引伸點:

(1)GFS及類似GFS的分散式儲存系統的架構及其實現,NWR、CAP、paxos、raft、二階段提交等協議,以及這些協議到底解決了什麼問題?

(2)可引伸出類似zookeeper、etcd等分散式協調服務的同步、選舉過程

(3)如何做基於tcp長連線的心跳服務?

(4)實際工程中使用這些分散式系統的經驗及瞭解程度

6、求和的絕對值最大的連續子序列 如{-5,4,-20,16,-2,-3}

考察點:演算法

參考點:遍地是

引伸點:

(1)通常能給出O(n^2)演算法即為OK,可進一步提示其優化至O(n )演算法;

(2)進一步考察常用的演算法分析方法,即分治、動態規劃、回溯等,可進一步考察某些排序演算法,如快排,但如果問到了快排,可進一步考察各種庫如何實現了快排,做了哪些優化來避免最壞情況的發生?

(3)分析問題能力,是否用比較合適的方法來解決一個問題。