“ 從現實世界的角度看計算機,可以幫助我們更清晰的學習計算機領域的知識。
本文試圖用生活中常見的事物來解釋計算機技術領域,讓知識更通俗易懂 ”
這篇文章的閱讀對象是計算機專業在讀及剛進入工作一年左右的的同學,文章措辭也許不太嚴謹,主要目的是為了讓大家更容易理解。
一、 便利店背後的“系統”
“系統” 這個詞不只是可以用在計算機領域,日常所見到的便利店、超市、商場也可以稱之為一個系統。參照現實生活中的系統,我們可以更容易的理解計算機系統。
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等等。通常企業會基於這些封裝自己一套開發更方便的開發框架,如果大家的學習進度比較快,後續我可以給大家分享我們公司框架是如何搭建的。