1. 程式人生 > >2017/2/13的碎碎念

2017/2/13的碎碎念

從開始工作到現在,已經過去了一年半,近期想轉行,遂記下這一年半的時間裡的各種碎碎。

說實話一年半里專業水平在專案中提升不是很多,由於業務強烈依賴高通,好多內容對新手來說不是很容易上手,摻雜了很多底層知識。公司裡的培訓相對又較少,造成自己對業務無法形成系統性的認知,也基本沒有寫程式碼的機會,遂放棄。
但是自己對作業系統的理解確實提高了一個檔次。以前完全是看不懂作業系統在講什麼,不理解作業系統為什麼設計?現在至少可以對其概念有了清晰的認知。

下面記錄一下自己的學習路徑:

linux核心學習

核心學習主要從以下兩方面入手

  • 必須先了解linux的記憶體管理部分,記憶體管理是精華,也是我們可能經常會碰到問題的地方。參考英文版的《深入理解Linux虛擬記憶體管理》,中文版翻譯很爛。
  • 學習《深入理解linux核心》這本書把linux核心講的很透,值得反覆看。如果英文版的《記憶體管理》那本書看不懂,可以先看這本書,這兩本書,我一直在交叉看。

驅動學習

  • 驅動學習必須先從device tree入手,核心3.0後都改用的裝置樹了。要理解“device tree是對硬體的抽象”
  • 然後是如何使用各個模組的介面,如regulator、gpio等
  • makefile編寫
  • android中.rc檔案配置

android學習

本身從事手機行業,提供了編譯接觸到android原始碼的機會,方便在學習中新增自己的功能。由於這半年自己負責的是指紋模組,對android的系統服務有了一定的認知。

  • android的基礎是binder通訊,但是不一定非要深入瞭解binder。首先要利用binder新增系統服務,包括native service和java service,這樣才瞭解到binder的基本結構。native服務和容易新增,java層的服務需要花費點時間。android的主要工作在java層,即framework構建了新的體系。現階段,對binder通訊結構的基本瞭解,能新增服務,還需要深入瞭解。
  • 學android離不開java

java學習

學習的時候走了很多彎路。雖然之前已經有過基礎,研究生期間學過java的基本語法,但是當時學的很淺,也沒有意識到java其實比linux還難。linux入門很難,但是入門之後,會發現是有規律可循的。linux可以分為記憶體管理、程序排程、檔案系統等,每一部分都可以作為獨立的一部分來研究。研究每一部分都需要先把對應的資料結構搞清楚,基本上搞清楚的資料結構的每個成員的作用,這部分就能瞭解的差不多。比如記憶體管理部分,對應的資料結構是struct mm_struct(給程序用的記憶體描述符)、struct page(描述記憶體物理頁)、struct zone(描述記憶體區)等等。其次要了解記憶體相關的演算法,這些演算法都是與資料結構中的成員聯絡在一起的。

總而言之,完全可以按照資料結構+演算法的思路來學習linux。

java 入門容易,寫個程式很簡單,但要寫好,很難。以前總是把java理解成一種程式語言,現在發現java更像是在作業系統上建立的新的“作業系統”。linux有記憶體管理、程序排程、編譯連線、程式碼執行、堆疊管理等等,這些jvm裡也都有。在學習過程中我一直把jvm當做作業系統來學(野路子)。
剛開始學的時候拿springmvc來練手,後來發現路數不對。雖然能用來寫點小程式,但是spring中概念太多,自己的底子薄,很多概念都理解不了,想深入瞭解一點spring設計相關的內容就理解不了,比如反射、靜態代理、動態代理、設計模式之類等。遂放棄。後來不知什麼原因想起了寫爬蟲,發現爬蟲真是個入門java,鞏固java基礎知識的好專案,大致經過了幾個過程:

  • 實現了各模組功能。
    完成了資料採集、網頁解析、資料儲存、多執行緒排程各個模組的功能。其間也是邊學邊做,這段時候學的最快。實現功能的同時,熟悉了jdbc、mysql、java多執行緒。
  • 優化程式碼。
    初次實現的程式碼各個模組間的耦合太嚴重,尤其是資料儲存部分,各個資料採集執行緒自己操作資料庫儲存資料,不易實現多執行緒。需要對程式碼進行分離。首先考慮的是如何支援多執行緒的問題,運用到生產者消費者模式+阻塞佇列的方式,完美地實現了資料採集和資料儲存之間的解耦。設計模式真是個好東西,它是對程式設計中常用的業務場景進行抽象和歸納,值得多學習。