search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

寫給立志做碼農的大學生

1.確定方向

1.1選擇比努力更重要

關於方向的選擇其實越早確定越好,生活中我們要面臨無數個選擇,前幾天看的一個黑客相關的美劇中有句台詞說的不錯:

lifeisbinary,生活就是二進位,一個個0101組成的。每一次抉擇,選了就是1,不選就是0。另外也有一句話說:人一生要面臨很多選擇,但是真正能決定你命運的只有幾個。沒錯其實就是這樣。

如果你是計算機專業的學生,那麼到底是考研還是就業就是首先要面臨的問題。本文是面向確定了畢業要工作的大學生的,所以關於這個抉擇,不再贅述。

就業的話,本文標題是碼農,實際是指所有計算機相關的技術工種。包括開發、測試、運維等。

很多選擇本身並沒有對錯或優劣,只有適合不適合。

不要濫用勤能補拙,這個詞語一度被很多人奉為圭臬,但同時成了枷鎖。我相信這個詞,但是要考慮現狀,要考慮投資回報率。你在自己並不擅長或不感興趣的領域深耕了四年,最後不一定能獲得多少成績。當然如果你能在畢業後繼續深耕幾年或許是可以的,但是我希望每一位大學生在畢業的時候都能有一份好的工作,並且如果你並不喜歡某一領域的話,那麼我相信你一定不會堅持下去。所以我們一定要找到適合自己的方向!

那麼如何發現自己對什麼感興趣呢?我也不知道很好的辦法,我只知道一個樸素的方法——嘗試。趁著年輕,就要多嘗試。千萬不要大三了都還不知道自己興趣在哪,想做什麼,適合什麼。所以大一大二努力去碰釘子吧。

1.2演算法還是開發

數據結構和演算法很重要,無論是面試還是工作,無論你從事哪方面的技術。不過演算法雖然重要,但並不適合每個人都花費大學全部的精力去鑽研。

相信很多學校都有ACM競賽相關的社團或組織。很不幸,我們學校沒有,我大一的時候也花了很多精力刷題,但是硬體條件不太允許,氛圍太缺乏。如果你覺得自己能夠在ACM比賽中遊刃有餘,那麼恭喜你,你可以一心一意搞演算法。如果你覺得自己在這個過程中十分吃力,挫敗感頻生,那麼也不要氣餒,或許有另一條路是屬於你的。選擇開發,有演算法功底深厚是很棒的事,但是僅僅只有演算法同樣是不夠的,計算機海洋還有很多未知等著你探索。

演算法崗包括數據挖掘、機器學習之類的(怎麼樣,高大上吧,反正我不懂)。要說明的是想做演算法的同學最好選擇讀研繼續深造,因為大企業在演算法崗的招聘上對大學部生是很不友好的。還是要申明一句,你做開發也不能忽視演算法和數據結構,起碼面試還是經常考的!記住一句:

演算法功底好的人,運氣都不會差

對於大學部生而言做開發還是相對容易的一條道路,不過開發的技術路線也是不勝枚舉:前端、後台(PHP後台、Java後台等等)、移動端(安卓和iOS)、遊戲開發、資料庫(比如做DBA)……。這裡我肯定不會去推薦你去學哪一種,我沒有能力也不適合。只有你自己才能發現自己的興趣以及好奇心之所在。

我能做的只是在浩如煙海的技術觀點中,幫一個個大學部生排疑解惑。

1.3認識技術

關於技術,很多大學部生都存在諸多誤區。初學者總喜歡追隨牛逼的技術,實在過於盲目,找准自己的定位最重要。

誤區1:圖形化的東西比非圖形化東西更牛逼

多見於初學者,尤其是計算機專業新生(我大一的時候就是)。當時學校教了點C語言,一直都是控制台程序,面對黑窗口,我就各種百度看看怎麼弄出圖形化的東西,那時候才知道GUI這個縮寫是啥意思(當初知道這個縮寫的全稱還小激動了一下下,果然我還是太年輕了),然後知道了WIN32、MFC這些名詞。。確實只能說是知道名詞。當時對著視頻教程做了計算器,就是用VC++拖拖控制項,視頻里的人敲一句代碼,我就敲一句。後面雖然弄出來了,但是感覺自己什麼都不懂,只是依樣畫葫蘆。這時我才意識到,還有很多基礎沒有打勞。

八卦一下,現在桌面客戶端的開發工作並不多,所以大家謹慎選擇這一技術方向。桌面端GUI技術一度火爆(MFC、Qt、WinForm、WPF、Swing……),但如今早已是互聯網及移動互聯網時代。所以大家真的要慎重選擇。不過還是可以學習一下的,至少能加深你對編程語言以及設計模式的理解。

誤區2:非圖形化的東西比圖形化的東西更牛逼

具體而言就比如說:後台技術比前端技術、客戶端(Android、IOS)更牛逼。多見於有Linux背景的人(沒錯,說的就是我=_=|||)。

我也一度這樣認為,其實不然。這裡和上一個誤區一起澄清一下:技術本身沒有高低優劣之分,但程序員對其有好惡之別。

另外要說明一下,不能說前端就簡單,後台就更難,同樣反過來說也不對。我只能說這完全是不同層面的東西,不能量化的去比較。前後端都自有其難點以及G點。你不能說你能處理後端複雜的併發、同步、高可用,那麼你就能輕鬆地完成美觀的網頁及特效、處理麻煩的瀏覽器兼容、極盡所能地降低頁面的載入速度。就好比同樣是一雙按在鍵盤上的手,那麼鋼琴家演奏優美的樂曲和程序員開發高性能的軟體,哪個更困難?(比喻不一定貼切,但希望大家能明白這個意思)

誤區3:XXX是最美的語言/框架/平台/……

多見於PHP程序員。哈哈,開個玩笑。這裡不是在談論誰是最好的語言,而是告訴大學生朋友們不要迷信論斷。

我大一的時候去圖書館看書,看到有JavaWeb的書,前言寫的很清楚,痛陳了PHP和ASP.NET的缺點,闡述Java是多麼優秀,OK。你可能也和我一樣,在入門的時候經歷過類似的事。我要告訴你的事,多翻幾本書,你會看到ASP.NET和PHP書籍的前言寫的同樣精彩,你絕不會在ASP.NET的書里看到誇耀Java的句子。不同的技術自有其優劣,千萬不要成為前言驅動的學習者。。

繼續八卦一下,雖然說不通技術自有其優劣,但是就目前國內形勢來看,學習Java絕對是不錯的投資,Java後台幾乎佔據了互聯網企業後台的半壁江山。而.NET技術確實日薄西山。不過PHP現在依然有很頑強的生命力。

另外還有一些經典論斷:

LAMP架構只適合中小企業;

MySQL只能用於中小企業,大企業都用Oracle。等等。

這些論斷從技術角度出發,確實無可非議,但卻並不客觀。見過一些朋友,對MySQL充滿鄙夷,覺得MySQL很容易出現瓶頸之類的。其實我想說,阿里、騰訊都大量使用了MySQL。別問我為啥MySQL被這麼大體量的公司採用(無外乎開源的好處和歷史原因啦),我覺得,只要技術夠屌,什麼瓶頸都能克服。。

2.學習那點事

1關於逃課

相信每一個大學生都逃過課,我也不例外,而且很多。我在談逃課,其實也是從某個側面來談自學。之前有個網友和我諮詢如何面試,如何準備之類的,他已經大三了。學校的課程完成的不錯。但我感覺他還欠缺很多。要想找到好工作只靠老師教你那些東西是不夠的,跟著學校的進度走,其實只會讓你落後。我並非一味的鼓勵大學生逃課,我的觀點是要選擇性的逃課(如果是好課那麼即使不開課也要去蹭課的)。哪些課要逃呢?

無聊的課程。

比如思修、毛概、馬原統統要逃。別急著反駁我,就是逃課而已,不要形而上。我不是黨員,也沒有申請過。數學相關的課程,我只想說量力而行,數學確實對於程序員來說還算重要,但是不同崗位對數學的要求又不盡相同,你能應付就好好聽,不能應付就。。

2

與你的技術方向無關。

這個就要看你是不是計算機專業了,如果你是其他專業學生,但是對計算機感興趣,相信很多課都是可以逃的了。或者比如你的技術棧是建立在Linux基礎上的,但是學校有一門MFC編程的課,你有興趣又有時間可以聽聽,沒時間就逃,OK的。這個也是有個前提的,就是你能清楚的明白哪些課程是對你有幫助的。你說:我學C++的,我把資料庫的課逃了=_=||別說你讀了我的文字。。

3

你已經掌握了的。

相信會自學的孩子,都有這種情況,那就是在學校開課前,你就自學過了某門課程。那麼等到開課以後你就可以逃了,我就是這樣逃了Linux編程的課。當然你要清楚的了解自己到底掌握了多少,不要自己是一知半解,還自以為懂了,就不聽課了。其實要逃這種課,你也不需要懂得太多,你只需要保證你比老師講課的水平高就行了。我們有的老師,水平真心爛,不逃課對不起他。

但是很多學生總是走極端,說到自學就一點課都不上了,看不起學校的課程安排。自己在寢室學個把月就能輕輕鬆鬆地做出網站或者APP。但是我想告訴你,你能做到的,別人同樣能做到。有一句話說的很好:

你的工資不是和你的工作時間成正比,而是和你的不可替代性成正比。

你和培訓機構幾個月量產出來的程序員差別在哪?僅僅是你沒有給培訓機構交學費嗎?但你的技能和他們是差不多的啊。所以說學校教的基礎課是很重要的,最直接的好處就是筆試,筆試考的就是基礎。然後這對你長期的職業發展也是很有幫助的。你工作幾年之後(可能就是一兩年),發展肯定會遇到瓶頸。

2.2關於讀書

多讀書,讀好書

這是一句老掉牙的話了,但是事實就是如此,閱讀經典書籍,你的投資回報率其實遠高於閱讀低質量的書籍。那麼什麼是低質量的書籍呢?比如《21天精通XXX》之類的。但是不管讀什麼書,都不能盲目跟風、囫圇吞棗。在網上,生活中經常看到各種索要書單的網友,借鑒別人的書單是可以得,但是直接照搬照抄則是不明智的。因為每個人已有的知識儲備是不一樣的,別人閱讀的書籍不一定適合你。所以閱讀合適的書籍也是一種重要的命題。

閱讀合適的書籍

那什麼是不合適的書籍呢?我認為有如下幾類:

1

與自己的技術棧毫不相干的。

這相關與否是建立在你已經做了清晰的職業規劃的基礎上,並且通過搜集信息能夠自己辨識哪些是和自己的技術棧相關的,哪些是不相關的。當然,我並不是鼓吹大家技能點越單一越好,技術人員當然需要不停擴充知識面,但是對於大學生而言,這要建立在你在主要的技術棧上的積累已經足夠多的時候(足以應付面試),不然東一榔頭,西一棒槌,最後只能樣樣稀鬆。

2

超出自己能力範圍的。

雖然我前面說要讀好書,要讀經典書籍,但是一定要量力而行。很多經典書籍的閱讀需要一定的基礎,如果你只看到了別人對這本書推崇備至就開始強行閱讀,最後通常也不多是走馬觀花,像讀小說一樣讀完了而已,最後什麼都沒學到,還浪費了時間。老子說企者不立,跨者不行就是這麼個道理。

3

知識點與自身已具備知識過度重合的。

面對一本經典書籍,可能你已經具備了那本書中所闡述的絕大部分知識,那麼還有沒有必要讀呢?我的建議是:可以查漏補缺,但不要通讀。很多經典書籍,單拿出一本來說都是值得閱讀的,但是放到一起就不一定了。因為兩本書籍可能70%甚至80%的內容類似,這時你讀完一本,再通讀另一本就沒有必要了,比如我讀了《C++Primer》就沒再去讀《C++PrimerPlus》了。當然你可以閱讀不重合的部分,這需要你有較強的辨識能力。

《C++PrimerPlus》雖然從名字上看起來像是《C++Primer》的加強版,但其實並不是。它們是不同的作者,並且從風評來看《C++PrimerPlus》貌似比《C++Primer》還要基礎一些。。

善待圖書館

請大家一定一定要善待圖書館。說實話我大學幾年對我們學校並沒過多好感,但是唯一讓我不舍的就是圖書館。相比電子書,我更喜歡那種手指翻閱紙張時那種真實的觸感。大學臨近尾聲,這幾個月瘋狂的去圖書館借書讀書。上個月竟然發現圖書館新購入了好幾本好書,可惜的是我實在是沒時間讀了。哎,突然發現自己一直以來都是不太會讀書的人,從大一到大四都借過不少書,但真正能讀完的並沒有幾本。當然了,前面我也提到了,有些書是不適合通讀的。但仍舊有很多需要通讀的書籍被我丟棄,直到最近幾個月才認認真真地讀了基本完整的。

書非借不能讀

很樸素的一個真理,借的書因為是時間限制,所以會逼迫你閱讀。而如果是你自己買的書,你潛意識就會覺得「啥時候讀都一樣」。當然這是對自制力不強的同學們說的。

2.3打造自己的技術棧

技術棧,或者叫技術體系、知識體系。首技術棧起於編程語言卻又不止於編程語言。你可以多嘗試,然後找到自己喜愛的技術方向開發深挖。然而很多學生通常會在起步的時候就陷入迷茫。在網上看到過一個人,想學web開發,各種調研,然後向別人徵求意見該學哪門語言比較好,哪個框架更有優勢。後面大概過了半年,他還在糾結該選哪一個。

我只想說:先跑起來。語言很重要但並沒有那麼重要。無論語言還是框架這些都是工具,在這些工具的使用過程中提煉出的思想、方法、認知才是你的能力。有了能力,即使你換了語言,換了框架照樣能快速上手。我覺得大公司一般不會計較你對某一框架的API熟悉不熟悉,他更看重的是你對框架背後的設計哲學和原理是否了解。

技術棧就像一棵大樹,樹根可能是操作系統、網路、演算法、資料庫。再靠上一點是編程語言。接著樹榦就是你的職業方向,可以是安卓、IOS、前端、後台等等。別忘了還有樹枝和樹葉。技術沒有孤島。把自己封閉在閉塞的圈子內十分危險。你應該是具備了深度的同時再擁有廣度,請注意擁有深度是前提。

沒有什麼東西絕對該學或者絕對不該學的,切忌盲從,照搬照抄別人的學習經歷,強迫自己看別人的書單。誰說你是後台的就不能看前端的東西?在你後台技術成熟之後是可以的,這樣也能加深你對整體架構的理解。

另外這些樹枝和樹葉上懸挂著的也可能NoSQL、Git或者Docker等,你不需要在每個方面都是專家,但你應該對新技術抱有好奇心。

2.4深度思考和提煉

不管是前端還是後台,框架都是層出不窮的。每個都學,誰都會疲於學習。但實際上你並沒有必要這麼做,對於一個框架,記憶它的API永遠是最低的技能,你要從中提煉出一些共性的知識點。比如後台框架,你學了之後你要記住的應該是URL路由、模板、許可權控制、MVC的設計等等。那麼你換一個框架,即使有不同,你也能快速上手,思維上只是換一套API,接著補一下個別差異,新特徵而以。對於編程語言的學習也是如此。

C++的STL裡面有各種演算法,很多時候參數的參數都包含一個函數對象(實際為重載運算符),這就是函數式編程啊。學了JavaScript,你會感覺到很多時候其實也都是在進行函數式編程,並且比C++更甚,尤其是jQuery這個庫的用法。提煉出不同語言之中的相似處及不同點,不僅能幫助你學習新語言,並且能幫助你鞏固舊語言,加深你對舊語言的理解。

另外呢。計算機學科的很多課程其實並不是完全孤立的(雖然可能看起來如此)。你比如說操作系統課,講鏈接和裝載,這肯定和C語言編譯的可執行文件有莫大關聯啦。講內存管理,分段是啥?你不知道C語言裡面數據段、代碼段、等等嗎?內存的分配策略和分配演算法,其實C語言裡面malloc就在使用這些策略啊。大家一定要學會在不同課程之間建立聯繫,這是一件很有趣事。

3.求職準備

3.1早做規劃

關於求職,一定要早做規劃,最起碼在大三開始就應該定下求職的規劃。舉個例子:

我意識到自己直接參加大四的秋招可能有很多不足,但是如果我找一個大三的暑期實習應該相對秋招要來的容易,並且實習留用的概率也比直接秋招通過的概率高。退一步講,即便我實習不能留用,我已經有了實習經歷,勇氣真的很重要,那麼我再去參加其他公司的秋招勝算也會大很多。

自己的短板一定要早點發現,然後及時找到彌補方案。比如你項目經驗匱乏,那麼你就應該在其他地方找到填補,例如:把基礎打牢(從上層應用到底層原理),深入了解數據結構和演算法,閱讀開源項目源碼等等。

俗話說「知己知彼,百戰不殆」,你應該找個時間(不需要太早)去看一看你所關注的公司往年的筆試題以及面試題。網上有很多筆經面經可供參考。

其他的規劃還有很多,比如你大概什麼時候開始就應該頻繁關注各大公司的招聘信息,什麼時候開始海投。如果你準備去外地面試,那麼提前給自己準備好足夠的錢,不僅是車票,面試過程可能會持續幾天,需要住宿之類的。

3.2關於刷題

這是個見仁見智的問題,如果你基礎足夠好,那麼大可以不要花太多時間在刷題上,但是我也建議你讀一讀《編程之美》、《劍指Offer》、《程序員面試寶典》、《程序員面試金典》之類的書來熟悉一下題型。

吐槽一下,我當時看的《程序員面試寶典》是第4版,不知道為啥出到第4版了,錯誤還很多。前半部分還好,值得一讀,後面就不敢恭維了。大家讀書一定要警惕。

如果你基礎不太好,那麼刷題就尤為重要了,雖然有點取巧,但也不失為一個辦法。

這裡提一下C++,即使你投的崗位不是C++(是Java或其他),那麼筆試的時候遇到C++的概率也是很高的。這是因為考察C++更有區分度,更加便於篩選,所以希望大家盡量突擊一下C++。當然,不同公司的選拔風格不一樣,所以還是多參考一下他們往年的筆試題吧。(前端的話應該考不到C++,這點我不了解)

3.3鼓起勇氣

之前我們學校大學部生進BAT的很少,可能要隔一年才有一個。但是其實並不是我們學校學生真的這麼差,雖然我們學校不怎麼樣,但不代表我們學生的素質就是如此。原因很簡單就是缺乏勇氣。我曾和一些學長學姐共事過一段時間,他們對於BAT以及其他的互聯網大廠,都是想都不敢想。我也曾經羞於說出自己的夢想「進入BAT」。

所有互聯網大廠都是不會來我們學校所在城市(南昌)招聘的,我們要想面試這些企業都要去省外城市(比如武漢)。異地面試也是給很多人心中造成了無形的壓力,覺得跑這麼遠,要是面試失敗咋辦,覺得不僅丟了錢還會丟面子。其實很幼稚,每個人都應該盡自己所能找到最好的工作,沒必要想這麼多,你丟掉的錢,遲早會得到更豐厚的回報。你丟掉的面子,遲早也會獲得欣羨的目光,最差的情況你也能告訴自己「努力過了,爭取過了,失敗了也不後悔」。

想我當初可是在武漢面試蘑菇街一面就掛掉了,然後三天之後又收到了騰訊武漢面試的簡訊。你說我去不去?

「蘑菇街你都掛了,你還要面騰訊?」

我去,我一定要去。

還有一點就是不要害怕自己學校差(普通一本甚至二本),不要嫌棄自己學歷低(大學部)。首先研究所們在演算法崗方面確實你大學部生有優勢,但是在開發崗上並沒什麼差別。然後大公司招聘雖然喜歡招聘名校的畢業生,這只是因為僅僅通過半個小時或一個小時的面試,面試官真的很難了解到你的全貌。而如果你是名校的學生,那麼無形之中就在證明自己的能力,首先你能考上這個學校就說明了你的學習能力,然後這個學校師資力量,辦學條件十分優厚,確實能助力學生的成長。如果你學校一般,那麼面試官可能覺得你學習能力有欠缺,或者覺得這樣一個學校並沒有好的條件去培養你。

但是這絕對不是全部。你是普通學校的學生,並不代表你沒有足夠的學習能力,沒有掌握足夠的職業技能。你需要做的僅僅是努力向面試官展示出你的學習能力,你所掌握的技能就好了。我有一個老鄉,二本學校,但是去年收割了BAT的offer,其中霸面百度拿了specialoffer。他大學期間就做了很多事,做了很多項目,還開辦工作室等等。這些大學經歷以及項目經驗寫到簡歷上,和面試官一聊,那麼面試官真的不會在乎你是什麼學校什麼學歷的(網易除外)。

另一篇:

學會思考,而不只是編程

人常說「授之以魚不如授之以漁」。如果說教授編程是授之以魚,那麼教授計算機科學就是授之以漁。為什麼說學習計算機科學比學會編程要重要得多?來聽聽Yevgeniy Brikman的解釋。

現如今,似乎每個人都在學習編程:Bill Gates、Mark Zuckerberg和Chris Bosh這些名人在Code.org網站上告訴人們每個人都擁有編程的能力;CoderDojo項目在世界各地大張旗鼓;英國已經把編程作為國小官方課程。

不過,我認為這樣有點誤入歧途了。但請不要誤會——我也確實認為代碼能夠讓世界變得更美好——但編程本身並不是我們的目的。計算機和程序只是工具,它們是我們通向終點的橋樑。

我們真正的目標應該是教會人們如何思考。換句話說,我們應該教人們計算機科學,而不只是編程。在這篇文章里,我將會解釋這兩者之間的區別,以及為什麼在這兩者當中選擇正確的一方對於邁向成功來說如此重要。

我們不妨先問自己一個問題:為什麼我們要關心編程或計算機科學?

歡迎來到真實的世界

或許你正在使用Chrome或Firefox閱讀這篇文章,這些瀏覽器可能運行在Windows或macOS上,而你可能正在使用筆記本或台式機。你今天可能花了一些時間閱讀電子郵件、查看朋友圈的狀態,或者在視頻網站上看了一些視頻。我們的生活在很大程度上依賴了計算機:我們的醫療記錄保存在資料庫里;我們的簡歷可能放在了LinkedIn上;我們使用Google或Facebook為產品做宣傳;我們在Amazon上購買這些產品;我們直接在網路上進行報稅;我們使用網上電子銀行;我們甚至開始涉足電子貨幣。

現在將你的視線從電腦上移開:在你的口袋裡或者桌角的某個地方可能放著你的手機,它裝有GPS、攝像頭、觸摸屏和大量的應用程序。在你的客廳,可能有LCD電視機、DVR、DVD播放機、Apple TV、Xbox或PlayStation。這些設備上的視頻、音樂和遊戲都是由計算機圖形和數字音頻組成的。

當你經過你的汽車時,你是否想過,現代汽車是使用軟體設計並在滿布機器人和計算機的工廠里生產出來的?你開著車,使用Google地圖導航,在Yelp上查找吃飯的地方或在TripAdvisor上查找休息的地方。在你的頭頂上方有自動駕駛的飛機飛過,飛機里有Wifi和娛樂系統,可以與其他飛機、交通指揮中心和飛機廠商聯繫。再往上,衛星和太空站正圍繞著地球繞圈,它們拍照、預報天氣、轉發電話信號。

軟體正在吞噬著這個世界,但這隻不過是個開始。在你意識到這一點之前,你可能已經穿上了智能可穿戴設備、使用電腦來鎖門、使用機器人來送貨或清理房間、開發自己的電子設備、有自己的製造車間、生活在虛擬現實里、乘坐自動駕駛的汽車,甚至飛向太空。

矩陣無處不在

上述的這些科技都是由軟體驅動的,我們的生活被代碼所包圍,而代碼的數量在未來只會不斷增加。

不過,雖說科技無處不在,但這並不意味著你在學校里就一定要學習這些技術。比方說,我們都需要乘坐飛機,但即使是K12也並沒有把獲得飛行員駕照當作課程的一部分。

相反,學會使用那些能夠幫助你理解飛行原理的工具卻是課程的一部分:

通過學習物理和數學,你了解了重力、作用力、壓力、速度、摩擦力和浮力。

通過學習生物,你明白了人體在缺氧和寒冷的高空中會發生什麼。

通過學習歷史,你知道了飛機是怎樣被發明和製造出來的,以及飛機在旅行、商務和戰爭中所扮演的角色。

中學畢業之後,你就知道飛機是什麼東西,知道飛機是如何飛行的,以及如何安全地搭乘飛機。一般性的課程,如物理、數學、生物和歷史,它們教會你如何思考各個領域的問題,包括飛機在內。相反,有些課程只是教會你如何使用一種工具,比如如何駕駛某種型號的飛機。

類似的,我們應該專註於教授計算機科學,而不僅僅是編程:前者能夠教會我們一般性的思考方式,而後者只是一種特定的工具。

什麼是計算機科學?

計算機科學就是研究計算:如何表示和處理信息。

解決問題:你將學會各種演算法策略,比如分而治之法、遞歸、探索法、貪婪搜索和隨機演算法,它們可以幫你分解和解決任何一種問題。

邏輯:你開始使用更準確和正式的方式進行思考,比如抽象、布爾邏輯、數字理論和集合理論,你因此能夠以一種嚴謹的方式來解決問題。

數據:你接觸到信息理論,想要了解信息是什麼東西,你該如何表示它們,以及如何對這個真實的世界進行建模。

系統:你該如何設計和實現複雜的系統來滿足一系列的需求?系統工程幾乎已經成為各個業務領域的核心議題。

思考:了解人類思維的最好途徑就是嘗試複製它。人工智慧、機器學習、計算機視覺和自然語言處理不僅僅是計算機科學的前沿技術,它們也涉及到了生物學、物理學、心理學和數學。

上述的清單並沒有提及編程或者程序,因為它們只是計算工具:它們都不是計算機科學。

在計算方面,我們更多地依賴另一個工具:我們的大腦!計算機科學的目的是教會我們的大腦進行創新性、一般性和廣泛性的思考。隨著科技的日益滲透,新的思考方式變得和物理、數學、生物和歷史一樣重要。

也就是說,只進行單獨的思考是不夠的:我們需要知道如何應用我們的思考。在物理學里,我們使用天平、稜鏡和磁鐵做實驗;在生物學里,我們使用試管、植物和有蓋培養皿;在計算機科學里,我們學習編程。

什麼是編程?

編程,或者說寫代碼,是指你發出指令讓計算機執行一些操作。如果你之前從來沒有寫過代碼,那麼你可能習慣了使用已有的應用程序來與計算機發生交互。實際上,這些應用程序是由代碼組成的,這些代碼告訴計算機如何顯示應用、在哪裡存儲數據、從哪裡獲取數據,以及如何對用戶的滑鼠點擊做出響應。

編程是基於上述的計算機科學原則進行的。計算機科學的概念——邏輯、演算法、數據和系統工程——可以用於構建所有的事物,從Web瀏覽器到飛機的自動駕駛軟體。編程涉及到數學和數據結構,同時也是一項具有創造性的活動:每敲出一行代碼,你的想法就又向現實邁近了一步。

將編程作為計算機科學的一部分帶來了很多好處。

DIY:如果你會編程,你就可以自己開發軟體。你可以從簡單的開始:寫一個腳本來重命名照片或寫一個Excel公式來計算稅金。然後更進一步:搭建一個網站;為你的公司開發一個移動應用;開發一款可以與你的朋友們一起玩的遊戲。

問題診斷:在開發了幾款應用之後,就可以輕鬆地理解其他的應用。在戰勝了對計算機的恐懼之後,你將成為技術大神。技術遍布我們的生活,知道如何操縱它們變得與知道如何使用它們一樣重要。

職業生涯:學習計算機科學的目的並不是為了成為專業的程序員。我們每個人在學校里都學習數學、物理和化學,但並不是每個人都成為專業的數學家、物理學家或化學家。不過,如果你有這方面的熱情,你會發現軟體工程是一份高評價、高收入、增長快速的工作。

總結

讓我們回顧一下:

計算機科學代表了一種新的思考方式。在一個被技術滲透的世界里,計算機科學的概念對於每一個人來說都是非常有用的。

編程是學習計算機科學的一種途徑,但它本身並不具備一般性目的。

混淆了這兩者就會讓學習編程偏離正確的方向。Slate寫過「或許不是每個人都要學習編程」的文章,Atlantic也寫過「新聞學院沒必要要求學生記者學會編程」的文章,而Jeff Atwood在他的文章「請不要學習編程」中問了一個問題,這個問題就是混淆概念的例子:

如果有一天,Michael Bloomberg在早上醒來時發現自己變成了一個Java編程高手,對於這個領導著美國最大城市的大人物來說,他的日常工作是否會如虎添翼?

當然,這個問題本身就是有問題的。這要歸因於人們將學習編程作為終極目標,而不是學習如何思考。即使是Jeff Atwood這位經驗豐富且倍受尊敬的程序員尚且分不清楚其中的區別,就別指望一般人能夠搞清楚問題的實質了。我們應該這麼問:

如果Bloomberg通過學習新的解決問題策略和掌握更好的邏輯領悟技能來改進他的思考方式,那麼他在日常工作中是否會變得更好?

我想答案是顯而易見的。隨著技術越來越廣泛地滲透到我們生活的各個方面,答案會越來越明顯。這就是為什麼我們要專註於教授計算機科學而不只是教授如何編程的原因。

作者 | 圖文來自網路、如涉及版權問題,請聯繫我們以便處理。文章內容純屬作者個人觀點,不代表本網觀點。

讀書吧| QQ群:481160039



熱門推薦

本文由 yidianzixun 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦