1. 程式人生 > >一篇關於程式設計師的文章

一篇關於程式設計師的文章

很不錯,轉載一下。

確定方向

選擇比努力更重要

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

life is binary

生活就是二進位制,一個個0101組成的。每一次抉擇,選了就是1,不選就是0。另外也有一句話說:“人一生要面臨很多選擇,但是真正能決定你命運的只有幾個”。沒錯其實就是這樣。
如果你是計算機專業的學生,那麼到底是考研還是就業就是首先要面臨的問題。本文是面向確定了畢業要工作的大學生的,所以關於這個抉擇,不再贅述。
就業的話,本文標題是碼農,實際是指所有計算機相關的技術工種。包括開發、測試、運維等。
很多選擇本身並沒有對錯或優劣,只有適合不適合。
不要濫用勤能補拙,這個詞語一度被很多人奉為圭皋,但同時成了枷鎖。我相信這個詞,但是要考慮現狀,要考慮投資回報率。你在自己並不擅長或不感興趣的領域深耕了四年,最後不一定能獲得多少成績。當然如果你能在畢業後繼續深耕幾年或許是可以的,但是我希望每一位大學生在畢業的時候都能有一份好的工作,並且如果你並不喜歡某一領域的話,那麼我相信你一定不會堅持下去。所以我們一定要找到適合自己的方向!
那麼如何發現自己對什麼感興趣呢?我也不知道很好的辦法,我只知道一個樸素的方法——嘗試。趁著年輕,就要多嘗試。千萬不要大三了都還不知道自己興趣在哪,想做什麼,適合什麼。所以大一大二努力去碰釘子吧。

演算法還是開發

資料結構和演算法很重要,無論是面試還是工作,無論你從事哪方面的技術。不過演算法雖然重要,但並不適合每個人都花費大學全部的精力去鑽研。
相信很多學校都有ACM競賽相關的社團或組織。很不幸,我們學校沒有,我大一的時候也花了很多精力刷題,但是硬體條件不太允許,氛圍太缺乏。如果你覺得自己能夠在ACM比賽中游刃有餘,那麼恭喜你,你可以一心一意搞演算法。如果你覺得自己在這個過程中十分吃力,挫敗感頻生,那麼也不要氣餒,或許有另一條路是屬於你的。選擇開發,有演算法功底深厚是很棒的事,但是僅僅只有演算法同樣是不夠的,計算機海洋還有很多未知等著你探索。
演算法崗包括資料探勘、機器學習之類的(怎麼樣,高大上吧,反正我不懂)。要說明的是想做演算法的同學最好選擇讀研繼續深造,因為大企業在演算法崗的招聘上對本科生是很不友好的。還是要申明一句,你做開發也不能忽視演算法和資料結構,起碼面試還是經常考的!記住一句:

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

對於本科生而言做開發還是相對容易的一條道路,不過開發的技術路線也是不勝列舉:前端、後臺(PHP後臺、Java後臺等等)、移動端(安卓和IOS)、遊戲開發、資料庫(比如做DBA)……。這裡我肯定不會去推薦你去學哪一種,我沒有能力也不適合。只有你自己才能發現自己的興趣以及好奇心之所在。
我能做的只是在浩如煙海的技術觀點中,幫一個個本科生排疑解惑。

認識技術

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

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

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

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

誤區2:非圖形化的東西比圖形化的東西更牛逼
具體而言就比如說:後臺技術比前端技術、客戶端(Android、IOS)更牛逼。多見於有Linux背景的人(沒錯,說的就是我=_=|||)。
我也一度這樣認為,其實不然。這裡和上一個誤區一起澄清一下:技術本身沒有高低優劣之分,但程式設計師對其有好惡之別。
另外要說明一下,不能說前端就簡單,後臺就更難,同樣反過來說也不對。我只能說這完全是不同層面的東西,不能量化的去比較。前後端都自有其難點以及G點。你不能說你能處理後端複雜的併發、同步、高可用,那麼你就能輕鬆地完成美觀的網頁及特效、處理麻煩的瀏覽器相容、極盡所能地降低頁面的載入速度。就好比同樣是一雙按在鍵盤上的手,那麼鋼琴家演奏優美的樂曲和程式設計師開發高效能的軟體,哪個更困難?(比喻不一定貼切,但希望大家能明白這個意思)

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

多見於PHP程式設計師。哈哈,開個玩笑。這裡不是在談論誰是最好的語言,而是告訴大學生朋友們不要迷信論斷。
我大一的時候去圖書館看書,看到有Java Web的書,前言寫的很清楚,痛陳了PHP和ASP.NET的缺點,闡述Java是多麼優秀,OK。你可能也和我一樣,在入門的時候經歷過類似的事。我要告訴你的事,多翻幾本書,你會看到ASP.NET和PHP書籍的前言寫的同樣精彩,你絕不會在ASP.NET的書裡看到誇耀Java的句子。不同的技術自有其優劣,千萬不要成為前言驅動的學習者。。

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

  • LAMP架構只適合中小企業;

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

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

學習那點事

關於逃課

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

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

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

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

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

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

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

關於讀書

多讀書,讀好書

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

閱讀合適的書籍

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

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

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

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

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

善待圖書館

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

“書非借不能讀”

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

打造自己的技術棧

技術棧,或者叫技術體系、知識體系。首技術棧起於程式語言卻又不止於程式語言。你可以多嘗試,然後找到自己喜愛的技術方向開發深挖。然而很多學生通常會在起步的時候就陷入迷茫。在網上看到過一個人,想學web開發,各種調研,然後向別人徵求意見該學哪門語言比較好,哪個框架更有優勢。後面大概過了半年,他還在糾結該選哪一個。。
我只想說:先跑起來。語言很重要但並沒有那麼重要。無論語言還是框架這些都是工具,在這些工具的使用過程中提煉出的思想、方法、認知才是你的能力。有了能力,即使你換了語言,換了框架照樣能快速上手。我覺得大公司一般不會計較你對某一框架的API熟悉不熟悉,他更看重的是你對框架背後的設計哲學和原理是否瞭解。
技術棧就像一棵大樹,樹根可能是作業系統、網路、演算法、資料庫。再靠上一點是程式語言。接著樹幹就是你的職業方向,可以是安卓、IOS、前端、後臺等等。別忘了還有樹枝和樹葉。技術沒有孤島。把自己封閉在閉塞的圈子內十分危險。你應該是具備了深度的同時再擁有廣度,請注意擁有深度是前提。
沒有什麼東西絕對該學或者絕對不該學的,切忌盲從,照搬照抄別人的學習經歷,強迫自己看別人的書單。誰說你是後臺的就不能看前端的東西?在你後臺技術成熟之後是可以的,這樣也能加深你對整體架構的理解。

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

深度思考和提煉

不管是前端還是後臺,框架都是層出不窮的。每個都學,誰都會疲於學習。但實際上你並沒有必要這麼做,對於一個框架,記憶它的API永遠是最低的技能,你要從中提煉出一些共性的知識點。比如後臺框架,你學了之後你要記住的應該是URL路由、模板、許可權控制、MVC的設計等等。那麼你換一個框架,即使有不同,你也能快速上手,思維上只是換一套API,接著補一下個別差異,新特徵而以。對於程式語言的學習也是如此。
C++的STL裡面有各種演算法,很多時候引數的引數都包含一個函式物件(實際為過載運算子()),這就是函數語言程式設計啊。學了javascript,你會感覺到很多時候其實也都是在進行函數語言程式設計,並且比C++更甚,尤其是jQuery這個庫的用法。提煉出不同語言之中的相似處及不同點,不僅能幫助你學習新語言,並且能幫助你鞏固舊語言,加深你對舊語言的理解。
另外呢。計算機學科的很多課程其實並不是完全孤立的(雖然可能看起來如此)。你比如說作業系統課,講連結和裝載,這肯定和C語言編譯的可執行檔案有莫大關聯啦。講記憶體管理,分段是啥?你不知道C語言裡面資料段、程式碼段、等等嗎?記憶體的分配策略和分配演算法,其實C語言裡面malloc就在使用這些策略啊。大家一定要學會在不同課程之間建立聯絡,這是一件很有趣事。

求職準備

早做規劃

關於求職,一定要早做規劃,最起碼在大三開始就應該定下求職的規劃。舉個例子:
我意識到自己直接參加大四的秋招可能有很多不足,但是如果我找一個大三的暑期實習應該相對秋招要來的容易,並且實習留用的概率也比直接秋招通過的概率高。退一步講,即便我實習不能留用,我已經有了實習經歷,勇氣真的很重要,那麼我再去參加其他公司的秋招勝算也會大很多。
自己的短板一定要早點發現,然後及時找到彌補方案。比如你專案經驗匱乏,那麼你就應該在其他地方找到填補,例如:把基礎打牢(從上層應用到底層原理),深入瞭解資料結構和演算法,閱讀開源專案原始碼等等。
俗話說“知己知彼,百戰不殆”,你應該找個時間(不需要太早)去看一看你所關注的公司往年的筆試題以及面試題。網上有很多筆經面經可供參考。
其他的規劃還有很多,比如你大概什麼時候開始就應該頻繁關注各大公司的招聘資訊,什麼時候開始海投。如果你準備去外地面試,那麼提前給自己準備好足夠的錢,不僅是車票,面試過程可能會持續幾天,需要住宿之類的。

關於刷題

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

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

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

鼓起勇氣

之前我們學校本科生進BAT的很少,可能要隔一年才有一個。但是其實並不是我們學校學生真的這麼差,雖然我們學校不怎麼樣,但不代表我們學生的素質就是如此。原因很簡單就是缺乏勇氣。我曾和一些學長學姐共事過一段時間,他們對於BAT以及其他的網際網路大廠,都是想都不敢想。我也曾經羞於說出自己的夢想“進入BAT”。
所有網際網路大廠都是不會來我們學校所在城市(南昌)招聘的,我們要想面試這些企業都要去省外城市(比如武漢)。異地面試也是給很多人心中造成了無形的壓力,覺得跑這麼遠,要是面試失敗咋辦,覺得不僅丟了錢還會丟面子。其實很幼稚,每個人都應該儘自己所能找到最好的工作,沒必要想這麼多,你丟掉的錢,遲早會得到更豐厚的回報。你丟掉的面子,遲早也會獲得欣羨的目光,最差的情況你也能告訴自己“努力過了,爭取過了,失敗了也不後悔”。

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

還有一點就是不要害怕自己學校差(普通一本甚至二本),不要嫌棄自己學歷低(本科)。首先研究生們在演算法崗方面確實你本科生有優勢,但是在開發崗上並沒什麼差別。然後大公司招聘雖然喜歡招聘名校的畢業生,這只是因為僅僅通過半個小時或一個小時的面試,面試官真的很難了解到你的全貌。而如果你是名校的學生,那麼無形之中就在證明自己的能力,首先你能考上這個學校就說明了你的學習能力,然後這個學校師資力量,辦學條件十分優厚,確實能助力學生的成長。如果你學校一般,那麼面試官可能覺得你學習能力有欠缺,或者覺得這樣一個學校並沒有好的條件去培養你。
但是這絕對不是全部。你是普通學校的學生,並不代表你沒有足夠的學習能力,沒有掌握足夠的職業技能。你需要做的僅僅是努力向面試官展示出你的學習能力,你所掌握的技能就好了。我有一個老鄉,二本學校,但是去年收割了BAT的offer,其中霸面百度拿了special offer。他大學期間就做了很多事,做了很多專案,還開辦工作室等等。這些大學經歷以及專案經驗寫到簡歷上,和麵試官一聊,那麼面試官真的不會在乎你是什麼學校什麼學歷的(網易除外)。
同學們,鼓起勇氣,乾巴爹。

生活在別處
工作很重要,學習很重要。但生活不止於此,不要忽視家人,不要忽視最後的大學時光,如果可以,早點找個妹子吧。