《碼農翻身》讀後感

吳昌良發表於2019-06-24

1.計算機的世界

  • 執行緒:

    • 執行緒執行步驟:就緒、等待、執行

    • 多執行緒併發問題

    • 加鎖、死鎖問題,按照資源順序申請鎖

  • TCP/IP

    • 不可靠通道進行可靠性傳輸

    • TCP的三次握手和四次揮手

    • 滑動視窗協議

  • CPU

    • CPU比記憶體快100倍,比硬碟快百萬倍。

    • 暫存器、程式計算器

    • 區域性性原理

  • 程式

    • 批處理系統

    • 程式記錄了暫存器的志、指令值、和消耗時間等

    • 地址重定向

  • 硬碟

    • 磁軌、扇區

    • 檔案、檔案系統

  • I/O裝置

    • 匯流排和埠

    • 輪詢、中斷

  • 資料庫

    • 查詢

    • 併發訪問

    • 原子性問題

    • 安全問題

  • socket

    • 對TCP連線的封裝

  • 翻譯器

    • 機器語言、組合語言、高階語言

    • 翻譯流程:源程式->詞法分析->語法分析->語義分析->中間程式碼生成->程式碼優化->程式碼生成->目標程式

  • 程式設計世界的鎖

    • 共享變數、鎖爭搶、自旋鎖、鎖的原子性、不可重入。

    • 訊號量:佇列會對wait、signal、full、enpty封裝

  • 遞迴

    • 函式棧幀

    • 尾遞迴、複用棧幀

 

2.Java帝國

 

 

3.浪潮之巔的Web

  • web起源

    • 超文字標記語言

    • 超文字傳輸協議

  • 通訊

    • 共享記憶體通訊

    • socket通訊:需要IP和埠,但是不安全

    • web通訊:HTTP(80)、HTTPS(443)

    • HTTP報文段打包在TCP報文段中,放到IP層資料包中,形成鏈路層的幀,通過閘道器發出。

  • HTTPS

    • 對稱加密

    • RSA非對稱加密

    • 非對稱加密+對稱加密

    • 中間人劫持非對稱加密的公鑰

    • 數字證照

  • CAS

    • 共享session和共享cookie是比較侷限的做法

    • 認證中心:建立session、建立Ticket、重定向

    • 2次重定向,一次驗證Ticket

  • Token和授權

    • 返回授權碼

    • 根據授權碼獲取Token

  • 資料庫

    • 結構化查詢語句:SQL

    • 資料庫連結通道:需要緩衝區

  • Redis

    • 支援:key-value、List、Set、Sorted Set、Hash

    • 餘數演算法:根據key的hash取餘,對增加節點非常不友好

    • 一致性Hash演算法:增刪伺服器只會影響相鄰節點的快取資料

    • Hash槽(slot):CRC16演算法,對槽值取餘,增加節點可以做資料遷移,訪問重定向。

    • Redis Cluster:故障轉移、資料備份

  • 高可用Nginx

    • 多臺伺服器使用Keepalived形成master-slave結構

    • 對外只提供一個IP

  • 高可用Tomcat

    • Tomcat叢集

    • 負載均衡

    • 失效轉移:伺服器叢集的請求轉移,狀態資訊需要保留,可通過redis。

  • 高可用Mysql

    • 資料庫讀寫分離

    • 需要在一個分散式環境中,保持資料的強一致性。

    • 一master,多個slave結構。

  • 函式

    • 本地過程呼叫:所有呼叫都發生在本機內的一個程式中。

    • 遠端過程呼叫(RPC):客戶代理(Stub)接收引數,然後通過socket交給服務端代理(Skeleton)處理,把複雜的網路細節隱藏了起來。

  • 框架

    • 框架就是把功能單元抽取出來,形成可複用的東西。

    • 最佳實踐:系統架構設計、快取、效能、高可用性、分散式、安全、備份。

  • HTTP Server1.0

    • 接收HTTP Request,處理完.html後,把檔案通過文字方式傳送回去HTTP Response。

    • 需要建立HTTP層下面的TCP通道,這個連結通道是通過Socket建立的。比如:socket、bind、listen、accept。預設為80通道,一般也不會被防火牆攔截。

    • 此為單程式,容易阻塞。

  • HTTP Server2.0

    • 多程式併發

    • 程式切換消耗大量資源

  • HTTP Server3.0

    • select模型:

      • 一個socket連結是一個檔案描述符fd,是一個整數,fd背後是一個簡單的資料結構。

      • HTTP Sever和作業系統之間傳遞的是一個fd_set的資料結構

      • 作業系統檢測是否有資料,然後標記有資料的socket,最後喚醒HTTP Server執行。

  • HTTP Server4.0 epoll模型

    • 和select模型類似,都是作業系統檢測是否有讀寫資料socket,然後通知HTTP Sever遍歷1024個連結執行。

    • 不同的地方是作業系統只會告訴HTTP Server可以讀寫的socket,不用HTTP Sever遍歷所有socket連結。

 

 

4.程式碼管理的那些事

  • 人肉版本管理

  • 鎖定檔案:避免互相覆蓋

  • 允許衝突:退一步海闊天空

  • 分支:多版本並行

  • 分散式管理

 

5.我的程式語言簡史

  • Javascript

    • 瀏覽器端執行驗證而出世

    • XMLHttpRequest進行區域性重新整理

    • JSON字串

    • 前端三劍客:HTML、CSS、Ajax和JSON

    • Node.js服務其語言

  • Java和C的區別

    • Java有虛擬機器,抽象層遮蔽底層平臺的API

    • C語言一旦編輯就可以獨立執行,擁有獨立的程式和獨立的地址空間

    • Java編譯之後是.class,C語言預處理、編譯、彙編之後是目標檔案。

    • C語言是編譯時的靜態連結,Java時執行時的動態連結。

  • 程式語言

    • C語言是貼近硬體的系統級程式設計

    • VB桌面應用開發

    • Java適合後端程式設計,後端程式設計:負載均衡、災難恢復、快取、訊息、分散式、資料備份、搜尋等

  • 指令式程式設計和宣告式程式設計

    • 指令式程式設計就是對硬體操作的抽象

    • 程式設計師就是把複雜、容易產生歧義的人類自然語言編譯成精確的計算機語言指令。

    • 宣告式程式設計:代表是SQL

 

6.老司機的精進

  • 凡事必先騎上虎背

    • 世上沒有等完全準備好後才開始的事情,等你覺得完全準備好後,黃花菜都涼了。

    • 對於性格內向的程式設計師,很多時候你認為基本準備好了其實就夠了。

  • 碼農需要知道的“潛規則“

    • 上帝的規矩,區域性性原理:時間區域性性、空間區域性性

    • 坐飛機的怎麼和坐驢車的打交道

    • 拋棄細節:抽象

    • 我只想和鄰居打交道:分層,應用層、傳輸層、網路層、鏈路層、物理層。

    • 我怕等不及:非同步呼叫

    • 大事化小,小事化了:分而治之

  • 一名架構師的總結

    • 好奇心

    • 養成計算機的思維方式

    • 紮實基礎,融會貫通

    • 要透徹的理解一門技術的本質

    • 能寫漂亮的程式碼

    • 抽象的能力

    • 技術領導力

    • 對自己狠一點,開始寫作吧

 

7.《碼農翻身》讀後感

”碼農“是一個貶義詞,這個詞對於很多軟體工程師來說是一個準確描述。技術更新換代頻繁、社會發展迅速,使得軟體這個行業的工作者,很多時候都疲於奔命,沉寂在不斷更換技術的怪圈。而《碼農翻身》一書能幫助更多的”碼農“從技術本質上打破這個限制。

在《碼農翻身》一書中不僅能學到了程式、執行緒、CPU、硬碟、I/O裝置等計算機基礎知識,也學到了TCP/IP、socket、HTTP等通訊協議方面的知識。同時在應用程式設計方面和工作規劃上也有一定的參考價值,是一本很值得看的書籍。

從不同角度來看《碼農翻身》它描述了一個軟體工程師的職業生涯歷程,不管是對初學者,還是有一定經驗的積累者,都能提供指路的明燈。

 

相關文章