在專案中開發中,特別是從事外部介面開發的過程中,經常遇到新的框架、新的協議等。如果遇到緊急開發的專案,特別會感慨自己的能力不足,需要快速學習充電。這裡我總結幾種學習的技巧。
遞進式提問其實對我們提公升自己也很有幫助,舉例來說。當我們學習網路程式設計socket的時候,我們知道tcp客戶端呼叫socket的connect連線服務端。那麼,我們可以問自己,同乙個服務端的埠能否連線多個客戶端?答案是肯定的,這就涉及到了tcp協議的半連線佇列和四元組模型。
接著,我們可以接著問自己,那麼怎麼樣監測鏈路正常?可以使用心跳或keepalive,如果不正常就關閉socket。那麼我們可以繼續深入下去,如何關閉socket?有close方法和shutdown方法。那麼我們還可以深入下去,這兩者有什麼區別?shutdown可以關閉讀寫的一端或全部,等待資料接收完成。呼叫close直接關閉,清空緩衝區。此時,我們還可以深入追問自己,除了這個還有其他相關的方法嗎?那就是so_linger引數了,可以設定超時時間,如果超時沒有取走,則清空緩衝區。
接下去,我們還能深入,從普通的阻塞socket程式設計,能否到非阻塞?通過設定socket引數即可。繼續追問下去,所謂的io復用?select,poll和epoll程式設計區別是什麼。
最後,我們還可以研究一下c10k和c10m模型,如何解決單機百萬連線?這個涉及到作業系統和io復用和執行緒模型問題了。到此,網路程式設計才能算真正的入門。當然了,對於網路程式設計,還得熟悉抓包分析,比如wireshark,tcpdump等。最關鍵的是還是要在專案應用中分析和解決問題。
一般而言,我們學習知識既需要深度,也需要廣度。深度的學習某一方面知識,是為了能夠成為某一方面的專家。這實際上是因為人的精力是有限的,只有集中有限的時間和精力去做自己喜歡的事情,才能在某乙個領域有所突破。
實際上,在軟體開發領域,每個分層都是有關聯的。應用程式需要做好設計,效能優化。好的效能和使用者體驗,實際上也離不開硬體層面的支援。這也是為什麼有系統架構的橫向擴充套件和縱向擴充套件。這也促進了各方面元件的出現,當我們想成為架構師,或多或少要對不同方面的元件有一定的了解。當然了,學習也是相互連通的。比如tcp協議底層設計的狀態轉換,不就是設計模式裡面的狀態設計模式嗎?現在很多開源元件的執行緒池,資料庫連線池,不也是類似於享元設計模式嗎?
一般在學習知識的初級階段,主要是打好基礎,並關聯應用場景。基礎知識包括資料結構和演算法,作業系統基礎,計算機組成原理,uml與設計模式,資料庫基礎,網路協議與程式設計,分布式系統等等。
如果我們要深入學習分布式系統,那麼分布式相關的演算法,raft,paxos,gossip等等演算法肯定要熟悉,然後能針對一兩個開源元件進行深入分析和閱讀原始碼,並在實際應用中針對遇到的問題進行導向性研究。最終的目的是服務好產品,提高可用性和穩定性。
學習與思考
可能很多人都看過暗時間這本書,但是我還是想把看過的東西寫一下,分享一下,不為別的,就是好好實踐一下作者的學習習慣,也能體現我註冊時的宗旨,我不太喜歡用碼字的方式來寫,如果是長篇論述,那樣看起來會吃力,我只是把內容精簡成思維導圖的方式呈現,如下圖所示 有些東西用筆寫下來更容易刺激腦細胞 有些東西心得與...
HDFS Block損壞的解決方式與思考
斷電導致hdfs服務不正常,並顯示塊損壞 檢查hdfs系統檔案健康 hdfs fsck 注 通過web ui也可以進行檢視 檢查是對應的哪些block發生了損壞 hdfs fsck list corruptfileblocks 出來的結果是損壞的block及對應的file所在的路徑 業務場景如下 m...
對自己的學習方式的思考
前兩天跟老大討論起關於知識學習的問題。他說到很佩服自己的記憶力,因為經常能看到我對那些錯綜復 雜的目錄結構,原始碼位置,檔名之類的資訊記得都很清楚。然後自陳他自己的記憶力就不夠好。對於那 些目錄結構,原始碼位置的資訊記憶得就不是很牢固,總是需要在 cd到某個目錄之前要 ls一下才能確定。但是在我看來...