程序員生涯中的這10個問題都去哪兒啦
我決定花些時間梳理一下我程序員生涯中看到的各種問題,看看它們都去哪兒啦。
外科醫(yī)生剪箭尾
在我博客上的“無Bug不生活”一文中,我羅列了程序員對Bug的態(tài)度,感興趣的朋友可以跳過去看看。
程序員經(jīng)常這么處理Bug:花上點(diǎn)兒時間擼擼代碼,哎呀,找不到Bug出現(xiàn)的根源;再花點(diǎn)時間看看能不能搞點(diǎn)沙土增高一下堤壩(想象黃河河堤的形成過程),嘿,真不錯,還真找到了,我只要這里塞點(diǎn)代碼堵一下那里扔幾個判斷圍一下,這Bug貌似就不出現(xiàn)了啊……哈哈,有才,搞定,太佩服我自己了耶。說實(shí)話,這種策略是把自己當(dāng)作了外科醫(yī)生,把軟件當(dāng)做了中箭之人。因?yàn)橥饪漆t(yī)生弄不懂內(nèi)外科的分別也找不到起出箭頭的辦法,只好通過剪斷箭尾來安撫病人,殊不知箭頭還在肉里,要是爛在肉中,病人的疼痛只會更加厲害。
我管不著啊
現(xiàn)在我們開發(fā)軟件通常都是兵團(tuán)作戰(zhàn),有時我們就會發(fā)現(xiàn)簽入到代碼庫中的某段代碼很爛,比如各種條件分支未覆蓋全面邏輯不嚴(yán)密,比如變量名凌亂導(dǎo)致可讀性很差,比如類庫設(shè)計不合理違反了單一職責(zé)原則(SRP:Single Responsibility Principle)……,此時大部分程序員的做法是:算了,這代碼是別人的,我管不了那么多,還是先忙我的吧……
有的程序員在開發(fā)過程中會感覺到軟件系統(tǒng)設(shè)計有問題,就會認(rèn)為這是系統(tǒng)分析師或架構(gòu)師的責(zé)任,因?yàn)槲铱赡軟]他牛逼或者我也沒有更好的解決方法或者我不大可能說服他采用我的方案,于是就放棄了,就按“我只要實(shí)現(xiàn)我的模塊就行了”這種方式往前走了……
還有的時候開發(fā)人員覺得產(chǎn)品某處不合理,交互方式不符合用戶使用習(xí)慣,但因?yàn)檫@是產(chǎn)品經(jīng)理的責(zé)任,就被“算了,我只負(fù)責(zé)實(shí)現(xiàn)”這種想法給俘虜了……
還有的時候阿猿覺著UI給的這個商品詳情展示界面看著色調(diào)不協(xié)調(diào),可還是放棄溝通照著做出來了……
類似的情況很多很多……
須知我們這么多人叮叮當(dāng)當(dāng)忙活,雖然每個人干的事兒不同擔(dān)的責(zé)不同,但其實(shí)是在造同一條船,沒有誰的工作與別人無關(guān),任何一處出現(xiàn)紕漏,都可能導(dǎo)致我們造出的船無法下水或者傾沒深水不能遠(yuǎn)航。
也許問題不會在用戶那里出現(xiàn)
很多軟件在測試過程中都會出現(xiàn)一些難纏的Bug:沒有規(guī)律,幾率極小。就連微軟這樣的大公司發(fā)布的操作系統(tǒng),也要不斷地打補(bǔ)丁。
作為程序員,有時遇到一個概率很小的Bug,會因?yàn)殡y以重現(xiàn)而決定先不管它,我們會這么說服自己、測試、產(chǎn)品經(jīng)理:這個Bug可能是極端操作或操作不當(dāng)引起的,用戶根本不會那么用,所以在用戶那里很可能不會出現(xiàn),就算出現(xiàn)了,按這種概率,也是極個別極個別的用戶才會碰到,而我們還有很多其他功能沒實(shí)現(xiàn),不能因?yàn)檫@種小概率的Bug影響整體的進(jìn)度。OK,事就這樣成了??墒俏覀兠總€人頭上都懸了一把達(dá)摩克利斯之劍。
要知道,用戶環(huán)境比測試環(huán)境更為復(fù)雜,測試環(huán)境無法重現(xiàn)的、幾率很小的Bug,很可能就被某個用戶Duang的碰上了,那對這個用戶,發(fā)生一次就是***啊,對他來講,根本不存在千分之幾萬分之幾這種鬼東西,他就知道他碰上了,你跟他說這個Bug實(shí)在是很難重現(xiàn)真的是小概率事件,任你舌燦蓮花屁用不頂,他的痛苦真真切切擺在那里,怎么可能認(rèn)同你的解釋。這個用戶失去了,還會有下一個“幸運(yùn) ”用戶,最終一定是星星之火燃起燎原之勢,你的產(chǎn)品口碑會爛到家,然后你的產(chǎn)品十有八九就這么死翹翹了。
我在使用手機(jī)時,像App閃退、App停止運(yùn)行等問題經(jīng)常會遇到,給人的感覺實(shí)在是太差了,你絕對不能讓我接受這是無傷大雅的小概率事件,我情感上絕對接受不了你知道嗎。
跳過技術(shù)難題,別影響進(jìn)度
軟件開發(fā)的一個特點(diǎn)就是隨時都會遇見未知的問題。比如開發(fā)互聯(lián)網(wǎng)電視產(chǎn)品,很可能會遭遇音視頻失步問題,具體表現(xiàn)是有時一個影片剛開始播放幾分鐘就失步,有時播放半個多小時才失步,有時超過一個小時也不失步,有時在這臺機(jī)頂盒上失步,有時在那臺機(jī)頂盒上失步……這個怎么辦?
有一種做法是,承認(rèn)這是個技術(shù)難題,一時半會難以解決,別讓它影響進(jìn)度,先跳過去干別的,以后專門抽時間解決它。
這種做法很常見,它的后果也很常見:項(xiàng)目進(jìn)度還是無可奈何地被這個難題拖累了。
別人都這樣
有時你會碰見這種開發(fā)團(tuán)隊:執(zhí)行力差,產(chǎn)出率不高,忙閑不均。作為一個原本追求上進(jìn)的社會主義四有青年,你看到這種狀況往往在開始時感到不正常,想要去改變它,可是久了之后發(fā)現(xiàn)你一個普通程序員改變不了什么,要是你執(zhí)意去做這個事兒勸那個人,反倒把關(guān)系給搞僵了,種種擔(dān)心或?qū)嵺`讓你意識到,你不是那個可以改變團(tuán)隊面貌的角色,怎么辦?
***的***,現(xiàn)實(shí)的結(jié)果往往是:算了,睜一只眼閉一只眼吧,我管好我自己就行了。更讓人不能接受的結(jié)果是:大家都這樣得過且過,我也沒必要這么賣力,于是自己也慢慢放松自己得過且過了。
慢慢向生產(chǎn)率下限看齊,這是非常令人傷心無奈的事實(shí)。
我們后面會追上進(jìn)度
軟件項(xiàng)目,延期的占大多數(shù)。很多項(xiàng)目,干著干著就感覺要延期了??墒呛芏鄨F(tuán)隊的項(xiàng)目經(jīng)理、開發(fā)人員在這件事情上卻表現(xiàn)得充滿童話風(fēng)格:只要解決了某個問題,只要某某猿加個班往前趕一趕,最終會趕上交付期的……
結(jié)果呢……
沒獎金沒加薪干個什么勁兒
不是每個軟件公司都能持續(xù)盈利,都能大把大把地發(fā)獎金,都能隔三差五地加薪。實(shí)際情況是,相當(dāng)一部分公司在艱難地生存,沒有辦法發(fā)可觀的獎金,也沒有辦法按承諾的節(jié)奏加薪。在這樣的公司里做開發(fā),程序員會怎么想怎么做?
公司效益不好,與我有什么關(guān)系?不發(fā)獎金,不加薪水,我干嘛還那么賣命?我何必還像以前那么努力?混混看吧。
這是一部分程序員的真實(shí)心態(tài),我也曾經(jīng)有過。要知道,當(dāng)我們在一個看不到將來的環(huán)境里工作,又沒有金錢刺激時,難免心灰意懶進(jìn)而放縱自己隨波逐流??珊髞砦乙庾R到:你在公司提供的平臺上通過為公司做事而修煉自己,你得到的,遠(yuǎn)不止是薪水,經(jīng)驗(yàn)、歷練、成長都是自己的,并且永遠(yuǎn)沒人能從你身上拿走;時間是自己的,虛度了再也無法追回;無論何時,我們都是在為自己的現(xiàn)在和將來工作,而不是為公司、為老板工作,我們不單單是一個拿薪水幫別人干事兒的人,如果停留在這種意識上,那我們一定是在扼殺自己成長的機(jī)會浪費(fèi)自己寶貴的生命。
還有XXX呢
受經(jīng)驗(yàn)、能力和眼界所限,有時某個難題看起來會超出程序員的能力范圍,讓我們感到再花精力也是枉然,于是我們就不打算研究下去了,告訴自己:算了,還有技術(shù)大拿楊過呢,還有技術(shù)經(jīng)理郭靖呢,不行還有技術(shù)副總風(fēng)清揚(yáng),再不行公司會想辦法,反正后面還有人……
反正我不是項(xiàng)目經(jīng)理時有過這種想法,我當(dāng)了項(xiàng)目經(jīng)理還是有過這種想法,甚至我做部門經(jīng)理時也曾經(jīng)這樣想過,就連項(xiàng)目總監(jiān),可能也難免有類似的想法……直到我成為一個公司的技術(shù)合伙人,我的后面,再也沒有人可以接我丟下的爛攤子了……
Sigh……,這是多么令人不適應(yīng)的情況?。?/p>
現(xiàn)在我要說的是,無論何時,都應(yīng)該把自己當(dāng)作***一道防線,要堅守陣地,有時一夫當(dāng)關(guān)可以萬夫莫開,有時一人放棄卻也會導(dǎo)致全線崩潰失地千里,我們要想盡一切辦法解決問題,這個問題到我這里就是要終止,我必須破釜沉舟不留退路。
反正不是我的責(zé)任
不可避免的,程序員會碰上項(xiàng)目延期這種事兒。有的人會回顧項(xiàng)目執(zhí)行過程中的種種問題,包括反省自己的不足、梳理團(tuán)隊成員協(xié)作上的問題、琢磨任務(wù)安排與進(jìn)度跟蹤是不是出了差錯……這是積極的做法,我覺得每個程序員都該這么做,然而實(shí)際情況卻并非如此,有相當(dāng)一部分人會這么想:領(lǐng)導(dǎo)安排的事兒,我該做的都做了,我有什么辦法,這是大家伙的事兒,很可能是項(xiàng)目沒管理好或者需求老特么變,跟我有毛關(guān)系……
算了,換個環(huán)境
程序員換工作的頻率很高,有的人兩年換一次,還有的人一年換一次,更有的人一年換幾次,這么頻繁的還工作,真實(shí)的原因是什么呢?
有時是干得不順心,覺得自己空有一籃子想法奈何領(lǐng)導(dǎo)不重視;有時是覺得團(tuán)隊的氛圍不行,不能讓大家安心做事,自己也無法保持積極向上的心態(tài),在技術(shù)和職位兩方面都無法獲得成長;有時是覺得產(chǎn)品沒有希望,看不到未來,越干越迷惘;有時是別的公司的超人氣美女拋來了酸爽***的繡球;更多的時候是,哎呀,那個公司真特么有錢啊;當(dāng)然,還有時就是莫名地,覺得該挪挪地方了……
假如不是錢的原因,你還是決定換個環(huán)境,你覺得這樣也許會好一些……果真如此嗎?
你最終決定跳槽,一定是發(fā)生了什么問題,導(dǎo)致你無法容忍現(xiàn)狀,但一定要問自己:我現(xiàn)在面臨的問題,究竟是公司、團(tuán)隊、產(chǎn)品的問題,還是自己的問題,換個環(huán)境是不是不會再出現(xiàn)類似的問題?
也就是說,我們決定跳槽之際,需要深入分析,問問自己的內(nèi)心,到底是外在的原因?qū)е伦约涸僖矡o法忍受現(xiàn)狀,還是發(fā)自內(nèi)心地覺得自己需要做出改變、去尋找新的方向。我們要弄明白自己的期望,搞清楚自己想要什么,這樣才不至于才出泥沼又入火坑。
作為程序員,在開發(fā)和工作的過程中,難免會遇到各式各樣的問題。面對問題,每個人都有自己的處理方式,不管你采取哪種方式,問題都不會自動消失。假如你采取的措施暗合“希望問題自行消失”這種模式,一定要注意,這是非常低級非常有破壞性的習(xí)慣。用這種模式“解決”問題的次數(shù)多了,時間久了,我們自己慢慢就成為問題了:因?yàn)槲覀兪聦?shí)上是在逃避問題,拒絕成長與成熟。我們希望跳到一個很少問題的環(huán)境里開開心心的工作,可這樣的環(huán)境無異于理想國和桃花源,它們只存在于想象之中,如果我們自己的內(nèi)在沒有發(fā)生改變,不能培養(yǎng)出接納問題、解決問題的能力,將在尋找的路上疲于奔命卻永遠(yuǎn)也找不到這樣的地方,最終絕望,最終選擇“放棄自己”這一看似最不可能的結(jié)果。
既然各種各樣的問題不可避免,那唯一可行的就是:直面問題,解決問題。
軟件開發(fā)問題多多苦難重重,只有接受了這個前提,只有理解了這一生活與工作的本質(zhì),我們的工作與生活才會變得美好起來。
我們往往在問題面前缺乏耐心,想讓問題馬上解決,東搞一下西搞一下還解決不了,就想丟在那里不管,邁步跨過去或繞道而走,我們總想盡快脫身,盡快縮短與問題接觸的時間而不愿花足夠的時間來應(yīng)對這種不舒服的感覺,不愿冷靜地分析問題。因?yàn)橹泵鎲栴}解決問題,真的是需要絕大的勇氣和卓越的耐受力來承擔(dān)切膚裂心的痛苦。
然而,我們必須面對。如果選擇逃避,只會越來越糟,問題會跟著我們走,我們走到哪里它們就攆到哪里。套用香港警匪片里的經(jīng)典臺詞:“出來混,遲早要還的”。我們也一樣,遇見問題,逃是逃不掉的,越逃問題越多,到后來總有你要還的那一刻。
既然如此,何妨早一日受苦、早一日解決、早一日浴火重生?讓我們接受“先苦后甜”的生活模式,坦然面對問題。問題可以開啟我們的智慧,激發(fā)我們的勇氣。為解決問題而努力,我們的思想和心靈就會不斷成長,心智就會不斷成熟。我們解決問題的能力就會不斷獲得提升。我們終將因?yàn)橹泵鎲栴}而淬煉成鋼,在混亂中成就自己,最終成就獨(dú)特的自我,找到自己的方式活出個樣子,這就是成功了。