“ 從現實世界的角度看計算機,可以幫助我們更清晰的學習計算機領域的知識。
本文試圖用生活中常見的事物來解釋計算機技術領域,讓知識更通俗易懂 ”
這篇文章的閱讀對象是計算機專業在讀及剛進入工作一年左右的的同學,文章措辭也許不太嚴謹,主要目的是為了讓大家更容易了解。
一、 便利店背後的“系統”
“系統” 這個詞不隻是可以用在計算機領域,日常所見到的便利店、超市、商場也可以稱之為一個系統。參照現實生活中的系統,我們可以更容易的了解計算機系統。
UI
便利店的門面、裝修、售貨員、貨架,一切你所能看到的外在就是UI。
UI,英文全稱是 User Interface,中文名是 使用者界面,UI是一個系統最接近使用者的地方。
對于一個便利店來說,UI很重要,它決定了你消費體驗是否良好。一個長得漂亮聲音好聽的售貨員小姐姐一定會讓你對便利店增加幾分好感。比如說,像這樣:

但這并不是核心,你進便利店的核心是你要買到你想要的商品。對于軟體來說,核心就是功能、資料以及服務。如果在你樓下隻有一家便利店,即使它再不堪,有賣你想要的商品,你也會光顧它。但是有兩家便利店,你可能會更願意光顧環境更好的那一家。
隊列
當你到店裡買東西準備結賬時,在收銀台前面站了好幾個人,這時候你就需要排隊等候,這在計算機領域叫做隊列。隊列應用非常廣泛,它可以削峰填谷。
樓下這家便利店裡可能上午下午都沒什麼客人,但是中午人非常多,而便利店隻雇傭了一個售貨員,上下午都很清閑,但是中午又忙不過來。
這種情況下,再雇傭一個售貨員顯得有點資源浪費。那中午忙的時候,還是讓客人排隊等吧,雖然隻有一個售貨員,但她可以一個個接待客戶,雖然處理慢一點,可能接待完所有客戶要到下午了,但是下午并不會有多少新客人到來,這就是削峰填谷。
消息隊列在計算機中有着大量的應用,例如Windows系統上的軟體,你的每次滑鼠點選是發送到一個隊列中,排着隊交給你開發的軟體進行處理的;在伺服器的軟體系統和軟體系統之間,為了避免兩個系統的處理性能差異太大,也會在中間加入一個消息隊列中間件,避免請求太多導緻系統無法承受壓力而崩潰。
資料庫
接着,聊聊核心: 商品,商品是由工廠生産的,生産好了之後會先放在工廠自己的貨倉,這裡就可以把貨倉了解為計算機領域中的資料庫,資料庫裡存放着我們想要的資料。
資料是資訊時代的石油,不管是電商、遊戲、社交還是其他軟體,使用者使用了它就會産生資料,對于網際網路企業來說,資料就是他們最寶貴的資産。一旦一家網際網路企業出現資料丢失、資料洩漏,他們将面臨着重則破産倒閉的風險。
資料可以提取出非常多有用的資訊,例如最近幾年流行給家裡安裝上智能門鎖,可以通過指紋、刷卡甚至是刷臉開門。一旦出現陌生臉龐出現在家門口,智能門鎖可以通過網際網路發送消息到你的手機上。這麼一把鎖,經過家人每天開門關門,會産生很多資料,通過這些資料,我們可以分析出家裡一共有幾口人、性别、出門時間、家裡有沒有人等等資訊,除了通過鎖擷取的資料以外,還可以結合家裡其他的智能硬體所采集的資料,這些資料融合在一起可以分析出更多的資訊,這些資訊可以給其他行業提供有效依據,而一旦落入非法分子手裡,後果不堪設想。
而資料的形式也是多樣化的,有結構化和非結構化之分,有文字、圖像、文檔、音頻和視訊等等,基于不同的資料形式,就會有不同的資料存儲方式,也就有了各種各樣的資料庫和檔案系統,以及處理這些資料的開發包,例如處理音視訊的ffmpeg。
緩存
前面提到,商品由工廠生産,并且通常會存放在工廠自建的倉庫裡。但是工廠一般離我們居住的地方很遠,我想不會有人願意買一瓶醬油還要打車去。為了提高效率,工廠會通過物流把商品分發到各地方經銷點的倉庫,通過這個倉庫中轉再把商品送到各個商店的倉庫,而店員會把商品擺在貨架上。
現實世界中的物流在計算機領域可以了解為資料通過網絡傳輸,而各級倉庫和貨架可以了解為緩存。
網絡傳輸我想大家應該都能了解,緩存則是一種為了加快我們擷取商品的機制,它同時也能減輕工廠自己倉庫空間占用的壓力。
計算機中,哪些地方用到了緩存呢?
浏覽器中就有緩存,為了提高網頁的加載速度,浏覽器可以将網頁直接下載下傳到本地電腦,在下一次通路這個頁面時,浏覽器就不會重新到伺服器去請求頁面,而是直接使用本地的網頁展示給使用者,但網頁中的内容資料還是需要每次從伺服器中擷取最新的。
記憶體條也是一種緩存機制,還有CPU自帶高速緩存。我們日常購買到的電腦,通常硬碟從128G到1T不等,而記憶體隻有4G、8G和16G。在軟體運作的時候,軟體會将代碼和資料從硬碟中讀取出來暫存在記憶體中,并在記憶體中進行處理。硬碟比記憶體更低廉,但存取資料較慢,就像工廠一般建在郊外,它的用地成本一定是比開在市區的便利店來的便宜。但便利店離你更近,到便利店買東西要比直接去工廠拿貨效率更高。
為了進一步提高性能,CPU還内置了高速緩存。CPU計算時可以将資料從記憶體中加載到高速緩存,再由CPU進行處理。計算機中這一步步的性能優化,其實與我們現實生活中提高效率的方式是如出一轍的。
二、 人是一個“計算機系統”
計算機一直在向一個取代我們人類的方向發展,是以我們人類所擁有的一些特性可以在計算機領域找到相應的學科,我們從人類身上可以看到很多如今非常流行的IT技術領域的身影。
人類有哪些特征呢?
我們人類有軀殼也有靈魂,軀殼上有五官也有四肢。
我們通過感官來接收外部環境的變化,我們可以聽到早晨的鳥叫,聞到花兒的芬芳,看到多姿多彩的世界,感受四季溫度的變化;我們依靠四肢做出執行動作,可以跟着音樂扭動身姿,可以在清晨的陽光下奔跑,可以單手把女朋友舉高高。
除了這些零部件以外,我們還有一個非常強大的大腦,它存儲了我們的所有往事記憶,它能幫助我們在遇到問題的時候做出決策,并對我們的四肢下達執行指令。
根據上面描述人類的特征,接下來我們在計算機世界裡尋找到相應的技術領域。
軀殼 / 靈魂 · 硬體 / 軟體
人類擁有軀殼和靈魂,在計算機領域中,對應着軟體和硬體。相信不少同學都聽說過 “ 軟體是硬體的靈魂 ” 這句話。我們人類的靈魂需要依托于軀殼,同樣軟體也必須依賴于硬體。
電腦、手機在我們日常生活中已經非常普及,我相信軟體和硬體的概念自然不必多說。
感官 / 四肢 · 物聯網 / 邊緣計算
人類擁有眼睛、鼻子、嘴巴、耳朵、皮膚,這些是我們的感覺器官,我們依靠這些器官來感受外部環境的變化。
眼睛:通過眼睛我們可以觀察周邊環境,在計算機領域中,眼睛的替代品是攝像頭
嘴巴:嘴巴裡有舌頭,舌頭賦予我們味覺能力,在計算機領域中,也有電子舌,但是這類硬體我工作至今也沒有見到過,普及率比較低
鼻子:鼻子是嗅覺,網絡上是有電子鼻這種東西,我也沒有見過,可能商業上應用場景太少
耳朵:借助耳朵我們可以聽到聲音,這個在計算機裡的替代品大家生活中很常見,就是話筒
皮膚:皮膚下的神經可以令我們感受到冷暖、痛覺,計算機領域裡有溫度傳感器,可以檢測環境溫度
除了上面提到的器官,我們人類還有比如平衡感、空間感,在計算機領域均能找到相應的傳感器,并且傳感器的種類遠超人類所擁有的感官數量。
這些感官、傳感器是輸入裝置,和滑鼠、鍵盤一樣,是向系統輸入信号的裝置。
而人類的四肢,則是輸出裝置,就像音箱、顯示器一樣。
這些外設組成了我們人類的軀殼(内髒我就不提了,知識淺薄實在舉不出例子)
而上面提到的傳感器就是物聯網感覺層的内容(不巧,正是在下從事的領域)
光有傳感器還不夠,人類感官是僅僅是感受外部環境變化,它還需要将這些資訊傳輸給我們的大腦,大腦來做出判斷,冷了要加衣,熱了要減衣。對應上圖,人類體内用于傳輸信号的神經就是對應于計算機領域的網絡。
目前計算機領域的網絡多種多樣,大家常見的有藍牙、2G、3G、4G、WiFi,以及這兩年推廣的5G,其他的還有485有線傳輸、紅外、Lora、NBIoT無線網絡等等。
大腦就是應用層,為了思考問題、處理問題而存在。但是我們大腦比較進階,能夠思考不同領域的問題,而計算機領域的應用通常隻能處理一個領域的問題。
雖然說大腦負責我們人類的問題思考、處理計算,但并不是所有事情都交給大腦處理的。我們身體是有條件反射的,例如膝跳反應。當用小棒槌敲打膝蓋時,我們的腿會不受控制的自然彈起,而且我們的大腦似乎毫無意識,事實上,這個動作并不是由我們大腦控制完成的,而是由脊髓控制的。
從敲打膝蓋那一瞬間,信号如果是通過我們的神經傳輸到大腦,傳輸也是需要時間的,經過大腦再來處理和下發指令控制,那就是不是條件反射了。而脊髓來處理這些簡單的信号則更快。
再舉一個例子,
作為無脊椎動物中智商最高的一種動物,章魚擁有巨量的神經元,但有60%分布在章魚的八條腿(腕足)上,腦部卻僅有40%。
逃跑、捕獵時異常迅速,八條腿明明白白,從不纏繞打結,這得益于章魚類似分布式計算的“多個小腦+一個大腦”。
這在計算機領域裡叫做邊緣計算。
用人類、章魚這種個體來描述物聯網,格局上顯得還是有點小的。格局如果上升一下,我們把一個園區、一個學校、一座城市來代替人類,在城市的各個角度部署各類傳感裝置,是不是我們就能感覺到整個城市了呢?大家在馬路上、街道旁是不是見過有很多的攝像頭
大腦 · 雲計算 / 大資料 / 人工智能
最後我們來詳細聊一聊大腦。
大腦是我們人類最重要的組成部分,它幫我們存儲記憶、邏輯運算、做出決策,并且還具備學習能力,能夠根據以往經驗來解決當下的問題,甚至對未來不确定的事物做出預判。
對應于計算機領域就是目前最火熱的就是雲計算、大資料和人工智能。
雲計算
雲計算是一個技術領域,也是一種商業模式。
從技術角度來說,雲計算其實就是一堆伺服器組成一個叢集對外提供服務。對于使用者來說,使用者看不到背後那龐大的伺服器叢集,他可以随意使用而不用擔心伺服器資源不夠,隻需要付錢就可以了。
而雲計算也是分層次的,有IaaS、PaaS和SaaS。
IaaS提供的服務是基礎設施服務,基礎設施包括網絡、CPU、記憶體、磁盤等。使用者根據自己的需求可以購買不同配置組成一個伺服器,隻需要通過界面操作,而不用手拿螺絲刀自行實體安裝。
PaaS提供的是平台服務,PaaS是建立在IaaS基礎之上的服務,平台服務通常是提供給開發者使用,開發者可以利用平台提供的開發工具、開放接口、SDK,來完成自己的應用程式。
SaaS提供的是軟體服務,SaaS就非常接近我們的日常生活,例如微信、QQ、網易郵箱,大家隻需要開通一個賬号就可以使用。
從商業模式角度上來說,雲計算是一種購買服務的方式。在雲計算之前,我們配置一台伺服器需要自行選配伺服器品牌、記憶體、CPU等等,托管到營運商的機房。現在則是按需購買,你可以按月、按年,甚至是按使用量進行付費,可以随時任意的升降配置。就像家裡的水電一樣,你隻管用,付錢就行,這對企業來說其實降低了不少成本。因為雲計算于企業就像水電于家庭一樣,做IaaS的雲計算公司是非常賺錢的。
其實雲計算也算不上什麼橫空出世的新興技術,一些技術在很多年前就出現了,隻是到近些年才爆發,而在爆發期就會發展很快,在技術上、概念上都會進行大幅度更新。
大資料
人類的大腦存儲記憶還是有限的,目前人類大腦開發程度還很低,并且記憶會随着時間推移逐漸淡忘,同時人類大腦也難以在短時間記錄大量資訊。
大家都知道,電腦靠硬碟存儲資料,常見的個人電腦硬碟通常配置最高應該是在1TB。在網際網路時代,幾乎全球人類都在使用網際網路,每天都在産生資料,到了物聯網時代,裝置也連接配接入網,裝置産生的資料遠比人類産生的資料來的更多,并且裝置數量也将遠超全球人口數。前面說到,資料是資訊時代的石油,這麼多石油,靠普通硬碟是肯定無法存儲的,那應該要用什麼存儲呢?
存儲就是大資料領域要解決的基本問題,解決方案就是采用分布式存儲,一個硬碟存不下,那麼就在多個硬碟存儲嘛,這個在以後我們在深入介紹。
解決存儲問題之後,還要解決計算問題。在前面提到,資料存儲在硬碟上,計算時将會加載到記憶體中由CPU進行計算處理。
這麼多的資料,要做計算恐怕一個記憶體條和一個CPU不一定能跑得起來吧?
同樣的,這個計算也是大資料領域解決的問題,解決方案就是采用分布式計算,一個CPU不夠,那就用多個CPU嘛。
而這些硬碟,CPU,記憶體從哪裡來呢?就是由雲計算來提供支撐。
人工智能
有了雲計算和大資料來提供海量資料存儲和計算能力,網際網路、物聯網來産生大量資料,人工智能發展速度也進而加快了。
在沒有AI的時候,我們編寫程式需要考慮到所有情況,根據不同情況進行不同的處理,把這些輸入和輸出的對應關系都通過代碼固化在系統中,也就是我們應該在前期詳細的告訴計算機應該如何處理。
這與我們人腦的智能程度相差甚遠,嚴格來說,這并不智能。
人腦可以通過學習,對一些未知的事物進行預判。這就像是一個函數,在沒有AI時,我們需要明确什麼樣的輸入産生什麼樣的輸出,而使用了AI,則隻需要提供足夠的樣本資料讓它學習,它能夠自動建立輸入與輸出之間的關系。
目前在哪些應用場景可以展現AI帶來的優勢呢?
前面我們提到,物聯網中的感覺層可以采集各種各樣的資料,通過攝像頭可以采集圖像、視訊,通過話筒可以采集音頻,那麼如果是我們人類來人工處理這些資料,我們會去打開圖像,看這個圖像裡有什麼,它可能上面有一隻動物,也可能是人的照片,如果用AI來處理的話,那就是要讓代替人類來自動識别圖像上有什麼,或者是把圖像上的文字自動提取出文本。話筒采集的音頻,我們會打開聽取裡面有什麼聲音,可能是一個人在講話,用AI處理可以代替人類把聲音轉換為文字。
從以上的介紹,大家是否能夠感受到計算機是在向着代替人類的方向發展,我們是否可以根據這個思路去思考未來的計算機發展趨勢。
三、 敲開計算機的大門
前面兩節介紹的内容是為了讓大家能夠更好的了解計算機領域的概念,但是對初學者來說,離當下的學習内容還是離的比較遠。
接下來羅列一份針對就業的軟體專業主要學習路線,注意是“主要” “針對就業”,其他支線不在本節範圍。
1. 程式設計語言
語言是人類和計算機的溝通形式,就像漢語和英語是人類之間的溝通形式,但計算機語言的學習難度是遠低于人類語言的。
在學校裡通常學習的第一門語言是C語言,這一門語言大家一定要學紮實。
接着是很多學校會在大學期間安排學習很多門語言,按照我的經驗來說,挺浪費時間的。語言是相通的,我建議大家在大學期間重點學習好C和Java語言即可,如果有興趣可以自行再接觸其他語言,但是一定要有一門主攻語言。當你有一門語言學習到一定高度時,學習其他語言的成本會很低,這也是我認為大學安排學習太多門語言是在浪費時間。
為什麼是我推薦學習Java呢?
第一個原因是我主要擅長Java,哈哈,如果有問題我可以很輕松的幫你們解答,其他的語言可能我比較費勁,太費勁的事我不幹,費勁的界限是幫你們解答一個問題超過20分鐘。
第二個原因是Java的生态比較成熟,普及率非常高,對于找工作而言比較容易,C語言雖然發展這麼多年更加成熟,但是由于性能高、開發效率低,更多的用在基礎設施、中間件等領域,這些領域的公司不好找也不好進,當然大家如果有這個追求也可以去嘗試。
還有硬體開發基本都會用C語言,這個是會比較好找工作,但是我不是做這一塊,幫不上多少忙。
第三個原因是Java學習曲線相對于大學開的其他語言課程來說,是比較複雜的,并且Java适合大型軟體項目開發。近些年人工智能的火熱讓很多高校都開設了python課程,python是一門比較好學的課程,如果學會Java,python自學就足夠了,而且人工智能的核心在與算法不在于語言。
2. 資料結構算法
資料結構算法是學校正常都會排的課程,并且一般是使用C語言進行教學。
在進階語言中,都會有一套庫把這些封裝起來直接使用,是以這裡學習的更多是原理,掌握了原理才能使用的更好。
3. TCP/IP網絡協定及網絡安全基礎
有一本書叫《TCP/IP協定詳解》,大家可以自己去看。
目前的系統很少是單機的,都需要通過網絡進行通信,我們手機中App也是通過網絡與伺服器進行互動。如果是開發web應用,至少需要熟悉Http協定。如果是物聯網開發,則至少需要熟悉TCP/UDP協定。
另外也需要掌握一些網絡安全基礎知識,例如如何通信加密,對稱加密、非對稱加密,一些正常的網絡攻擊方法等。
4. 資料庫
目前的軟體項目開發,幾乎都會使用到資料庫。
使用最多的還是關系型資料庫,在學校裡教的Oracle、SQL Server、Mysql都是屬于關系型資料庫。
除了關系型資料庫以外,還有鍵值對資料庫、文檔資料庫、圖形資料庫等等。
大部分項目使用Mysql足夠,在銀行等一些機關會要求使用Oracle、DB2,SQL Server對于用C#開發的人用得更多。
我們公司常用的資料庫主要包括Mysql、Redis、Mongodb、Elasticsearch等。
5. 開發包
程式設計語言本身就會有标準庫,但僅僅有标準庫是不夠的。為了實作各種各樣的功能,我們會用各種各樣的開源的開發包,這些開發包裡封裝了很多功能,例如需要權限控制我們會使用Shiro或者Spring Security,需要生成二維碼會使用zxing庫,需要生成excel文檔我們會使用poi庫。有一些庫使用起來非常簡單,有一些庫想要使用則需要學習大量知識,例如圖像處理、視訊處理等等。
對于程式設計,很多人說數學非常重要,但在大部分企業裡,對于程式設計工作來說英語更重要,因為有大量的開發類庫、架構技術都是用英文編寫的文檔,能夠順利的找到這些資料并讀懂他們就已經好了。即使現在有翻譯工具,但對于計算機專業領域來說翻譯還是有點蹩腳。
6. 前端界面
每款終端應用都有界面,手機app有界面,網頁有界面,微信小程式也是界面。這裡的界面主要是指H5,需要大家學習HTML/CSS/JavaScript,單純學習這三門語言還不夠,至少再學個Jquery吧,如果想跟上潮流,可以再深入學習Vue/React。
前端是更新疊代速度非常快的,因為它非常靠近使用者,是以在項目中也是需求改動最多的地方。
7. 設計模式
掌握前面6點,你已經能夠寫出代碼實作正常的功能了,但是寫出的代碼大概還缺點東西。設計模式是業界前輩總結的一些代碼寫法,學習設計模式在不同場景下使用相應的寫法,我們可以提高我們的代碼品質,讓我們的代碼更容易維護,并且為我們學習開發架構打下基礎。
8. 開發架構
在企業裡項目開發幾乎沒有不用架構的,是以很多企業招聘時都會要求需要掌握開發架構。從Java這條路線來說,大家在學校應該學習Spring、Hibernetes(可以不學,越來越多使用Mybatis) / Mybatis、Spring MVC、SpringBoot等等。通常企業會基于這些封裝自己一套開發更友善的開發架構,如果大家的學習進度比較快,後續我可以給大家分享我們公司架構是如何搭建的。