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