當前位置:
首頁 > 最新 > 計算機是怎樣跑起來的

計算機是怎樣跑起來的

今天講一本和計算機有關的入門讀物,作者是日本的矢澤久雄,自稱軟體藝人。我呢,大概用了8個小時把這本書認認真真的讀了一遍。作為一個入門級程序員,這本書給我的感覺是,「業界良心書」。作者用了大量的類比,採用已知去滲透未知的方法,盡最大的可能讓更多的讀者了解計算機和編程的原理,將有帶入感的場景和枯燥的知識合為一體,真的是面向人類在寫書。即便是從專業的角度看,也絕對稱得上是高級程序員寫出的文檔。更重要的是,這本書融入了作者對計算機和程序的理念,甚至是一種哲學思辨,如果你閱讀這本書,你一定能夠感受到更深一層的東西,感受到了那種嚴謹的工匠精神。

小聊一下日本這個國度。這些年,零零散散的,我也是讀了不少日本作者寫的書,接觸的日本文化也算不少了,能夠隱隱約約的感受到這個民族的氣息。精緻小巧、較真謹慎、謙虛內斂似乎是他們抹不去的標籤。那裡會不會是一個更「面向人類」的國度呢?也許是我的偏見。為了眼見為實,看來有必要到日本遊歷一番了。(話說區塊鏈的大牛們,最近是不是都跑到日本去了?)


A.基礎

計算機的三大原則

1.計算機是執行輸入、運算、輸出的機器;

計算機的硬體由大量的IC (Integrated Circuit )集成電路組成,引腳的電壓變化就會產生不同的信號方式。計算機還沒有發展到能通過自發思考創造出信息的地步。就算是現在火熱的人工智慧,同樣不具備自由意志的思考能力。只有輸入、運算、輸出成套出現,計算機才能執行任務。

2.程序是指令和數據的集合;

從最早的C語言,發展到C++(加入面向對象),再到後來的JAVA 和C # ,都沒能脫離指令和數據的範式。人類社會發展遵循一個底層邏輯,分工和細化,也即經濟學裡講的比較優勢。可以理解為分工和細化在計算機領域的實例。

3.計算機的處理方式有時與人們的思維習慣不同

01010101就是計算機的思考方式和邏輯。簡單,對就是這麼簡單的邏輯,生生造出了一個深遠影響真實世界的虛擬世界,靠得就是不同的組合排列方式。而對計算機來說,什麼都是數字。

計算機的構造

微型計算幾的基礎元件只需3個,CPU、內存和I/O. CPU是計算機的大腦,負責解釋、執行程序;內存負責存儲程序和數據;I/O是輸入/輸出設備的英文單詞縮寫,負責將計算機和外部設備連接在一起。中型和大型機也都是在此基礎上進行設備的擴展,其核心工作原理都是一樣的。

彙編語言/機器語言

彙編語言--就是根據表示指令功能的英語單詞起一個相似的昵稱,並將昵稱賦予給0和1的組合,這種類似英語單詞的昵稱叫做「助記符」,彙編語言即是使用助記符的編程語言。

構成機器語言的是二進位數,在彙編語言中,則使用十進位數和十六進位數記錄數據。機器語言是唯一一種CPU能夠直接理解的編程語言。


B.邏輯

順序、分支、循環

程序的流程可以分成三種:順序執行、條件分支、循環。

解決一切問題有一個通用的方法論:

明確和理解問題;

拆分和定位問題;【需要80%的精力分配,拆分轉換成容易解決的小問題】

提出解決方案;

總結問題(反饋)

編寫代碼也一樣,只要定義好事件的流程,就可以套用順序、分支、循環模式解決所有問題。

其中作者提到了結構化程序設計,其核心就是去除了GoTo跳轉指令,僅用順序執行,條件分支和循環表示程序的流程。

演算法Algorithm

演算法是程序設計的「熟語」,一旦了解了演算法就可以將自己的想法完整的傳達給計算機了。那麼什麼是演算法呢,書中給了例子。例如為了達到「計算出兩個數相加的結果」這個目的,就需要一次完成以下三個步驟:即「輸入數值」、「執行加法運算」、「展示結果」,像這樣的處理步驟,就被成為演算法。

這裡有幾個我們需要正三觀的幾個要點,放到這裡應該會很合適:

演算法中解決問題的步驟是明確且有限的;

計算機是機械地解決問題;

有一些套路,如典型演算法;

可以利用計算機的處理速度解決問題,即使是笨方法也無妨;

使用編程技巧可以提升程序執行速度;

數字間有規律可循;

寫代碼可能只佔很少的一部分時間,大部分時間是在尋找拆解流程的思路。

C.數據

有了演算法,接下來我們要有數據才能完成運算。

數據結構

變數,變數是數據的容器,其實質是按照變數所存儲數據的大小被分配到一塊物理的內存空間上。

數組,數組實際上是為了存儲多個數據而在內存上集中分配的一塊內存空間,並為這塊空間整體賦予了一個名字。

棧,採用LIFO( last in first out) 後進先出的數據方式。好比你往箱子里放玩具,最後放進去的,總是在下次玩的時候第一個被拿出來。

隊列,採用(FIFO first in fist out )先進先出的數據方式。好比排隊買火車票,先來的排在前面,買完票就先出去了。

(LIFO和FIFO,學過財務的同學可能對這個概念比較熟悉,和庫存管理中應用的概念是一樣的)

結構體,所謂的結構體,就是把若干的數據項彙集到一處,並賦予其名字後形成一個整體。一旦定義完結構體,就可以把他當作一種數據類型,用來定義變數。結構體中包含成員,可以為成員變數賦值,然後用表達式調用。

鏈表,是一種類似數組的數據結構,這個「數組」中的每個元素和另一個元素都好像是手拉著手一樣,只需在結構個體中添加一個成員,並指向另一個元素的地址。(在C語言中,把存儲著地址的變數稱為「指針」。簡單吧,認為難的,往往是不理解的。如果把時間戳 Timestamp加入其中會怎麼樣?)

二叉樹,帶兩個地址鏈接信息的自我引用結構體。自我引用的結構體就是以指針為數據類型的成員。把二叉樹簡單理解為有兩個指針的鏈表也可以。

面向對象

記得在學編程之時,總是聽到面向對象,面向對象,自己一臉懵逼的樣子還歷歷在目。面向對象無非是打包封裝,工具化的一個過程。減少你的重複勞動,模塊化,分工細化,外包。將對象的行為和操作內置於對象本身。使編程更加人性化,接近人的認知模式。帶來的好處顯而易見, 容易上手,開發效率和可維護性高,只要在對象內部做改動就好了。我想,有關「用戶故事」的學問應該也是伴隨著面向對象和在現實世界建模的方式一起發展起來的。

談到面向對象,就不得不提一下類和對象的區別。類就好比是做餅乾的模具,而對象就是餅乾本身。更形象點例子,狗是一個類,吉娃娃就是類的一種,這就是「對象是類的實例」常被提起的那句話的最好解釋。其中吉娃娃有名字,有顏色,有性別。這些就是對象內的變數。我們可以為這隻吉娃娃取名字叫哈尼,然後把哈尼賦值給名字這個變數,如此而已,簡單吧。

資料庫

是一個非常大的話題,就從技術角度來簡單說一下吧。有興趣的朋友可以延展閱讀我在簡書寫的一篇文章《Human Singularity》

資料庫主要分為關係型資料庫和非關係性資料庫,這裡主要講關係型資料庫。

書中提到,資料庫(Database)就是數據(Data)的基地(Base)。我們生活中無數不存在數據,把這些數據整理歸檔成表(Table)就形成了表格形式的數據。DBMS資料庫管理系統,就是管理這些數據的程序。SQL結構化查詢語言是用來操作數據內容的,其中CRUD,即插入、獲取、更新、刪除就是基本的操作。而在區塊鏈世界裡,只有CRW,一個歷史數據不可更改的資料庫。

資料庫系統的要素包括「數據文件」「DBMS」「應用程序」三部分。把三個要素全部部署在一台計算機上,稱作「獨立型系統」;把資料庫文件部署在一台計算機上,並且使數據文件被部署了DBMS和應用程序的多台計算機共享,這樣的系統稱為「文件共享型系統」;把數據文件和DBMS部署在一台或者多台計算機上,然後用戶從另外一些部署這應用程序的計算機上訪問,這樣的系統被稱為「客戶端/伺服器系統」。

隨著計算機網路科學產業的發展,數據存儲和使用更加多元化,針對不同的客戶需求和功能要求,各公司也都推出了自己特點的產品,比如amazon,青雲,阿里,京東,七牛等等。

這裡要提一下資料庫的規範化,所謂的規範化,就是將一張數據的大表分割成多張小表,然後在小表之間建立關係,以此來達到整理資料庫結構的目的。而且可以加入連接表(Link table),將多對多的關係分解成兩個一對多的相對簡單的對應關係。

D.網路發展

計算機網路的發展,離不開通信協議、數據加密技術和標記語言等技術的支撐。

TCP/IP協議

IP, 你可以把它看作主機在網路上的一個門牌號碼,在其下的區域網中,各個硬體都是你的「家裡人」,你的「家裡人」需要通過各自的「身份證」(MAC地址)來分配到動態的子網路地址,這樣你和你的家裡人就可以和世界上任何角落的計算機進行通信了。

TCP,是用於通過數據發送者和接收者相互回應對方發來的確認信號,可靠傳輸數據。這樣的數據傳送方式稱作「握手」(handshake),也就是把你要傳輸的數據內容打成小包,加上必要的信息並發送的過程。

加密

加密其實就是對數據進行再編碼的過程。

最早的加密技術是「對稱密鑰加密技術」也稱作「私密密鑰加密技術」。這種加密技術的特徵是在加密和解密的過程中使用數值相同的密鑰。這種技術並不適合於互聯網世界。

於是,上帝說世界需要公開密鑰,於是就有了公開密鑰加密技術,也就是非對稱加密。RSA演算法是目前在互聯網應用最為廣泛的公開密鑰加密技術。

數字簽名,你可以簡單理解成公開密鑰加密技術的反操作。人家用公鑰加密,我用私鑰加密,再用公鑰解密,最終做一個驗證,證明你所聲稱的那個,就是你聲稱的。有點意思吧!

至於說,有了加密技術就萬無一失了嗎?換個角度看,也就是在取捨權衡,放棄一點點安全感,能夠換來的不止百倍的收益。

XML/HTML

HTML是網頁標記語言,XML是數據傳輸語言,是元語言。通俗地說,HTML是給人看的,XML是給計算機看的。只是說,HTML中的標籤大都是預先定義好的,而XML是可以自定義的。

其中SOAP(Simple Object Access protocol )簡單對象訪問協議可用於分散式計算。所謂分散式計算,就是把程序分散部署在用網路鏈接起來的多台計算機上,使這些計算機相互協作,充分發揮計算機整體的計算能力。簡單地說,SOAP就是使運行在A公司計算機中的A程序,可以調用運行在B公司計算機中的B程序。對,這就是應用在BC領域的分散式計算,10多年前就有的技術哦。


結尾:

在全書的結尾,作者談論了計算機技術領域的從業者的職業走向。To SE or To 程序員?這是一個值得思考的問題。

程序員,沒什麼好說的,寫代碼,做用戶故事。在我看來,是一個不斷長胖的過程,在自己擅長的領域不斷拓展自己的寬度,最終變成一個領域的大木桶--技術大牛。

SE系統工程師,在進行業務信息化時,負責調查、分析業務內容,確定計算機系統的基礎設計及其詳細規格的技術人員;同時,也負責系統的項目管理和軟體的開發管理、維護管理工作。由於主要的工作是基礎設計,所以不同於程序員,SE需要具備從硬體結構,軟體的構建方法乃至橫跨整個業務的廣泛知識以及項目管理經驗,是一個不斷長高的過程。

這本書給我們搭建了一個計算機世界的基本框架,讓小白和剛入門的人形成了一個知識體系的大網,誠然這張網的網眼很大很大,所以那留出來的空白就是需要我們自己去編織的部分,那同樣是人生的樂趣所在。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 全球大搜羅 的精彩文章:

一大早刷屏的「新世相營銷課」,到底是怎麼回事?
我的母親老了,而我才開始懂了她

TAG:全球大搜羅 |