計算機科班出身的優勢是什麼?
逛了逛知乎,
發現一大堆學生轉計算機專業,還都是靠自學的,雖然說計算機學科確實是需要大量自學的學科,但是這樣學校設置計算機本科的意義何在呢?以及計算機科班出來的學生又有什麼優勢呢?
歡迎批評和補充—————————————————————————
討論的轉計算機不是包括簡單的自學,還有比如本科化學生物自動化等,研究生轉到CS,這些在興趣驅動下後又接受了學科碩士的教育(就是混合型的學生),這些是否就比較好的融入這個專業?
我自己是P大地球空間科學出身,拿的是地理學學位,自己和師長都算是非科班。這裡舉身邊幾個例子,談一下體會,不黑母校。
我們系一位教授A,測繪專業出身,多年C++編程經驗,在資料匱乏的年代也算是摸爬滾打的老前輩了。他教我們地形可視化和數字高程模型,推薦教材是固定管線時代的Nehe博客,張口便是「C++比C語言慢」(這句話在上世紀是對的,但現在顯得有點過時了),不知道shader為何物,此外還喜歡說「我們那時候都是人力malloc/free,現在的年輕人哪吃得起那個苦」。
另一位教授B,工程背景算是比較強的,以前貌似是486時代開始就搞市政公交地圖的項目,對圖形學和圖論有了解,我認為他的演算法能力強於同系所的其他許多老師,講課也頗有水平。但對於編程語言的範式和技法則不太講究,寫出來的C#代碼,一大半是各種dispose()。然後一邊寫一邊跟我們感嘆,C#這個難用,開發效率遠不如VB。
更不用說一票遙感和GPS行業的老師,用的是垃圾的IDL(NASA搞得那個,不是 Interface description language)或者Matlab/Fortran77,他們何嘗不是勤勤懇懇,花了很多心血,炮製出來幾萬行科研代碼,然而對結構化編程毫無概念,不研究方法論相關。在他們手下讀PHD的同學,面對成噸的編譯錯誤,每天沉浸在「Dimension doesn"t agree"之中,恐怕這輩子那一點點對於編程的興趣也被磨滅沒了,還要落個「不能吃苦」的罪名。
身邊有些同學不喜歡本專業,想要改行自學C語言,卻不知道怎樣和操作系統,編譯原理,計算機組成聯繫起來,不知道哪些是70年代PDP硬體機能不足帶來的設計缺陷,反倒苦心孤詣,走入了「i+++++i的值究竟是多少」「異或交換兩個變數效率更高」,「《C與指針》講了void*威力無比」,「linux源碼用宏實現泛型簡潔強大」這類邪門歪道。有些同學認為藝多不壓身,希望學python數據分析或者ML練就一技之長,結果數學基礎不紮實,動輒看著概率泛函的鬼畫符抓耳撓腮,或者乾脆化身調參員,面向玄學編程。還有些勇士聽說Haskell蘊含了無數PL人智慧的結晶,發誓不學懂monad決不罷休,便一頭扎入了犯愁論的苦海,再也沒能爬出來。
我本科自學C++,雖然是搞了全新的C++ primer卻看不進去,試了幾次都淺嘗輒止。來知乎搜索答案,得到的都是「連C++ primer這種入門書都學不懂還編個屁的程序」的勸退言論。直到一位前輩告訴我,C++的幾個需要注意的特徵是「兼容C的包袱,值語義,zero-overhead abstraction,RAII」,帶著這個思想去讀書,頓時豁然開朗,一周多就通讀了一遍,還感覺自己前面白白耗費了幾年光陰。
這裡並不是要批判一下師長。我只是覺得,既然是北大出身,想必吃苦耐勞的素質也是有的。然而受限於環境,手頭資料匱乏或無人引路,很多錯誤的(或者當年是正確的,隨著時間漸漸變成錯誤的)知識流傳於民間,很多人奈何不住無人交流,自己埋頭死練硬練,搞錯了方法,練野了路子,把九陰真經學成了九陰白骨爪,還將這個錯誤一代代流傳下去,流毒甚廣。這就是沒有師承和人脈帶來的弊端。
知乎很多人喜歡說「現在網上編程資料一抓一大把,只要肯自學都不是難事」,我個人認為純屬倖存者偏差。現在這個時代資料豐富的確不假,但是如何從浩如煙海的資料中摸出門道,形成正確的方法論和知識體系,卻遠非讀幾本書或者搞幾個項目那麼簡單。所謂師傅領進門修行在個人,意思是師傅找對了效率能翻10倍20倍,然後才看個人自學努力。你看知乎的某幾個大V,實際上都是小時候父母老師教導有方,早就開始用正確的方法練習了。長大了以後還要酸腐一下別人:我能有今天的成就,完全是自初中以來不懈努力的成果。
我自己水平不高,現在勉強算是半個上道的人,大學時代瞎逼練編程,被虐了好久還在堅持,現在才剛剛摸到一點方法,那些沒堅持住的人呢?恐怕他們才是沉默的大多數了。
利益相關:帝都仰望星空大學(又名:學院路小飛機實驗場)科班出身,也算國內top幾。
先說結論吧:科班出身肯定是有優勢的,主要在於基本理論知識。基本理論這個東西,對於入門和平均水平程序員來說,可能並不見得有多大用處。但是如果邁向高端、深入,那麼這些基本功就顯得很重要了。(要是沒有用,那本科四年時間豈不白費了)
以我校課程體系為例吧,講一講一些專業基本課程(可能學的時候看起來一輩子都用不著)是怎樣體現在實際工作中的。
先講語言:本科期間唯一一門語言必修課是C語言。其他的語言統統都是選修或自學。用的當然不是譚浩強的教材。考試是機試:程序輸入過測試點,和leetcode等方式是一樣的。很多同學覺得很殘忍,一個小錯誤可能就導致考試不及格。老師講過一個故事,說他和北大的老師討論,北大老師說:怎麼可以這樣呢?明明程序大多數都寫對了,怎麼能一分不給呢?老師說:這就是工科和理科的區別吧。你不能說火箭大多數都對了,只是錯了一顆螺絲釘。那就是一分不給啊。說白了語言就是一門工具,舉一反三的傢伙,多數科班教育都不會把語言特性作為育人的重點。
離散數學:離散數學算是計算機基礎數學。主要包括集合論、圖論、數理邏輯等。圖論算是比較貼近實際工作的部分,畢竟有很多圖演算法。集合論貌似是最遠的,但卻是一切的基礎,如笛卡爾積的概念,我最早一直不知道有什麼用,直到學資料庫,上來就說join(廣義的,而不是只指自然連接)操作就是笛卡爾積,頓時恍然大悟。數理邏輯包括命題邏輯、謂詞邏輯等等,在人工智慧領域是用得著邏輯推理的。
演算法:我校的演算法課程不是一般意義上的講具體演算法,而是講的演算法的一些種類、思想、理論。比如講divide and conquer,講概率演算法、隨機演算法(很多人是分不清這兩者的)。講快排在什麼情況下最慢,講通過隨機演算法(隨機快排)來減少最壞情況出現的概率,講快排和插排切換使用加快排序。概率演算法,比如hyperloglog,布隆過濾器都是通過犧牲精度換取巨大的性能提升。所以演算法課的價值和刷演算法題是不一樣的。講真,除了少數情況,多數演算法都有成熟的庫實現,並不需要你裸寫一個。應用的時候,你知道有什麼樣的演算法,用什麼樣的思想能解決問題,比你會裸寫出來重要100倍。
形式語言自動機:喬姆斯基文法類型。大家都愛用正則表達式,但是正則表達式所對應的正則文法到底能做到什麼?是萬能的嗎?如果不知道,有的根本實現不了的功能就還可能在絞盡腦汁想怎麼寫個正則表達式。比如正則表達式能解決括弧配對的問題(左右括弧一樣多)嗎?對不起,不行,要上下文無關文法才可以。又如,我見過有同事面對一堆的狀態純手擼代碼的情況,邏輯不是這兒有漏洞就是那兒有,一直搞不定bug。其實,紙上畫一個有限狀態機,狀態轉移圖一畫,邏輯就理清楚了。
資料庫原理:3NF,4NF,BCNF有什麼區別?對不起,我也不記得,但是我知道有這個東西,需要的時候我可以去查。一般來講,一個資料庫系統3NF是需要的吧?也有為了性能需要一些冗餘的情況,但就必須要注意好數據一致性問題。我是見過什麼範式都不滿足的資料庫系統(當然,1NF還是有的。。。),維護起來一團糟。
編譯原理:嗷,這個可能是很不接地氣的一門課了。高級語言滿天飛的今天,有多少人還需要編譯原理或者彙編這樣的知識啊?但我們學校的編譯課,可是硬生生要求大家實現一個PL0文法(Pascal文法子集)(和C0文法穿插著來,防止學弟學妹直接抄上一屆學長的作業,也是用(sang)心(xin)良(bing)苦(kuang))的編譯器,要想拿優還要實現一些基本的編譯優化。這種知識,多數情況下是用不著的。但是當你的代碼面對性能問題的時候,你會發現有時候面向編譯器的代碼優化有時候能更好的提高性能。有時候寫框架,需要用到代碼生成,那麼這時候懂編譯原理也能有所裨益。
接下來是考研必考的三門專業課:
計算機組成原理和操作系統:這兩個放在一起說,是因為他們有很多互相交叉的部分。考研面試常問問題:從你按下電源鍵到登錄到底發生了什麼?計算機存儲的層次結構?硬碟、內存、cpu cache之間的關係、緩存、交換。這些對代碼的優化還是很有好處的。舉個例子:大數據領域常用的消息中間件Kafka,數據都是落在磁碟上的,但是卻提供了超高的讀寫性能。其原因就是強制使用順序讀寫,充分利用了操作系統Page Cache,這種思想和實現,沒有紮實的計算機基本功是做不到的。操作系統的調度演算法可以在寫「大數據」任務的調度演算法時有所參考。了解double,int等數據的存儲方式,可以避免計算時不必要的精度損失(比如大數加小數)和提高性能(比如用位移代替乘除法)。又比如為什麼有時候存儲時有的框架看似多存了幾個位元組反而性能好了?這多半是用了對齊,提高了cpu cache的命中率。這些有都是需要計算機基礎知識的。我校的計算機組成原理課後,還有一門計算機組成原理實驗課,需要使用Verilog語言在FPGA上實現一個MIPSC指令集的完整系統。
還有一點是避免鬧笑話:某本Spark書,將ListenerBus理解為Listener 公共汽車,還覺得「巧妙」:
但凡學過計算機組成原理的都應該知道,bus在這裡應該是「匯流排」的意思(計算機里一堆匯流排,很多這個概念的提及)。強行抖一波機靈,說是公共汽車,到站就下車,實在是貽笑大方。
(更新ListenerBus相關內容:評論區很多人說bus本意就是公交車,「匯流排」只是一個中文譯名,英文中也就是借用了「公交車」的類比。好吧,我收回我言辭激烈的批評,但是仍然覺得在一本面向程序員的專業書籍里,不應該有這樣的「比喻」。還是應該使用專業的翻譯。)
網路:網路也是個設計非常巧妙的東西。滑動窗口機制、慢啟動快重傳,都是在消息傳遞的時候非常有借鑒意義的設計。前段時間排查一個錯誤,涉及到socket的問題,我就強烈懷疑是和滑動窗口機制有關,遺憾的是,由於時間和精力關係,沒有進一步跟下去,但能往這個方向想,就本身是需要有這方面的基礎知識的。
差不多說完了,有什麼想起來再補充。知識點都是憑記憶寫的,說的不對請大家指正。
當然,科班的這些優勢都不是絕對的,只是平均上講會有一些優勢。畢竟這些東西都不是壁壘。我認為程序員是一個入門容易精通困難的職業。其實很多職業都有這樣的特性吧。
我的導師,許可教授,本科就不是計算機專業的。但他同樣能在高德納的《計算機程序設計藝術》里挑出錯誤,並獲得高德納給他寄的支票(圈內人都知道這是多麼牛逼的事情)。我校兩位前校長、計算機學院教授、李未、懷進鵬院士,也都是數學系出身(當然,數學系轉計算機的真的有很大優勢)。科班有科班的優勢,但真正的大牛,是不在乎你這麼一點點優勢的。
以上,謝謝。
電子信息工程、計算科學、電子科學與技術、通信工程、網路工程、信息工程,軟體工程的師兄們,大家同時信息和尚院的。不要跑過來裝自己是非科班好嘛!!!!
================================================================
計算機科學與技術專業畢業
帶過很多非科班出身的員工。
科班出身(當然僅表示認真學習過的,打了四年遊戲的,就是扯淡)
首先我們來看下科班,計算機科學與技術的課程表。
數字電路原理、模擬電子技術、數字邏輯、數值分析、計算機原理、微型計算機技術、計算機系統結構、計算機網路、高級語言、彙編語言、數據結構、操作系統、資料庫原理、編譯原理、圖形學、人工智慧、計算方法、離散數學、概率統計、線性代數以及演算法設計與分析、人機交互、面向對象方法、計算機英語等。
這是才從百度百科摘過來了,基本上跟我當年的一致,但是我們當初沒學人機交互,圖形學,和人工智慧。
這些課程里,高數,概率,線代,復變,離散,等基礎學科,打下了 邏輯思考的基礎,以及工作中需要使用到複雜的數學運算時的數學基礎。使人更加易於理解和分析如何吧現實問題轉化為程序邏輯並實現。
模電主要讓人明白信號傳遞的原理同時又作為數字電路的基礎,而數電主要讓人明白計算機內部數據到底是如何存儲,如何運算,如何傳輸的。
計算機原理,微機原理,體系結構,等,主要是來解釋計算機是如何組成的,早期是什麼樣子的,發展歷程是什麼,為什麼會有這樣的發展,現在的計算機的複雜結構下的簡單核心是什麼?
操作系統,真正講述了,一個應用程序是如何層層傳遞,調用了最終硬體的。操作系統,驅動,應用程序,分別都是什麼關係。cpu的運算方式是什麼樣子的,為什麼要有多線程?為什麼會有死鎖,在多線程的模型下,硬體到底在做什麼。
網路基礎,讓人明白在計算機的基礎之上,到底是如何傳輸數據的。分別有哪些層,每一層在做什麼,為什麼RFC的各種協議里會有那麼多奇奇怪怪的頭和尾。各種不同的協議是怎麼產生和怎麼發展的,分別有什麼特色。我們為什麼在某一種場景下使用某一種網路協議。假如我們需要一個自己的協議,該如何構建。
數據結構,讓人明白數據是如何存儲的,目前常見的存儲的模型有那些?這些模型在內存里以什麼樣的方式存儲?這些存儲方式都有什麼優劣?在那些場景中最為適用?
編譯原理,讓人明白高級語言到底是怎麼被解釋編譯成機器語言的。
彙編語言,讓人明白在接近硬體的層面上,程序到底是怎麼運作的。去理解去思考,我們的操作和編寫的程序,對硬體到底做了什麼。不同的操作系統,不同的編譯器,不同的寫法,不同的邏輯,在硬體層面上,會有什麼樣的不同?
演算法和高級語言,一般來講,到這個層面往上,非科班和科班的差距開始變小。因為大部分人在實用性的學習過程中。必須來學習和接觸到高級語言和演算法。
所以科班和非科班,不是你會什麼C Cpp C# Java python PHP Object-c這樣的語言。不是你學了多少linux,Win32,IOS,Android,MFC,.net,Apache,Struts,Spring,樣的框架。或者或你會Oracle,MySQL,SQL server這樣的使用。而是你是否明白,從最基礎的電路和電訊號傳遞開始,到今天的計算機體系的大廈,是如何一步步構建出來的,每一步的取捨都是為了什麼。這才是科班花了四年應該學到的東西。
大部分的非科班生,固然可以做到知其然,熟練的編程,設計生產出非常優秀的應用。但是如果可以知其所以然,那麼是不是可以做得更好?在出現新東西的時候,能夠更快的去理解這些新東西的緣由,發展和價值?
當然我這裡不是在無限抬高科班。而是說,不管是科班還是非科班的同學,不要學了一點皮毛就沾沾自喜。今天我們之所以不用去了解那麼多基礎,就可以從事這個行業。但是這是在無數前人構建的基礎上,我們才可以輕鬆的去學習,去操作。但我們的夢想就僅此而已了嗎?我們該如何往前進一步的去推進呢?
在工作學習的過程中,不僅僅要學習怎麼做,更要多問問為什麼。這樣才能走的更高,更遠。
科班出身的小明:我是科班出身,總不能讓半道出家學了幾個月的小剛追上吧,得加油了
非科班出身的小剛:我是非科班出身,和他們有不少差距,得多花點時間抓緊補補,爭取3個月趕上小明
科班出身的小華:我是科班出身,非科班的永遠只能仰望,玩局遊戲休息一會,反正小亮他們永遠也追不上
非科班出身的小亮:我是非科班出身,感覺永遠也追不上那些科班的大牛小華啊,不追了,他們玩他們的我玩我的
科班:你們聊你們的別扯上我。
可以把題主的問題換個方式去問:
1. 一個普通二本大學的計算機專業的大學生和一個清北非計算機專業的大學生相比,在同時學習一門新的 Web技術時哪個讓人感覺更有優勢?為什麼
2. 一個普通二本大學的計算機專業的學渣和一個普通二本大學的非計算機專業的學霸在同時學習一門新的 Web 技術時哪個讓人感覺更有優勢?為什麼
3. 一個普通二本計算機專業的大學生和一個清北非計算機專業的大學生,畢業後同時從事 Web 開發,兩年後誰發展的更好?
4. 一個普通二本 非計算機專業的學霸畢業後進入了 BAT,而一個清北計算機的學渣只畢業後進入一個不知名的小公司,都從事 Web 開發,兩年後誰發展的更好?
上面4個場景里都有科班和非科班,甚至還有學渣和學霸,普通二本和清華北大,相信大多數人都不再很有底氣的回答科班出身的人最有優勢。
在學習一門新知識時所謂的優勢其實涉及到幾個方面:環境、老師能力、個人能力(智商、主動性、勤奮、專業素養)、專業背景的花費時間、內在驅動力(很難用合適的詞來描述,可以理解為個人不服輸的上進心、專業榮譽感、學校榮譽感),而所謂的『成功』涉及的就更廣泛(很少看到那些『成功人士』自豪的說我是科班出身,科班的光環加成甚至還遠不如學校和工作經歷)。
而所謂的科班不過是在專業素養、專業背景花費的時間上有一些優勢,當然這些優勢有些情況下可以成倍加成放大,而有些情況下又不值一提。
如果相關背景基本相同的情況下(學校類似、學生綜合水平相當),非科班的同學只需額外花費1.5倍的自學時間稍加提點就能達到科班的水平,而背景如果差距過大完全沒有任何可比性。
大學裡計算機相關專業的課程總共才多少課時呢?
所以你要問計算機科班出身有優勢嗎?當然有。但這和你平時能多抽出點時間來學習沒什麼區別。有些東西已經無法再改變了,比如學校、專業、學歷,而有些東西時刻在變,比如個人能力(智商、主動性、勤奮、專業素養)、專業背景的花費時間、內在驅動力。
如果你問:我是非科班出身,我的學習過程很痛苦
我會告訴你:那些科班出身的大牛學習道路也曾經也同樣痛苦,你不過是走了相同的路
如果你再問:我是非科班出身,我每天花費的時間是他們的3倍以上,為什麼還是趕不上他們?
我會告訴你:先堅持個一年再說
其實你想要的是『成功』,而不是優勢。成功是加分制,不是一票否決制。
成功分不同的階段。考上好的大學算成功,找到一份讓人羨慕的工作算成功,升職加薪算成功,賺夠人生第一個100萬算成功,拿到N 輪融資算成功,達到1個億的小目標算成功,顛覆整個行業更成功。如果低階段的成功可能需要100分,而高階段的成功則可能需要1000分甚至10000分
總分 = (科班【0~80分】 + 學校光環工作經歷 【50~200分】+ 勤奮踏實做事【0~200分】)* (科班所獲得的能力、思考方式、做事方式【1~3倍】)* (軟技能如主動性、上進心、待人處事方式等【1~10倍】) * (機遇【1~10倍】)
對於科班的同學,如果你只是盯著科班的0~80分,忽略了更重要1~3倍,甚至忽略了其他更更重要的因素,那你可能能達到100分,但一定達不到1000分
對於非科班的同學,既然科班的0分是註定了的,那發揮自己的所長也可輕鬆超越大部分人達到自己的小成功甚至大成功,不用妄自菲薄或者盲目自大
從去年九月份算起,自學大半年了,起初還覺得科班生沒什麼。我買了大量的經典書籍,自信搜索能力不差,能從互聯網上獲得大量的資源,MIT、網易雲課堂、培訓機構的內部視頻我都有,難道這些還不足以彌補科班與非科班的差距嗎?
後來發現不是這麼一回事兒,越學越羨慕科班生的環境。要是有機會的話,我還是挺想讀一個cs方向的研究生。就我的體會,自學的劣勢主要有以下幾個方面。
1、找不準坐標系,難以定位自身。
我最開始接觸編程是通過《笨辦法學python》,這本書我學得挺痛苦,因為此前沒有接觸過任何與編程有關的東西,兩周左右才拿下,被裡面的各種各樣環境安裝,編碼什麼的弄得頭昏腦脹。然後我看見我的初中同學在空間里發了一個動態,兩天學完了《笨辦法學python》,速度還不錯吧?當時我就懵逼了,為什麼我辛辛苦苦學了這麼長時間人家只要兩天就搞定了?要知道我高考至少比他多出100分吧,要是科班生學東西都是這速度那我還學個屁啊,一輩子也趕不上人家啊。開始自我懷疑,自己是不是不適合學編程?
現在我知道要是有一門語言基礎,一兩天看完《笨辦法學python》還真不是個事兒。但自學者由於缺乏相應的坐標系,難以判斷自己的學習進度。我後來也加過不少所謂的自學群,群里最愛問的一句話就是,你學成這樣學了多長時間?大家好像都在暗中較勁兒,他花了多少天學完了什麼什麼,我就應該比他更快,因為沒幾個人願意承認自己比別人笨。我覺得這種比較是毫無意義的,因為每個人的基礎、時間、資源、天賦、環境都不一樣,每個人學到的深度也不一樣,怎麼比?越比越焦躁。就像他們有人覺得我學得挺快,但我從來沒告訴他們那段時間我是脫產在家專心擼代碼的。
初學者一般都猶疑不定,迫切看到成果來確認自己是否適合編程,本來就有些急功近利的意味,處於這種混亂的坐標系會變得更加焦躁。自學群里一個人加我QQ就問我一個問題,多長時間學完了狗書《flask web》,我說用了二十多天,快一個月,有什麼不懂的可以問我。這一個月時間,他什麼也沒問我。一個月後,他說他也全部學完了,但有個地方出了bug,怎麼也跑不起來,讓我給看看。我越看越疑惑,問他這不是你的代碼吧,這明明是原作者的代碼。結果他告訴我,他就是把原作者的代碼的config部分改了一下,然後把書給學完了。我當時無語,跟他說:第一,原作者的代碼是有很多問題的,有些問題沒解決,從第六章之後就根本跑不動了,不知道你是怎麼學完的?第二,我坐在那裡邊看邊調試了半個多小時,把別人寫的代碼發給我來調bug,這事兒太不厚道。然後就把他給刪了,後來群里也沒看見他了。
這種狀況學到後面就能好很多,初學編程,大家都是盲人摸象,不知道怎麼走,到了後面就能隱隱窺見大象的輪廓,對自己的水平就越了解,道路也越清晰。知乎上關於編程的問題,最受歡迎的答案基本都是留學習資源,列書單的。因為越是初學者,就越迷茫,越計較自己投入的每份努力都有回報,他們一點不想走彎路,大量的書單和資源會給他們一種踏實、確定的感覺,好像按著這個走就能直達成功。
到了後面我才發現,沒有捷徑,只有路。是路,都得走下去才能看到結果。
2、缺乏反饋,找不準自己的薄弱點。
學習過程中經常會遇到這樣的事兒,很多概念原理,以為自己理解了,其實是錯的,或者理解不深刻,但自己是很難發覺的。這樣的錯誤累計越來越多,到了後面就老出問題。並且這些錯誤的觀念,知識很難糾正過來。
我曾為此苦惱了很長時間,因為沒人可以給我一個反饋,我不知道自己的理解對錯,也不知道自己的知識體系里有多少篩子,每每以為這一塊兒自己已經吃透了,後來才發現是自己從一開始就錯了。
我的解決辦法是重視習題,習題是幫助自身理解的工具而非負擔,可以提供檢驗與反饋。還有就是繼續往後學,你不可能只學python就把python學得很好,以前很多不理解的地方在我接觸了c、計算機組成原理之後慢慢就迎刃而解了。往後學得越多,對前面東西的理解也就越深。
3、缺少人來做提綱挈領的工作
一本書,一眼望過去,上面印的字都一樣大,但裡面的內容絕對不會是一樣重要的。有的章節,篇目很長,內容繁雜,卻都是不涉及核心的介紹性內容。有的篇目很簡短,卻可能是整本書的精華所在。哪些是主要,哪些是次要,哪些內容並不完整?
沒人指點,你很難第一遍學就抓住重點。書上的內容都是平面的,但知識體系卻一定是立體的。你要通過平面的書籍建立自身立體的知識結構,全憑自學是很難的。
最開始我的解決辦法是一本書讀兩遍甚至更多,第一遍學習了解內容,第二遍歸納總結。後來學習計算機組成原理和計算機網路的時候就遇到了麻煩,因為第一遍學過去就已經很困難了,後來果斷跟著網易雲課堂的老師學,邊學邊感慨,科班的環境就是好,有老師的話,學習的難度曲線陡降50%。
4、缺乏「常識」
這一點我不知道該怎麼形容,這裡的「常識」也可以換成意識、觀念什麼的。
最初學了函數的封裝,面向對象的抽象,我以為自己已經理解了編程中的抽象到底是怎麼回事,後來讀《SICP》的時候才發覺自己對抽象的理解是多麼淺薄。之前讀到現代的軟體設計是以數據結構為核心的,我一直不太理解,我原來以為是因為我對數據結構的了解不夠,後來才知道是因為我對抽象這個概念的理解不夠。
意識這東西,很多時候不是多難理解,恰恰相反,是很好理解,然後停留在最淺的層次就被忽視過去了。這些意識方面的東西,在科班生那裡耳濡目染,可能是常識,但自學的話,你卻很容易就忽視過去了,非得下苦功才能領悟。
5、很多縮寫單詞讀錯了。
這點我就不多說了,和別人一交流,蜜汁尷尬·······
6、路線問題
很好理解,科班出身路線更清晰。我個人也是走了不少彎路,現在可能還在彎路中·····
寫了這麼多,你可以看到自學是有很多劣勢的,這些劣勢未必不能彌補,但是需要耗費很多額外的時間成本,學習成本。前段時間我搭建一個伺服器,耗時兩天多,走了很多不必要的彎路,但要是有個人指點一下,估摸著兩個小時左右就可以搞定。
相較於科班的學習環境,自學環境一定是劣勢,所以自學者一定要學會藉助各種資源降低難度曲線,學會在岔路口前摸清方向。
科班出身
小學5年級開始寫 QB ,中學6年有5年在寫 Pascal,大學讀了4年 CS。
從業以來,我見過最厲害的獸人哦不非科班工程師,也見過最垃圾的科班應屆,倒不是說科班一定會比非科班好,放在90%的工程領域,你根本分辨不出兩者的差異。
比如我認識的 SA 們,不是學德語就是學英語,弄起敏感詞來比誰都666。再比如我認識的大齡婦女殺手哦不正則大師安德魯斯,是個半路畢業從政府幹起的。
一個科班出身的,可能數據結構了如指掌,左龍書右 SICP 頭頂黑皮腳踩郵電,然並卵的是業務都是 MVC,用的都是標準庫,你說你有十八般武藝,不好意思我司只用這一把菜刀。講真沒有BAT那身材,就不用考慮從最底層去造 KPI 輪子。你說你精通 C++ 彙編那都沒用,大公司的輪子部門也是一個蘿蔔一個坑,沒坑你也沒法造,況且這世上還沒人敢說自己精通 C++。
一個非科班出身的,趕上了 Taylor Swift 的風潮,弄一弄「全棧」寫幾個 js,一樣能在這個圈內混得風生水起,從工資層面來看說出來那也是不輸金融界。幹個3,5年遇到的坑多了,經驗也多了,能給公司創造價值,能給用戶改善體驗,跳槽都是搶著要,也沒什麼不好。
長遠來看工程領域門檻越來越低是好事,邊際收益高,時間成本省下了,人力成本也低,讓這個世界變得更美好嘛。
但是,科班出身別人我不知道,我自己的感受是「焦慮」,而且是隨著工作年限增加而越來越焦慮。大學也好中學也好,大多數教的其實和工程無關,是一種科學體系的培養,畢竟這一門是叫計算機科學與技術,不是什麼怎麼寫代碼。而科學體系,是沒有上限的,而且科學體系,是有門檻的。
你說你今天得益於馮諾依曼結構的計算機架構有了這一份飯碗,萬一哪一天不是馮諾依曼結構了咋辦?你說你開源用得各種666,萬一哪一天突然發現核心演算法失靈了咋辦?比如 sha1。你可以說你熟練的用各種語言寫這個寫哪個,萬一哪一天業界的重心變了咋辦?比如現在的 AI 再比如圖形學。
你一瞥這門學科的一粟,你會發現這片滄海,真是無窮無盡,而這就是我「焦慮」的來源。對於我來說,字典裡面就沒有「上限」這2個字。
畢竟,人類綜合了數學物理化學等各種基礎科學集大成者,硅基生命的基礎,就是這個計算機科學。
所以一定要扯到優勢的話,我覺得就是這種「焦慮」感帶來的原始驅動力吧。
1. 知道哪些問題是不可判定的(undecidable),遇到了不要浪費時間去試圖解決它。如果發現老闆給的任務跟停機問題等價,可以跟老闆 argue 說 mission impossible,如果老闆不買賬,呃,自求多福吧。
2. 知道哪些問題是困難的(例如 NP-hard 類),遇到了不要試圖尋找多項式時間演算法,除非你打算把圖靈獎和菲爾茲獎一併笑納了。
3. 知道哪些問題是已經解決的,不要試圖去重新發明個方的輪子。要知道天高地厚,ECDHE-RSA 這個密鑰交換演算法有5個圖靈獎得主的名字在裡邊,不是那麼容易被你踩在腳下的。
4. 知道常見術語的含義,portable 通常是可移植的,而不是便攜的,PDF 不是攜帶型文檔格式,class library 不是班級圖書館,資料庫 field 是欄位不是場。
5. 知道術語本來的意思,object 除了是對象,還可以是「賓語」,verb+object 是動詞+賓語,不是動詞+對象。
6. 會正確使用標點符號,C/C++ 不是 CC++,反斜線 "" 通常只用來表示轉義字元。
也許是倖存者偏差?
將轉行這件事比喻成翻越圍牆的話,在外面的人看來,看到的儘是牆頭的人,而牆頭下黑壓壓的人是沒有資格說話的,即使有也很少被人聽到。所以在局外人看來,轉行真是一件容易的事,「你看,那麼多人都成功了呢!」
你也許不信,有很多人看到「如何自學成為大牛」的問題,默默點了個收藏,不幸成為「書單、公開課愛好者」,卒;有很多人信誓旦旦、摩拳擦掌在淘寶買回《21 天精通xxx》束之高閣,卒;有許多人好不容易下了 visual studio 死活安裝不上,卒;有很多人總喜歡說「對技術感興趣,喜歡研究新事物」,結果倒騰了三年 linux 桌面,一無所獲,卒。凡此種種,不勝枚舉。
要知道大部分人都是普通人,對轉行、轉專業的人來說,最致命的也許並不是走彎路、沒有清晰的規劃,在二者之間徘徊的心態也許才是最可怕的(新形勢下,作為物理數學專業的大學生應該何去何從? - 知乎),仍以翻越城牆為例,不上不下才是最痛苦的。
所以回答題主的問題,「科班出身有什麼優勢?」,優勢就是即使現行的教育體制有若干問題,即使很多人對學校、老師有諸多抱怨,但是為了那點可憐的學分,畢竟和一群人(如果有志同道合再好不過)浸淫了四年,更不用說視野、夥伴和環境了。
據我觀察,有許多轉行成功的人,在工作一年之後也會選擇回爐重造,讀個研究生,某種程度上也印證了「科班出身的優勢」吧。
早就mark了這個問題,趁著端午有空來答一發。這麼多年在學校和公司中,也接觸過形形色色,各種背景的同學和老師。我本身當然是一直科班CS,但是本科的啟蒙導師算是一個非常"不CS"風格的老師,研究的方向更偏向統計,在這過程中也有幸接觸到了很多優秀的數學/統計背景的同學。下面主要從技能和思維方式兩方面來講下CS科班(泛指CS EE相關)和非CS科班(理科專業以及跨度較大的工科專業)同學的差異吧。
技能方面
其實在一些前沿的應用技能方面,CS出身的學生並不會比非CS的學生有太多優勢。這些可以快速習得使用的技能,在我看來只是外功,技術革新飛快,在學校裡面學到的一門編程語言,一個框架可能到實際工作中就已經過時了。然而在這背後,想要深入進去之後,總是有一些不會變的東西支撐著:例如,CS的課程設計里會有一條從數字邏輯-計算機組成-體系結構-操作系統-彙編-編譯器清晰的脈絡。雖然我也不可能清晰地記得其中每一個細節,但是其中一些反覆被提及的概念以及設計原則可以幫助理解很多最新的技術,例如memory hierarchy,RISC vs. CISC。最近的例子就是火爆的TPU,為何可以比CPU和GPU獲得更高的效率?可能會遇到的擴展性問題有哪些?如果只是一個半路出家用用caffe跑跑model的"deep learning researcher"可能就很難理解了。
思維方式方面
在思維方式方面,可能差異會比在技能方面更大,列兩個我覺得最關鍵的吧。
1. 試錯與debug思維
這可能CS和其他學科差異最大的一點:在CS里,尤其是軟體方向,基本試錯的成本為零:不像很多理科專業,推理過程的嚴謹性不容得馬虎;也不像生物化學這類專業,試錯可能會導致極其嚴重的後果。這最明顯的感受就是,每當遇到一個有bug的程序,CS和非CS同學處理的方式。非CS的同學一般會從頭思考整個的code,不知如何動手。然而CS的同學一般會採取的方式是:1. 猜測可能錯誤的位置 2. 列印關鍵變數or注釋掉代碼重新運行驗證自己的猜想。如果不對,回到1。當然,腦中debug是非常重要的一項能力,也是對思維極好的訓練。但是後者對於複雜的項目有著更高的效率,可以快速定位不符合預期的地方。
2. 偷懶與潔癖
優秀的程序員都是"偷懶"和"優美"的。偷懶體現在如果一個事情需要重複做三遍,那麼我可能就會去考慮用一些自動化的script去幫我做。優美體現在對於自己code的抽象性和簡潔性的極致追求。這一點最直觀的就反應在了代碼質量上。很多非CS同學寫的code是正確的,而且性能各方面也都不差,但是整個代碼看起來一團糟:各種複製粘貼,各種hardcode常量,使得整個代碼的可讀性和復用性大大下降。
當然這些方面也都不是絕對的,這些技能也好,思維方式也罷都是可以通過刻意的訓練很快習得的。每一個行業的人多走出自己的舒適區,去學習別的行業中的優點,這樣的大融合才會是趨勢。
好吧,不知道我算不算科班出身。
我是轉學到伯克萊的,EECS專業,就是EE和CS一起上的那個苦逼專業。
從61A 300+人,到61C 200人左右,學到一半學不下去的人大有人在。
科班出生的優勢在於,你更接近這門學科的本質。
計算機其實出現得很早,現在小朋友大概已經很少知道什麼是8086 80286 80386之類的了吧。
當年教我們的教授讓我們學習的不是C,不是C++,而是scheme.
Scheme (programming language)
HomePage for Brian Harvey (bh@cs.Berkeley.EDU) 這老頭教的。
他當時就給我們說,scheme我大概會用20分鐘教你們,然後剩下的你們都會了。
他最常用的一句話就是:you guys already know it, you just don"t know you know it.
我一直很困惑,但現在明白了。
科班出身的優勢其實主要是這麼幾點。
1. 你知道天高地厚。 不要覺得擼擼演算法,會寫幾句hello world 就是什麼高手了,真的高手根本就不跟你玩這些東西,我們基礎課最後的作業就是用C 實現LOGO,語言其實就是一種思想的實現方式。我從不說我精通什麼,在老師面前,他用一天的時間了解思想,寫出來的code會比外面的人精鍊和優雅得多。
2. 你知道前路方向是什麼。也許剛開始初級的時候,這些優勢不會顯現,但當你到了一定程度,你就會發現,清楚方向是多麼重要的事情。對於技術棧的選擇,為什麼會選擇這樣的前端框架,為什麼後端的配置是這樣的,緩存如何處理,流量平衡,數據儲存,等等問題,你都會一點點的考慮。如果你對於這些問題的本質有所了解,你會更容易的找到方向。
3. 自信。這點其實很重要,即使是所謂的蜜汁自信,對於處理一些問題的時候,真的會有幫助。我就一直相信,無論我跌得多慘,我總會爬起來,無論這個bug多複雜,我都可以解決。想當年,我們在61C直接就模擬了一個晶元,就是"我的世界"那個遊戲里那種,我們每一個學生都造了一個,從與門,或門,與非門開始,從頭開始學彙編,模擬晶元,最後考試就是用自己模擬的晶元做計算器。
其實所謂科班二字,有點不妥,因為科班是中國的說法,其實就是從專門學校出來的而已。
但如果非要較真兒,科班出來的,有個師承。
對我來說,就是內心敬畏,不要給我的學校丟人,僅此而已,但其實這隻能是自己對自己,其他人並不在意。
所以,簡單說,是科班出來的人,在後勁上可能,我是說可能,會比半路出家的人要大一點。
但太多半路出家的高手了,其實,人家本來就是高手,只是恰巧選了計算機而已。
==============================
看來大家挺喜歡閑聊的,那就多說兩句。
我其實挺討厭給人貼標籤的,計算機行業什麼時候出現科班出身了,又不是曲藝圈,我們程序猿是憑本事吃飯的,平地摳餅對面拿賊,講究的就是口條利索,什麼報菜名啊,地理圖啊,都是基本功……
哦,我的意思是,動態規劃和遞歸編程,都是基本功啊,不會不行的。
現在有些年輕人啊,以為知道個背包問題,會個 Fibonacci Number, 就是演算法設計師了,會個聖杯布局,懂一點bootstrap,就是前端工程師了,那如果會點 Nodejs,會上線個小網站,那可要了親命了,全棧。你說,這相聲哦不,這程序猿能好得了嗎?
好的程序猿,得從小跟著師傅,七八歲兒長起來,誒~師傅說一就是一,說二就是二。
"來,說說,硬幣問題是個怎麼回事啊~"
"這是動態規劃的經典問題……還有幾種延伸……是這麼回事師傅……"
"嗯,說得好,小羊崽子最近很刻苦嘛,內個你,肥頭大耳內孫子,一個byte有幾個bit啊?"
"不知道師傅……"
"今兒晚飯沒你份了,繼續搬凳子吧~"
所以說,所謂的科班根本就沒這回事,學校里根本就不教你語言,照這種說法,前端工程師就全都是野路子,因為學校里就沒教你前端的,別跟我提培訓學校,其他人不知道,反正我覺得那不算數。
說了這些話,我的意思是,碼農界,都是憑code說話,管你什麼學校,寫出好code就是角兒……我是說,就是team leader。
好好說相聲,幹什麼不是掙錢,別拿出身壓人,沒本事的人才天天說我祖上誰誰,我是世家,我爸爸怎麼怎麼樣。
talk is cheap, show me the code.
優勢主要是同學和學長大部分都在這個行業里混,想找個人給你背書太容易了,這在找工作上對於非科班基本是壓倒性的優勢。
另外,給你1000份簡歷讓你篩出100個來面試,你是HR的話會怎麼篩,難道還真去看github上的代碼嘛,HR又不懂,必然是看學校和專業啊。
轉行不是那麼容易的,所以選專業要慎重。。。我們有一張文憑證明自己比不是科班生的學生掌握相關技能的概率更大
我們有一張文憑證明自己相對來說更喜歡計算機相關的技術
我們有一張文憑證明自己在高考前十二年的價值比多少人高或者低
是的,我們也就多張文憑而已。
當幾個幾十個我們需要競爭的時候,負責人有時間看人。
當成千上萬個我們需要競爭的時候,負責人就只有時間看文憑了。
招人傾向科班,我說的科班指的是老老實實地完成學業,並熱愛自己本專業的科班學生,沒啥,我相信專業,尊重專業。道理很簡單,若是病人我依然傾向於醫學院畢業的醫生給我治病,而不是自學本草綱目的老中醫。
不否定自學成才的人,但是我知道一個人花費大量的時間和精力成本在一個非專業領域完全靠自己完成一門系統性學科,這需要極高的熱情莫大的勇氣和常人無法想像的毅力。最重要的是一路忍受周圍人的白眼和冷板凳的寂寞。說的直白點,這種人天生就是干這行的好材料,當初高考填志願腦子進了水罷了。人家找到了原本屬於自己的世界,每個行業都有這樣的大神,IT行業尤其多。
但是我也清楚地知道大神之所以是大神,那是因為大神鳳毛麟角。大部分都是凡人,沒有接受過系統專業教育必然存在這樣或是那樣的知識缺陷,在有的職位無關緊要,而有的職位則至關重要,或是說沒有某些知識一輩子都會在現有職位原地打轉而無法突破職業瓶頸。同時這裡面還有很多投機分子,轉行不是因為熱愛或是擅長,而是隨便學點皮毛就想混碗飯吃。
說些政治正確的話很簡單,但是專業知識就是專業知識,他是一個系統性的架構,不會因為說點好聽的話它就變成40天速成XXX,科班的有鋼結構還得老老實實地搬磚,這樣才能蓋的了高樓,否則就是紙上談兵的PPT黨。非科班的如果只是滿足於搬磚蓋一個個二層小樓,嘲笑科班的大老粗不知道走捷徑,就知道挖地基,那麼這輩子也不會有多大出息。貴知精英又開始劃圈子、貼標籤了。
據我所知,身邊數學、物理、化學專業的同學轉行做計算機都是非常厲害的。
科班文憑就是個計算機行業的入場券。
科班身份讓你入了行,後續的職業發展和爆發力全靠自己。
我在這邊小小的黑一下一小部分計科軟院的同學。雖然他們計算機基礎還行,但是在職場上的學習能力和工作熱情度真的很不如非科班的同學。
科班出身的同學更多的是有知識廣度上的優勢,但是技術深度一定是個人投入大量時間才可以沉澱下來的。比如南大的計科學長R大,在JVM方面的知識深度絕對是個人精進的結果。
1.有內存概念,科班的人編程一般都知道自己在什麼時候需要跟內存打交道,什麼時候不需要,而非科班的人,大部分都是功能導向的,很多人不理解內存在計算機科學裡面的重要地位,像python這樣的語言,你其實大部分時候看不到內存,跟你打交道的是list呀,map呀這些數據結構,你在寫code的時候一般都不會考慮他的內存情況。
2.不會被局限到框架中,大部分培訓班出來的人,都是學了一門語言加框架,所以他一般就是背的這些東西,但是不理解,比如典型的web框架,尤其以前jsp時代,好多非科班的人,捧著一本厚厚的jsp書跟查字典一樣學這個東西,非科班的人容易被某個框架局限住。而科班的人一上來就知道所謂框架不過是人家寫好的code,你理解他在做什麼就可以了。
3.對操作系統的理解,這一點上很容易看出科班跟非科班的差距,大部分非科班的人看到的都是程序呀,語言這一層面的,但是科班的人,如果操作系統學的不錯的,他關注的其實是對機器的抽象,他知道我們要run一個程序,需要這麼一些東西,包括進程怎麼管,內存怎麼管,io怎麼管,網路怎麼管,這樣對於編程來說,你其實拿到的是什麼,是一個進程管理器的句柄,一個內存管理器的句柄,一個io管理器的句柄,一個網路管理器的句柄,有這幾個功能句柄,你就可以操作這個機器了。
4.再進一層是緩存,這個可能需要有工程經驗的科班人士才會有的意識,實際上計算機體系結構,只有一個東西就是緩存,弄明白這個,很多架構上的事情你才會明白,比如資料庫有一個cache,搜索引擎有cache,你做的所有的優化,基本上都是跟cache相關的。
5.抽象的意識,這個也需要寫過很多實踐的code才能明白,跟科班可能關係不是很大,跟悟性有關,有的人很笨,無論是不是科班,他就是悟不到這一塊,有的人很聰明,無論是不是科班,只要他寫過一些code,你點撥他一下,他自然而然就知道什麼時候該做什麼樣子的抽象。
(2017/04/09 有重要更新,請往下翻)
我和各種背景各個層次的開發者都有深入接觸,所以對這個問題可以說上一些話。首先,我聲明,我沒有任何瞧不起非科班出身從業者的意思,我對這個問題的回答是希望大家能夠認識到差別,只有認識到差別才知道如何去消除差別。
如果我們把「科班出身」定義為「受過計算機科學本科以上教育」,那麼,科班出身和非科班出身的區別還是很明顯的,而且這種區別是非常大,大到能夠影響到一個人的職業發展。
我認識很多非科班出身的朋友,他們也是很有激情的從業者,但是,即使他們受過相關專業培訓,甚至已經有多年從業經驗,如果不能對一些計算機科學補課的話,一些意識和思維方式會影響到工作。遺憾的是,雖然我也嘗試幫助他們,他們也努力自學,但是收效甚微,所以,我覺得「科班教育」(也就是計算機本科以上的教育)還是很重要的。
舉個例子,一個工程師能不能理解時間複雜度和空間複雜度,其實對於編程非常重要,如果沒有接受過計算機科學教育,對複雜度就沒有概念,往往寫出一個能工作的code就滿足了,沒有意識去思考如何優化code。當然,即使科班出身,如果不好好學在這方面也很差勁,又一次我在一次面試時問科班出身的面試者,剛剛寫出來的程序時間複雜度是怎樣,他的回答是「大約幾秒鐘」,搞得我都臉紅了。
可以說,這個行業和傳統工程行業一樣,從業者可以分為「工程師」和「技師」兩種,這兩個名稱和實際職業頭銜無關。工程師懂得原理,知道如何去優化改進;而技師則只是懂得如何操作就行,按照設計來做,並不需要懂太多原理。
如果缺乏科班教育,那就往往只能成為技師,成不了工程師。
在我認為,一個工程師至少要學習過下面這些知識。
- 基本演算法和演算法複雜度,你不用能在黑板上手寫快速排序演算法,但是你應該知道它的時間複雜度是;
- 數據結構,你應該知道常用數據結構,能有用這些數據結構解決實際問題;
- 英語,你的英語應該能讓你閱讀計算機英文文檔,至少要好到會用英文來命名標示符,不要用拼音;
- 編程,至少兩種風格的編程語言,兩種我隨口說的,總之就是要有比對不同語言特性的能力。
- ...
突然發現列出所有需要的技能還挺難,但是上面幾條是我首先想到的。
職業發展上,這麼說吧,這個行業本身就是知識型的,金字塔頂端的人都是科班出身,如果你不具備這些知識,不努力學習,和頂級人才都聊不到一塊去,怎麼可能有更好的發展呢?
當然,這只是從專業方面來描述,即使你完全不學這些東西,也不影響你開一個公司自封CTO,也不表示你不能管理好其他懂這些科班人才,也不會影響你成為中國首富甚至世界首富,只是,比爾.蓋茨和埃隆.馬斯克肯定是懂這些的,你自己看著辦。
最後,我還是要說一遍,對科班出身或者非科班出身不要有任何偏見,每個人的出身、際遇、背景都會有所不同,只要心中充滿正能量,好學向上,那就是好同志。
(2017/04/09 重要更新)
這個回答引來朋友們的一些討論,教育只是手段,教育最終的成果才是重要的。
上面說的各種課程,也只是手段,不是目的,那麼怎麼衡量某種教育是有成果的呢?具體說,怎麼衡量某個人接受計算機教育之後是一個專業的從業者呢?
答案就是:理解抽象事物的能力。
系統的計算機科學教育,應該能夠訓練出人理解抽象的東西,為什麼這麼說呢?
首先,計算機科學本身就夠抽象的啊。無論是高等數學、離散數學還是計算機系統結構,乃至設計模式,雖然可以用可視化的方式呈現,但是要理解還是需要大腦中的抽象思維能力。
然後,計算機行業本身就需要能夠理解抽象事物。我們這個行業前沿的工作,都是在做前人沒有做過的事情,即使是對現有產品的copy,依然要解決各種新出現的問題,實際上還是做一個新東西。比爾蓋茨雖然看了喬布斯做得蘋果機UI,但也只是看了一眼,回去趕緊生產Windows依然是要用抽象思維能力。還沒有做出來的東西,就需要想像,在動手實現之前能夠描述抽象的東西。
最最重要的,計算機這行當是很複雜的東西,能夠從紛亂複雜的東西中抽取出最重要的,才能夠有效溝通,有的放矢,把資源放在最重要的部分。
打個比方,一頭牛本來是這樣的。
在畢加索筆下,逐步抽象,成了這樣的牛。
這是極度的簡化,但是依然能看出這是一頭牛,因為牛的關鍵點都被畢加索用線條表達了出來,有頭,有角,有強健的肩部,四條腿,有尾巴……這就是一頭牛。
進一步抽象,就是這樣,有角(側面只看到一隻角),有尾巴。
然後,大家就可以交流溝通「牛」。
嗯,科學和藝術、文化是相通的:)
話說回來,科班出身的,因為學習相關課程就是在理解抽象的東西,所以在抽象思維上能上強一點,而這一點,是一個巨大的優勢。
我在寫 進擊的React - 知乎專欄 的時候,經常用上比喻,因為比喻讓抽象的東西更加直觀,比喻是一個很好的科普手段,但是,比喻說到底還只是一個修辭,只能幫助抽象思維,不能夠代替抽象思維;事實上,和基礎紮實的同學交流,基本不用比喻,經常我說前半句,他們/她們就已經知道了後半句,因為能夠很容易理解抽象的東西。
科班同學有好幾年時間可以沒有生存壓力地接觸相關領域
等到畢業的時候
大部分人就不做程序員了
能留下來的都是有點相性的
(不是抖機靈)
聽課是不可能聽課的,這輩子都不可能聽本校老師講課的。代碼又不會寫,就是MOOC這種東西,才能維持得了生活這樣子。
進Github和CSDN的感覺像回家一樣,我一年回班裡,輔導員親自點名都不回去,就平時期末考試,我才回去看看這樣子。在Github和CSDN里的感覺?比在課堂上的感覺好多了。在課堂裡面一個人很無聊,都沒有Python玩,Linux玩。
Github和CSDN裡面的老哥個個都是人才,說話又好聽,我超喜歡在裡面的。
下棋找高手,弄斧到班門。
你去看看國外MIT,斯坦福,國內清北之類名校的計算機專業,就知道大牛雲集,學霸碾壓,在這種環境中學習,眼光見識、成長速度比自己單打獨鬥要好很多。
當然,差的學校就很少甚至沒有上述優勢了。
IT行業的競爭堪比戰場,在戰場上,子彈才不管你是不是軍校出來的,能活下來的就是牛人。倒霉鬼和無能者最後都死翹翹了。
最終,還是英雄不論出處。
=======更新(以下內容首發於我的微博,再貼於此)=======================
很多科學史讀物說:瓦特發明了蒸汽機,並強調其「沒上過大學」,其實忽略了一個事實:瓦特雖沒有大學文憑,但他系統地學習過大學物理和高等數學,他是通過科學原理直接改進蒸汽機,而不是靠長期經驗的積累。
聯想到在知乎上討論的「計算機科班出身有哪些優勢」這個問題,答案呼之欲出:
一個人是「科班出身」,只能說與「培訓班」出來的相比,有較大的概率他對計算機科學理論打好了一定的基礎,但不等於說他就真把理論學好了。
高手不一定出身科班,但沒有相應的理論打底,他絕成不了高手!
實際上對於大部分學校,包括很多985 211來說,課程本身幾乎沒有任何優勢,能不搞成劣勢就不錯了
真正的優勢是人脈,或者說你的同學和一部分老師
推薦閱讀:
※程序員的成長離不開哪些軟技能?
※從 2015 年起的未來五年內有哪些創業方向?
※阿里公關在月餅事件上請了水軍么?
※知乎不可以解決哪些問題?
※有哪些特殊的搜索引擎?