計算機專業學生大學期間應該培養的核心技能

計算機專業學生大學期間應該培養的核心技能

來自專欄程序員的窘境

最近有很多計算機專業的學生向我諮詢有關編程學習方面的問題,從他們的問題中能明顯感覺到還是有很多學生對於在大學四年學習好哪些課程、以及如何學好這些課程存在很多疑惑的。因此在一月前,我寫了《計算機專業學生一定要學好這幾門課》這篇文章。

在文章中我建議計算機專業的學生需要學習好數字電路、計算機網路、計算機操作系統、數據結構與演算法等課程,不少同學反映所要學習的東西太多,並且有些是沒有必要的。

首先承認一點的是,所要學習的東西是挺多的,不過沒有必要本人是不太贊同的,這些課程對一個計算機科學專業的學生來講是最基礎的專業素養,況且我還沒有談到一些像高等數學、線性代數、概率論與數理統計等之類的課程也是需要學習好的,否則的話,又會有更多的同學站出來說我寫代碼的時候根本用不到這些知識。

哈哈,的確是的,寫一些初級代碼時的確用不到計算機操作系統、數據結構與演算法、高等數學等知識,甚至是不需要讀大學的,那為何不高中畢業直接參加工作,還要來讀大學呢?(說的稍微有些激進了些,不過也的確是需要有些同學認真思考的問題)。

現代是一個功利性的社會,因為功利性導致大家的目光都短淺了一些,只去學習那些花拳繡腿,因為這些東西上手快,但無法長久存在,也是很多計算機專業學生抱怨技術更新太快的一個原因;也因為功利性,導致大家對那些需要花長久時間來學習、來打磨的事情都不聞不問,君不見很多學生聚在一起討論如何開發小程序,卻對課堂上剛剛講過的內存管理置若罔聞;君也不見很多學生在一起研究如何把數據傳輸給服務端,卻對課本中的HTTP協議視而不見。

我很希望,這些同學能夠通過小程序的開發、數據的傳輸來學好計算機操作系統、計算機網路等專業課,很希望同學們能夠在學習的時候理論聯繫實踐,既能學好專業課,又能學到一身技能。只可惜,囿於自身、環境等因素,這些都太難了。

那有沒有一些更簡單的方案呢?既能保證學習的實踐性,又能不至於理論方面的知識太弱,以至於工作幾年後,由於理論知識薄弱導致根本就站不起來。這個問題我也思索了很久,最後總結了一些相關核心技能,也就是本文即將要闡述的。

首先先列出一下這幾項核心技能,有個心理認知,之後咱們再一一闡述相關核心技能的學習內容和相關資料:

1、數據結構與演算法

2、兩到三門編程語言

3、計算機系統原理

4、學習和解決問題的能力

5、溝通能力

6、英語

需要說明的是,以上的技能雖然有1到6的標號,但是並沒有誰優先於誰之說,這6項是同等重要的,也就是具備同樣的優先順序的。

1、數據結構與演算法

俗話說的好:程序=數據結構+演算法,可以看出數據結構和演算法的重要性了,因此,對於一個計算機專業的同學來說,如果沒有學過數據結構與演算法,或者掌握不好數據結構與演算法,那麼很多情況下只能淪為二流程序員,做一些邊緣工作,而不能從事核心編程工作。

大學時期所接觸到的數據結構與演算法是比較基礎的、也是比較簡單的演算法,主要是鏈表、隊列、棧、樹、圖的使用和學習,以及查找和排序演算法的學習,這部分知識大家可以通過課本或者一些課外讀物都可以學習得到,入門書籍比如《演算法圖解》和《啊哈,演算法》講解的都是挺不錯的,可以用來培養自己對這方面的興趣愛好。

另外,如果要深入研究下去,則需要讀一些更高深的書籍,理論性也會更強一些,這其中可能牽涉到很多數學知識、更高級的一些數據結構和演算法等,但我認為如果有能力就盡情的研究下去吧,畢竟這塊是無止境的。更高階的書這裡暫且先推薦《演算法心得》和《演算法導論》這兩本書吧,相信這兩本書夠大家在大學期間學習的了。

另外,由於數據結構與演算法的理論性和實踐性都是非常強的,大家在學習時不僅要掌握各個數據結構和演算法的相關理論基礎,同時也要通過自己所學習到的編程語言來對其進行一一實現,最好再去網上找一些ACM、歐拉計劃等題目來做,加深自己對這塊的理解。

最後再強調一點,數據結構與演算法無論是在大學時期還是在以後工作中用到的頻次都是非常高的,並且在大學期間很多比賽也都是這方面的,因此建議大家配合編程語言儘早學習,並且深入學習,多加練習,盡自己所能達到的高度,一直走下去吧。

2、兩到三門編程語言

首先,你最好在學校裡面掌握好兩到三門編程語言。建議這三門語言分別是:C、C++、Java,如果有能力的話最好也學習下Python。據我所知C、Java這兩門編程語言本身計算機專業學生就是要學習的,有的學校還會教授C++語言,Python語言就需要自己下功夫去學習了。

這些語言中大家可以選擇一門語言作為自己的主語言,個人建議是Java,因為目前Java是大型項目用的比較多的一個語言,也就是偏工業級的語言,當然選擇其他語言也是OK的。

剛開始學習時,肯定是要學習這些語言的基礎用法、相關類庫等,這方面相關的書籍也比較多,我這裡大致推薦幾本,大家學習時根據書中的案例、代碼一步一步實踐,花不太久能夠基本掌握一門編程語言。

C語言幾乎是每個計算機專業學生學習的第一門語言,不過由於學校教授此課程時,很多都是通過PPT或者板書進行教授,即使有上機課也是比較簡單的。這裡推薦的一本書是C語言的設計者寫的一本書,非常經典,並且有一個本配套的習題集,大家可以邊學習邊實踐。

C++語言則是C語言的一個面向對象的擴展,學習C和C++主要是因為目前很多底層的軟體基本上是用C和C++來寫,比如操作系統、Java虛擬機等等,學習這兩門語言也是為了將來自己想要更深層次地去研究一些東西時,需要用到的。C++推薦的書籍是《C++ Primer》和《C++編程思想》這兩本書,由於《C++編程思想》相對難一些,因此建議優先看《C++ Primer》,之後再看《C++編程思想》。

對於Java語言,推薦的學習書籍是《Java核心技術》卷一和卷二、以及《Java編程思想》這三本書。《Java核心技術》更偏向入門一些,而《Java編程思想》則有一定的難度,因此在學習時優先看《Java核心技術》,然後再針對性的看《Java編程思想》中對應的章節。這幾本書都比較厚,不能完全看完完全沒關係的,重要的是掌握Java的基礎用法,能夠編寫一些簡單的程序,剩下的知識則在以後使用的過程中再逐步深入學習。

對於Python語言,它官方的文檔就寫的非常不錯,所以這裡也不推薦其他的書籍了,只推薦官方的Tutorial,順便也鍛煉下大家的英語閱讀能力。Python的Tutorial官方地址為:docs.python.org/3/tutor

很多同學掌握完一門編程語言之後就開始向上學習,比如學習Java的同學就開始學習Spring之類的框架,這裡不建議計算機專業的學生掌握完編程語言後立馬去學習這類知識,而是向下學習,更深層次地了解自己所學習的編程語言。如果向下學習都已經不錯或者將這些框架作為學習時的調味劑,也是可以學習的,畢竟核心掌握了,去學習這些框架的使用還是非常快的。

因此當掌握完編程語言的基礎之後,後面就建議向下學習,即深入地了解自己所學的編程語言,具體從以下幾個方面進行學習:

1)、核心類庫

像Java、C++、Python等都提供了一些核心的類庫以方便程序員進行程序的編寫,很多同學學習時只對這些類庫進行使用,而不是去結合自己的專業知識來對其進行深入研究,這是不對的。

這些類庫中都提供了集合、隊列、棧、哈希表等非常經典的實現,在前面提到的數據結構與演算法也是重點在講解這些數據結構。因此通過這一步的學習,自己嘗試用Java、C、C++等語言去實現一個鏈表、一個隊列、一個棧、一個哈希表,然後再和Java、C++等類庫中提供的實現方案做對比,不僅能夠理論結合實踐,又能深入地了解自己所學編程語言的核心知識。

由於這塊的知識理論性和實踐性都比較強,因此我推薦兩本輔助性的書籍,方便大家能夠順利的突破這塊的學習。一本是比較經典的演算法書,即《演算法:C語言實現》,這本書分為上下兩部分,前期大家可以專註於第一部分,第二部分的圖演算法則在以後再進行深入研究。

另一本則是Java語言編寫的,即《數據結構Java版》,也是一本不錯的入門書籍,裡面提供了大量的實例代碼,帶領大家一步一步實現列表、隊列、棧等數據結構。

2)、I/O系統

像C++、Java、Python等都提供了對應的I/O介面,我們不僅僅要掌握對應的API使用,還要明白其中的相關原理,這時可能需要大家對操作系統的I/O介面、磁碟的存儲方式、編碼/解碼等做一個深入的了解。很多上層數據結構和演算法的設計都考慮了底層磁碟存儲方式、編碼方式等,因此對這塊的了解還是非常有必要的。

3)、網路編程

很多程序都是需要跟網路進行打交道的,無論是通過區域網傳輸還是通過外網傳輸,同時也由於最近分散式系統、RPC的廣泛應用,網路編程則顯得更為重要。在學習時不是簡簡單單地學會使用C++、Python、Java這些語言的相關類庫就行了,作為計算機科學專業的人,更要明白其底層的相關技術,無論是路由、TCP/IP、HTTP等都要做深入的了解。

對於網路基礎理論還是有一兩本不錯的通俗讀物的,一本是《圖解HTTP》,相信大家花個一兩天就能夠讀完,另一本是《HTTP權威指南》,這個相對比較專業些,可以作為更為深入的讀物。

如果大家不滿足於這些基礎的網路知識,想要更上一步,做一些更為實踐性的東西,我推薦給大家一個比較好玩且有用的技術:Netty。基於這項技術大家能夠對網路編程有更深入的了解,不要僅僅滿足於Netty的使用,而是要深入到其原理,看其是如何實現網路通信的。同樣Netty也有兩本非常不錯的書供大家閱讀,一本是入門級讀物叫《Netty實戰》,另一本則是相對深入的讀物叫《Netty權威指南》。

4)、並發編程

現在已經進入多核時代,很多計算機都是四核、八核、十六核等等,如何更好地發揮多核地性能,則非常考驗我們並發編程的能力。並發編程是一門相對比較難的技術,因此在學習時也會碰到更多的問題,需要對線程/進程、鎖機制等理論有非常深入地理解,同時能夠深入理解像Java、C++為用戶提供的相關類庫,比如Java中的ConcurrentHashMap、Semaphore(信號量)、Lock等等。

並發編程這塊的資料相對來說比較少,即使有也都比較一般,無法帶領我們觀其全貌、究其根本。不過還好,我找到了基本相對來說還不錯的書籍,其中一本是相對通俗易懂的一個版本,叫《圖解Java多線程設計模式》,大家可以買來閱讀。這本書中也提供了大量的練習題,每道練習題都值得大家深思,並且每道聯繫題都配有參考答案,方便大家進行自我驗證。

另外兩本則是相對來說有些難懂的書籍,一本名為《Java並發編程實戰》,另一本為《Concurrent Programming in Java》。這兩本書都是Java並發庫的作者編寫的,其含金量可想而知,不過書中一些概念對於實踐不多的你來講可能比較難懂,不過沒關係,這兩本書可以一直拿出來閱讀,直到掌握為止(偷偷告訴你,很多工作很多年的程序員都沒有看過這兩本書呢)。

其實並發編程的相關理論基礎在計算機操作系統這門課中是重點,也是老師花很多篇幅來講的,如果這塊要學好,那麼在學習計算機操作系統時一定要重點關注這塊的知識點哦。

3、計算機系統原理

其實學習完數據結構與演算法和編程語言之後,你就已經很牛了,如果學習得足夠深入的話。不過這個時候還是稍微欠缺點什麼東西的,即對整個計算機系統的理解還不是特別的深入,只能說在應用層還不錯,如果想要更紮實,站得更高,那麼就需要再系統地學習下計算機系統相關的知識。

這塊是有一些非常不錯的資源供大家學習的,這裡把我接觸到的幾個比較不錯的推薦給大家,首先推薦的是一本書,也是比較經典的一本書:《深入理解計算機系統》,這本書從程序員的視角向大家闡述了計算機從底層到上層各個層之間是如何配合的,同時書中提供的練習題和實驗也都是非常不錯的,有利於大家了解計算機相關的工作機制。

同時,圍繞著這本書也有兩套比較不錯的視頻供大家學習,一套是國外華盛頓大學的視頻教程,是英語教授的,不過目前好像有了英文字幕;另一套則是國內南京大學的公開課,講的也不錯,大家可以有選擇性的學習。

中國大學MOOC(慕課)_優質在線課程學習平台_中國大學MOOC(慕課)?

www.icourse163.org

CSE351: The Hardware/Software Interface?

courses.cs.washington.edu

4、學習和解決問題的能力

前面提到的三點都是計算機專業的同學所需要具備的硬實力,後面三點咱們開始說下相關的軟實力,這也是在上篇文章《計算機專業學生一定要學好這幾門課》中未提及的內容,但是卻同等重要的內容。

如果大家能夠自學完上述的數據結構與演算法、編程語言、計算機系統原理,我相信大家的學習和解決問題的能力一定不會差。相反,對於那些很難堅持下來,不知道如何學習、碰到問題不知道如何解決的同學還是需要多多地練習才好。

在學習時要掌握學習的方法,逐步總結出適合自己的學習方式,比如看視頻、記筆記、聽講座等等,找出適合自己的高效學習的方式,同時碰到問題時善於利用搜索引擎(建議谷歌)、善於利用自己身邊的相關資源(學長、老師)等等。

因為等畢業工作後,很少有人能有大塊的時間來教你如何做如何做,這個時候就需要靠自己鍛煉起來的學習和解決問題的能力,在短時間內掌握最新的技術,在短時間內對公司業務有整體的把握等等。

5、溝通能力

在以後的工作生涯中,絕不是你一個人在戰鬥,而是有一群人陪著你一起戰鬥,那麼如果和他們高效地溝通,則是值得我們深思和鍛煉的。大型的軟體都不是一個人編寫完成的,想Windows操作系統絕不可能靠比爾·蓋茨一人來編寫,而是有成千上萬的工程師一起來編寫完成,這中間的溝通是成本是巨大的,等工作後會發現,80%的時間是用來溝通的,只有20%的時間是用來編碼的,如果溝通不到位,編寫出來的程序很可能是不符合要求和規範的。

其次,自我展現也是非常依賴溝通能力的,自己的想法如何精準精確地傳達到你的溝通對象,並且得以正確的實施,都是需要一定的溝通技巧的,希望大家在學習好編程技能的同時也能提升自己的溝通能力。

另外,大家也看到,對於上述專業知識的學習我也是推薦了很多資料的,如果大家的學習方法不對,那麼學習起來會非常吃力。那麼在學習時如何快速抓住書中的重點、如何做到知識點的觸類旁通是非常重要的,不然你可能會陷入書的龐雜和細節之中,無法自拔。

6、英語

英語應該不需要再花費更多的語言來解釋了,相信大家也都明白它的重要性,計算機相關的重要文獻,很多都是英文的,並且很可能是沒有中文翻譯的,如果具備英語的閱讀能力,那麼自己就能獲取到最新的、一手的資料,而不是去看過時的、二手、三手的資料。

最後,再說下相關的學習路線:

1、首先開始學習編程語言的基礎部分(建議先學習C和Java)

2、接著學習數據結構與演算法相關的知識

3、之後開始學習編程語言中的核心類庫方面的知識,在這裡一定要通過編程語言來實現數據結構與演算法中的常用數據結構和演算法,同時研究編程語言類庫中的相關源代碼

4、每天或者每周做一道演算法題(ACM或者歐拉計劃),培養自己的編程能力和演算法能力

5、學習計算機系統原理

6、學習I/O系統、網路編程、並發編程等知識

7、學習C++和Python(也可以提前學習)

以上這些知識如果大家認真學習的話,大家四年的時間應該是滿滿的,並且收穫也是滿滿的。

另外,學習並不是一朝一夕的事情,需要常年累月的積累,在這個過程中很可能會產生放棄的想法,或者受外界因素產生一些其他想法,如果對這些想法拿不定主意,大家可以私信我進行諮詢,希望我能夠解答你的問題。

以上書籍的推薦是本人在知乎Live的部分內容,本人於去年開了一場關於《大學生如何自學成為專業程序員》的Live,效果還不錯,也幫助到了很多大學生找到了自己的學習方向,並且目前已經有5300多人購買了,有興趣的同學可以點擊下面的鏈接查看詳情:

北大軟體碩士:大學生如何自學成為專業程序員??

www.zhihu.com圖標

同時為了幫助更多的同學和程序員們,我建立了一個微信公眾號,方便解答大家的問題,以及給大家分享更多的學習資料,歡迎大家搜索公眾號「極客特訓營」來關注。

最後,還是那句話,市場不缺代碼民工,缺的是對計算機科學有深刻理解的高精尖人才,希望大家都能成為高精尖人才,所以大家努力加油哦~


推薦閱讀:

給計算機初學者的書籍推薦
1-5 市場
1-12 關於改行的問詢
關於引用的一點點想法
計算機科班出身的優勢是什麼

TAG:計算機 | 計算機專業 | 大學 |