學計算機必看:程序員部落酋長,給計算機專業學生的 6 個建議!

若是你喜歡編程,那麼你真是受到了上天的眷顧。你是很是幸運的少數人之一,可以以本身喜歡的事謀生。大多數人沒有這麼幸運。你認爲理所固然的觀念「熱愛你的工做」,實際上是一個很現代的概念。一般的見解是,工做是一種讓人很不開心的事,你爲了拿工資纔不得不去上班。程序員

你工做的目的是爲了攢下錢去幹那些本身真正喜歡乾的事,可是前提是你得等到65歲退休以後才行,並且還有很多條件。條件一,你的積蓄必須足夠多;條件二,你沒有老到走不動,你還有體力去幹那些事情;條件三,你喜歡的事情不須要用到脆弱的膝蓋、昏花的視力,也不要求你走上一里地不喘氣,等等。數據庫

我剛纔說到哪裏了?對了,我要提建議。編程

畢業前練好寫做

若是不是Linus Torvalds不斷地散佈福音,請問Linux操做系統會成功嗎?雖然他是一個很是聰明的計算機天才,可是Linux吸引來全世界一大批志願者的真正緣由倒是Linus Torvalds的表達能力。他經過電子郵件和郵件列表用書面形式傳播本身的想法,最終引發了全部人的注意。微信

你據說過如今風靡一時的「極限編程」(Extreme Programming)嗎?我在這個地方不談我對極限編程的見解,我只說若是你聽過這個詞,那麼緣由就是它的倡導者都是一些很是有才華的做家和演說家。閉包

即便咱們縮小範圍,將目光侷限在任何一個軟件開發團體中,你也會發現該團體中最有權勢和影響力的程序員正是那些表達能力強的程序員,他們不管是作書面表達仍是作口頭表達,都可以清晰、自如、具備說服力地傳達觀點。此外,長得高也有助於提高影響力,不過這個不取決於你。架構

一個普通程序員與一個優秀程序員的區別,不在於他們懂得的編程語言誰多誰少,也不在於他們喜歡用Python語言仍是喜歡用Java語言,而在於他們可否與他人交流思想。若是你能說服其餘人,你的力量就能夠獲得放大。若是你能寫出清晰的註釋和技術規格說明書,其餘程序員就可以理解你的代碼,所以他們就能在本身的代碼中使用,而沒必要重寫。若是你作不到這一點,你的代碼對其餘人就沒有價值。若是你能爲最終用戶寫出清晰的使用手冊,其餘人就能明白你的代碼是用來幹什麼的,這是惟一讓別人明白你的代碼有何價值的方法。SourceForge[ ]上有許多優美的、有用的代碼,可是它們都像被埋葬了同樣,根本沒人來用,緣由就是它們的做者沒有寫好使用說明(或者壓根就沒寫)。這樣一來就沒有人知道他們的成果,他們傑出的代碼就衰亡了。編程語言

若是一個程序員不會用英語寫做、沒有良好的寫做能力,我就不會僱他。若是你能寫,無論你去哪家公司工做,你很快就會發現寫做技術文檔的任務會落到你頭上,這意味着你已經開始在放大本身的影響力了,管理層正在注意到你。學習

大學裏有些課程被公認爲「寫做密集型」(writing intensive)課程,這就是說爲了拿到學分,你必須寫做多得可怕的文字。必定要去上這樣的課程!不要管學科,只要這門課每週甚至天天都要你寫東西,你就去上。測試

你還能夠動手寫日記或者網誌。你寫得越多,寫做就會變得越容易。寫起來越容易,你就會寫得越多。這是一個良性循環。spa

畢業前學好C語言

第二點我要講的是C語言。請注意,我說的是C語言,而不是C++。雖然在實際使用中C語言已經愈來愈罕見,可是它仍然是當前程序員的共同語言。C語言讓程序員互相溝通,更重要的是,它比你在大學中學到的「現代語言」(好比ML語言、Java語言、Python語言或者其它正在教授的流行垃圾語言)都更接近機器。你至少須要花一個學期來了解機器原理,不然你永遠不可能在高級語言的層次寫出高效的代碼。你也永遠沒法開發編譯器和操做系統,而它們偏偏屬於目前程序員可以獲得的最佳工做之列。別人也永遠不會放心將大型項目的架構設計交給你。我無論你懂多少延續(continuation)、閉包(closure)、異常處理(exception handling),只要你不能解釋爲何while ( s++ = t++);這句代碼的做用是複製字符串,或者不以爲這是世界上對你來講再天然不過的事情,那麼你就是在盲目無知的狀況下編程。在我看來,這就好像一個醫生不懂得最基本的解剖學就在開處方,他看病的根據徹底是由於那些娃娃臉的醫藥廠商銷售表明說這種藥有用。

畢業前學好微觀經濟學

若是你沒有上過任何經濟學課程,那麼我首先來作一個超短的評論:經濟學是這樣的學科之一,剛開始學的時候轟轟烈烈,有許多有用的、言之有理的理論和能夠在真實世界中獲得證實的事實,等等;可是,再學下去就每況愈下,有用的東西就很少了。經濟學一開始那個有用的部分正是微觀經濟學,它是商業領域全部重要理論的基礎。跟在微觀經濟學後面的東西就不行了。你接下來學的是宏觀經濟學,若是你願意,儘管跳過去,也不會有什麼損失。宏觀經濟學開頭的部分是利息理論,內容比方說是利率與失業之間的關係,可是怎麼說呢,看上去這部分裏面尚未被證明的東西多於已經被證明的東西。學完這部分,後面的內容愈來愈糟糕,許多經濟學專業的學生實際上都變成在搞物理學,由於這樣才能在華爾街上找到更好的工做。可是無論怎樣,你必定要去學微觀經濟學,由於你必須搞懂供給和需求,你必須明白競爭優點,你必須理解什麼是淨現值(NPV),什麼是貼現,什麼是邊際效用。只有這樣,你纔會懂得爲何生意是如今這種作法。

爲何計算機系的學生也應該學經濟學?由於,從經營一家公司的角度來看,比起那些不懂的程序員,一個理解基本商業規則的程序員將會更有價值。就是這麼簡單。我沒法告訴你有多少次我是那樣地充滿挫折感,由於我看到了太多的提出一些瘋狂的想法的程序員,這些想法在代碼上也許可行,但在資本主義世界中毫無心義。若是你懂得商業規則,你就是一個更有價值的程序員,你會所以獲得回報的,可是前提是你要去學習微觀經濟學。

不要由於枯燥就不選修非計算機專業的課程

想提升GPA績點的一個好方法就是多選修非計算機系的課程。請千萬不要低估你的GPA的重大意義。千千萬萬的人事經理和招聘人員在拿到一份簡歷的時候,第一眼就會去看GPA,包括我也是這樣。咱們不會爲這種作法道歉。爲何?由於GPA不反映單個的成績,而是表明了許多個教授在一段很長的時間中,在不一樣的狀況下,對你的表現的一個總的評估。SAT成績難道不夠嗎?哈,那隻不過是一場幾個小時的測試罷了。GPA中包括了四年大學期間你的小論文、期中考試和課堂表現,總數有幾百次之多。固然,GPA也有本身的問題,不是百分之百準確。好比,這些年來,老師對學生的打分愈來愈寬鬆,學習成績有通貨膨脹的趨勢。再好比,GPA沒法反映課程的難度,沒人可以看出你的GPA是來自無名社區大學家政系的輕鬆課程仍是來自加州理工學院針對研究生的量子力學課程。漸漸地,我造成了一套本身的作法,首先我會過濾掉全部來自社區大學、GPA低於2.5的簡歷,而後我會要求剩下的人給我寄成績單和推薦信。我再從中發現那些成績一向優秀的人,而不是那些僅僅在計算機系課程中獲得高分的人。

爲何我要關心某人的「歐洲歷史」課程成績呢,畢竟做爲僱主我要找的應該是程序員啊?況且,歷史是那麼枯燥,不得高分很正常。哦,這麼說來,你的意思是我應該僱用你,而不用考慮一旦工做變得枯燥你會不會努力工做?別忘了,在編程工做中也有很枯燥的東西。每一項工做都有枯燥難耐的時刻。我不想僱用那些只想幹有趣事情的人。

選修有大量編程實踐的課程

我依然清楚記得我發誓毫不讀研究生的那一刻。那是在一門叫作「動態邏輯」的課程上,教師是活力十足的耶魯大學教授Lenore Zuck,她是計算機系那些聰明的老師中最聰明的人之一。

現在, 因爲記憶力糟糕, 我已經差很少把這門課的內容忘光了,可是無論怎麼說,在這裏我仍是想要對付着說一下。大體上,形式邏輯的意思是說,若是條件成立,你就能證實結論也成立。好比,根據形式邏輯,已知「只要成績好,就能被僱用」,而後假定「Johnny的成績好」,你就能夠獲得一個嶄新的結論「Johnny會被僱用」。這徹底是經典方法。可是,一個解構主義者(deconstructionist)只須要10秒鐘就能破壞形式邏輯中全部有用的東西。這樣一來,留給你的只是一些趣味性,而不是實用性。

如今再來講動態邏輯。它與形式邏輯實際上是一回事,可是必須再多考慮時間因素。好比,「你打開燈以後,就能看見本身的鞋子」,已知「燈之前是亮的」,那麼這就意味着「你看見了本身的鞋子」。

對於像Zuck教授那樣聰明的理論家,動態邏輯充滿了吸引力,由於它看上去頗有但願讓你在形式上證實一些計算機程序的相關理論問題。這樣作說不定頗有用。好比,你能夠用它在形式上證實,火星漫遊車的閃存卡不會發生溢出(overflow)問題,不會於是成天一遍又一遍地重啓,耽誤了它在那顆赤紅色的星球上漫遊尋找火星人馬文(Marvin the Martian)。

在第一堂課上,Zuck博士寫滿了整整兩面黑板,甚至黑板旁邊的牆上都寫上了不少證實步驟。須要證實的問題是,有一個控制燈泡的開關,如今燈泡沒有亮,這時你打開了開關,請證實燈泡將會點亮。

整個證實過程複雜得難以想象,到處都是陷阱,必須十分當心。保證這個證實不出錯太困難了,還不如直接相信打開開關燈就會亮。真的,雖然證實過程寫滿了許多塊黑板,可是仍是有許多中間步驟被省略了,由於若是要從形式邏輯上完整證實全部步驟,那就瑣碎得沒法形容了。許多步驟是用各類經典的邏輯證實方法推導獲得的,包括概括法、反證法等,甚至有些部分仍是由旁聽的研究生證實的。

留給咱們的課後做業是證實逆命題:若是燈原來是關着的,如今卻亮了,那麼請證實開關的狀態必定同原來相反。

我動手開始證實,我真的去證實了。

我在圖書館裏待了很長時間。

我對照着Zuck博士的原始證實想依樣畫葫蘆。研究了幾個小時以後,我在其中發現了一個錯誤。可能我抄寫的時候抄錯了,可是這使得我想通了一件事。若是花費3個小時,寫滿了一塊又一塊的黑板,每一秒鐘均可能出錯,最後可以證實的卻只是一個很瑣碎的結論,那麼這種方式有多大的實用性呢?在活生生、充滿趣味的現實世界中,你永遠都不會有機會使用它。

可是,動態邏輯的理論家們對這一點不感興趣。他們看上它不是由於它有用,而是由於它能夠爲他們帶來終身教職。

我放棄了這門課,而且發誓毫不會去讀計算機科學的研究生。

這個故事告訴咱們,計算機科學與軟件開發不是一回事。若是你真的很是幸運,你的學校可能會開設很像樣的軟件開發課程。可是另外一種多是,你的學校根本不教你在現實中如何編程,由於精英學校都以爲,教授工做技能最好留給職業技術學校、犯人重返社會的培訓項目去作。你處處都能學怎麼寫代碼。別忘了,咱們是耶魯大學,咱們的使命是培養將來的世界領袖。你交了16萬美圓的學費,卻在學循環語句的寫法,這怎麼能夠?你覺得這是什麼地方,難道是機場沿途的酒店裏臨時拼湊起來不靠譜的Java語言培訓班?哼哼。

麻煩在於咱們沒有一種真正教授軟件開發的專門學校。你若是想成爲一個程序員,你可能只能選擇計算機科學專業。這是一個不錯的專業,可是它同軟件開發不是一回事。在那些400等級的課程代號中,去尋找名稱中帶有「Practicum」這個詞的課程吧(編者注:指供人實習的課程)。不要被這個拉丁語單詞嚇倒,這些都是有用的課程,之因此起這種名字,只是爲了讓那些文縐縐、裝腔做勢、滿嘴胡說八道的公司經理們以爲高深莫測。

找一份好的暑期實習工做

精明的招聘負責人都知道,喜歡編程的人高中時就將牙醫的信息輸入了數據庫,進入大學前就去過三次電腦夏令營,爲校報作過內容管理系統,有過軟件公司的夏季實習經歷。招聘負責人就是要在你的簡歷上找這些東西。

若是你喜歡編程, 就不要隨便什麼工做都答應,不然你會犯下最大的錯誤。無論是暑期工做,仍是兼職或者其餘性質的工做,只要與編程無關,就不要輕易接受。我知道,其餘19歲的孩子都想去購物中內心打工,在那裏摺疊襯衫。可是你與他們不一樣,你19歲時就已經掌握了一門很是有價值的技能。將時間浪費在摺疊襯衫上是很愚蠢的,等到畢業的時候,你的簡歷上本應該寫滿了一大堆與編程相關的經歷。就讓那些財經類的畢業生去租車公司「幫助人們知足他們租車的須要」吧,你要乾的是別的事(在電視中扮演超人的Tom Welling注1除外)。

爲了讓你的生活變得更容易一些,也爲了強調這整篇文章徹底是爲了知足個人我的目的,我要告訴你,個人公司——Fog Creek軟件公司——提供軟件開發方面的暑期實習機會。咱們很是看重簡歷。「比起其餘公司的實習工做,你在Fog Creek最有可能學到更多的編寫代碼、軟件開發、商業運做方面的知識。」這是去年夏天咱們的一個實習生Ben說的。他會這樣說,並不徹底是由於我派了人到他的宿舍讓他這樣說。咱們接受實習申請的截止日期是2月1日。一塊兒來吧。

若是你遵從了個人建議,你仍是有可能落得一個悲慘的下場,好比很早就賣掉了微軟公司的股票,再好比拒絕了谷歌公司的工做機會,緣由是你想要一間本身的能夠關上門的獨立辦公室,或者作出了其餘生命中愚蠢的決定。可是,這些可不是個人錯。我一開始就告訴過你,不要聽個人話。


大學想提高你的編程能力,成爲一個強大的程序員找到一份好工做嗎?不妨和一些志同道合的小夥伴一塊兒學習成長!

C語言C++編程學習交流圈子,【點擊進入微信公衆號:C語言編程學習基地

有一些源碼和資料分享,歡迎轉行也學習編程的夥伴,和你們一塊兒交流成長會比本身琢磨更快哦!

相關文章
相關標籤/搜索