漫談程序員系列:噢,我是一個(gè)鬼問題!
程序員(軟件開發(fā)工程師)有很多別稱,比如“程序猿”、“碼農(nóng)”、“代碼工人”、“碼字猴”等等,都是幽默的阿猿們自黑的結(jié)果。這些個(gè)別稱,指出了一個(gè)不爭(zhēng)的事實(shí):程序員要寫代碼。然而,被遮蓋的問題是:程序員寫代碼的目的。
程序員的職責(zé)是解決問題
軟件的目的是解決生活和生產(chǎn)過程中的問題,為人們帶來(lái)便利,提高生產(chǎn)力和生產(chǎn)率。
程序員生產(chǎn)軟件,所以,程序員的***目的是用軟件來(lái)解決自己和他人生活中的問題。這是程序員的職責(zé),而寫代碼,不過是解決問題這個(gè)復(fù)雜旅程中的一小步,非常非常小的一步。
開發(fā)軟件苦難重重
程序員是為著解決問題而生的,可實(shí)際上,程序員的工作過程中,需要面對(duì)許許多多問題,問題讓程序員痛苦,一個(gè)問題解決之后,新的問題馬上又會(huì)出現(xiàn),讓程序員繼續(xù)陷入無(wú)盡的痛苦。軟件開發(fā)其實(shí)就是一個(gè)不斷面對(duì)問題和解決問題的過程。所以,從這個(gè)角度來(lái)講,開發(fā)軟件苦難重重。
考慮軟件開發(fā)的整個(gè)過程,大概有這么幾類問題:
產(chǎn)品定義問題
架構(gòu)設(shè)計(jì)問題
實(shí)現(xiàn)偏離需求
軟件BUG
維護(hù)問題
溝通問題
具體的問題我們也無(wú)需展開來(lái)說(shuō),不是本文的重點(diǎn)。本文的重點(diǎn)是,如何面對(duì)問題。首先我們要看看幾種現(xiàn)實(shí)。
鴕鳥癥
鴕鳥在遇到危險(xiǎn)時(shí)會(huì)把頭埋進(jìn)沙子。
OK ,這是逃避問題的一種方式。
很多程序員也采取類似的鴕鳥策略來(lái)逃避自己面臨的問題和需要承受的痛苦,問題解決不了,就拖拖拖,往后拖,就當(dāng)沒看見,興許到時(shí)神跡出現(xiàn)問題不見了呢。
這都是自欺欺人。雖然鴕鳥策略會(huì)讓程序員暫時(shí)避免了痛苦,但卻不得不去承受另外兩種更深邃的痛苦:看不到希望的交付期和沒有盡頭的維護(hù)。
貼膏藥
還有一種常見的處理問題的策略,就是貼膏藥。這種在解決軟件BUG時(shí)比較常見。
說(shuō)實(shí)話軟件的質(zhì)量和程序員個(gè)體關(guān)系太大,有追求的會(huì)寫簡(jiǎn)潔、有效、邏輯清晰的代碼,出了問題比較好分析、解決;敷衍的呢,就隨便搞搞能 Run 就行,出現(xiàn) BUG 就很難腸,總是尋尋覓覓尋不到,***呢,就只能是揣摩著在某條路上堵點(diǎn)東西,貼塊膏藥,久而久之,這代碼就丑陋得不行,到處是狗皮膏藥,你要是想揭開看看里面到底是啥,都無(wú)從下手。說(shuō)什么飛越迷霧把代碼看清楚,都是夢(mèng)啊。
綁架產(chǎn)品經(jīng)理
有一些問題來(lái)源于開發(fā)實(shí)現(xiàn)與產(chǎn)品需求定義之間的分歧。這個(gè)時(shí)候就看開發(fā)和產(chǎn)品溝通的結(jié)果了:要么產(chǎn)品妥協(xié),把一個(gè)問題定義為使用習(xí)慣什么的以便延后解決;要么打回給開發(fā)重新實(shí)現(xiàn)。
我見過很多次妥協(xié)的情況,有的問題真的還蠻重要的。我認(rèn)為這種情況,多數(shù)時(shí)候是程序員運(yùn)用自己的技術(shù)優(yōu)勢(shì)為自己的理解偏離保駕護(hù)航,最終綁架了產(chǎn)品經(jīng)理。這是程序員不愿意看到、看到了也不愿意承認(rèn)的事實(shí)。
接受苦難,實(shí)現(xiàn)超越
令人欣慰的是,只要接受了軟件開發(fā)苦難重重的事實(shí),程序員就能從苦難中解脫出來(lái),實(shí)現(xiàn)產(chǎn)品和自我的超越。程序員正是在承受痛苦和解決問題的過程中,技能、經(jīng)驗(yàn)和心智得以成長(zhǎng)和成熟。如果害怕面對(duì)問題,畏懼承受痛苦,一心想要逃避,那么我們雖然能夠逃避一時(shí)的痛苦,卻會(huì)承受隨之而來(lái)的用戶投訴、產(chǎn)品失敗、公司破產(chǎn)等等更嚴(yán)重的后果。
你不解決問題,你就會(huì)成為問題。作為程序員,這是我們一定要牢記的。
面對(duì)問題的泥沼,不可能躍過,我們的選擇,只能是穿越。
直面問題的好處
程序員都是成年人(有童工嗎)了,應(yīng)該有能力去面對(duì)問題和痛苦。但實(shí)際情況是,作為成年人的程序員,心理卻不一定成熟,有時(shí)還是會(huì)像小孩子一樣,不愿去面對(duì)和解決問題。這有能力問題,也有心理問題,但從旁觀者看來(lái),這歸根結(jié)底是能力問題。
我們來(lái)給能力下個(gè)定義:解決問題的態(tài)度、技能、經(jīng)驗(yàn)和自我學(xué)習(xí)的欲望,綜合起來(lái)就是能力。
直面問題,會(huì)提升能力。這是***的好處。
規(guī)避問題,會(huì)失去提升的機(jī)會(huì),阻礙自我成長(zhǎng)。但我們常常會(huì)這么做,一方面是我們傾向于認(rèn)為正在做的事兒不是我們自己的,是公司的,老板的,我們還有退路;另一方面是因?yàn)?,接受問題、解決問題會(huì)挑戰(zhàn)我們的技能、經(jīng)驗(yàn)、認(rèn)知習(xí)慣,是沉重而痛苦的,人的天性中有一點(diǎn)是拈輕怕重避重就輕,說(shuō)白了就是愿意當(dāng)下舒服。
軟件開發(fā)過程中的問題不會(huì)因?yàn)槌绦騿T的回避而消失,問題會(huì)一直存在,并且老問題會(huì)滋生新問題,導(dǎo)致問題越來(lái)越多,超出產(chǎn)品、團(tuán)隊(duì)、公司所能接受的范圍,最終在某個(gè)時(shí)刻集中爆發(fā)出來(lái)。
我有過很多次這樣的經(jīng)歷,鴕鳥癥讓我不自覺地延后問題,總覺得最終交付期限還早,總抱著不切實(shí)際的幻想,自己騙自己說(shuō)隨著時(shí)間的推移也許問題會(huì)自己消失或者出現(xiàn)一些情況讓問題不再是問題。但實(shí)際情況是,項(xiàng)目不斷延期,測(cè)試結(jié)論總是“達(dá)不到釋放標(biāo)準(zhǔn)”,為了上線不斷地加班,搞得大家伙又疲憊又無(wú)奈,期間的痛苦甚至讓人絕望,我們都被問題淹沒了,看不到出頭之日。這個(gè)時(shí)候我是真心后悔沒有及早暴露問題、解決問題,有時(shí)也告誡自己下一個(gè)版本下一個(gè)產(chǎn)品一定不能這樣??墒聦?shí)是,惡性循環(huán)一旦形成,慣性很大,很難 break 出來(lái)。這會(huì)讓人厭煩、不堪忍受、不得安寧,努力多次后,當(dāng)發(fā)現(xiàn)在當(dāng)下的環(huán)境里無(wú)法改變這種惡性循環(huán)時(shí),我會(huì)傾向于換個(gè)環(huán)境重新開始。這也是換工作的一種常見的原因。
為了避免這種情況,***的辦法就是克服就輕、逃避的欲望與習(xí)慣,接納問題,擁抱痛苦,遇佛殺佛遇鬼殺鬼,***時(shí)間解決各種問題。不要擔(dān)心自己水平不夠解決不了,人的能力都是在做超出自己能力的事情中提高的,這也是自我修煉的要訣:設(shè)定比自己能力高一級(jí)的目標(biāo)。
解決問題的實(shí)踐
我們把心態(tài)放開了放平了,那接下來(lái)就是如何解決問題了。每個(gè)程序員遇到的問題都不一樣,解決問題的具體方法也天差地別,但還是有一些指導(dǎo)性的原則可供參考。
有效溝通
良好的溝通能力是優(yōu)秀程序員最顯著、最重要的特點(diǎn)。
如果你不能和別人有效地溝通,那你很難打磨出一個(gè)優(yōu)秀的產(chǎn)品。
程序員需要和產(chǎn)品經(jīng)理、市場(chǎng)、客戶溝通需求、設(shè)計(jì)等等問題,這是逃也逃不掉的。雖然有些程序員選擇軟件開發(fā)就是為了避免和人打交道,但殘酷的事實(shí)是,在如今兵團(tuán)作戰(zhàn)的環(huán)境下,“兩耳不聞窗外事,抱著鍵盤敲敲敲”的埋頭苦搞是搞不出來(lái)好東西來(lái)的。
程序員還要和開發(fā)同事、測(cè)試 MM 溝通,簡(jiǎn)直是各種溝通……
如果我們能準(zhǔn)確地表達(dá)我們的想法,正確理解別人的意圖,那就可以在產(chǎn)品初期規(guī)避很多問題。
盡早暴露問題
問題暴露得越早越好,解決的成本也越低。如果臨近交付時(shí)蹦出來(lái)神問題,會(huì)擊垮可憐的程序員,他們會(huì)更傾向于回避、掩蓋問題,有時(shí)實(shí)在沒轍了,會(huì)和測(cè)試、產(chǎn)品一起,大家伙一起把自己給說(shuō)服,改變問題的屬性、范疇、嚴(yán)重程度,然后相互安慰,這看起來(lái)不是什么問題了。
從軟件開發(fā)過程來(lái)看,下面的做法會(huì)盡早暴露問題:
需求評(píng)審
設(shè)計(jì)評(píng)審
同級(jí)代碼審查
持續(xù)集成
迭代測(cè)試
正確認(rèn)識(shí)問題
無(wú)論你怎樣有效溝通,無(wú)論你采取多少措施來(lái)盡早暴露問題,還是會(huì)有預(yù)料不到的事情發(fā)生。這就是軟件開發(fā)的不確定性,是我們必須接受的事實(shí)。而對(duì)于程序員來(lái)講,一定要牢記,你在生產(chǎn)代碼,也在生產(chǎn) BUG 。我們要正確認(rèn)識(shí)這個(gè)事情,出現(xiàn)問題時(shí),不輕視,不回避,不隱瞞,不悲觀,實(shí)事求是地來(lái)面對(duì),實(shí)事求是地來(lái)解決。
如果我們不能正確地認(rèn)識(shí)問題,那遲早有一天,我們自己會(huì)成為問題,那時(shí),我們面臨的,將是被冷落、被淘汰。