在真實工作中的編程是怎麼樣的,與學校里有什麼不同?

本人還是在校學生,學校里每門編程語言課程都是上一點上不完的,實驗課寫的代碼最長一兩百行。 很好奇在真實的工作環境中,程序員寫代碼是怎麼樣的。每天啪啪啪手敲成千上萬行代碼這樣的嗎。和在學校學習時寫代碼有什麼異同。 (????ω????)希望已經工作的前輩們來回答回答。


第一名答案給的是一個在學校里屌屌的學生,進去一家傳統公司,然後看不上一切別人垃圾代碼的視角。

我帶來一個,畢業眼界也挺高,覺得自己技術不錯,然後面試被真正的大牛虐成狗,然後還跪舔進入公司繼續被虐的,遊戲公司,第一視角。

給我一份愛,還你一夜情。第一視角,現在開始。

10年進入大學,無限憧憬大學,然後就傻逼了整個大一上學期,大一下學期買了電腦接觸了dota,兩年刀塔路,步步皆辛苦。大三下學期開始意識到,畢業總得賺錢吃飯,現在的節奏感覺會要飯,然後就開始敲代碼。一開始無任何頭緒,找到某培訓機構視頻開始看,我學java,據說ssh搞完,出去就有6k以上,我無恥的硬了。不對,我傻傻的信了。現在想想,多單純啊,6k就感覺吊炸天了。大四下學期,獨自一人去了廣州,學校同學還在學校里接受培訓機構培訓。我覺得教的都會了。就先出來了。

2013年11月18號,到了廣州。投了一圈,沒反應。感覺人生挫敗了。這時候,有時候不得不說可憐之人偶爾也有運氣好的時候。在qq上碰到一個公司發招聘,我完全不抱希望的嘗試下,居然給了面試機會。當天去面試信心滿滿,然而並沒有什麼卵用。老大直接從基礎問到虛擬機,計算機原理,編譯原理。當場直接跪了,我現在都還有心理陰影。整整差不多一個小時,我感覺像是一個世紀。印象比較深,老大問編譯原理,我說我們沒有開編譯原理的課,事實是真的沒有。老大原話,「你們他媽沒有編譯原理也敢叫軟體工程專業!」,我完全無法接下去。最後老大問,你堅持最久的一件事是什麼?大三一直都在跑步,我說,跑步,跑了一年多。老大說,那你感謝你的跑步吧。就這樣我留了下來。得到了全公司最低的月薪,別問我怎麼知道的,不可能有人比我更低就是了。忘說了,老大長發,那種中長發,飄逸的那種,第一眼真心就覺得大牛。至今無法忘記見老大的第一眼。好了,不能再說了,再說會有gay的即視感。

留下來後,下周二入職,周一我去看了牙齒,做根管治療。

大學裡面完全不知道遊戲怎麼做,遊戲服務端是怎麼做。一絲一毫的概念都沒有。第一天幾乎沒啥事做,我自己配了下環境,上網看了看遊戲相關的東西。還是完全都不了解遊戲到底怎麼做。我的座位靠著一個項目組老員工,我就看他和別人一句話過來一句話過去,然後看看代碼什麼的,後來才知道這叫連調。第二天,旁邊的老員工問我是新來的么,然後讓我去找xxx要學習視頻,然後拿兩本書,一本Java並發編程實戰(JCP),一本Effective Java。然後就開始看視頻,看書,看視頻,看書。視頻也是一個培訓機構錄的視頻,後來才知道,那是我老大幾年前在一個培訓機構講課錄的。大概看了一周多視頻,終於有了個小任務,寫一個拉日誌的小程序。暫時就叫那個老員工鳥哥吧,大家都那麼叫,一直我也不知道為什麼。鳥哥講了需求,給了點思路。我第一次知道延遲隊列,第一次知道Executor線程池,然後就自己去搜,搜了然後去用,然後去寫,寫完去找鳥哥,鳥哥直接在我電腦上看代碼,分分鐘把問題找出來,看了多少篇文章,都不如鳥哥直接指出來,來的印象深刻。寫完之後大概有看了一周的書,等到了第二個入職的新人,終於有了個伴。然而後來我問了,人家工資都比我高。我就說我全公司最低啦。

第二個人進來後,我和他兩人開始做第一個測試項目。SVN管理系統。在這之前,我對SVN真心都不太熟,只是知道這東西。第一個版本,鳥哥說寫個命令行版本的,就直接在命令行能交互就行,我當時雖然被虐的很慘,但還是比較有信心的。畢竟當時我看培訓視頻,還寫過一個OA的項目,當時我覺得OA就很牛逼了。沒辦法,眼界太低。開始做了才知道,這東西真心沒那麼簡單,SVN寫過代碼的都知道,版本控制,有庫什麼的,原生版本好像是沒有許可權的,然後我們就是要在外面加一層控制,並把許可權管理加進去,用一個RBAC模型,總之全都沒聽過,總之做的艱難前行。

忘了說,當時面試進來,HR的老大就強調過,說他們公司對新人的淘汰率很高,每做一個小項目,都會有代碼review,會有幾個老大一起看,如果說不過,給次機會回去改,改了還不能過,直接辭退走人。童話里真的都是騙人的,我之前從來沒有過這樣的心理準備。你們有待過這樣的公司么,真的是直接走人,真真的!後來看到有人review完,會議室里出來,就收拾東西去辦離職了。你們感受下。

在高壓下前行,完成了第一個版本。第一次review,我不知道女孩子第一次是啥感覺,反正我進會議室內心是期待而又忐忑的。過去從來沒有人這麼正式的看過我的代碼,一行一行的看。真的是一行一行的看!功能是最基礎的,但是鳥哥真的不怎麼在乎那些功能,他覺得那是必然要做到的。功能驗證演示也就幾分鐘的事,功能看完就是看代碼。在會議室,用個筆記本,遠程桌面連接到自己的電腦上,然後直接投影到會議里,直接在eclipse裡面看,從入口開始,一個一個方法,一行一行代碼,那天整個人內心真的是被罵崩潰的。對的,就是被罵崩潰的。看到別人進入公司都會碰到一個和藹的老李,我這邊真沒有老李,只有嚴厲的不能再嚴厲的鳥哥。代碼中各種錯誤被鳥哥一處一處指出,包括各種編碼規範錯誤,並發控制考慮,該抽出可配置文件的地方抽出配置文件去配,不能硬編碼在代碼中。印象很深的是不處理異常,直接就列印出來了。「你他媽列印出來給誰看,以後都是跑在伺服器上的,以後不要讓我看到syso在代碼中出現」,然後還特意全局搜了下syso這句列印代碼的數量,然後鳥哥一頭黑線,因為我所有有異常的地方都是列印出來。當時加上設計錯誤,代碼錯誤,反正記起來得有十幾條,我寫在筆記本上的,筆記本現在依然躺在我電腦邊上。我是個戀舊的人。

經過第一次review,我和另外一個哥們總算是感受到什麼叫代碼review了。那哥們比我早一屆,已經畢業,之前在一家公司做過,我問他這咋辦,真的是被噴成狗了。他說實在不行就辭職了。我沒說話。

/**
2015/10/5 2點更新
**/
經過第一次review,回去改第二版,基本知道了問題有哪些,雖然被打擊的非常慘,但是還是有信心可以把這些代碼改好的。當時其中一個主要大的問題,就是在做多任務處理時,對多線程的處理,以及多線程異常的處理。當時鳥哥說,上傳功能有可能當時是因為網速或者其他因素沒上傳成功,但是可能稍微多嘗試幾次就能成功,所以出錯後要加嘗試處理。當時我是真的沒經驗,我就覺得嘗試嘛,得嘞,那捕獲到異常,我就循環,while(true)一直就嘗試上傳操作,直到上傳成功才跳出這段代碼。所以當我上次看到那個圖,一個哥們寫代碼,失敗之後再強制去試100次的代碼的時候,我真的是笑尿的,因為我比他更屌,我是試無限次。當然最後這裡也是被鳥哥噴的狗血淋頭,鳥哥說,你真牛逼。你這是在代碼裡面寫了個死循環啊。我真的當時臉都綠了,因為我知道在伺服器代碼上寫個死循環是什麼後果,真的是一背都是汗。

哦,插一段,當時第一次還是第二次review的時候,鳥哥看完代碼之後,發現太多問題,實在沒法看下去了,說,「你們的代碼真的讓我感覺到噁心。」。不知道你們review的時候,聽到這麼一句是什麼感覺,反正我是一輩子忘不掉了,和我同期那個同事也是,至今一起吃飯每次都會回憶這句。

當時經過了,幾次改版,從基本命令行,到後來用bootstrap做個web版本,前前後後鬼門關走了得有7,8次,特別是當時做web版本,鳥哥要求使用restful風格,又是一個新名詞,restful,好好休息么?我承認我當時真的是渣1的戰力。不過鳥哥講解東西真的是一絕,就三兩下,真的可以把restful是個什麼東西讓你有個清晰的了解。restful當時還好說,springmvc本來就支持restful,真正讓我差點掛掉的是js。JS我真的是學了一萬年都沒學好的一個東西,當時我和那個同事兩人還是有點美術追求的,不想就寫個特別簡陋的界面出來,感覺至少也得讓人能下的去眼吧,雖然鳥哥當時沒有要求這個。後來我們兩就想用bootstrap,一直都挺火的一個前端框架,但是也是完全沒接觸過,然後我還是9流的js程序,功能沒花我太多時間,反而是界面真的是讓我整個人都瘋了。很難整體上做出一個比較好的效果出來。最後聽說公司後台用的就是bootstrap,我們兩就拿了公司的後台模板直接來改,但是中途發現公司有自己封裝一層js,我的一個側邊欄點擊,右邊顯示的效果死都出不來,但是這還是最重要的一個效果。搞得心好累,就是不出來。關鍵時刻,那個周末,我那個和我相依為命的同事,還去澳門玩了。我內心的怨念,你們可以感受下。因為他已經調出來了。沒辦法,我只能等他澳門回來,星期天晚上,12點多,我們語音,他跟我一起幫我調我的那個問題,最終解決。想想,那一段日子,沒有他一起,還真的是很難堅持下來啊。相依為命的日子,一起深夜打車,冬天跑KFC買甜筒,一起感慨不知道哪次review完就要收拾東西走人。歷歷在目。

===更了一段。待續。大家來點贊。要不好多人看不到。被壓在下面。

/**
看了一眼,上一次更新時2015年10月5號,差兩天正好一年,時間真的好快
2016年10月3日更新
*/
感覺自己的記憶在一點點流失,趁著現在還能回憶起,我還是要堅持把我在那遊戲公司的一年多寫完。

好不容易熬過SVN許可權管理系統的痛苦黑暗的一段時期,差不多改了3個還是4個版本,從命令行一直寫到WEB版本,方才罷休,總算是過了。

不過忘記當時通過是什麼感覺了,很後悔沒有把但是最直接最真切的感受記錄下,有可能這輩子都不會再有了。

據之前已經通過試用期的同事小道消息,過了SVN許可權管理系統之後就能真是接觸遊戲代碼了,當時還是很興奮的。馬上要接觸自己從沒接觸過的東西,好奇心所帶來的興奮感沖淡了那段難熬的痛苦時光。當時公司擴招的很厲害,辦公位置不夠,都是各種找位置擠,到最後沒法擠了,就弄了個會議室,所有試用期的同學全部搬到了會議室改成的辦公區。他們取名叫小黑屋。就是一個沒有窗戶的小會議室,擠一擠坐了7,8個人。後來我們也是在小黑屋裡,結下了深厚的戰友情,這是後話了。

第二個測試項目開始涉及遊戲,做一個黑市商店,也就是可以發布物品,然後玩家可以選擇購買,然後扣費發放購買獎勵什麼的。但是聽到需求的第一感覺是完全沒概念的,沒有任何整體的設計概念,知道像以前一樣,定義個存儲,設計一些介面啥的,對於實際遊戲中的設計,或者說最佳實踐完全木有概念。而且這次開始有了一個簡單的公司框架給我們使用,我和我那個小夥伴簡直如獲至寶,感覺看公司的實際運行的東西是怎麼寫的,然而沒想到木有源碼,只是一個簡單的架子,有些調用實例,底層的代碼都是木有的。sigh.

就這樣做了第二個測試項目,過程快進了,和之前類似,都是被罵,修改,繼續被罵,再修改。還好反正抱著必死的決心,也就堅持過來了。我那個一起吃甜筒的小夥伴中途還提過一次辭職,不過後來又被鳥哥兩句話給安定下來了。我還記得那天鳥哥突然把我倆叫到會議室去,我一臉懵逼,然後就說我們就這麼玻璃心,然後說我那小夥伴提了離職,問我怎麼想的。我還一臉傻逼的笑著說,哈哈,我沒有啊,還好誒。但是我的內心獨白其實是,其實我也想過。

經過了這個遊戲項目,後面開始順利很多,偶爾還會犯特別二的錯誤,但是已經可以整體理解真實遊戲開發怎麼做了。後面還繼續做了兩個測試項目,都是遊戲中的真是模塊,一個搖錢樹,一個奴隸系統,我小夥伴抽到的是競技場。反正就這麼熬了下來。

進到項目組之後,開始負責開發一些小玩法模塊,修復一些產品提過來的BUG。老大已經不是鳥哥,換了實際遊戲開發組的老大。不過要求沒有一點點的減弱,每次上線的代碼要review,會扣一些很細節的內存使用,數據結構使用,邊界的處理從這個老大那裡也是學到很多。對待代碼的那種認真的態度,和對實際review中的錯誤代碼敏感度,真是我到現在都很敬佩的。總是能在review中快速看出錯誤點,或者可能有疑問的地方,提出質疑。人真的是在高壓環境下成長比較快,我很慶幸能一開始進入到這樣的團隊接受鍛煉,提高自己的眼界。

我一直覺得,代碼眼界很重要,你要知道什麼是好的代碼。

除了老大,組裡的一些同事也都非常的執著認真,說實話,我真心感覺自己有時候就是個渣。當時坐我旁邊的是一個成都的哥們,操著一口四川普通話,川普,你曉得的撒,真心是逗的飛起。不過他寫代碼做東西的速度也是快的飛起。而且看問題的角度經常能轉換的非常快。近水樓台嘛,所以我的很多問題都是找他討論的,總能找到一些新的思路。關鍵是!!!天天炒股還能不耽誤工作!!代碼照樣寫的飛起!!我也是沒話說了。像我這種,只要想著什麼事的時候,基本工作效率就為0了。

還有個湖南的同事,工作經驗比較豐富的,之前電信研究院做了4年還是5年,然後轉行來做遊戲。我們都叫他斌哥哥。我就記得當時印象最深的,我們在閑聊一個什麼事情的時候,然後斌哥哥說他就是真心喜歡寫代碼的。從那以後這句話一直是我檢驗自己內心的標杆啊!

不過頁游最終是走下衰亡的趨勢,是無法逆的。技術人再怎麼努力,你也沒法反抗市場的選擇。頁游市場被37幾乎全部霸佔,手游開始崛起,最終呆了一年多之後,我也是不得不選擇離開。我的第一家遊戲公司,又愛又恨的公司。到現在,我午睡的靠枕和毯子都還是這家公司發的。我說過,我是個戀舊的人。嘻嘻。

好像寫的越來越離題了,反正我其實也是在寫給以後的自己看了。大家將就吧。


作為一個計算機相關專業畢業,畢業後一直從事編程相關工作10年多的大叔就這點上可以談一些看法。

我在面試很多計算機本科甚至碩士畢業生時,他們很難向你展現實際的項目經驗和工作能力,因此你只能考驗他們對某門編程語言的熟悉程度,也就只能是語法和演算法。因此也不可避免的讓他們做些演算法題。說實話,我覺得這種方式很傻,有誰會在紙上寫程序呢?但你會有更好的選撥方法嗎?

不誇張的說,一切學校學習的目的是為了通過考試。因此在學校學習編程無非是通過期末的考試。考試是在卷子上寫程序,還是在機器上寫程序並不重要,因為無論哪種考核方式,都和你將來是否成為一個合格的程序員沒有什麼卵關係,它僅僅就是純粹的考試。但是,我想說編程的能力不在於你對這門計算機語言語法背誦以及幾個演算法的記憶。在實際工作中,更多在於你怎麼組織你的代碼。 語法是可以百度的,演算法前人早已經給你寫好了,你只需要知道怎麼調用。但是新手和老手寫出的程序是立馬能聞出來的。

有些人面試的時候很厲害,但到後面,你會發現他/她並不適合也不想成為一個程序員。因為真正的編程工作是如何理清一大堆代碼,而不是在幾個燒腦的演算法上玩智力遊戲。如果你剛入行接手的是一堆糟糕的代碼,那麼我只能遺憾的告訴你,你的程序員生涯有了一個糟糕的開始。第一次糟糕的體驗會是影響一生的。所以我希望你一開始接手到的是一堆高人留下的代碼,這對你的發展以及培養你對編程興趣是起到至關重要的作用的。當然,如果你天賦好,你最好有能力選擇好的代碼堆,或者自立門戶。畢竟自己挖坑總比填別人的坑要來得爽。

我這裡有點小小的人森經驗要分享,就是你看一個人適不適合編程,就得看他是不是喜歡把事物整理得井井有條。在學校里你看他的床鋪,看他的寫字檯,看他組織集體活動的能力,等等。不要以為程序猿都是鬍子拉碴,臟里八稀的,那些都是電影小說杜撰的。就算有時候會出現這種情況,那也是為了短期的衝刺工作。程序猿就是藝術家,雖然很多人不這麼看,就連很多程序員自己也並不這麼認為。但實際上,程序員就是藝術家。語法和演算法,還有程序組織能力,那些都只是基本功,就像畫家的畫功,都不需要提。厲害的程序員是要有對現實世界抽象的能力,是要用系統性的思維去理解世界,並有可能模仿上帝去創造自己世界的人。因此,你會看到許多高階程序員寫的書和文章都像哲學家寫的一樣。

看一段糟糕的代碼就如同你走進一間髒亂的房間,你會聞到不好的味道,你會看到東西被放在不該放的位置上。新手寫的代碼就如同一間不知道整理的小孩的房間:被子團在床上,玩具亂扔,牆上亂畫.....你暫時是不會指望他能把整個家都收拾好的。因此,很多情況下我帶新人更多的是會告訴他們代碼應該寫在哪裡,而不是i++和++i的區別。

實際的編程工作中,你做的事情往往是一個大系統中的一個組件。完成一個大系統的開發工作是一個團隊的事情,因此你必須學會如何團隊開發。而這點上和學校學習的編程是有本質區別的。學校的編程課教授的東西是點狀的,它教你如何寫出可以編譯過去的一小段代碼,它教你一些經典演算法,但都沒什麼實際卵用。舉個例子,比如排序演算法,教科書上一大堆。有些同學硬是能將各種排序演算法默寫出來。然而他們永遠不會想到關係型資料庫是如何實現排序的,因此我一問他們如果內存裝不下所有數據的情況下,怎麼排序,就個個傻眼了。因為他們只知道在內存中排序數據,不知道多了硬碟後怎麼處理;他們只知道馮.諾依曼這個名字,並不理解它在計算機架構中的本質。

這些點狀的知識點對於一個不接觸實際的學生來說是很難串起來的。團隊開發是個很搞的課題,涉及組織理論。雖然很多人都能意識到這樣一個事實:人多未必能辦好事。但真正聯繫到實際,就是如何發揮一個團隊的最高組織效率時,往往對自己的認識是估計不足的。很多想當然的事情是行不通的。編程工作是純粹的腦力勞動,是很難量化的勞動。諮詢公司樂此不疲的發明各種指標(如:代碼行數)和各種團隊編程模式(如:SCRUM),但也是基本沒什麼卵用的。永遠記住程序員是藝術家,不要試圖用管理指標來衡量藝術家的工作,這隻能靠儘可能發揮程序員的主觀能動性來提高效率和質量。

最近,考古學家發現,埃及金字塔不可能是由奴隸建造的,而是由擁有絕對信仰的大量工匠完成的。每個工匠切割每塊石頭的時候,都傾注了他的心血和虔誠,這並不需要由監工去督促。這些由不同工匠獨立完成的石頭最終能拼接成如此巨大完美的五面體,是人類工程史上的奇蹟。真實程序員所做的大抵就是類似的事情。


/*說說我的經驗*/

剛進公司時,在你正式動手寫代碼前,很可能要理解code base。這一過程至少持續1個月,取決於你所在項目的規模。你會發現你不得不使用你渾身所學之能事,理解上古程序員是如何解決一個個實際的問題的。有的時候你沾沾自喜,「哈哈,這個技巧勞資經常用,你們也算有點見識」。但大部分時候你很糊塗。
在此階段,你每天的工作就是看文檔,看設計圖,讀代碼,放斷點debug,hack,fix,問同事。
你很累。你很無聊。

此外,剛進公司的你,會發現你的項目組正在使用一些奇葩工具、冷門技術,他們非常不好用,尤其跟你大學時候用的成熟IDE相比。你可能會想砸鍵盤,「誰特么想出來的用這個工具!誰特么寫的這麼sb的工具!」
你很失望。

漸漸的,你開始了解了你們的業務領域,所謂的掌握了一定的領域知識,你開始有能力判斷哪些是權衡,哪些是權宜,哪些是極精妙的設計,哪些是遺留代碼。
你的領導也發現了這一點,於是開始給你安排簡單的任務。他們可能是改一些顯而易見的bug,可能是實現一個最簡單的新特性。此時你會有一種駕馭的錯覺,你很快的寫好了功能,提交,開始幻想自己精妙的代碼收到表揚。當然,不出意料的是,你提交的100行代碼里被找出了10個bug,其中2個是很嚴重的邏輯錯誤,4個是未實現的需求,2個是ui錯誤,2個是邊界條件未檢查。
你心裡十分不爽,「媽的勞資這麼屌炸天的代碼你們都不懂得欣賞!」
此時你的領導過來輕描淡寫地來了一句,「我們提交之前要進行code review」。
於是你找了你身邊比較和善經常解答你問題的小哥來代碼檢視,10分鐘之後,你漂亮的代碼被改得面目全非,你欲哭無淚,又不想得罪前輩,於是默默地提交了這不知道是誰寫的代碼。

就這樣掙扎著過了幾個月,你開始摸清了門道,於是你開始運用你大學時期課內或者課外學到的引以為傲的技巧和知識了。領導自然也發現了這一點,於是他開始安排你組織技術交流會,你精心準備好了ppt,自己在家排練,並且試圖加入一些或者高冷或者沒品的幽默段子。
會議很成功,你感覺到同事開始對你刮目相看,你開始飄飄然,重新拾回「駕馭」的感覺,心想「就你們這幫碼農,勞資以後可是架構師!」

漸漸的,你開始進入了狀態,你提交的代碼越來越多。剛進公司時你從來沒打開過的代碼規範文檔開始回來找你麻煩,不過這不是大問題。領導開始對你強調質量,而你則在心裡抱怨舊代碼的設計。你想要重構,你想要創新,你想要搞一個大新聞。
與此同時,組裡新來了一位同事老李,是從其他部門調過來的老員工,領導組織組裡盛情歡迎了他,你心裡不服,但是他是個好人,你們談笑風生。

機會來了。
公司要緊急實現一個演示功能,百萬級的合同能不能拿下來就看這次了,你的領導已經親自飛往客戶那裡坐鎮,他走時跟你說,「組裡就靠你和老李了!」
你十分激動,買好了泡麵和零食,準備通宵作戰,給領導提供最犀利的火力支援。

第一個功能點談下來了。領導發給你了要求。
你發現你半懂不懂。
裡面提到的一些其他模塊,你在每月組織的技術交流大會裡聽說過,但你寫過的那點代碼里從沒調用過他們的API,你更沒讀過他們的代碼。你有點不知所錯,開始心虛。

不管了,先開始干。
你找到了一些相似的功能,翻出了一些發霉的陳年舊代碼,注釋里寫著2004/06/18。你沒有時間完全讀懂,你開始複製粘貼,直接debug。當然,代碼報錯了,你開始挨個解決,就這樣,一個通宵。
第二天早上,你總算把你熟悉的後台部分調通了,你發現了新的麻煩。

是前台。你對前台並不熟悉。你知道javascript的原名叫ECMAScript,你知道JQuery對象和dom對象的區別,但是你發現你還是看不懂你們的前台代碼。

怎麼辦?
好吧,你決定拉下臉,問老李。老李看你的樣子,說,「你去睡一會吧,我來幫你看」。你心裡有些不甘,有些不好意思,也有些感激。你很想自己把它們做出來,但你不會,而且時間也來不及了。你想學學他是怎麼做的,但是你的大腦已經停止工作了。於是你疲憊地笑了笑,「好,交給你了。你看一下這裡這裡還有這裡...我就去睡半個小時,一會就回來找你。」

你這一覺睡到了下午。
你醒來一看錶,震驚的彈起來,趕緊回辦公室找老李。老李已經從你的座位回到自己的座位上了,正在慢悠悠地喝茶。你有些驚喜地問他,「怎麼樣?」他回頭看見你回來了,說,「放心吧,已經給一線調試了,你去吃點飯吧。」

你哪裡有心思吃飯。你驚訝地對老李說了聲「好的!太好了!」然後回到你的座位上迫不及待得打開代碼開始運行。正如老李所說的,功能已經實現了。你輕舒一口氣,拿出一碗泡麵泡上,開始啃代碼,心裡想的是「這次一定要準備好,防止下次再出亂子。」

啃著啃著,你有些不耐煩了,因為你發現代碼越看越多,已經超出了你的大腦容量。你想了一下,決定先放在一邊,查收一下郵件放鬆一下。

郵箱里又是塞滿了新員工培訓的資料,各個部門的聯誼活動通知,當然最多的是伺服器發來的build report和test report。沒什麼有趣的事。

你想了一下接下來要幹嘛。算了,還是接著寫新特性吧,測試們還等著你呢。但是你其實很忐忑,你的心早已飄去了前線,但是你知道你不能發郵件問狀況,因為你領導可能幾天沒睡了,何況你也並沒有什麼特別緊急的事。你破天荒的把郵件客戶端開著,留意每一個新收到的郵件。

就在這樣的忐忑中,一天過去了。反正也沒什麼事,你回家好好洗了個澡,定了個早早的鬧鈴,安心的睡覺了。

第二天一大早你就跑去公司,果然郵箱里有了領導的郵件,上面寫道「演示很成功,客戶很滿意,接下來是談判階段。家裡的開發兄弟你們太棒了!」

當然,你很高興。但是又有一點失落。你不太明白為什麼,於是你想了一下。隨後你似乎明白了,雖然這是一個好消息,但是好像跟你又沒什麼關係,跟任何人似乎都沒什麼關係,好像是一件自然而然的事情一樣,並沒有「holy shit」超神的聲音。

過一會,你的大領導,項目總經理回復了你領導的郵件,說「幹得好!同時也對家裡的兄弟提出表揚!回來開慶功會!」你心裡略有一些期待,「不錯」,你想到,雖然主角不是你,但是你畢竟也是功臣。

你為慶功會暗自準備了很久,你在網上瀏覽跟領導吃飯該說些什麼,你想好了很多概括性的有內涵的問題來證明你對項目的理解,你也想多了解一些項目的大方向。

幾天之後,你領導回來了,大家開了慶功會。飯局上,大家聊聊家常,聊聊你領導在國外的見聞,大領導知道了你的名字,大家似乎很隨意的打了一會牌,就這樣平平淡淡的結束了。你略有一些失落。

生活回歸正常。

但似乎又跟以前不那麼一樣。
你在開發工作以外,有了新的任務,其中包括學習推廣新技術等等。你開始跟你領導徹夜長談。他與你分享他的經驗,你與他分享你的見聞。你開始接觸他的工作,比如提高團隊能力,完善自動化測試,提高代碼質量,提高代碼性能,增強功能可配置性等等。你開始淡定的接受新的工作,而不再幻想一朝成名的瞬間。畢竟,迎接挑戰才是你真正感興趣的事。

不過,這接下來的幾個月里,除了改自己先前遺留下來的bug,你幾乎沒有提交任何代碼。你每天的工作變成了看框架,讀代碼,看技術文檔,學習試驗新工具,瀏覽技術論壇等等。你開始覺得有一些缺乏成就感,也有點懷念綠綠的單元測試結果和噼里啪啦彈鋼琴一般飛舞的手。

有一天晚上,只有你和你的領導在加班。你的問題困在心裡很久了,於是你問道,「老大,為什麼我的任務跟別人的不太一樣了?」 老大說,「那當然了,你是當作未來的技術主管來培養的。」
突然的幸福讓你不知所措,不過你剋制地問道,「技術主管都是幹什麼的?」 老大並沒有回答你,而是說,「以後你就知道了」。

生活還在繼續。

跟你同一天入職的曉明是一個勤奮而又活潑開朗的人,但是你覺得他似乎入錯了行。他總是掙扎著思考為什麼他的代碼中有邏輯錯誤。對你來說再簡單直接不過的一段代碼,他也很難讀懂。領導也發現了這一點,所以安排他漸漸地向配置管理(CM)方向發展了。不過他似乎對這個很擅長,無論多麼繁瑣的任務,他總能按部就班的完成,各種紛雜的腳本他也一一了熟於胸,重要的是,他很有耐心,無論伺服器出了什麼奇葩問題,他都會跟它死磕到底。大家都很喜歡他,也很信賴他。

有一天,曉明像往常一樣抓住你向你請教問題。是個bug。你已經習慣了從代碼檢視開始。你自信地叫他給你看代碼。然而你並沒有發現什麼問題。於是你問什麼現象。他說部署到伺服器上就報錯了。你看了一下日誌。你沒想通。於是你再仔細重新檢查了一下是否各個環節都作對了。是的,沒有什麼問題。

好吧,你知道你遇到棘手的問題了。不過誰知道下一秒會不會就解決了呢?進公司這麼久,各種奇葩問題對你來說早已是司空見慣。你打開搜索引擎,開始試圖尋找相似的問題。你不斷的做出假設,然後通過證據否定它們,然後再作出新假設……直到你突破了你的理智,你覺得可能是編譯器出了問題。

真的假的?你從來沒有想過編譯器會出問題,就好像你從來沒有想過你的肝臟有一天會報錯一樣。你覺得應該是自己錯了,於是你仔細排查了一下其他的可能性,不,沒有別的問題。於是你把伺服器上編譯過的位元組碼通過反編譯工具打開,你發現了一件微妙的事情。於是你跟隨著這個線索繼續上網查找原因。終於,你發現是兼容性的問題。你發現了新大陸。

問題雖然複雜,但是你只需要簡單調整一下代碼就可以繞過這一問題,於是你三下五除二把代碼改好了,測試,嗯,哈哈,果然沒有問題。曉明在旁邊看得發愣,問你,「咋回事啊?」 你心裡有一絲淡淡的驕傲,你興奮地把他拉過來看你搜到的網頁,你把代碼反編譯之後跟源代碼對比,你給他講依賴載入的實現……你興奮得講了一大堆,他靜靜地聽完之後,眨了眨眼,說,「大神啊!」

艹,他根本沒聽懂。你一下子泄了氣。你也沒什麼可說的了,但也不知道該如何接茬,就謙虛道「沒有沒有,我不是大神」。
雖然如此,他依然天天跟著你「大神」「大神」得叫你,雖然你知道他很菜,但是當個偽「大神」也不錯。你有點沾沾自喜,想說給你的同學聽,又覺得太 low。要不發個狀態「我不做大神好多年」?想想太蠢,只好作罷。

直到你發現還有好多人也被他稱為「大神」。

失落?
有一點。
你都習慣這種失落了。自從意氣風發地畢業之後,你再也沒有那種強烈的勝利的感覺。你覺得生活似乎並不是你之前那樣的一元化。大家都有各自完全不同的特長、興趣、知識和經驗,你也有你的,你並不是萬能的。即使在上學的時候你從來都是班級里的佼佼者,但是你漸漸的發現世界還很大,你不會的還很多,山外有山,人外有人,路漫漫其修遠兮,吾將上下而求索……

想到這,你的思緒突然中斷了。你覺得自己實在是太優秀了,還懂得反思。你又開始了沾沾自喜,心想,自己如此優秀的人,總有一天會幹出一番大事。於是你收拾收拾心情,繼續工作。

最近項目沒有那麼緊張了,你漸漸的多出了不少時間。你領導也是。所以他又推薦給你了幾本書叫你看,都是一些設計的書,什麼《領域驅動設計》、《企業應用架構模式》、《修改代碼的藝術》等等。你想起了剛來的時候他叫你讀的《重構》,《設計模式》等書,你還記得剛翻開它們時的那種醍醐灌頂、豁然開朗的感覺。你微微一笑,說「好」。

這些書寫的真好,你感嘆道。
讀著它們,你總是不自禁地想起你們的代碼。你非常能理解書里描述的現象,你覺得你們的代碼有著同樣的問題。可是當書里介紹解決方案時,你卻發現理解它們很困難。書裡面的問題域跟你們的不太一樣,你們有著不一樣的需求和架構。書里說對於資料庫的操作要做這樣的一層封裝,可是你們除了資料庫還有web service;書里說對於UI和業務邏輯要做這樣的隔離,可是你們的UI並沒有直接調用後台,也是通過web service;書裡面提到了好多技巧,你們並不需要……

你看得很無聊,漸漸的失去了耐心。簡單翻完了書的後半部分,你覺得你差不多明白書裡面說的方法了。一種乾坤大挪移練到第七層的感覺油然而生,你非常急切地想找點東西試試功力。

你躊躇滿志地對你領導說,「我想對我們的代碼 進 行 重 構 。」

出乎你意料的是,你領導一點都沒有驚訝,而是笑眯眯的問你,「呦,好啊,你打算怎麼搞啊?」 你沒有想過這個問題,愣了一下,說,「就按照領域驅動設計的方法改啊,構造一個充血領域模型。」 領導繼續笑眯眯,「好啊,那你打算怎麼實施呢?」

怎麼實施?什麼叫怎麼實施?改代碼就是改代碼咯,還怎麼實施?你擺出了一個困惑的表情。

領導笑的更開心了,「你還記得《重構》里說過的,重構代碼要保證單元測試全通過嗎?但是現在你要重新設計,單元測試肯定都沒用了,要重新改。你來看這個。」 他掏出一本書,指著某一章的標題說,「如果要對代碼進行大型重構,只好退而求其次,使用高覆蓋率的自動化測試來確保大部分功能的正確性。但是只是這樣是遠遠不夠的,我們還得保證原有功能沒有被破壞,所以你還可以這樣這樣……」

你聽的如痴如醉,如沐甘霖。你想起在學校里,如果你對代碼不爽,你可以乾脆刪掉重寫。你甚至都不需要一個版本控制工具。你從來沒有想過在真正的工程中有這麼多複雜的問題以及這麼多聰明的前輩們發明了各種系統化的方法。你再一次發現了新大陸。

討論之後的結論是,你負責監督並提高自動化測試的覆蓋率,同時你可以先構造新的模型代碼,也可以提交,但是在發布時並不把它們包含進去。當新的代碼寫好之後先內部測試,確保幾乎沒有問題了,再策略性的發布出去。

說干就干,你很興奮。「終於可以寫代碼了!」你開心的對領導說。領導又笑了,「寫代碼並不是重點,重點是讓它們正確的執行起來。」 你若有所思的點點頭,心卻早已飛到了你的新設計上。

你打開了看過改過無數遍的最核心的業務代碼,心裡想像著它們被你改好之後的樣子,完美的領域模型、高內聚低耦合的類、優雅的代碼、完備的注釋、再加上同事們佩服的眼神……你覺得你快要像櫻木花道一樣笑出聲來了。

但是細節之處有乾坤。
你發現你第一行就不知道怎麼改。
是日誌。
你想了半天,沒有想到任何現成的解決方案。你問自己,日誌算不算業務邏輯呢?算吧,它又對框架有很多依賴;不算吧,那把它放哪呢?你對著日誌的代碼看了整整一個下午,仍然毫無頭緒。你覺得日誌簡直是破壞你優雅代碼的殺手,你真恨不得把它們給刪了……

算了,先不想了。你決定今天給自己放一天假,早早回家看個電影然後睡覺。

剛推開門,哇!外面下雪了。

漫天的雪花翩翩飛舞,一掃平日晚上蕭條的景象。昏黃的路燈照射下,雪花反射出暖暖的光。你想起了你在北國的家鄉。北方的小夥伴們都說江南的濕冷讓人難以忍受,「屋裡跟屋外一樣冷」。你在此時此刻卻有了另外的感悟,你覺得說成」屋外跟屋裡一樣暖和」也說得通。

也許生活就是這樣吧,你想到,並不總是得意,也並不總是失望。你的期待總是狡猾得偽裝成另外的樣子悄悄的進入到你的生活中,而你的得意又總是在指縫中流走,想握也握不住。但是不管怎麼樣,你覺得你很快樂,也很幸福。你很慶幸自己成為了程序員。你對現在的自己感覺到驕傲。

意識到你已經在門口發獃了很久,你笑了,笑自己什麼時候變的這麼多愁善感。你走出門去,踩在雪上,發出咯吱咯吱的聲音……

&<全文完&>

&<程序員的故事還沒有完&>

/** 後記
真的沒有想到大家對這篇小文章(我都不知道能不能稱為文章)這麼喜歡,我本意只是想通過一些真實的細節來描述工作和學校的不同的,誰知道寫著寫著就成故事了:-D
其實後面還有更多有意思的故事,不過已經扯得太遠了,想聽的話帶上好酒來找我吧!
至於你們所關心的老李,他是真的,但是他並不是掃地僧,他是前端大神,後來他把我們前端的js代碼完全重寫了一遍,他三十多歲,頭髮濃密,有一個可愛的小女兒,說話不多,但是喜歡講內涵段子。
故事經過了加工,亦真亦假,人物也不是完全還原,但是看到你們留言說很真實,我非常開心!

最後,作為一個工科男,我決定總結一下:

  • 工作之後的代碼量遠沒有學校時大作業那麼多,但是要更嚴謹;
  • 但是你要面對很多遺留代碼,你要把它們弄懂,不像在學校里你基本都是從頭造輪子;
  • 同事們都是八仙過海,各有所長,無論你在學校里是當大腿還是抱大腿,在公司大家都對公司有著這樣那樣的貢獻;
  • 你不可能什麼都會,工作才是學習的開始,大學生活只是讓你準備好;
  • 除了代碼和技術,你還要考慮業務知識、測試、質量、生產效率和可持續性;
  • 機會總是有的,你要做的只是準備好;
  • 學校所學的非常有用,但是理論和實踐有著巨大的鴻溝,這全靠你的經驗和工程感 (engineering judgment);

我暫時只能想到這麼多,更多的就靠大家自己發掘啦。

最後祝喜歡編程的大家都成為架構師!
*/


/* 親愛的維護者:
如果你嘗試了對這段程序進行『優化』,
並認識到這種企圖是大錯特錯,請增加
下面這個計數器的個數,用來對後來人進行警告:
浪費在這裡的總時間 = 40h
*/


潛水這麼久,怒送一血,已然破百,答題之路才剛剛開始。謝謝大家
答案非原創,純屬娛樂


我本科的專業是軟體工程,大一的C++基礎課學的還不錯,後面數據結構與演算法也學得挺認真的,
資料庫結構學的時候搞不清那麼多範式有什麼用,UML直接睡過去了,軟體生命周期搞不懂是怎麼回事,測試這門課老師都沒怎麼好好講。所以上面幾門課直到畢業也沒覺得有什麼用,感覺C++的基礎好,數據結構和演算法好,就是編程好了。

到了工作中,才發現原來還有【需求】這種東西,不是課程作業那種胡搞瞎搞,差不多就行的了。而且做出來的程序不能只是自己演示正常就可以,要經受的住用戶的各種胡搞瞎搞,被各種奇怪操作導致的BUG打回來,才知道什麼叫程序的健壯性。

接手了一份胡搞瞎搞的資料庫之後,才知道範式說的是什麼,師傅說我司資料庫每天要備份六次,我問為什麼不多備份幾次,他說,因為每次備份需要四個小時...

後來做了很多外包項目,才知道需求管理,或者說討價還價其實也是個重要的編程技能。不是每個程序員都可以乾乾淨淨的只搞技術研究,做一個科學家。程序員應該是個工程師,工程師的話就要以實現為目標,很多時候,演算法效率不是最重要的,有時候為了工程上的需要,還要犧牲程序效率換取工作流程上的效率或者框架的可維護性。

以前上學寫的代碼就像是高中物理中飛天遁地光滑無阻力無摩擦的小滑塊,沒有需求變更,沒有雷劈機房,沒有瞬發流量,沒有兼容版本,沒有很多奇怪的東西,完全是在理想狀態下寫代碼。


看圖,

騷年悟到了么


百贊啦,又想到了一些,更新一波~

文檔:
學校:口口相傳
工作:別人都用Markdown寫文檔,快把你的Word收起來……

delay:
學校:deadline之前搞定了就好,先休息半個月再說
工作:每天都要發項目日報,你的老闆和你老闆的老闆都盯著呢……

聯調:
學校:自己和自己聯調,左右互搏……
工作:我:##¥¥%!……*!! 對方:沒聽懂……

需求:
學校:定期和老師彙報進度就行,需求一般不會發生變化
工作:時常會碰到來求助的運營MM

故障:
學校:就算真的遇到了,頂多挨頓罵
工作:這個季度的kpi又懸了……

上級:
學校:才不管你怎麼實現的,也不會看你代碼,能用就好
工作:不但會問你怎麼實現的,也會review你代碼,還會強行讓你用一些新技術……

代碼復用:
學校:復用全靠寫函數
工作:就算跨項目也要強行復用……

造輪子:
學校:輪子是什麼
工作:這個季度造個什麼輪子吹比呢……

bugs:
學校:以空指針居多
工作:只有想不到,沒有遇不到……

吐槽:
學校:好煩啊,做了這麼多事情一點好處也沒有
工作:運營又說改版了,之前的代碼可是PHP的啊,確定這樣也能改版?

--------------------------------------------------------------------

項目:
學校:基於XXX的XXX系統的設計
工作:商家處罰中心

工作來源:
學校:老師或者是自己
工作:產品或者運營

工作內容:
學校:實現完整的項目
工作:實現完整項目是少數情況,大部分是新增功能需求

開發之前:
學校:打遊戲看電影刷知乎拖延一下
工作:開會評審需求,分配工作

開發人數:
學校:前端後台產品設計全是自己
工作:前端2兩人,後台3人,產品一人

代碼:
學校:所有代碼自己搞定
工作:只負責規則模塊

規範:
學校:實現功能就好,代碼寫成什麼樣不重要,從來不寫任何注釋,代碼之後自己剛寫完的幾天才能看得懂
工作:每一個模塊都需要完成相應的單測,並且保證測試通過。代碼需要簡潔美觀,變數、類等命名嚴格遵守駝峰命名法,需要附加完備的注釋

框架:
學校:框架是什麼,實現功能就行
工作:公司對各個功能(例如鏈接資料庫等)進行了封裝,必須要使用相應的框架

封裝:
學校:為什麼一定要面向對象,怎麼簡單粗暴怎麼來
工作:進行一定的封裝是必須的,要考慮代碼的復用性,儘可能避免代碼冗餘。差的封裝是會被吐槽的

debug:
學校:肉眼,偶爾使用工具,一碰到蛋疼一下午
工作:使用工具,流程化排查問題

疑難雜症:
學校:自己蛋疼摸索,直到放棄向研究生師兄請教
工作:蛋疼摸索一會,請教大牛

發布:
學校:隨意發
工作:每次發布需要請示老闆,你多發幾次試試……

review:
學校:review是啥……
工作:發布之前必須review,被挑到刺打回去再正常不過

maven:
學校:maven是啥……
工作:每個模塊的打包發布都有嚴格的流程,maven依賴必須要仔細,否則很容易遇到問題,有專門的工具對maven依賴進行檢查


git:
學校:coder只有一個,用git幹嘛……
工作:git的命令牢記於心,stash,merge,checkout花式命令,鍵盤敲起來

氛圍:
學校:開發累了,打會遊戲休息一下
工作:老闆就在旁邊,你打個遊戲試試……

設計模式:
學校:聞所未聞
工作:原來這種方法這麼機制,趕快學一下,以後說不定能用上

先想到這麼多,後面想到了再來更


剛工作了三個月,簡單談一下我的感受。先說重點:最大的不同是質量

質量是個很廣的概念,涵蓋方方面面。
1、規範性
在學校寫的代碼,除了你自己可能沒有第二個人看,可以不寫注釋,命名隨意起,int i、int a;在公司,代碼需要遵循一套嚴格的規範,這樣做利人利己。每行代碼需要經過至少一次其他人的Code Review,我在學校自認為代碼比較規範,結果到這裡經常被師傅提很多Tala(修改建議)。
2、測試
在學校,代碼寫完運行起來跑一下、隨便點一下就行了;在公司,相比較開發的時間,寫單元測試和介面測試的時間只多不少,一行代碼需要好幾行代碼、好幾個用例來測試。我認為沒有經過測試的代碼等於沒寫。
3、性能(並發)
在學校,寫的代碼充其量只是個小玩具,用戶量一隻手數得清,甚至再變成玩具之前就已經夭折了;在公司,每一行代碼要面對的用戶上千萬、甚至上億,性能以及隨之帶來的並發問題不得不考慮。這就好比在公園蓋一個廁所,裝修華麗,環境很好,但是坑位只有五個,結果節假日幾百號人同時上廁所,那場面自行腦補。
4、嚴謹
在學校寫的代碼,出錯了最多被老師批一頓,改一下就完事了;在公司,尤其是我所在的支付寶,一行代碼出錯可能會帶來幾十萬、幾百萬甚至更嚴重的資金損失,這種坑把我賣了都填不上。借用一位前輩的話:對你的每一行代碼保持一顆敬畏之心。

最後回答題主另外一個問題:每天啪啪啪手敲成千上萬行代碼——我還沒聽說過每天啪啪啪就能敲成千上萬行代碼的人,不啪啪啪也敲不了這麼多。

暫時想到的就這麼多,後續有機會再補充。


真實的工作中,一個合格的程序員並不是把所有時間都用來寫代碼。而是在腦袋裡、電腦上,通過各種方式先把程序的結構、邏輯等等先想明白了,才開始動手寫。
一個好的程序員不是產出代碼量多,而是產出代碼質量高。
牛逼的程序員一天寫十行代碼,可能比我一個禮拜寫1000行代碼還有用。


複雜度不同,(通常)學校編程的複雜度就像勻速直線運動或者加速直線運動,背後是有「公式」可套的,這是教學的目的;實際項目的複雜度基本都是變速非直線運動,混沌理論是最好的解釋,無窮無盡的不確定性。

關注點不同,(通常)學校編程比較注重解決方案的最優解,會特彆強調封閉領域內的演算法最優化;實際項目的代碼99.9%是業務,介面,架構,錯誤處理,會特彆強調一個實現的性價比,短期是否可發布,長期是否可維護性,除了少數領域,基本不需要特別關注演算法;所以學校編程像研究核子裂變,實際項目是用鋼筋水泥建設核電廠,時刻都是成本核算(時間,金錢)。


最大的不同就是,學校里寫的代碼都是用完就扔,所以完全不管可維護性(這不是個好習慣)。
公司里寫出來的代碼大部分情況就要你一直維護它到離職了,寫的時候就不可能不管可維護性了。
至於代碼量,我在學校的時候經常一天上千行C艹,公司里我一天也就300行C艹左右。


學校里,程序哪怕錯了一百次,只要跑對一次,也算是及格了,也就是過了。
工作中,你跑對一百次是應該的,只要錯一次,就是錯了,就過不去。


時間分配不一樣。

工作的時候寫到晚飯飯點在公司吃了飯就可以回家自己寫羞羞的小程序玩了。周末如果不oncall的話根本不用和工作發生任何交集。

讀書的時候哪有下班的……每天眼睛一睜就開始幹活,一直干到困出翔。第二天眼睛一睜又是一個due。周末只是不會刷新出更多的due而已。該做的事情一點都不會少……

而且工作寫代碼可以領錢,讀書寫代碼要自己貼錢。


謝邀

課代表不會改你的作業題目,
也不會在你身邊叨逼叨、叨逼叨、叨逼叨。


這1w行我先干為敬


入行愉快。

首先,一言以蔽之,用兩個字來概括,就是「殘酷」,但是,好在是加引號的。讓我慢慢說來——


下面這些都是看起來「殘酷」的事實,有的不但殘酷,還很無奈;有的則是在殘酷的同時,還很有趣。搞工程和學校里的象牙塔大不相同,這也許老早就知道,但是絕對不是七八年前我想像的模樣。你可以把它當成我沒睡醒的囈語,也可以當成我喝多的胡話,或者是心情太差的時候寫的吐槽檄文。反正,它們就在那裡,事實就在那裡。


總的來說,學校裡面編程,或者在工作之餘編程,是很有趣的,沒有manager給你各種壓力,也沒有各種大神(比如TMP、PM、SE等等我都搞不清楚幹嘛的職位)給你指點江山,你可以自己愛咋弄咋弄。當然,沒有了這些「殘酷」的痛苦,你沒法進化,沒法超脫,沒法升華。


就從一畢業開始的荒唐的面試說起吧。國內的公司問的更雜一些,知識性的問題也問,有時我反而覺得更務實。而外企則很喜歡考察「能力」,我加引號是因為他們覺得他們在考察能力,實際卻不見得。因為他們只是在考察80%的演算法+數據結構,以及一點點系統設計,一點點扯淡能力,再順道看看顏值如何啊,八字合不合啊,星座屬相啥的而已。因此,這其中前80%東西都是可以準備的。而應試,恰恰是中國人最擅長的東西。我記得有朋友在我的blog裡面回復道,特別鄙視刷演算法題和面演算法題這樣的做法。我想,我可以和你「同鄙視」的,但可惜我沒有那麼崇高,而且他應該是沒有很多去大的外企公司面試的經歷,否則,應該去一邊罵這個該死的面試方式,一邊自己偷偷刷題去了。還有人說,FLAG又如何,某ACM拿獎的,某演算法特別好的,某題刷特多的,但是工作卻不出活兒啊。嘿,這樣的人,我還真見過,也聽人說過,但問題是,人家,錢,拿,得,多,啊?人家不爽了就可以跳槽啊?人家一跳就是不錯的薪水啊?


既然聊到演算法,那就繼續下去。好吧,殘酷的事實是,絕大多數軟體工程師的日常工作,和演算法的關係其實並不大。當然,和data analyst這樣的職位比我們還是好很多,那個職位簡直就是僅次於產品工程師的神級角色了,學經濟學宇宙學物理學化工的,只要數學屬性可以,只要會講故事,就可以扯到偉大的數據分析上面,就可以表示「本人具備成為優質數據分析師的潛質」(好像也沒有什麼不對嘛,analyst們請不要打我)。好吧,話題再扯回來,面試考察的正是平時工作用不著的東西,換言之,原則是「什麼用不著就考什麼」,首當其衝的就是演算法,而真正用得著的呢,以一句「Google得到的別考」搪塞過去了,於是這些自我感覺良好的公司中,工程師日常工作就是在和Google+StackOverflow戰鬥中度過的。尤其是MS,這家自我號稱地球上最沒有taste的公司,面試簡直是為ACMer準備的,有的組簡直是「來了就做題,做完就閃人」。Google問的演算法題還算有新意的話,是那Facebook是對普通演算法題要求bug free就讓人和不解,bug free能說明什麼問題,說明熟練,說明題目做得多,還是想說明一個人腦子這個hash table裡面存放的題量大?


工作有多有趣?這是個好問題。其實,每當我們從一家公司跳到另一家公司的時候,也總會有這樣那樣的幻想,會對下一個讓自己發揮的「舞台」有所憧憬。但是很多時候,我們面對的問題,都是「知識謎題」。說白了,就是那些「不知道的打死也不知道,知道的困難解決毫無難度」的問題。來來來,這樣歸納一下,假設一個工程師每天的工作時間是100%的話,20%可能要吃飯喝水打望上廁所刷推刷微博吹牛逼閑聊,30%的時間要開各種傻里吧唧的會(這個估計夠保守了吧),剩下50%的時間想干正事兒了,發現大部分都在干各種operation的工作,說白的就是編譯構建部署安裝搭環境改配置打補丁,餘下總數的10%才是真正研究問題寫代碼的時間,發現各種亂七八糟奇形怪狀的問題,各種在學習新技術的時候,看著那些玩具代碼和hello world的時候,根本不可能想到的狗血問題全部冒出來了。就改了一行代碼,居然這東西就不work了?就加了一個小小的feature,整個系統居然就掛掉了?於是,從外往裡連蒙帶猜,連分析帶搜索,連Google帶StackOverflow地試錯,重要在某個人生中重要的時間點發現,又是一個知識謎題,又犯了一個二了吧唧的錯。搞完這些東西,終於把自己寫的那一點點小代碼,像橡皮膏一樣貼到項目組負責的這個龐然大物上了,嗯,it』s working it』s perfect。


別急,哪那麼容易讓你到達成功的彼岸?代碼修改了要反覆測試啊,測試的時候要考慮各種情形,調用一個API的時候說要接收一隻老鼠作為參數,必須要考慮如果對方傳過來一頭大象怎麼辦。搞完這些東西,才可以去嘗試code review這個苦難重重的關卡。發出去以後,等啊等,等啊等,居然沒人review啊,那好吧我去催,挨個催。結果,幸福來得太突然,十行代碼,二十條review comments,一度讓自己對自己的人生觀和價值觀產生了懷疑。但是,仔細看了之後,發現其中19條是關於各種縮進符號命名大小寫注釋空格的,只有1條是具有實際的建設性意見的,終於鬆了口氣,又是一輪改+催的流程……


更可惡的是,當你折騰完這些亂七八糟的東西以後,心裡居然沒有啥成就感,就那麼點破事兒,居然整那麼半天?於是你在第二天的sync up meeting上說,俺昨天做了xxx,yyy,發了個code review,裡面代碼修改其實只有10行。這就是一天又苦逼又繁忙的工作產出啊。更更可惡的是,有牛逼哄哄的同事A跳出來說,你這麼搞是大錯特錯的,理由1理由2理由3,還有最核心的理由4,退一步說還有理由5,就在你心裡想我擦媽蛋你這個馬後炮為啥不早說的時候,又有一位牛逼哄哄的同事B跳出來說,如果用開源的/公司內部的/免費的/別的組做的/我曾經參與開發的,框架abc/庫def/組件ghi/工具xyz,問題可以瞬間解決,言下之意,就是你眼瞎了,腦殘了,活白乾了,當初應該屁顛屁顛地跟在他後面求指導就好啦。


別高興得太早,到了線上,還會有更多歷練人生的有趣事情等著你。比如項目發布,比如on call(改線上問題)。有的問題緊急啊,就意味著你要拿著一個傳呼機一樣落伍的幾千年前才用的東西睡覺。它也許早上響,也許晚上響,也許深夜你做美夢的時候響。總之,當它響了,你就得爬起來立即處理,看看是不是service又掛了?是不是你天天整的那個破玩意兒又不能訪問了?還是哪個用戶欠抽搞了個false alarm?說不定這個問題還真是由你提交的代碼引發的呢,那就是bonus啦。所以不用懷念學校里那些美好的熬夜打遊戲的美好時光,你會迎來新一輪的熬夜改問題的美好時光。


來回折騰若干次以後,環境終於搞定了,code review終於審過了,代碼終於push了,集成測試終於跑過了,部署到線上終於沒問題了……但是,淋漓暢快的成就感呢?在崇高和偉大之間對神一樣的設計反覆的斟酌呢?對代碼像藝術品一樣的華麗麗的無止境的追求呢?


以上,來自我的blog:http://www.raychase.net/


剛開始工作的時候,還是個愣頭青。那個時候最優秀的品質就是 速度。一天三千行代碼啊………簡直文思如尿崩。然後 一周之後 自己寫的什麼 回看起來就困難。好像是 亂扯的毛線團,雖然能用看著心煩。bug時不時的出來 撩撥你的神經。

大概過了兩三年 經過幾個項目之後,每天有個三百行 真是了不起了!不同是 寫的少,錯的少。功效倒是差不多。寫的少 想的多了。代碼結構從 過程化 到 對象化 到函數化了。建模從 點線面到立體 到 流,從描繪系統 變成了 描繪 用戶體驗流。

基本上經歷了一個過程
比較語言哪個好,系統哪個好
到方法哪個好,思路哪個好
到代碼範式,規範,美觀,編程技巧
再到怎麼樣 最短時間 最低成本達到可用性要求,快速推進項目,不廢話 不啰嗦。
到最後其實都是工具而已,脫離了情景環境單論好壞都是耍無賴。

代碼外圍的工作做的越來越多了,頸椎間盤突出越來越嚴重了。稍有不注意休息 就會有肢端麻痹和疼痛。

工作後很難和小夥伴打一局dota了,學校里 很難有認真嚴肅的項目。

諸位 注意保護頸椎,坐卧行 都是關鍵。


在學校的時候我也幻想著自己好像電影裡面的黑客那樣,噼里啪啦一頓敲,東西就做好了...
結果畢業以後,我寫代碼,大部分時間都在發獃...
或者就是看項目文檔...或者是在寫項目文檔...


不要嘗試賣弄你在大學學到的演算法,因為都有現成的輪子可以用的。


第1天
組長:這裡有個客戶提交的bug,交給你了。
我:聯繫客戶,重現bug。email來往數輪,終於重現了。耗時半天。
我:打開issue tracking system,填表創建bug,耗時一刻鐘。
我:開始調試,搭建環境,編譯代碼,配置參數。各種折騰後,重現了。耗時2小時。

第2天
我:管理很shit,沒有log,沒有release pdb,沒有dump,瞎子摸象,各種斷點,print,在第10層函數fuckme()找到了案發地點,耗時2小時;
我:發現fuckme()調用了dumb lib組的DLL。似乎問題出自dumb lib組。
我:聯繫dumb lib組,報告bug。來往email無數輪,終於對方開了bug。
我:切換到另一個任務。

第n天(1個月後)
終於他們組bug fixed,客戶已經咆哮n遍。
我:改動一行代碼,測試,提交。寫release report表格,找人review code,找人審核測試結果,找人批准release,耗時1天。


推薦閱讀:

啃老、懶惰、拖延的我如何改變?
初入職場的女生,預算有限的情況下,服裝上如何搭配才能又職業化又符合年齡身份?
為什麼越努力,越焦慮?
北京有哪些好?
名校光環在給你在找工作的時候,帶來過什麼方便?

TAG:學習 | 程序員 | 編程 | 代碼 | 工作 |