編譯原理網課知乎
『壹』 計算機基礎知識對程序員來說有多重要
非常重要,必須認真學習。
學習基礎知識從來都是枯燥的,而且很多時候會給我們一個錯覺,就是基礎知識沒有用。這主要是因為,我們未來工作以後,更多的是面向應用,更直接的就是面向工具的使用,基礎知識基本是不可能直接拿出來用的,所以,大家就會覺得我只要懂應用方面的知識就好了,基礎知識根本不需要去學。
就拿程序員來舉例:
很多的程序員培訓機構,他們並不會教任何的基礎知識,直接就是教編程語言,然後設計一些案例做練習,3個月-6個月基本就結束。這樣教出來的程序員能夠寫代碼嗎?當然是能的,不然這些培訓機構早垮了。而很多大學本科4年讀完的應屆生,說不定寫代碼都沒有這些培訓幾個月的學生強,大學4年對於程序員來說難道就是白費嗎?
並不是的。
基礎知識決定的是你未來的高度,可能你作為一個初級、中級程序員,你不一定會用到數據結構、演算法、編譯原理。但初中級的程序員就是你未來幾十年的全部嗎?
如果是的,在你30多歲的時候,應該就會面對裁員了並且很難找到下一份工作。
程序員是一個干到老學到老的工作,每天都需要去學習一點新的知識,技術也是在不斷的演進,需要去了解未來的技術發展方向,這樣才能夠一直產生價值。而基礎知識是什麼呢,就是當你對技術了解越深入時,越需要用到的東西。
例如:你要做大數據的工作時,你需要數據建模,需要在海量的數據中抽取自己需要的數據,還需要不影響系統的性能,運算速度更快。那麼你就必須要了解演算法,了解時間復雜度。如果你曾經大學時好好的學習了這些知識,並且時不時會溫習一下,那麼你更高更快的勝任這份工作。
但是,對於一個只是了解應用知識的程序員來說,他需要想辦法學習你用4年時間堆積起來的知識,而且還不一定有可靠的老師能夠教他。
再舉個例子,現在華為需要一些技術人才,來做他方舟編譯器的迭代,待遇非常可觀。
而這時,對於懂數據結構、懂演算法、懂編譯原理的人來說,查的無非就是一些應用實踐的知識,這些知識只要有基礎、有環境,1-2周就可以上手。
但是對於只懂應用知識的人,他可能就是看都看不懂,華為也就不可能去招聘這樣的人。
所以,程序員也是有高低之分的,有的年薪百萬,有的年薪可能就十來萬。誰不想拿百萬年薪呢?可能他們也覺得某些知識沒有用,所以沒有去認真的學吧。
『貳』 想自學it,該怎麼學
想要自學it,得明白以下幾點
1. 應該選擇什麼編程語言
可能困擾編程新手最多的一個問題是【我應該學什麼編程語言】或者【我需要學習哪些課程才能做出一個web、一個app】,很多人一直糾結這個問題,陷入了東學一點、西看一點的死循環,到頭來啥也沒學好,這會很浪費時間。
剛上大一的時候,我也很想知道應該選擇什麼編程語言。我問了很多人,網上各種查資料,但所能得到的答案都很片面,多數對這個問題答非所問,總是回答說「某某編程語言難」,「某某編程語言性能好」。其實作為初學者,我們對計算機體系都不了解,就不要過多地去糾結性能,或者難易等因素,原因我等下再說。
如果你有明確的方向,那麼很好選擇。如果你想做演算法、機器學習方向,那麼python是最好的選擇。如果你想做web開發,java、php等都可以。如果想做一些更底層的工作,那麼就可以選c。當然這是建立在你有明確方向的基礎上。可是,很多人都沒怎麼接觸過計算機行業,特別是和我一樣剛入學就被調劑到計算機專業的人。對這些同學來說,各個編程語言就只是個名字,除了叫法不一樣,你根本不知道它們有什麼差別。所以索性不要糾結了,我替你選一個吧。
如果你是在校大學生,那麼你有大把連續的時間,就先學習c,然後再學c++。我個人是學c入門的,也許很多人不理解我為什麼推薦學c,因為c和c++都很難、很復雜,看起來並不適合入門。然而正是它們的難和復雜才能讓你更好地理解計算機系統【計算機系統不是指操作系統】。學習編程不是學習編程語言,而是學習一個計算機生態,即一個龐大的知識體系。只會編程語言而不理解整個計算機的體系,就像只會寫字而寫不出好文章。了解c/c++和了解計算機系統是極為貼合的,向下可以幫助你更容易地理解操作系統、編譯原理、計算機網路、計算機組成原理,為什麼呢?因為較為底層的東西很多都是用c實現的,和系統的貼合度極高,很多教材源碼甚至教程,在講述這些知識的時候都是用c或c++作為媒介。而向上,c++面向對象的機制,也可以做出一些應用,譬如五子棋游戲等,也不會顯得那麼枯燥。花個小半年時間了解c和c++,之後你就會覺得看書、看資料可以輕松很多。
如果你是一個上班族,但是剛剛學習編程,可能學c和c++對你來說有些復雜和困難,因為學習它們確實是很需要時間。你們不像在校生那樣有大把的連續時間,而零碎的時間去學習一個比較復雜的東西效果不見得有那麼好,所以可以先學一些【更容易見效】的編程語言,從python入手吧,至少能快速做出一些小應用,不至於丟失了興趣,但是真的要入門編程又還得看看與計算機系統相關的書籍,這樣才能更深層次地去編程,譬如【深入理解計算機系統】這一本書可以讀很多遍,這本書把整個計算機系統給串起來了。
2.學習編程,我需要學習哪些課程?
我要學哪些課程?我為什麼要學習如高數、離散數學、線性代數、概率論等課程?
這個問題也是之前困擾了我很久的問題。不過我現在想通了,對於【高數、離散、線性代數、概率論】等課程,很好解釋,做演算法的同學肯定知道為啥要學習這些課程。機器學習中會大量用到上述提到的課程,所以會比較好理解。對在校生而言,學校開設的很多課程我們不知道為什麼要學,我們很疑惑,不知道學它有什麼用,這個時候我們就會很糾結,還會產生抵觸情緒。這很正常,因為我們學習得不夠深入,自然不能理解它們的用處。
在我看來,大學本科課程更多的是面向「面」的教學,即什麼課程都教給你一些,但是又講得不那麼深入;而工作或者讀研,更多的則是面向「點」的學習,用到的知識更專。本科時,學校也不知道你以後是去搞演算法、還是搞架構、還是搞伺服器開發,甚至去搞硬體,所以學校需要你學很多課程,至少有個了解。對學生來說,一方面可以從中選擇自己感興趣的點;一方面也可以對未來的就業方向有些啟發。所以即使像數電、模電等課程,雖然之後可能用不著,但是你也要學,並且會花費大量的時間。雖然你最後不一定去搞硬體,但是這些課程也會讓你更容易去理解一些知識,比如cpu中的邏輯器件。
如果你在大一的時候就有一個明確的定位,知道自己今後想從事哪方面的工作,課程與課程之間是可以調一下優先順序的。不過像大學物理,這種課程確實是對編程沒有幫助,但是像我前面所說的,大學教育更注重廣度,大物等課程可能就是為了給你普及生活常識吧。
其實,大學教育的問題是普遍存在的,我認為我們學習一項技能的時候,應該採取的是項目驅動式學習,即需要用到什麼東西時不會了再去學,而不是先填鴨式的都填進腦子,並且在學習的過程中我們還不知道它這是幹嘛用的,等之後用到了,甚至不記得自己學過,反而查資料才會想起:哦,原來我之前學的xx科目是這個用處啊,可是我當時並沒有好好學。很多時候學生時間的浪費可能還是要怪老師、怪學校,他們一開始沒給我們做好充分的課程介紹。所以,在經過比較多的編程和項目實踐後,我認為一個比較好的學習方式是,改良版的項目驅動學習法。即:
學習一段時間,做個小項目,將做項目遇到的問題記下來,針對性地學習相關知識,然後再實踐,再學一段時間理論,讓知識成網狀發射狀地變大。當然,項目驅動式學習有一個弊端,就是每次學習的知識都是項目所需要的,很零碎、不成體系,所以需要改良,即在採取項目驅動學習法的時候每天抽一段時間去完整地讀一本書,或者一個相關問題的完整介紹,這樣就很容易把一些知識成體系地串起來。這樣一段時間下來,慢慢的,你就知道我們為什麼要學那麼多科目,學這些科目能幹什麼。
談到數據獲取,可能最容易想到的是爬蟲,爬蟲是一個在知乎上被說爛了的話題,所以我不想多說它是什麼。很多時候有人覺得爬蟲簡單,為什麼呢,因為有現成的框架,所以獲取少量的數據就比較容易。但是當你需要爬取的數據很大的時候(比如我之前抓取了知乎500萬用戶的數據,在下班的時間、用自己家裡普通的pc,計算機性能並不是那麼好,比不上伺服器,又要在不被封IP的情況下抓到這么大量的數據,然後對數據進行清洗,最後還要可視化展示),使用現成的爬蟲框架就並不是那麼容易實現了。況且,我需要抓很多數據源,並不是一錘子買賣。所以我選擇去開發一個系統,即在現有的框架下進行二次開發,搭建一個屬於自己的爬蟲系統,並植入一些演算法。我在系統中添加了很多中間件,直到現在,它還可以在10分鍾內就部署一個能抓取大量數據的爬蟲應用。
『叄』 非計算機專業為什麼學c語言知乎
對於題主的問題,我覺得有點大了,這個問題就好像我問一個學習金融的人這樣一個問題:對於非金融專業的學生,怎麼入門金融學?
OK,我先說說我對計算機的理解吧,因為我覺得這對學習計算機比較有好處。
我所認為計算機是什麼呢? 他是一種輔助設備,能夠拓展人類的能力。能夠輕易完成人類很難做到和很費時間和精力才能做到的事情。
Okey,理解說完了,開始干貨:
計算機分為硬體和軟體,硬體就是你看得見摸得著的,軟體是你看得見摸不著的。介於題主是想說入門,我就不推薦計算機有關硬體的東西了,我主要推薦的是軟體的方向。
通常對於計算機專業的人來說,了解計算機的硬體組成是非常有必要的。因為這不單單只是告訴你現象,還告訴你的本質。
學習計算機的軟體(還有硬體):首先,你要看一本叫《計算機科學技術導論》的書(事實上不管你專攻硬體還是軟體,這本書看看絕對沒錯),這本書包含了很多的基礎內容,
比如2進制(「計算機世界」的語言,計算機非常笨,哦,也就是cpu非常笨,只能明白01010101,其他的統統不知道),
計算機硬體的組成(運算器,控制器,存儲器,輸入輸出設備),
匯編語言(因為010101對於人類來說過於麻煩和難以理解,所以就把一段010101用幾個字母定義,例如「mov」),
然後就是c語言,一些很懶的使用匯編語言的程序員覺得匯編語言還是不夠方便,所以就發明了高級語言---c語言。(可以看出來計算機的發展史真的是一群很懶的人的奮斗史:),我希望有幸成為他們其中的一員。)
當然,裡面還說了很多其他的東西。
看完了《計算機科學技術導論》以後,好吧,這是開胃菜,正菜開始上桌了。
C++ 。推薦書目:《C++ primer》 ,C++是一門計算機高級語言,計算機語言是拿來干什麼的呢?就是和計算機交流的,你看,你和英國人說話要說英語,要和廣東人說粵語,要和荷蘭人說荷蘭語。一樣的道理。隨著「hello world」在那個黑黑的界面中顯示出來的時候,你甚至會懷疑:這TM就是編程?!
哦,這只不過是萬里長征中的第一步。後面還有好多有趣的東西呢。
你要開始了解什麼是變數,什麼是常量,什麼是循環,什麼是類,什麼是判斷語句,什麼是繼承,等等等等。
如果你學習完了語法部分(就是上述說的),那麼,恭喜你,基本上已經可以和別人說:我學過編程了。
好嘞,開始下一步:
因為題主的研究生是金融的,而且boss是做risk management的,那麼演算法就是必不可少的了。
《演算法藝術及信息學競賽》 這本書還不錯,介紹了一些基本的演算法(當然裡面不會告訴你怎麼進行風險管理,那是金融專業的事)。我只是粗略的過了一遍,所以就不獻丑了。不過研究演算法感覺就像在原始叢林裡面爬山,一般人進去就跪了,有了大量的經驗以後才能生還。
《數據結構》 ,在計算機科學或信息科學中,數據結構(英語:data structure)是計算機中存儲、組織數據的方式。通常情況下,精心選擇的數據結構可以帶來最優效率的演算法。(來自維基網路),這是修煉的內功心法之一。
《操作系統》,了解了操作系統的原理以後,才能更好的操作我們正在使用的系統。屬於中級的課程吧。
《編譯原理》, 如果說計算機語言是魔法咒語的話,編譯原理就是告訴你,這些魔法咒語是怎麼生效的
《計算機組成原理》 哦,這個非常有趣,和操作系統有很大關系,但是這個是從硬體的層次上面(大部分來說)來解釋計算機的組成
《軟體工程》 估計題主暫時看不到這里的了,什麼是軟體工程呢?我的理解就是,把寫軟體規范化。形成一種規范以後好處就不言而喻了。
實話說,在學習的過程中會出現很多問題:
比如說語言選擇的問題,你會聽說JAVA無所不能,C#簡單方便,python優雅至極,php開發速度快到帶你飛。
我個人覺得,語言不是重點,語言只是個工具而已,重要的是人,就好像我們都會寫中文,為啥俺和莫言的差距咋就這么大呢!
個人建議是:發揮各個語言的優勢,在不同的情況使用不同的語言。
比如說:
1.想要開發個簡單的網站,PHP是不二的選擇(你可以想像用C++寫網站的「快感」么?)
2.windows下的程序,C#絕對是王道,還有比微軟自家的東西更懂自己的么?
3.android開發,平台的限制,最好還是用JAVA。
4.考慮到性能問題,如果你是個大神(那是不可能的,如果這樣你就不會問怎麼入門了)那絕對會使用到C++,對於一般的凡人,JAVA的回收機制以及夠用了。
如果你想要買書,個人覺得最好不要買國人寫的,因為國內大部分都是你抄我我抄你的節奏,最好買國外的書。圖靈系列的我覺得不錯。
我個人覺得,學習計算機並不神秘和復雜,甚至有些可怕的簡單,有付出,就一定有回報。因為計算機的嚴謹性,他永遠不會出錯,你給出了正確的方法,就會得到正確的結果。
這里推薦題主一個小網站,名字叫做提問的智慧:
http://www.beiww.com/doc/oss/smart-questions.html
『肆』 計算機在大學能學到東西嗎 知乎
計算機在大學能學到東西。
計算機硬體與軟體相結合、面向系統、側重應用的寬口徑專業。通過基礎教學與專業訓練,培養基礎知識扎實、知識面寬、工程實踐能力強,具有開拓創新意識,在計算機科學與技術領域從事科學研究、教育、開發和應用的高級人才。本專業開設的主要課程有:電子技術、離散數學、程序設計、數據結構、操作系統、計算機組成原理、微機系統、計算機系統結構、編譯原理、計算機網路、資料庫系統、軟體工程、人工智慧、計算機圖形學、數字圖像處理、計算機通訊原理、多媒體信息處理技術、數字信號處理、計算機控制、網路計算、演算法設計與分析、信息安全、應用密碼學基礎、信息對抗、移動計算、數論與有限域基礎、人機界面設計、面向對象程序設計等。