計算機新生入門指南
(幫朋友寫的,各位請多指教)
我是一位畢業多年的計算機系學生。畢業後很多同學都轉行做其他的事,我也有這個打算,然而在進行很多嘗試後,我發現自己真的還是很喜歡程式設計。只要有時間,我就會坐在電腦前,胡亂寫些程式,不僅是為了謀生,經常是為了讓自己的生活過得愉快。很多人都是無意間選上計算機專業的,我不清楚現在計算機是否還是大熱門,不過我要恭喜你,你做了個不錯的選擇。
和其他專業相比,計算機是一個比較簡單的學科。你主要是和機器打交道,而不是各種性格脾氣的人,要知道人這種玩意兒可比機器複雜多了。雖說很多計算機的畢業生主要都從事程式設計的工作,但除了程式設計,計算機學生也有許多選擇,例如做測試、產品設計、美工等。如果你覺得程式設計很難,就不要勉強自己,找到自己喜歡的東西,然後好好學,精通它,不僅可以靠它為生,而且也把它視作自己一生的興趣。要是你對計算機相關的東西都不感興趣的話,不妨換個專業,依然要跟隨你的愛好。總之是要有個目標,不要浪費自己的時間,每個人的時間都很寶貴,尤其是年輕時候。
也許你現在還無法確定你是否喜歡程式設計,那我可以舉一些例子。你電腦裡的軟體,手機上的應用,你訪問的網站,都是“程式”。這些程式的用處大不相同,但共性是它們都是程式,執行在不同硬體上的程式。程式設計,就是寫程式。有些大型軟體,需要很多人付出很多年的努力才能寫成,例如QQ;有些小型的軟體,你一個人一個下午就可以完成,例如簡單的個人主頁網站。
計算機基礎課程
雖然上面我都在說程式設計,但其實程式設計只是計算機學習中的一部分而已。計算機系學生要學習的課程大概如下:
- 數學、英語、計算機導論,以及其他一些基礎課程。這些不用多說,一定要打好基礎。基礎不好,你就很難長遠發展。英語尤其要學好,因為很多技術書籍、文件都是英語寫的。
- 計算機硬體、體系結構。現在看計算機軟硬體的融合度是越來越高了,可穿戴計算機的呼聲也很高。儘可能多地瞭解硬體,這樣可以幫助你更好地理解你的程式是如何執行的。
- 計算機程式語言。學校大概會教兩三門計算機語言,例如Java或C/C++。不論學校教什麼都要好好學習,多練習程式設計。
- 作業系統、資料庫、計算機網路。有點偏理論,但非常重要。
- 資料結構、演算法。屬於那種你用得少,但非常重要的東西(你親自寫得少,通常是你依賴一個成熟的程式庫或框架,由它們來提供資料結構和演算法的支援)。
- 編譯原理等。比較艱深的課程,很少用到。
- 軟體工程等。目前我還看不到在學校學習這個東西的作用,但至少也得及格吧。
這些大概就是我記憶中的計算機的學習核心了。
如果你還沒有電腦的話,想辦法在假期打些零工,賺到可以購買一臺爛電腦的錢。如果你有電腦的話,要儘可能地多操作、多實踐、多程式設計。向你的老師打聽怎麼才能更好地理解課堂和教材裡的那些知識,他不知道的話就向高年級的學長請教,如果找不到答案,就在網路上搜尋,在論壇或者群裡打聽。除了少數偏向理論的課程,或者你抱定決心走計算機理論的道路外,大量實踐總是沒錯的。
硬體的學習沒什麼好建議,因為我也學得很糟糕。如果有機會就多拆卸實驗室裡那些破電腦,看看各種組成部件。在京東、淘寶上搜尋當前流行的硬體,在視訊網站看看各路神仙的視訊分析。
計算機程式語言。程式設計主要靠語言、環境(系統)和工具,這幾個領域都很容易引發爭論,如上所說,學生要避免陷入這些爭論,也不要糾結於到底學什麼好,更不要把不同的語言/環境/工具對立起來看待,不要給自己畫圈子。學校教什麼就學什麼,學好學精通。後面很多課程的實踐都需要程式設計作為基礎,所以請務必學好。
作業系統的學習。最好在你的計算機上多安裝幾個作業系統,學習Windows、Linux/BSD、OS X或iOS、Android。學習各個系統的設計,不要抱有偏見。不要把時間浪費在核心程式碼的閱讀和學習上,除非你真的到了必須要通過核心程式碼來解決問題的時候。剛開始可以用VMWare Player虛擬機器來安裝系統,這樣可以低成本地接觸到許多系統。學習作業系統,最好是拋開圖形介面,在命令列終端來學習,這樣效率會高一些。
資料庫的學習。相對作業系統,資料庫的學習更容易實踐一點。你可以用資料庫來管理自己的個人資訊、記賬,或者搭建個自己的網站,和朋友們分享資訊。學好SQL。雖然現在很流行NoSQL,但如果你時間不夠就不要管它,打好基礎最重要。
計算機網路的學習。也是比較容易實踐的課程。你可以下載一個抓包工具(如Wireshark)學習協議。也可以學習Socket程式設計。你一定要深刻地理解TCP/IP協議,同時儘量多學習上層的協議,如HTTP等。我建議你把《UNIX環境高階程式設計》和《UNIX網路程式設計 卷1》這兩本書的例子,全部手工敲入你的電腦,不過你得先安裝一個Linux環境才行。
資料結構和演算法都是純軟體的東西。每一種結構每一個演算法,你都應該親自鍵入電腦,除錯、實踐。如果時間不夠,就把你部分的睡覺時間,或者娛樂時間,或者休息時間劃分出來,借給這兩門課。許多公司的面試也主要以語言、資料結構和演算法為主。
養成好習慣
從第一天寫程式碼開始,你就要把你的程式碼儲存起來,時常回顧,不斷修改,如果太陳舊,就刪掉,用一份新的程式碼來取代它。你可以用Git來管理程式碼,你只需要學習幾個基礎的命令,就可以管理自己的程式碼。記住,它們是你成長的記錄,是你的財富。你可以把你的程式碼同步到Github上,它是一個免費的程式碼倉庫管理平臺,主要用於分享程式碼。雖然你現在還無可分享,但你最好記住這個平臺,在日後的學習中它的出現頻率會很高。
你遇到的每一個問題,都要儘量徹底弄清楚。在放棄和堅持間需要一個權衡,要是卡在一個地方太久,不妨先跳過;但如果你經常都要跳過問題的話,一定是基礎不牢,你得回頭好好補下基礎。你可以用Evernote來記錄你的每個問題,學習到的每個知識點。它會自動同步到你所有的計算機平臺(電腦、手機、平板電腦等),你可以隨時檢視。
你需要熟練使用Google幫助自己解決問題,但不要迷信搜尋。讓每次的搜尋增值,而不是一遇到問題就去Google。當然,你解決問題後,請用Evernote總結記錄,下次你就不用Google了,而你的Evernote中的每一條筆記,都會經過許多次的增刪,在日後成為經久實用的文件。你要學會把自己的心得分享出來,有高人會站出來指出你的錯誤,幫助你提高。記得保持謙虛,永不止步地前行。
你最好在畢業前學會寫作。我知道多數計算機系的學生根本不會寫,也許是懶得寫,但你得強迫自己寫。你要強迫自己寫作,在寫作中理清自己的思路,把大腦裡的想法用圖形、文字表達出來。寫作能擴大你的影響力,增加你的個人價值。如果你要畫圖,我推薦你使用LucidChart或ProcessOn這兩個免費的線上作圖工具。
放棄“稍後再讀”的想法。標註為稍後再讀的東西,99%你都不會再讀。如果要讀,當時就安靜下來閱讀,不要貪多。如果你糾結於廣度還是深度,那我建議你先顧深度。學習能力、理解力、思維模型比知識量更重要些;你基礎好的話,擴充套件知識會很快。好比如果你精通Java/C/C++中的任何一項,你沒有理由在3天內無法學會PHP。當然學會和寫好還是有區別,不過既然你具備了舉一反三的能力,要繼續進步就很容易了。至於何所謂精通?學得多不如用得好,能用它輕鬆地解決你大多數問題即可。普通學生認真學習2-3年,再在壓力中等的工作中每天使用長達3-4年差不多就精通了。更好的建議請參考《十年學會程式設計》。
少用聊天軟體,少逛微博、微信。它們會嚴重分化你的時間。很少有人能夠掌控碎片化的時間,你真正需要的是大塊的時間,集中精力學習。當然,可以玩得很開心。把兩者區分開。
計算機學習的反思
在學校裡學習到的東西,我現在已經忘得差不多了。我有很多雄心壯志的開始,它們中的大多數也都無疾而終。我數次立志學習Linux核心、TCP/IP協議實現以及經典的《計算機程式設計藝術》,但無一例外都失敗了,我根本沒走多遠就放棄了。我在大學時就關注程式碼重構,以及如《人月神話》之類的軟體管理經典,現在想真是可笑,我那會兒連程式碼都不會寫呢,說什麼重構談什麼管理呢。說到底還是太貪心。
在我初學計算機的時候,發現有些朋友很快就能寫出漂亮的介面,或者帶有網路功能的程式。而我還在可憐兮兮地糾結到底是學C++好呢還是學Java好。現在看來真是太功利了。興趣培養才是最重要的,流行的東西變化很快,而每個人都有自己的興趣傾向,有些人很會鼓動別人跟著他走,而有些人又很會引發爭論,引起曠日持久的口水仗。對學生而言,要避免自己陷入到這些對立的爭論中。另外,不會圖形程式設計也沒什麼。
前途和錢途
通常計算機系的學生家庭都不是特有錢,有錢的學生似乎有更好的選擇。因此剛一入學就要說前途,多少令人有些沮喪。現在難道不應該是個無所顧慮的青春歲月嗎?為什麼要考慮遙遠的未來呢?從事計算機工作的人不少自稱為“碼農”,寫程式碼的農民。自嘲是程式設計師固有的幽默,但也反應了一個現狀,靠計算機改變命運或者發大財有點白日做夢。
計算機系的普通學生畢業後在一二線城市找個開發的工作不是太難,收入大概會比平均收入高一些,但也不會高得太多。優秀的學生在哪兒都很搶手,可能一出校園就比普通學生高2-3倍。特別卓越的學生也許高10倍甚至更多。但是往往他們並不滿足在公司上班的收入,他們管這個叫“替別人打工”。很多人只願意為自己打工,但只有少數人真正能做到為自己打工。有不少人創業,但成功的還是少數。如果你從一開始就認準了自己是與眾不同的,要真正改變自己的命運,那最好多學習點技能,擴大社交圈子,總之你得比別人付出更多的努力才行。
最後,我還是真誠地祝願你喜歡上計算機的學習,你在稀裡糊塗中做出了一個還算不錯的決定。把它當作一個值得信賴的夥伴,準備上路吧。
相關文章
- Python入門到實踐-計算機算數Python計算機
- 入門量子計算
- **伯克利大學** 的計算機入門教程計算機
- 計算機影象與視覺入門必備計算機視覺
- 計算機視覺入門系列(一) 綜述計算機視覺
- 計算機圖形學入門·光柵化計算機
- 遊戲程式設計入門指南遊戲程式設計
- shell程式設計入門指南程式設計
- 如何入門雲端計算?
- 計算機網路快速入門--1--概述篇計算機網路
- 【深度學習】:一門入門3D計算機視覺深度學習3D計算機視覺
- 讀AI新生:破解人機共存密碼筆記03計算機AI密碼筆記計算機
- 入門計算機的粗略學習-Day11計算機
- 學習筆記 -《量子計算與程式設計入門》- 量子計算機硬體基礎筆記程式設計計算機
- 程式設計“初學者”入門指南 (轉)程式設計
- Zookeeper入門指南
- CPack 入門指南
- Docker 入門指南Docker
- numpy入門指南
- EOS 入門指南
- Vue 入門指南Vue
- RabbitMQ入門指南MQ
- Nginx入門指南Nginx
- Vagrant 入門指南
- React 入門指南React
- Flask 入門指南Flask
- gulp入門指南
- OSWorkFlow入門指南
- CouchDB 入門指南
- RxJava入門指南RxJava
- ODA入門指南
- MySQL 入門指南MySql
- Markdown入門指南
- 趣解計算機網路(一)之入門概念介紹計算機網路
- Metal入門教程(四)灰度計算
- 雲端計算教程學習入門影片原始碼課件:CURL命令使用指南原始碼
- KNIME快速入門指南
- Markdown快速入門指南