1. 程式人生 > >計算機是怎樣跑起來的

計算機是怎樣跑起來的

時間開銷:

共計12h

閱讀+隨手記

181107: 2h
181108: 0.25h+3h
181112: 1h+1.5h+1.5h
小計:9.5h ~ 10h

總結+進階計劃

181112:2h

分章節筆記

00 序言

本書2003年出版,2015年5月譯版第1版
如果僅僅把技術當作一個黑盒, 只把時間花在學習其表面上, 而並沒有探索到其本質, 就絕不應該認為自己已經“懂” 了。
即便面對的是複雜的最新技術,一旦把它們迴歸到計算機的基礎知識上, 就變得可以輕鬆理解了。
本書目的是為了瞭解有關計算機技術的知識範圍,掌握其基礎中的基礎知識。
全文共計12章:

  • 01:計算機基礎中的基礎(三大原則)
  • 02-03:計算機組成原理(CPU構成)+彙編(手工彙編)
  • 04-07:演算法與資料結構(經典演算法+陣列棧佇列連結串列樹)+程式設計(程式執行流程+面向過程or面向物件)
  • 08:資料庫(表、欄位、索引、主鍵、關係、事務)
  • 09-11:計算機網路(TCP/IP)+加密(對稱加密or非對稱加密)+資料傳輸格式(XML擴充套件標記語言)
  • 12:整個系統構建過程和目標

01 計算機的三大原則

181107:2149:所謂編碼,就是把資訊數字化成計算機能夠理解的數字,根據不同的編碼方式,計算機儲存需要的位元組數不同;用於表示字元的數字就是“字元編碼”,用於表示顏色的數字就是“顏色編碼”;編碼就是一種數字化的標準or方式,比如單漢字GBK下2位元組,UTF-8下3位元組;如果說Linux系統中所有都是檔案的話,那麼計算機中所有都是數字;計算機=輸入+運算+輸出;程式=指令+資料;指令和資料都是數字,一組指令可以理解為函式,資料可以理解為變數;所謂編譯,就是把各種不同程式語言寫的程式碼轉換成計算機能夠理解的機器語言(原生語言-數字);計算機進化的方向是為了與人類越來越接近,擯棄計算機中不符合人類思維習慣的地方;面向過程程式設計->兩種程式設計方法,面向元件程式設計CBP和麵向物件程式設計OOP(更接近人類的思維習慣)。

02 試著製造一臺計算機吧

181107:2238:這章講的大部分內容基本都是之前沒看過的,偏底層硬體,只看到了各種引腳連線,把CPU、記憶體、I/O給串起來,但是到底怎麼串的,以及各種物理電學常識都忘了。通過手工繪製電路圖連線,對整個CPU的構造有了一些瞭解,非常細緻,通過撥動CPU上的按鍵開關手動輸入機器語言一行一行的輸入程式碼。機器語言的語法十分簡單,就是指令+資料,指令和資料則是根據儲存的記憶體地址+指令or資料本身,告訴CPU在哪兒做什麼。對於不做硬體的來說,要深入理解的主要還就是二進位制,時鐘訊號,0/1,Hz是用來表示驅動CPU運轉的時鐘訊號的頻率,1秒鐘發出1次時鐘訊號就是1Hz。

進階書:計算機組成原理(是時候複習一下了)

03 體驗一次手工彙編

181108:0958:總的來說這一章的知識比上一章容易理解,主要是之前上了計算機組成原理的課,對於暫存器、組合語言有一定的瞭解,這章把機器語言清晰的解釋了一遍,更理解底層的實現機制了,很不錯,不過掌握程度不是很高;每個彙編符號都是在CPU的資料中能夠找到,每個指令都有對應的機器語言二進位制程式碼,以及對應執行該指令需要的時鐘週期,每個CPU的Hz頻率表示的就是每秒能夠執行多少個時鐘週期,通過對指令需要的時鐘週期進行累加,就能夠計算程式所消耗的時間。組合語言的語法只有一個,把標籤、操作、運算元寫在一行中,標籤的目的是為該行程式碼對應的記憶體地址取一個名字;程式的執行重點是幾種暫存器,其中PC暫存器儲存著下一行指令的記憶體地址,是控制整個程式執行流程的重要暫存器;(2)表示地址編號;組合語言的一行指令能夠翻譯成多少位元組的機器語言取決於指令種類和運算元的個數(其實也就是CPU資料上怎麼寫就怎麼對應)

進階書:編譯原理(這書說實話雖然買了但幾乎沒看,太偏底層而現在業務開發很少直接用到,但如果想要了解底層實現各種感覺還是要好好看一下)、程式設計師的自我修養——連結、裝載與庫(對各種靜態、動態編譯瞭解不深刻,這本書貌似很經典,想看)

04 程式像河水一樣流動著

181108:2107:程式的流程到根本只有3種:順序、條件、迴圈,如果看到更底層的硬體層面,其實可以把迴圈和條件歸為一類,條件是跳轉到另一個地址,而迴圈則是跳轉到之前出現過的地址;寫程式之前可以先簡單畫大概的流程圖,其實就等價於演算法,不過演算法可能還需要更加細緻;流程圖主要使用的就是圓角矩形表示開始結束、矩形表示操作、菱形表示條件、箭頭和連線表示執行的順序流程;所謂程式塊就是程式碼的集合;所謂結構化程式設計,就是隻具有順序、條件、迴圈,而沒有goto等所謂跳轉,因為goto這種跳轉命令用得不好就會導致整個程式執行的邏輯複雜、難以理解,而僅僅根據已有的3種流程已經能夠組合出所有想要的程式需求了;幾乎所有的程式都可以分為初始化處理+迴圈處理+收尾處理這三個過程;兩種特殊的流程,中斷和事件驅動,嚴格的說他倆都是條件的一種,中斷突然類似來了個電話,解決之後又再回到原本的任務中來,事件驅動則是類似通知,接收到某個通知之後,改變當前的狀態;事件驅動主要用於GUI程式的編寫,更適合使用狀態轉換圖or狀態轉換表來進行描述。

進階書:程式設計相關——程式碼大全&程式碼整潔之道&程式碼之美(很經典,而且貌似很細緻,想看)、HeadFirst設計模式(講解了多種設計模式,看名字感覺對小白也比較有愛)、設計模式之禪(據說很經典,想看)、領域驅動設計(據說很經典、想看)

05 與演算法成為好朋友的七個要點

181108:2133:所謂哨兵就如字串的末尾用\0表示,連結串列的末尾用-1表示的這種特殊的資料,之前見過一些使用哨兵的技巧,但是不知道這就是哨兵;計算機程式的演算法必須是步驟明確且有限的;計算機只能機械的解決問題,雖然有時候解決問題的方法比較複雜,但考慮到計算機的執行速度極快,利用好了也可以執行非常簡單的演算法;一些主要的典型演算法是必須要掌握的:輾轉相除法(求最大公約數,求最小公倍數就用兩者相乘除以最大公約數)、埃拉託斯特尼篩法(求某個數是否是素數,直接直覺的從2除到該數的平方根即可)、查詢搜尋的順序、二分、雜湊,排序的冒泡、快排;解決同一個問題可能有多種演算法,而其中執行速度快的、佔用空間少的演算法當然更為優秀,要善於利用程式設計技巧(如哨兵)、數字規律(公式or特殊規律)等來優化演算法,減少執行時間;善於使用流程圖or虛擬碼先把演算法寫出來,想清楚之後再開始編碼。

進階書:演算法導論(講演算法中堪比聖經了吧,不過貌似比較難理解)、演算法第4版(據說這個作為演算法入門比較不錯)

06 與資料結構成為好朋友的七個要點

181108:2156:這章可以說是自己第1個能夠把3個問題全部回答出來的章節了,整體就是在講資料結構的東西,陣列、棧、佇列、連結串列、二叉樹,這幾種基本的資料結構,算是簡單的複習了一遍,還有C結構體的概念;其中棧和佇列有個特性是說,經常用於不能立即處理的資料,進行快取,感覺就是訊息佇列kafka的核心了。陣列是最基礎的資料結構,其他的資料結構都是基於陣列進行的變種,因為陣列這種分配連續一塊記憶體空間地址的方式,與計算機物理分配記憶體一致。這章還算比較友好,不過相對的學到的新東西其實也少了。

進階書:資料結構(可以複習複習,其實資料結構和演算法密不可分,看上面的基本就OK)

07 成為會使用面向物件程式設計的程式設計師吧

181108:2234:算是複習了一下面向物件程式設計和麵向過程程式設計的最大的不同點和特性,主要就是類、繼承、封裝、多型,繼承顧名思義就是繼承類,封裝則是把類中的屬性和函式設定為private不讓外面呼叫,形成一個封閉的盒子,多型則是對於同一個訊息,不同的物件能夠進行不同的操作;類和物件的關係,類是物件的定義,物件是類的例項;裡面比較新的是對UML統一建模語言的介紹,九大圖,之前有看到過,但是沒有去搜,這裡看到了很不錯把面向物件程式設計作為一種能提升程式設計效率、寫出易於維護的程式碼的程式設計方法, 在適當的場合實踐面向物件程式設計;使用類有3種情況:一個是繼承該類定義新類、一個是呼叫該類持有的個別成員(函式)、一個是在類的定義中使用其他類。考慮python,它既是一種解釋型指令碼語言,也能夠支援使用面向物件程式設計的思想,重點是在什麼情況下使用面向過程,什麼情況下使用面向物件。

進階書:面向物件相關(和前面程式設計相關結合看,基本上講程式設計的都會說到面向物件程式設計)

08 一用就會的資料庫

181108:2302:資料庫這個,之前也是上過課的,整體來說,由於這本書03年寫的,肯定有一些技術有點滯後,特別是對近幾年火的非關係型資料沒有進行探討,不過這裡對關係型資料庫的介紹還算不錯,如何對關係型資料庫進行拆表、主鍵、外來鍵、CRUD、資料庫事務的原子性操作、SQL語句,Visual Basic 6.0中以前用過的ADO資料物件,用於處理和資料庫的互動的類;任何語言都有能夠和資料庫互動的資料物件,基本操作就是:程式開始時建立連結,進行CRUD操作,結束時關閉連結。

進階書:關係型資料庫(MySQL、Oracle)、非關係型資料庫(MongoDB、GraphDB、Redis、NoSQL精粹)、分散式資料庫。(這部分的書暫時還沒有找好,不過根據想要了解的某種資料庫,比較經典的書應該也是比較好找的)

09 通過七個簡單的實驗理解TCP/IP網路

181112:1019:所謂協議,就是一種通訊標準,對資訊傳送方式的規定or約束;從底往上,網絡卡(LAN內的MAC地址在網絡卡上)-網絡卡驅動程式-IP層(LAN外的IP地址)-TCP層-應用程式(FQDN,主機名+域名);LAN中,MAC到IP的轉換,由ARP地址轉換協議規定,路由器通過廣播詢問某個IP的MAC地址是誰,該主機應答後,在路由器中記下ARP快取表,定時詢問更新快取;LAN中IP地址地址的分配,包括路由器的IP地址的分配由DHCP協議(伺服器)搞定,服務端記錄可用的IP池,客戶端申請時自動分配可用的IP地址給主機;LAN中,FQDN和IP的轉換,則由DNS伺服器搞定,實際上內網中各自主機的轉發用不到DNS,如果路由器發現數據包目的IP就在LAN內,則直接轉發,如果目的IP和源IP不在同一個LAN內,則需要通過路由器轉發;網路中的傳輸都是通過IP來標識資料包定址的,域名只有上升到應用程式的時候才考慮,但其實每個LAN都有一個域名,每個LAN內的主機也有一個主機名,組合起來的FQDN就是域名,也可以唯一標識一臺主機;MAC地址由兩部分構成,製造廠商的編號+廠商內部的編號;子網掩碼的作用是為了標識IP地址的網路地址部分和主機地址部分。windows下檢視一些資訊的命令(linux可能也有同名命令):

  1. ipconfig /all :可以檢視主機MAC地址、IP地址、主機名、子網掩碼、預設閘道器(路由器IP地址)等
  2. route print :輸出路由器的路由表,5列構成:目的IP+子網掩碼+路由器IP+介面+距離
  3. tracert FQDN :跟蹤路由路徑,訪問某個網站的路由路徑資訊
  4. nslookup :構造DNS請求資料包,檢視響應結果
  5. arp -a :檢視路由表ARP快取資訊,對應的MAC地址和IP地址。

進階書:計算機網路(經典課本,感覺可以複習複習)、圖解TCP/IP第5版(這本書講解風格比較容易理解,適合入門,之前沒看完)、TCP/IP詳解卷1-3(差不多是類似聖經,經典必看了,裡面的內容比較深入、底層,把程式碼的實現細節都寫出來了,感覺理解起來有一定難度)、UNIX網路程式設計卷1-2(一直很想看完的書,但是一直沒看完……)、HTTP權威指南(也是經典必看,做網路必須要深入瞭解HTTP協議原理)、Linux鳥哥私房菜基礎學習篇+伺服器架設篇(考慮到大多數網路伺服器都是在Linux系統下,而且有很多網路相關的命令,深入瞭解Linux也是做網路的必備工夫)

10 試著加密資料吧

181112:1626:整體來說這章的內容還是比較淺顯,只是對對稱加密和非對稱加密稍微講了講,介紹了下數字簽名,是公私鑰對的簡單應用。還是比較簡單,如果涉及到證書驗證之類的可能會比較難一些。不過也從側面說明這部分自己掌握得還算不錯吧。合理的金鑰應該滿足如下條件: 長短適中、 可以反覆使用、 可以通過某種通訊手段交給接收者, 並且通訊雙方以外的其他人難以用它來解密。

進階書:加密與解密(一直想看,結果沒看)、HTTPS/SSL/證書相關(書還沒找,但一直想深入瞭解其原理,現在做網路繞不開加密了,加密流量越來越多,非常需要深入瞭解,進一步可能需要了解一下區塊鏈技術)

11 XML究竟是什麼

181112:1707:XML其實是一種標記語言的源語言;標準的XML由3部分組成:XML宣告+DTD/XML schema+XML主體,宣告定義這是一個XML文件,類似檔案頭部,DTD/XML schema嚴格定義XML文件中能夠使用的標籤及資料及資料位數型別等,主體則是XML傳輸的資料內容;XML可以應用到任何領域,只要是想要為資訊標記含義的應用場景;但是XML是通用的,但並不是萬能的,在例如網際網路or分散式計算等需要多個不同標準格式的主機之間傳輸資料時,作為通用的資料格式,XML非常有用,但是如果所有的主機都是同一個廠商的,其實使用廠商內部定義的格式更為高效並節約記憶體;相對於XML,csv格式的檔案沒有定義資料資訊,而是隻傳輸了資料本身,更為節省記憶體,另外csv檔案格式傳輸字串的時候使用雙引號包含起來,可能內部的逗號就不會被認為是分隔符;由於XML可以使用於多個領域,而且標籤是可擴充套件的(即任意指定),肯定會存在同形異義的情況,所以有xmlns屬性作為命名該標籤的名稱空間,明明空間的指定一般使用URI,這樣能夠全世界唯一標識該XML使用的命名檔案,這樣如果存在標籤的同形異義,就不會誤會了(名稱空間的名稱其實可以任意寫);用於解析XML的程式有很多,DOM、SAX其實都是一種解析標準,很多編碼語言都已經實現了XML的解析庫,直接呼叫即可。這裡也是沒有介紹新技術HTML5,畢竟2003年HTML5還沒有出現。

進階書:資料傳輸格式貌似沒什麼可進階的,不過如果考慮到XML大量應用於Web開發的話,Web開發相關的進階技術棧就非常多了;之前做過一些網頁前端開發的東西,對HTML/CSS/JS/XML/DOM等相關的技術有一定了解,不過並不深入,後續有需要的話可能會進一步學習,不過感覺還是對後端更感興趣一些。

12 SE負責監管計算機系統的構建

181112:1741:這裡說的SE系統工程師,感覺是把產品經理和技術經理結合起來了,或者說就是在人少時候的技術經理,需要懂一點技術,而且能夠和客戶溝通需求,既要求溝通能力也要求技術能力;簡單介紹了軟體開發時最簡單的瀑布模型,基本就是按照順序進行的階段,每個階段具有其具體的輸出文件;所謂設計就是拆解(最好使用面向物件進行拆解,這樣當現實世界進行變化的時候,可以通過只改變那一個物件而進行順利過渡),所謂編碼就是整合(通過從小到大的編寫模組單元測試,最終整合成一個系統進行整合測試);拆解的程式設計方法,根據拆解時候關注的事物不同,可以有不同的方法,但是究其根本的原則,還是順延計算機的三大原則,輸入運算輸出、符合計算機處理方式的設計原則,更適合計算機程式設計;系統的可用率計算,當多配置一臺機器,其裝置可用率就能夠從90%上升到99%,這個在數學之美里面也看到過,很神奇,但數學就是這樣。

進階書:如果從技術的角度,這部分的進階應該就是軟體架構相關了。軟體架構的藝術(據說很經典)、大型網站技術架構:核心原理與案例分析(之前看過,但是影響不深刻,而且這本書可能已經比較舊了)、大規模分散式系統架構與設計實現(一直很想了解分散式相關的東西,想看)

全書總結:

181112:1749:整體花了近10h看完這本書,雖然其實是一些很基礎的知識介紹,但是也有一些說實話是之前都沒有了解過的完全全新的內容,差不多佔10%左右,還有一些內容是之前瞭解過,但是並不是很熟練然後相當於是複習加固了一遍,感覺還是不錯的。這是整理程式設計書籍之後看的第一本書,希望今年能夠把計算機的基礎重新複習加固一遍,很多東西其實自己真的沒有掌握很好的,無論怎樣,打好基礎是很重要的。
這本書的優點是講解十分淺顯易懂,感覺即使是完全的小白也能夠理解大概;但是缺點是有些內容可能有點點過時,經典的原則、那些基礎中的基礎當然具有漫長的宣告週期,但是有些新技術其實應該加入到裡面來的,而沒有加入,作為打基礎感覺欠缺了一些新技術的介紹。

無論是想要複習的、新學習的方向進階書都太多了, 準備還是先把基礎看完、整理、複習OK之後再慢慢往上。
暫定閱讀計劃順序:

  1. 程式是怎樣跑起來的(和本書同一個作者,不過是2001年寫的,會有一些重複的內容,不過也有一些本書沒有覆蓋到的)
  2. 網路是怎樣連線的(這三本書是同一個系列的,總是成套賣,還是比較經典的,想一次性看完)
  3. 程式設計師的自我修養——連結、裝載與庫(很想把編譯這塊沒有了解的弄明白)
  4. 編譯原理(這本書感覺會比上面這本難,所以先看上面這本打個底)
  5. 程式設計師的數學(看完編譯原理看這個放鬆一下)
  6. 作業系統概念(算是複習一下)
  7. 七週七語言:理解多種程式設計範型(接觸過的程式語言也算是有一些了,可能現在看這本書會比較有感覺了)
  8. 多核程式設計入門(之前一直不太瞭解多核、並行、分散式這堆東西,想看看了解下)

這些是已經下載好準備看的計算機基礎概念相關的書了,不知道19年之前能看到第幾本,爭取堅持每天看2h吧。