實際工作中的程式設計是怎麼樣的,與學校裡有什麼不同?

發表於2015-10-14

【伯樂線上注】:本文源自知乎《在真實工作中的程式設計是怎麼樣的,與學校裡有什麼不同?》問答帖下朱眾的回答。作者已同意伯樂線上刊登轉載。


/*說說我的經驗*/

剛進公司時,在你正式動手寫程式碼前,很可能要理解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);

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

最後祝喜歡程式設計的大家都成為架構師!

*/

轉註:其實小編第一眼看到這個標題的時候,想到了下面這張趣圖:

“大學時學習中的程式設計 ” vs “實際工作專案中的程式設計”,有同感的朋友麼?

相關文章