通過(guò)心理學(xué)知識(shí)提高問(wèn)題定位與解決能力
前言
軟件開(kāi)發(fā)工作無(wú)論是從宏觀還是微觀上看,都可以看作一個(gè)問(wèn)題解決的過(guò)程。從宏觀上看,軟件開(kāi)發(fā),簡(jiǎn)單來(lái)說(shuō),就是弄清楚客戶的需求是什么,然后通過(guò)分析、設(shè)計(jì)、編碼和測(cè)試等一系列活動(dòng)解決如何將需求轉(zhuǎn)換為代碼的問(wèn)題。從微觀上看,開(kāi)發(fā)人員的日常工作中也面臨各式各樣的問(wèn)題。比如,用于調(diào)試代碼的Web服務(wù)器突然啟動(dòng)不了,開(kāi)發(fā)人員必須先解決這個(gè)問(wèn)題,否則手頭上的工作可能無(wú)法進(jìn)展。
作為開(kāi)發(fā)人員,與其抱怨加班,不如去反思下自己的時(shí)間都去哪里了。我相信開(kāi)發(fā)人員的大部分時(shí)間都花在解決各種各樣的問(wèn)題上了。不管是資深的開(kāi)發(fā)者、還是新手,在日常的工作中都會(huì)遇到各式各樣的問(wèn)題。所不同的是,資深開(kāi)發(fā)者可以在幾秒內(nèi)解決的問(wèn)題,新手卻可能要花上幾個(gè)小時(shí),甚至一兩天的時(shí)間!可見(jiàn),提高開(kāi)發(fā)者的問(wèn)題解決能力,無(wú)論對(duì)于個(gè)人還是對(duì)于團(tuán)隊(duì),都有著重要的意義。
其實(shí),心理學(xué)作為一門獨(dú)立的學(xué)科,對(duì)于問(wèn)題解決有其專門的研究。其研究成果值得我們借鑒,以提高我們自身以及團(tuán)隊(duì)中的其他成員的問(wèn)題解決能力。本文將為讀者介紹心理學(xué)關(guān)于問(wèn)題解決方面的知識(shí),并結(jié)合軟件開(kāi)發(fā)工作的特點(diǎn)給出提高問(wèn)題解決能力的相關(guān)指導(dǎo)意見(jiàn)。沒(méi)有心理學(xué)背景的讀者,也不必?fù)?dān)心“隔行如隔山”,本文所涉及到的一些心理學(xué)術(shù)語(yǔ),大多都是淺顯易懂的。
重新審視什么是“問(wèn)題”
提高問(wèn)題解決能力,首先要弄清楚究竟什么是“問(wèn)題”,然后才能談如何更有效率地去解決問(wèn)題。
心理學(xué)將“問(wèn)題”定義為“給定信息和目標(biāo)之間有某些障礙需要被克服的刺激情境”。通俗的理解就是,對(duì)于給定的事物的初始狀態(tài)(所謂“給定信息”)和目標(biāo)狀態(tài),我們不清楚如何將初始狀態(tài)轉(zhuǎn)換為目標(biāo)狀態(tài)(所謂“障礙”),“問(wèn)題”就產(chǎn)生了。例如,著名的梵諾塔問(wèn)題,其初始狀態(tài)是64個(gè)盤子在A桿,目標(biāo)狀態(tài)是所有盤子在C桿,并且每個(gè)小盤都在大盤之上。所存在的需要被克服的“障礙”就是如何將64個(gè)盤子從A處移動(dòng)到C桿。
圖 1. 梵諾塔問(wèn)題
按照上述定義,解決問(wèn)題就是克服“障礙”的過(guò)程,即尋找到一條從初始狀態(tài)通往目標(biāo)狀態(tài)的通路的過(guò)程。如梵諾塔問(wèn)題中,我們反復(fù)借助B桿,最終將A桿上的所有盤子“原封不動(dòng)”地移動(dòng)到C桿的過(guò)程就是問(wèn)題解決的過(guò)程。
那么,提高問(wèn)題解決的能力就是提高我們找到一條從初始狀態(tài)通往目標(biāo)狀態(tài)的路徑的能力。
為了下文討論方便,這里簡(jiǎn)單地將軟件開(kāi)發(fā)領(lǐng)域的“問(wèn)題”劃分為界定清晰的問(wèn)題(Well-defined problem)和界定含糊的問(wèn)題(Ill-defined problem)。前者指初始狀態(tài)和目標(biāo)狀態(tài)都很清楚的問(wèn)題,如梵諾塔問(wèn)題。后者指初始狀態(tài)、目標(biāo)狀態(tài)或者二者都很模糊的問(wèn)題,這類問(wèn)題往往更難解決,對(duì)問(wèn)題解決者的要求也更高。與軟件運(yùn)維有關(guān)的問(wèn)題多屬于這類問(wèn)題。比如這樣一個(gè)問(wèn)題:某個(gè)生產(chǎn)環(huán)境上的數(shù)據(jù)庫(kù)系統(tǒng)自動(dòng)重啟,需要查明其原因。
解決問(wèn)題的心理過(guò)程
就像了解計(jì)算機(jī)處理信息的原理有助于我們更好地使用計(jì)算機(jī),了解人類解決問(wèn)題的過(guò)程有助于我們更好地解決問(wèn)題。
心理學(xué)家一般把問(wèn)題解決的過(guò)程分解為問(wèn)題表征、設(shè)計(jì)解題計(jì)劃、執(zhí)行解題計(jì)劃和監(jiān)控這四個(gè)步驟。
問(wèn)題表征指明確問(wèn)題的初始狀態(tài)、目標(biāo)狀態(tài)和允許的操作和必須滿足的限制。梵諾塔問(wèn)題中,問(wèn)題解決者首先對(duì)問(wèn)題進(jìn)行表征,即弄清楚:64個(gè)盤子在A桿上,小的盤子在大的盤子上面(初始狀態(tài))、目標(biāo)是將這64個(gè)盤子移動(dòng)到C桿上,C桿上的每個(gè)盤子仍然保持小盤在上,大盤在下(目標(biāo)狀態(tài))、移動(dòng)過(guò)程中可以借助B桿,但是移動(dòng)過(guò)程中保證小盤始終在大盤上面(允許的操作和必須滿足的限制)。
設(shè)計(jì)解題計(jì)劃指確定解題的步驟。梵諾塔問(wèn)題的問(wèn)題解決者通過(guò)比較問(wèn)題的初始狀態(tài)和目標(biāo)狀態(tài),準(zhǔn)備借助B桿遞歸地將A桿的所有盤子逐步地移動(dòng)到C桿,就是設(shè)計(jì)解題計(jì)劃。
問(wèn)題解決者設(shè)計(jì)好解題計(jì)劃后,就執(zhí)行解題計(jì)劃,并在執(zhí)行過(guò)程中時(shí)刻進(jìn)行自我檢查當(dāng)前的操作是否有助于解決問(wèn)題、相關(guān)操作是否滿足問(wèn)題的限制,即執(zhí)行監(jiān)控。如梵諾塔問(wèn)題的問(wèn)題解決者在移動(dòng)盤子過(guò)程中要注意小的盤子是否在大的盤子上面,移動(dòng)盤子的結(jié)果是否如事先預(yù)期的那樣能夠使越來(lái)越多的盤子放在了C桿上。
下面我們討論,影響問(wèn)題解決的心理因素。
影響問(wèn)題解決的心理因素
問(wèn)題的表征方式
問(wèn)題解決的***個(gè)步驟中的問(wèn)題表征,還可以再分為兩個(gè)小步驟:?jiǎn)栴}表層理解和深層理解。
問(wèn)題表層理解就是將問(wèn)題用問(wèn)題解決者自身的語(yǔ)言來(lái)描述的過(guò)程,這是解決問(wèn)題的最基礎(chǔ)的一步。問(wèn)題的深層理解是在問(wèn)題表層理解的基礎(chǔ)上,進(jìn)一步把問(wèn)題的每一陳述綜合成條件和目標(biāo)的統(tǒng)一體。這一子步驟中,非常重要的一點(diǎn)是區(qū)分問(wèn)題中有關(guān)的信息和無(wú)關(guān)的信息。對(duì)于無(wú)關(guān)的信息,可以忽略之,也可以采用不同的方式去理解和表示之(即表征)。
在問(wèn)題深層理解的過(guò)程中,問(wèn)題的表征采用的方式不同對(duì)問(wèn)題的解決難度可能有很大的影響。這點(diǎn),可以從典型的一個(gè)問(wèn)題——和尚上山問(wèn)題(見(jiàn)上圖)反映出來(lái)。
和尚上山問(wèn)題給人的直覺(jué)的反映是似乎不大可能存在這樣一個(gè)點(diǎn),因?yàn)楹蜕猩舷律降乃俣炔灰粯?。然而,?dāng)我們發(fā)現(xiàn)這個(gè)問(wèn)題可以看作這樣一個(gè)問(wèn)題時(shí):兩個(gè)和尚在同一時(shí)間點(diǎn),沿著同一條山路,一個(gè)下山,另一個(gè)上山,答案就非常直白:這條山路上必然存在一個(gè)點(diǎn),在某一時(shí)刻這兩個(gè)和尚會(huì)相遇。那么,原問(wèn)題的答案也是肯定的。這個(gè)問(wèn)題的解決中關(guān)鍵的一步是,在對(duì)問(wèn)題進(jìn)行深層理解的過(guò)程中,我們采用與問(wèn)題表層理解中不同的方式來(lái)表征問(wèn)題:表層理解中問(wèn)題描述的是同一個(gè)和尚上下山,而深層理解時(shí)我們發(fā)現(xiàn)是否是一個(gè)和尚上下山是一個(gè)“無(wú)關(guān)”的信息,我們可以將這個(gè)信息理解成兩個(gè)和尚同時(shí)上下山。
下面看一個(gè)軟件開(kāi)發(fā)中的實(shí)際例子:我們要對(duì)網(wǎng)頁(yè)上的一個(gè)表示文章關(guān)鍵字列表的字段的值進(jìn)行合法性校驗(yàn)。校驗(yàn)的規(guī)則是該字段的值不能為空,若字段值不為空,則多個(gè)關(guān)鍵字間用英文分號(hào)分隔。例如:“keyword1;keyword2;keyword3”。顯然,這個(gè)可以用正則表達(dá)式來(lái)校驗(yàn)。問(wèn)題就轉(zhuǎn)化為這個(gè)正則表達(dá)怎么寫。按照問(wèn)題的表層理解(如上面文字的描述),關(guān)鍵字列表的字段值的格式會(huì)被表征為:
(關(guān)鍵字1)+;+(關(guān)鍵字2)+;+(關(guān)鍵字3)+...
這樣的表征固然直白簡(jiǎn)單,但依照這個(gè)表征,相應(yīng)的校驗(yàn)正則表達(dá)式不是那么容易寫。相反,如果把字段值的格式換作另外一種表征,相應(yīng)的正則表達(dá)式就容易寫得多:
(關(guān)鍵字1)+(;關(guān)鍵字2)+(;關(guān)鍵字3)+ ...
依照上述表征(即從第二個(gè)關(guān)鍵字開(kāi)始,每個(gè)關(guān)鍵字都需要以";"為前綴),可以得出相應(yīng)的正則表達(dá)式(Javascript語(yǔ)言表述)為:“^[^;]*(;[^;]+)*$”。
因此,當(dāng)我們?cè)诮鉀Q問(wèn)題,尤其是一些比較困難的問(wèn)題時(shí),若沒(méi)有什么進(jìn)展,而又沒(méi)有什么新的思路時(shí),不妨回到問(wèn)題的原點(diǎn),重新去表征問(wèn)題,換一種新的方式去表征問(wèn)題?;蛟S,這個(gè)時(shí)候就會(huì)豁然開(kāi)朗。這就好比我們?cè)趥商筋}材的影視作品中經(jīng)常看到的情景:偵探在查案過(guò)程中,費(fèi)了許多人力和時(shí)間案情都沒(méi)有什么進(jìn)展,這個(gè)時(shí)候要突破困境的一個(gè)好的方法是從“零”開(kāi)始:重新回到案發(fā)現(xiàn)場(chǎng),重新去尋找蛛絲馬跡,重新進(jìn)行推敲。這個(gè)時(shí)候,案情往往就柳暗花明了!
問(wèn)題的表征充分程度
若我有一小時(shí)的時(shí)間來(lái)拯救世界,我會(huì)花59分鐘來(lái)定義這個(gè)問(wèn)題,并花一分鐘的時(shí)間來(lái)尋找解決方案(If I had an hour to save the world, I would spend 59 minutes defining the problem and one minute finding solutions––– Albert Einstein)。
心理學(xué)研究表明,在解決常規(guī)問(wèn)題時(shí),專家比新手快得多。而在解決困難問(wèn)題時(shí),專家用于表征問(wèn)題的時(shí)間比新手要長(zhǎng)一些,他們會(huì)用更多的時(shí)間去收集問(wèn)題的相關(guān)信息,因而對(duì)問(wèn)題的表征更加充分。
有這樣一個(gè)個(gè)案。運(yùn)維人員報(bào)告某個(gè)生產(chǎn)環(huán)境的進(jìn)程數(shù)過(guò)多,向研發(fā)人員求助定位該問(wèn)題。而對(duì)方所提供的信息僅僅是說(shuō)“主機(jī)上的進(jìn)程數(shù)過(guò)多”,附帶一款監(jiān)控軟件所報(bào)的告警信息:“XXX主機(jī)上的進(jìn)程數(shù)超過(guò)260”。
該問(wèn)題的解決過(guò)程是:首先,弄清所謂“進(jìn)程數(shù)過(guò)多”,具體是什么意思。結(jié)合監(jiān)控軟件的告警信息,可以回答該疑問(wèn):所謂進(jìn)程數(shù)過(guò)多,是指主機(jī)上所啟動(dòng)的進(jìn)程數(shù)大于監(jiān)控軟件所預(yù)設(shè)的進(jìn)程數(shù)量(如260)。此時(shí),問(wèn)題似乎明朗了:找出260個(gè)進(jìn)程之外的進(jìn)程是哪些,問(wèn)題應(yīng)該就能解決。但這也存在一個(gè)問(wèn)題,假設(shè)進(jìn)行問(wèn)題定位的時(shí)候,該主機(jī)的進(jìn)程數(shù)是265個(gè),這其中的每個(gè)進(jìn)程對(duì)我們來(lái)說(shuō)都是沒(méi)有差別的,我們又如何將這些進(jìn)程區(qū)分為兩部分呢?
進(jìn)一步向?qū)Ψ皆儐?wèn)得知,問(wèn)題所涉及的主機(jī)系一個(gè)集群環(huán)境(共幾十臺(tái)主機(jī))中的一臺(tái),而經(jīng)過(guò)確認(rèn)其它主機(jī)上并沒(méi)有出現(xiàn)該問(wèn)題。那么,通過(guò)比較該主機(jī)上的進(jìn)程名稱列表和集群環(huán)境中另外一臺(tái)主機(jī)的進(jìn)程名稱列表,可以發(fā)現(xiàn)出現(xiàn)問(wèn)題的主機(jī)“多出”了哪些進(jìn)程。***發(fā)現(xiàn),該問(wèn)題系運(yùn)維人員定制了一個(gè)定時(shí)任務(wù),該定時(shí)任務(wù)調(diào)用的Shell腳本重復(fù)運(yùn)行(前一次腳本運(yùn)行對(duì)應(yīng)的進(jìn)程未結(jié)束,新的腳本運(yùn)行又開(kāi)始了),從而導(dǎo)致進(jìn)程數(shù)越來(lái)越多。
當(dāng)筆者將上述問(wèn)題寫為問(wèn)題定位案例給新手進(jìn)行定位時(shí),新手的反應(yīng)是懵了,不知從何下手。
正如上述個(gè)案所展示的,軟件行業(yè)中遇到的問(wèn)題多數(shù)是定義模糊的問(wèn)題,尤其是一些生產(chǎn)環(huán)境中出現(xiàn)的問(wèn)題。對(duì)于這樣的問(wèn)題,專家能夠通過(guò)自己的分析判斷、進(jìn)一步收集與問(wèn)題有關(guān)的信息,使問(wèn)題逐步轉(zhuǎn)化為定義良好的問(wèn)題,再通過(guò)適當(dāng)?shù)膯?wèn)題解決策略(如上述的比較法),從而解決問(wèn)題。而新手往往不知所措。
因此,對(duì)于定義模糊的問(wèn)題,其解決思路大體上是試圖將其轉(zhuǎn)化為定義良好的問(wèn)題,途徑是通過(guò)分析判斷,收集有關(guān)問(wèn)題的更多信息。而對(duì)于新手,平時(shí)通過(guò)觀察專家解決問(wèn)題的過(guò)程,并試圖模仿之,也是一個(gè)提高解決問(wèn)題能力的方法。
觀察能力
一切推理都應(yīng)該從觀察和實(shí)驗(yàn)中得來(lái)。
––– 伽利略
在解決軟件行業(yè)的問(wèn)題過(guò)程中,視覺(jué)是人腦獲取信息的主要途徑。解決問(wèn)題的過(guò)程中,人腦并不是被動(dòng)地接受視覺(jué)信息,而是通過(guò)有意識(shí)的、帶有目的性的主動(dòng)觀察獲取信息。另外,軟件開(kāi)發(fā)過(guò)程中遇到的問(wèn)題多數(shù)是界定含糊的問(wèn)題,通過(guò)觀察獲得有關(guān)問(wèn)題的更多信息有助于對(duì)問(wèn)題進(jìn)行充分的表征。因此,觀察能力在解決問(wèn)題的過(guò)程中顯得非常重要。在我們的日常工作中也不難發(fā)現(xiàn)一點(diǎn):專家在解決問(wèn)題過(guò)程往往能夠從一堆視覺(jué)信息中快速捕捉到其所需的關(guān)鍵信息,而新手面對(duì)專家所賴以解決問(wèn)題的信息時(shí)卻往往視若無(wú)睹!
例如,如圖2所示的一個(gè)幾十行的Call Stack信息中,專家可以快速地定位到第35行這行關(guān)鍵信息,從而斷定問(wèn)題系磁盤空間不足所致,而新手則可能不知從何下手。
圖 2. 從錯(cuò)誤信息中快速定位關(guān)鍵信息
日志文件、軟件界面等所呈現(xiàn)的錯(cuò)誤信息是問(wèn)題定位的一個(gè)重要信息來(lái)源。但是經(jīng)驗(yàn)告訴我們,“二八原則”在此也是適用的:這些錯(cuò)誤信息中的大部分對(duì)于解決問(wèn)題來(lái)說(shuō)是無(wú)用或者用處不大的,而那些對(duì)問(wèn)題的定位和解決能夠起到?jīng)Q定性作用的關(guān)鍵信息往往就那么幾行甚至一行。因此,能否在這些大量的錯(cuò)誤信息快速找出那些我們需要的關(guān)鍵信息,往往決定了問(wèn)題解決的效率。
快速找到我們所需的關(guān)鍵信息,需要問(wèn)題定位者的擁有敏銳的觀察能力。提高觀察能力,首先需要意識(shí)到觀察能力的重要性。其次,在日常工作中逐步地學(xué)會(huì)區(qū)分自己在問(wèn)題定位過(guò)程中所遇到的錯(cuò)誤信息,哪些是關(guān)鍵的,哪些是幫助不大的。再次,掌握一些獲取關(guān)鍵信息的基本技能。例如,對(duì)于與數(shù)據(jù)庫(kù)有關(guān)的錯(cuò)誤信息,要能夠重點(diǎn)關(guān)注數(shù)據(jù)庫(kù)系統(tǒng)所報(bào)的錯(cuò)誤碼。對(duì)于Java Call Stack信息,重點(diǎn)關(guān)注“Caused by”部分的頭幾行。
筆者曾經(jīng)通過(guò)引導(dǎo)組員意識(shí)到其觀察能力的薄弱和觀察能力的重要性,并通過(guò)實(shí)際的問(wèn)題定位向其展示如何快速獲取關(guān)鍵信息,幫助了組員一定程度上提高了觀察能力。
小結(jié)
本篇介紹了問(wèn)題解決的心理過(guò)程以及問(wèn)題表征階段影響問(wèn)題解決的一些心理因素。并結(jié)合筆者實(shí)際經(jīng)歷的例子通過(guò)比較專家與新手在解決問(wèn)題時(shí)表現(xiàn)出的差異給出提高問(wèn)題定位與解決能力的指導(dǎo)意見(jiàn)。下篇將介紹影響問(wèn)題解決的其它心理因素,并給出相關(guān)指導(dǎo)意見(jiàn)。