編譯原理和演算法導論是不是屠龍技 有技而無龍可屠?
————以下為更新內容————
有童鞋在評論還有私信給我說了些問題,我統一回答下。1、像高數、編譯原理、操作系統等等很多課程總覺得學不懂怎麼辦?
答:這不是你一個人的疑惑,這是普遍現象。這些知識相對來說比較抽象,而且涉及的知識面非常廣,比如說圖形學,能做研究生的單獨專業分支了。本科階段學時有限,老師也只能抽重點來講,剛學的時候你要真能懂百分之六十已經非常不錯了。而且很多知識要在實踐中才會慢慢理解。關鍵是得首先有個大概印象,理解核心內容,一些細節先放過,日後開發中遇到問題再回來看就會理解了。比如資料庫,剛開始脫離實踐去講,左連接右連接自然連接1234f範式等,肯定很多人一頭霧水。
等到日後,做實際開發,設計資料庫時候因為不懂左右自然連接的區別,然後發現自己踩坑了,回頭再研究才發現原來如此。所以不用擔心。2、現代很多開發中,比如前端,很難接觸到底層,學這些知識有用嗎?
答:的確,隨著各種工具越來越完善,很多開發已經越來越少讓程序員接觸底層,從而解放生產力。而未來的趨勢則是,程序員會越來越少地寫代碼。但是,無論怎麼變,這些基礎的課程都不可能改變。因為這是這些都是計算機專業核心基礎。工具會過時,但是知識不會。打個比方,六十年過去了,計算機比人計算速度得快得多得多,但是人為什麼還要學數學?想想就明白了。也有人說有些知識學來感覺沒機會用的上。關於這個問題,我原答案已經說了:上大學其實是拓寬你未來的道路。這樣無論你以後想往哪個方向繼續深入,都可以會很平坦。很多計算機專業的都面對一個問題,現在Android ios php等等,那麼火,人家上個培訓班不到一年就去拿個不錯的工資了。我還要浪費四年青春學這些沒用的知識幹嘛?
想一想如果未來Android像塞班一樣說沒就沒,ios不再火了。沒有一身過硬的基礎的你,你能去幹嘛?再上個培訓班學上半年然後轉行?要是你不再年輕了呢?而且一般企業開發,核心的都會交給一些真正底子好,又有經驗的來干。而只會if else for while的你,只能寫一輩子邏輯。當然你說你享受寫邏輯的話,可以忽略。————以下為原答案————有人說了些觀點。我以一個普通程序員的觀點分析下這個問題好了。
先說下個人經歷
剛大一,學高數、線性代數時候。
我當時想,這些抽象的算術有什麼卵用,老子又不是做數學家好好敲代碼,背背公式、做做題就過了。結果被啪啪啪打臉,大二碰上圖形學、離散要多慘死得多慘。我又想,圖形學、離散有什麼卵用,我以後肯定不會用到,好好敲代碼才是重要的。
結果後面學directx opengl遊戲開發時候,碰上各種矩陣換算、幾何轉換以及數學知識各種綜合運用,又被啪啪啪打臉,趕緊回去惡補數學、圖形學知識。大三學概率論,我想這鳥玩意我們絕對不會用得上了吧?於是得過且過。
結果後面參加個比賽,小組一起做個關於小語種手寫識別的項目。其中的模式識別模塊和機器訓練,都必須用到hmm模型。找了各種hmm模型資料發現自己看不懂,各種概率論知識,欲哭無淚。又各種找回之前的課本惡補。此時臉已經腫了。終於到下學期學組成原理、編譯原理操作系統時候開始用點心去學。雖然當時有很多無法學透弄懂,但是大有收穫。即使過了這麼久,依然覺得當時做得太對了?
至今我仍然會在開發上遇到各種問題,依然要回去各種補,有時候甚至恨不得重讀大學四年。
有很多童鞋總是不屑這類課程。總覺得數學、理論等各種科目都是那些考研、搞特定領域研究、學霸刷GPA用的。所以我們總能在大學裡面看到很多人相當不重視,應付了事,能過就已經燒香拜博了。
大學計算機專業無非分五大類課程:
數學:高數、離散、微積分、概率論、線代、數據結構、演算法、圖形學等工程理論:工程導論、結構設計、需求工程、建模、設計模式等計算機原理:數字電路、計算機基礎、計算機網路、組成原理、編譯原理、操作系統、資料庫等編程基礎:C/C++、java、html、彙編等應用及實踐:各種語言的課程設計普通程序猿眼裡最有用的就是這塊:編程、以及實踐。然而,他們佔總學習時間不到四分十一。難道這些課程都沒用么?如果像題主說的,「無龍可屠」那學來幹什麼?
其實這些都是基礎,根植整個計算機體系中。學得一招兩式就整天都去打小怪獸,還樂呵樂呵的。某天你遇到棘手一點的,開始知道技窮了。關鍵是有些人可能一輩子遇不到了,然後就覺得也不過如此。
說白了。這些課程其實是拓寬你未來的道路。這樣無論你以後想往哪個方向繼續深入,都會走很平坦。否則你真地哪天用到了,你才發現自己某個技能樹沒點亮,趕緊回去補,到那時候學習路線就會變得非常陡峭。我已經如果一次坑。
演算法/數據結構,這是編程的靈魂。很多人覺得學這個東西就是為了刷ACM刷面試題。你用什麼語言這不重要,這是工具,重要的是編程思想。你不一定會用到裡面的演算法,但是它能鍛煉你解決問題的思維能力。
編譯原理。它能讓你真真切切地看清楚你寫的東西具體實現。沒學過的人只能看到表面上的語法,而你能看到具體的實現。沒接觸過的人只知道怎麼寫,你卻知道為什麼要這樣寫。同時可以配合編譯器做一些優化。
這些你也不可能深入學透,了解個大概已經夠開發用了,真成了這方面的專家,至少十年。編譯原理:當你想寫個靜態網站生成器,再發現基本技能不過關的時候,就後悔沒早早投入時間精力弄明白了。看看當今巨頭,Google 的 go 和 dart,facebook 的 hack,Apple 的 swift,每一個成功的巨頭都認識到想把一件事做好,就一定要自己從頭做,從語言著手。再例如 Chrome 用的 V8 更是引領一個時代。這方面的牛牛們,都是一言不合就扔給你一個新語言。
演算法導論:這個用過的都說好,沒事多翻兩遍,總會有新的收穫。計算機專業,本科期間沒刷過一陣 OJ 的,終身遺憾啊。
其實還有一個沒提到的,操作系統原理。不知道是題主已經受益了,還是簡單沒想到,也是常被列入屠龍技的。一個例子是在各種嵌入式平台上,各種自己動手寫簡單 OS 的,常常有。或者就算不是自己寫,使用別人寫的,不完整的或者部分實現的裸露的嵌入式 OS,對於操作系統原理的理解更是必不可少。另一個例子是,Apple 的 iOS/OSX 和 Google 的 Android,都是大殺器。
再一個,網路原理和 tcp/ip 協議棧。用 dsp 的時候,移植過一個精簡的基於 C 的協議棧,累壞了,ti dsp 的 c/c++ 編譯器各種坑。這個移植協議棧傳輸速度慢,不穩定,出了區域網本網段,傳輸成功率就靠概率。還好項目不大,一個固定 ip 區域網解決問題,湊活完成了。中間解決數據錯誤和丟包的技巧是一個數據包發兩遍,各種汗。就怨自己學藝不精沒能力沒時間好好調試。後來換了嵌入式 linux 和 android,系統內置可靠穩定的網路協議棧,那真是——「解放區的天,是明朗的天,解放區的人民,好喜歡~~~」。跨網段啊,互聯網公網遠程傳輸啊,都不是個事兒。
總體來說,屠龍技是計算機技術之集大成。作為從業人員,當然要學好精通。作為企業,要關注,要投入,這些技術方面如果能做出一些成果,那才真是能做出大新聞,做點小成績的。以國內信息技術應用的大環境而言說得沒錯,並不高深的知識,都少有用武之地:從工作總量上來說增刪改查業務模塊實現才是現實中存在的多數工作。不過這個問題十多年隨著信息化的深入是慢慢改觀的。
改一下,答案區亂七八糟,我要一本正經談一談有關編碼和基礎知識之間的緊密關係了,非胡說八道。
演算法導論,數據結構,微型計算機基礎,編譯基礎這四本基礎知識,按其重要性,以微機基礎為先,從晶元原理,至邏輯電門,至各介質存儲原理,至堆棧結構等,至少做到部分理解後,再循序至編譯,掌握機器或低級語言的底層實現機制、內存定址寄存讀取等重點,結合前述電門堆棧等知識,結合起來理解透徹,再逐步深入演算法和數據。底層都明白了,演算法數據就不用細說。
看不懂?學不透?還是別幹這一行了,真的,很真誠的勸告,因為走不遠。不如去尋找其它領域的職位,或許你的天賦不在這裡。混飯吃追求不高的,可以留下。
至於各種高級語言及各自編程思想,只是最淺層的應用知識。已掌握基礎原理的同事,因為在量子計算大行其道前,高級語言是萬變不離其宗的,所以得恭喜你,生存有保障了。掌握基礎知識的同事,在編碼實踐中,也會有意無意的避開觸發性能瓶頸的低效演算法,代碼敲多了,編寫出最優或次最優代碼就如同本能。如果負責架構設計或技術方案撰寫、審定等工作,熟悉基礎知識,發現並規避瓶頸就簡單了,集成時,也會選擇最適配的中間件。這些,不是顯而易見的事情么?
咱們即身為專業程序員,可能要想一想以下這個問題:在可預見的未來,當各種腳本級語言、高級語言成為一般科研人員的必備技能,或非信息產業高技術人材在解決任務時,所必須的工藝方法時。我們要問問自己,憑什麼,專業程序員的稱謂是我們的,而不是更多的、越來越多的也會編程的普通運用者呢?兩個函數的調用順序,一個數組的範圍設定,變數是全局還是私有,該不該繼承呢……。代碼之中,處處都能看出專業和非專業的差異。單項差異確實細微難查,但過多誤差累積,對最終交付版本的質量影響,可能是致命的。
從我在ApploII上敲入第一行代碼至今,已近三十年,從書寫第一行正式的將要交付甲方的商用/軍用代碼起,職業生涯也已近二十年。因自己的代碼人生,是從微機基礎開始循沿以上路徑逐級深入,所以比較推崇夯實基礎的學習路線。也因為有幸從見習工程師逐級向上,直至技術類職位的天花板,所以對各層級工程師的心態、對信息產業及其衍生各分支領域,略有了解。在過往漫長的職業生涯中,我從未曾見過,在沒有吃透底層原理時,高級程序員或架構設計者,就能設計並實現,基於複雜或極複雜背景下的高效代碼,更不會在升職時,將技術類高級職位輕易應許給基礎欠缺的同事。如果真有例外,那麼是我孤陋寡聞,但即使屬實,我也會斷定,他將在下一階段更高級職位的競爭中,被無情淘汰。
(沒寫完呢,你們就瞎點贊。以下是原答案,新答在上。)
能不能屠龍,不知道。
殺雞嚇猴效果不錯。偶爾有大業務,殺頭牛,宰只豬,效率要比只會莊家把式的高,別人三天殺一頭,我已經一天宰三隻了。日子久了,面對獅虎豺狼,也覺得不過爾爾。後來四鄉八里都知道我這個屠夫還不錯,又傳聞是有山中奇遇,和仙人學過屠龍技,這出場費慢慢就高的沒譜,為了排隊請屠龍者去殺豬互相毆鬥也是 常有的。
哎……可惜,空有屠龍技,至今卻未曾屠龍。人生啊~~
龍是真實存在的
而且數量龐大
每年每月每日每時每刻每分每秒
這屯那村
都有惡龍肆虐
我早年立志屠龍
尋訪五洲四海
抱回屠龍九卷梵語本
電閃雷鳴日晒雨淋風吹去
險阻困苦煎熬習得屠龍技
出發
入山
屠龍
山下胖漢橫槊攔下
何往
進山
何事
屠龍
屠啥龍啊,整啥玩意兒呢,就你這德行,天空套裝都穿不起,逼逼啥呢,屠龍協會能要你這人,哪兒涼快滾哪兒去
合當拿此賊祭刀
但只能默默遁走
「屠龍技屠龍不屠傻逼」——《屠龍導論——原理、技術與工具》演算法導論,名字都叫導論了還屠啥龍啊…這個是基本功…編譯原理,看你做到什麼地步了,要是刨去優化這一塊也是基礎課。算上優化確實是屠龍,不過我感覺龍還是蠻多的啊…
年輕人多讀書,少那啥我覺得這不是屠龍,因為龍殺一個少一個,龍已經被前輩們殺光了。這些只是比較高級的副本,對於一般的玩家而言,每刷必死。副本是會刷新的,等級不夠刷不了,等級夠了,技能沒點滿也刷不了,就是這樣。
這都是普通工科本科課程大綱裡面的,不是 什麼理論前沿,也沒有量子力學電動力學難度的十分之一。就不能看兩本書學個大概再來談一下自己的人生經驗?
這是一道送分題……?是屠龍之技。龍真實存在,已經畫在圖上了。
關鍵是很多IT從業者的工種的技術含量之低使得他們沒機會用到這些東西
屠個屁呀,都是基本功。
」你會跳嗎「
會啊「這裡有個1米寬的坑,給我跳過去看看」這不簡單,是人都會。(你看那些號稱練過的,他們和我一樣能跳過一米遠,他們練了有什麼用啊。)「哦,你會跳啊?好,就要你了。」------
(被名為」項目進度「的大怪獸追殺的時候)
「對了,前邊有個坑你得跳過去。」好……等等卧槽為什麼這個坑有50米寬「啊?你不是會跳嗎?跳過去不就行了」但是等等,1米寬的坑和50米寬的坑不一樣啊「不都是坑嗎?你看大家不都跳過去了」我了個#$*()@#@*#------
不好好學基礎大概就會碰到這樣的情況技在手,龍主動上門
先不說是不是屠龍技,但是龍就在那裡,只不過大多數人都看不到,只有功力深厚的人才能看到。
1. 能找到的活兒太差的時候,覺察不到技術的必要。成天跟小孩打架,不用練力量敏捷抗打擊;成天蓋狗窩,不需要圖紙和水泥標號。如果理想就是這樣,龍只是傳說,屠龍技當然毫無用處。
2. 除非真正屠龍過,否則不能確定掌握了技術--做習題是不夠的。因此「有技(而無龍可屠)」是個偽命題。其實這個問題很簡單,就看你目標崗位是什麼。
你目標是畫網頁,那麼這些都不用學。但是但凡你想搞個收入更高的工作,這些屠龍技真的可以賣出好價錢哦我天天吃麵包,還要農民種小麥干毛。
不要把任何知識單純當成是為了解決某一問題的。其實任何知識都會給你提供一種思想方式,學的多了,你可能用一個毫不相干領域的知識去解決某一領域的問題。不要只看他怎麼做,要知道他為什麼這麼做。
某人學生時代校招時面試支付寶,說在校期間實現過簡單編譯器和簡單OS。於是侃侃而談。當然是實打實做過。
面試官直接就說:不面了,可塑之才。連這個都能玩轉的人,其它技術學習有啥難度。錄用。是因為非計算機專業的從業者太多了吧,這些都是課綱里的,真正的屠龍技可是我大數學啊
推薦閱讀:
※有哪些有用或者好玩的 Telegram Bot?
※C++ 關於 static 對象定義問題?
※python求解八皇后問題中的回溯究竟體現在哪裡了?
※是否所有的循環都能用遞歸代替?
※為什麼 PLC 梯形圖要這樣設計?意義在哪?