計算機組成原理有哪些知識點是工作中需要的?

IT修真院經常說計算機組成原理,計算機網路,計算機操作系統,數據結構,演算法,資料庫這六大基礎課程是工程師必備的基礎課程,對於轉行而來的非計科的初學者來說,有哪些知識點是需要重點掌握的,在工作中非常重要的?

還有,在哪裡可以學習這些知識點,什麼樣的學習方式更好一些?有哪些推薦的書籍可以讀。


第一 計算機組成原理在講什麼,對於程序員來說的意義是什麼。

第二 哪些知識點是工作中經常遇到的。

第三 在哪裡學習,怎麼學習。

第一 計算機組成原理在講什麼

計算機組成原理,講述的多數跟硬體有關係,主要描述的是計算機的內部結構是什麼,數據怎麼存儲和運算,指令系統又是什麼,CPU怎麼運轉,還有就是輸入輸出是什麼。

揭開神秘的面紗,做一個真正的工程師,計算機組成原理是必不可少,軟體是靈魂,硬體是肉身,玄幻小說中經常說的肉身成聖,對應到IT里,指的就是對計算機組成原理非常熟悉。

計算機組成原理會講很多底層的東西,大部分和編程無關,但是有一些重要的概念是少不了的。
這也是這個回答想要做到的,就是幫助新人快速了解哪些知識點很重要。

對於程序員來說,了解計算機組成原理,從認知上,就把軟體從一個魔性的位置降低到了可掌控的位置,就會明白,軟體運轉並不是靠魔性,而是靠指令,所有你看到的數據和錯誤,都是對應的程序分解成一道道的指令。

除此之外,還有一些對於軟體編程來講非常重要的概念,特別是底層的一些設計理念。
所謂的科班出身,就從這裡開始。

第二 哪些知識點是工作中經常遇到的。 1.浮點數的表示

浮點數的表示是編程里比較重要的概念,這對於金融計算來講,格式重要。1/3=多少?為什麼推薦使用BigDecimal?
Float和Double適合做金融運算么?

這些都會在浮點數里找到答案,對於Java,Android,IOS,JS都有用。

2.進位

1024的世界外行人不懂,沒有2進位就沒有計算機。這也是必不可少的一定要理解的概念。10000這個可不是聯通的電話,8進位,16進位的轉換對於運維來講格外重要,如果你們熟悉Windows藍屏,那一串看不懂的東西,也是和2二進有關。

同樣的,Java,Android,IOS,JS和OP都需要。

3 字元編碼

Ascii碼,GB2312,GBK,Utf8,Unicode,這些編碼格式,是纏繞程序員的惡夢,有一位未來的偉人曾經說過,如果一個程序員沒有解決過亂碼問題,他還能稱為一個程序員嗎?

了解了這些編碼的存儲格式,你才會明白為毛為有中文亂碼問題,究竟計算機是哪裡出錯了-其實錯的是它么?它只是聽你的話而已。

這個對於Java程序來講更重要一些,無論是DB,還是文件,還是介面,還是日誌,甚至是CRT,只要有中文的地方,你都有可能遇到亂碼的問題。

4.Cache的替換演算法

計算機本身的緩存設計,給軟體系統中的緩存設計能提供很多啟發。常用的替換演算法,隨機,FIFO,LRU,這些都是從計算機組成原理就可以借鑒的。

當然最重要的還是緩存的概念,在計算機的世界裡,空間換時間,時間換空間也是經常用的策略。

能夠理解了緩存,就能夠讓你在未來的複雜設計中站穩腳根。對於Android,IOS,JS也講,也同樣如此,Java更不用說,Redis和Memcache和Ehcache和OSCache等一系列緩存體系,都脫胎於最根本的計算機組成原理思想,只是在不同的場景下,有了自己的變異。

對於緩存,還有命中率的概念要懂的。另外就是失效策略,命中率和失效策略是設計緩存的關鍵點。

5.匯流排

匯流排的概念其實在幾年前SOA盛行的時候比較火熱,最近已經慢慢消散,但是做為背景知識,理解總件,進而理解微服務,還是有點用處的。

6.調用子程序

調用子程序可以幫助你理解遞歸,回調。特別是在JS里,回調簡直是。。。還有IOS。
與此同時,上下文的概念也可以在調用子程序中理解的更透徹一些,想當年,我可是想了好久都沒弄懂上下文是什麼意思。

7.I/O

IO更多的是一個概念,input和Output是一個非常重要的概念,特別是在網路請求和讀文件中。
Java工程師必備,Android和IOS也可以懂一點。JS可以不用怎麼了解。

第三 在哪裡學習,怎麼學習。

這些基礎課程,最好的學習方式就是課本,我找到的一本王道考研,&<計算機專業基礎綜合考試指導全書&>,看看這本就很好了。
當然,我們請了付師,每周日晚都在講直播課,如果你感興趣,加入QQ群 417440564 了解,但是請記得入群看群公告,改群名片。


出一道簡單的題目:二維數組A[X][Y],每個元素自增1。雙重循環,X這層寫外面還是寫裡面?

對於初學者、底層碼農、業務員、外包交差的人來說,機組的東西在絕大多數不直接和硬體打交道的情況下,不重要。畢竟中間隔著一層操作系統的封裝。而透明性是API的重要參考標誌之一。大多數人會說,寫裡面還是寫外面沒區別。

如果想往上走,寫出高效、間接的代碼,機組的東西必須少不了。緩存是根據內存命中率來的,如果連續讀取同一段內存的數據,緩存就會映射該段內存,而緩存和內存的IO速度是存在數量級差距的,具體表現就是運行時間會大不一樣。這時候的回答就是連續維度寫裡層,非連續維度寫外層。


補充一下

一說搬磚大家好像都覺得比較 low,我可以換個說法,那就是你即使想成為黑客,架構師之類的,用到這些計算機系統結構之類的可能性也是非常的小。我個人比較喜歡《黑客與畫家》作者的觀點,程序員的工作其實與畫家的工作很類似,都是使用現有的材料來創作。發現(明)新材料的活是物理學家或數學家的工作,如果你只是想寫一個很酷的程序出來,那麼你最需要知道的是現有每種材料的特點及如何使用它們。

順便補一個不那麼新的新聞

2015 年 6 月,知名包管理工具 Homebrew 的作者 Max Howell 去 Google 面試。因為他沒能寫出反轉二叉樹演算法,最後被 Google 拒絕了。

-----------------以下為原答案------------

如果我說基本沒用可能會很多人噴。但事實就是如此。別說什麼你要研究系統底層,閱讀某牛逼框架源碼之類的。一個最簡單的判斷就是,如果大多數程序員都用不著,那麼你有很大的可能用不著。

當然,如果你是有雄心壯志的人,將來是想成為技術獸人的,那麼,努力吧,不用問這個有沒有用,既然這是基礎課程就一定用得著,沒用人家不會放進來。你可是要為將來成為行業領袖而準備的。

如同工地上,管搬磚的需要懂大樓的應力結構設計嗎?都知道搞設計的逼格高的多,但從搬磚的轉職設計的沒見過,轉成包工頭的已經是人中龍鳳了。

數據結構和演算法還是看看吧。雖然工作中不見得用得著,但面試時很有用。如果你能把教材里的示例都背過,那說明你有升級的潛力,不然安心搬磚也是不錯的選擇。

順便問一下,你覺得高中的數理化除了用來高考,你現在有用嗎?別扯什麼訓練了邏輯思維之類的,要訓練邏輯思維不如去看哲學。


1.對於轉行計算機的人來說,補一補計算機相關的基本知識是合理的,而且是必要的。一本《從入門到XX》雖然可以教會你編碼,但是很難告訴你為什麼那樣編碼,因為這涉及到了計算機的組成以及操作系統原理。

2.以我自己的經驗來看,從工作的角度來講,你說的六大部分其實可以分為兩個大類,一是計算機網路和資料庫;二是計算機組成、操作系統、演算法、數據結構。第一類的分別對應工作中的網路工程師和資料庫工程師,這都是專業性比較強且相對(大部分軟體開發)比較獨立的方向,如果志向在其中的一個,那麼重點看這些(建議二者選一),第二類只做補充。第二類其實是計算機軟體從業者的必修課,簡單的說 計算機組成告訴你硬體能做什麼,操作系統告訴你它是如何管理這些硬體並提供給外部(上層)介面來使用。演算法和數據結構告訴你如何高效、簡潔的的使用這些介面以便達到最合理的使用硬體和儘可能的有利於軟體開發。

3.回答你的問題(只針對第二類),對於初學者來說,建議首先了解基礎演算法(鏈表...到二叉樹,和排序),建議使用C語言來編碼〔不要太深入,不容易理解的的跳過〕。然後看計算機組成,一定要理解計算機系統設計的分類和分層(你理解了之後就會知道這句話是什麼意思)〔不要對硬體細節摳的太仔細,一切都從整體來看〕。接著看操作系統原理,我認為操作系統的兩大難點是虛擬內存管理、進程調度和通信,而且與編程關聯比較密切。最後你會發現東西有很多,每一個部分都有難度深度,你已經無法兼顧所有的部分,所以最好選擇一個主方向做研究學習。

4.書籍的選擇。我給出的建議是 儘可能挑知名度比較高的,但是也要考慮自身情況。因為很多時候你選擇了一本經典書籍,但你能力不夠(或者太高),導致這本書當時對你的價值反而不如那些一般的書。 不過一般的書的缺點是有時候作者也對某些細節理解的不清楚或者有錯誤的理解,你看了之後(你未必能分辨出來),也照著理解,從而可能當時或以後感到很困惑,你還要花更多的時間來確認它。具體哪些書籍你使用搜索引擎就可以得到,普遍推薦的基本都是經典的,銷量高的一般都是容易理解的。


應該先從一些big idea或general idea開始看起,比如computer science到底是個什麼領域,計算機有哪些核心部件,計算機互聯網發展簡介什麼之類的(關於這類問題 百度百科就是個很好的資源)

當你大致了解完了cs,下一步了解編程語言,再根據自己的需求和技術功底去判斷先從哪種語言開始學起(一般都是先學python再是java)。另外做個補充,學語言基本分兩塊,語法與邏輯。語法就要多背多用,至於訓練邏輯嘛,三年高考五年模擬。。。這就不用我說了。

接著就要去初步了解自己選擇的語言,這裡以java為例:

Java是一種基於C++的編程語言 所有的編程語言都在做一件事情-把人類語言/邏輯用計算機聽的懂的方式表達出來。其實「java」這個英文單詞的意思是一種咖啡。20年前就是一幫技術宅研發好了一款十分先進的編程語言但又不知到叫什麼,正好眼前有杯java咖啡... 所以就命名為Java

好,相信你現在已經對CS有了初步的認知。

俗話說的好,書是人類最好的老師。是時候找一本書充當「老司機」來帶帶你了。在這裡我推薦一本java入門書《java從入門到精通(第三版)》。這本書非常好上手寫的通俗易懂。

讀書小技巧:(這裡可適用於任何一種編程書)在讀前一定要準備一本小notebook,當你在讀編程書時候,裡面一定會有大量的基礎知識,語法,演算法或一些小案例。這些一定要記到你的筆記里,尤其是剛剛接觸編程語言的時候。一開始,當你要編寫一些小程序時,記住所有關鍵詞是不可能的,所以有一本notebook能讓你快速查找 效率極高。其次學編程一定要有一種刨根問底的心態,不過一開始你會對許多關鍵詞感到confuse,千萬彆氣餒 在這世上千千萬萬的程序猿都是過來人。

往往你自己覺得懂了但不一定是真的掌握了。所以每當你在書中學完一章,你應該給自己出題,而且是難題。就這樣反覆的去不斷挑戰自己的極限,500強的offer再也不是夢。

如果你在學習過程中遇到了什麼困難,Stack Overflow 肯定是首選。StackOverflow可以理解為編程界的知乎。

好了,入門已經講完了,那麼也恭喜你已經踏上了程序猿這條不歸路,剩下的就全靠自己的努力了,走你!


這也不學那也不學還上什麼大學,上培訓班好了,多快好省的變成碼農被資本家榨取剩餘價值。


我就想說 不學這些,學那些個是人都會的東西,沒完沒了的搬磚,你拿什麼和別人拉開的差距?混經驗是吧。


我覺得就像不同的高度看世界一樣

世界很大的


cpu調度 .虛擬內存地址映射這塊


推薦閱讀:

開放系統(如 Android)和封閉系統(如 iOS)哪個更好,更有前途?
移動互聯網未來的趨勢是什麼?
很多 iOS 開發者收到 Apple 警告郵件,是要全面封殺熱修復方案嗎?
一個有 15 個頁面的項目怎麼規範 css 樣式?
iOS 設備和電腦間傳輸文件有沒有比較好的方案?

TAG:iOS | CSS | JavaScript | Java | Android |