问题战略[置顶] 十八年开发经验分享(四)问题解决篇(下)
最近一直在研究問題戰(zhàn)略之類的問題,下午正好有機(jī)會和大家分享一下.
????關(guān)于本系列文字的源來,衷初和內(nèi)容定位可以考參第一篇的頭開部份,鏈接址地如下:
????http://blog.csdn.net/binarytreeex/article/details/8174445
????http://www.cnblogs.com/WideUnion/archive/2012/11/12/2766397.html
????本文前一篇址地如下,感興趣的可以問訪面下的連接:
????http://blog.csdn.net/binarytreeex/article/details/8625156
????http://www.cnblogs.com/WideUnion/archive/2013/03/01/2938315.html
?
????在現(xiàn)實工作中軟件工程師大部份情況下都是在攻城拔寨,決解一個個自己到遇的問題。這些問題常常是在自己的知識和驗經(jīng)可以蓋覆的范圍內(nèi),所以基本上可以說是利順的。但是也會有另一些情況的存在,那就是到遇一個自己不會的問題。這些問題擁有這樣一個外在的景象:問題觸及的內(nèi)容是在責(zé)職或者以后發(fā)開務(wù)任范圍內(nèi)的,但是對如何實現(xiàn)或者決解這個問題沒有思緒和方法,簡略的說就是第一應(yīng)反之下是不道知該怎么做來決解這個問題。為了行文便方在下文中,我把所謂不會的問題命名為“困難”,所以在本文中困難這個說法特指程序員不會決解的問題,而不是其它的義含。
?
????一般來講,我們是總求力用簡略的法方來決解問題,所以一旦我們到遇一個自己不會決解的問題時,常常表現(xiàn)我們的處境已不是很妙了,或者說我們的處境有點困難了。本文就是要主分享我個人在對應(yīng)這些面局時的一些領(lǐng)會。望希幫助軟件工程師們能更好的來處置這樣的難局和境困。當(dāng)然這里以困難必須被決解為前提來探討問題,對于如何避規(guī)困難和否是須要決解困難就不探討了。在這里還要對所謂的不會的問題做一個設(shè)假的前提。本文設(shè)假如果這個問題能被決解,那么我們少缺的不是知識,也不是驗經(jīng)。否則的話我們的話題會聚焦在習(xí)學(xué)和驗經(jīng)的累積方面,而不是直接探討如何去決解一個自己不會的問題。當(dāng)然我還是樣同的再次夸大,本文分析的內(nèi)容來自個人的實際,對于決解問題這樣一個巨大的話題和全部發(fā)開者這樣一個廣泛的群體來講,局限性和片面性是在劫難逃的。所以請行同們自行舍取,同時也要根據(jù)自己的驗經(jīng),現(xiàn)實應(yīng)用場所做出當(dāng)適的化變,這樣才能更好的應(yīng)用本文分析的內(nèi)容。如果分享的內(nèi)容可認(rèn)為行同們決解現(xiàn)實工作中的問題起到踴躍作用的話,那么我的目標(biāo)就到達(dá)了。當(dāng)然如果可以到達(dá)庖丁解牛那樣余有刃游的界境那是最好的。
?
????
????一.困難是什么樣的問題
????
????這要主是和一般問題比相而言的,先從源來上來講。一般來講我們不應(yīng)該到遇困難,無論從風(fēng)險還是進(jìn)度來講,與項目有關(guān)的每一個人都應(yīng)該在求力免避這類情況的現(xiàn)出。但是在某些情況下,困難還是會來的。其中原因是困難的客觀存在性。工程師試嘗決解現(xiàn)實的問題,而這些問題的難度并不以工程師的客觀意志定決的,而是問題本身定決的。另一個原因可能項目本身的要求,比如為了有競爭優(yōu)勢等等,會在實現(xiàn)上提出一些有難度的要求。
?
????從難度上講,這類問題對于工程師而言在第一應(yīng)反之下是不會的,工程師所擁有的知識驗經(jīng)并不能直接告知工程師能決解問題。這就是所謂的難。所以在試嘗決解問題時問題決解篇(中)里頭提到的行不行,在這里就格外要重了。如果一個困難是不能決解的,那就沒有必要再去花時光了。
?
????從法方上講,困難的決解會多出一個驟步,那就是析分。這個析分是對問題本身的識認(rèn)和解理,這是可以決解問題的先決件條。當(dāng)然這個解理不僅僅只是審題層面的解理,而是問題本身結(jié)構(gòu)上的識認(rèn)。為了到達(dá)這樣的識認(rèn)常常要求工程師在動手決解問題前須要有一定量的實際活動,于用識認(rèn)問題。
?
????從略策上講,決解困難時須要確明自己的戰(zhàn)略,因為困難常常是一個品產(chǎn)或者項目標(biāo)成敗癥結(jié)。所以常常也是源資投入比擬多的方地,如果沒有好的戰(zhàn)略來對應(yīng)問題,同時從全局握把的話,那么困難引入的風(fēng)險有可能會失控,這有可能會帶來很嚴(yán)重的效果。所以須要有一個當(dāng)適的戰(zhàn)略。
?
????
????二.處置困難的戰(zhàn)略
????
????在備準(zhǔn)或者開始動手決解困難時,要求工程師對于決解問題的戰(zhàn)略有一個清晰的識認(rèn),并且在決解問題的中程過格嚴(yán)遵守這個戰(zhàn)略。這樣做的目標(biāo)是為了少減失敗的損失。困難的決解常常須要時光,更有可能會增加對其它源資的消耗,那么萬一決解困難失敗,我們改如何對應(yīng)?不成功則成仁的作法是不可取的,也不是一個明聰?shù)倪x擇。所以在到遇困難時,工程師就要確保自己處在進(jìn)退都有余地的狀態(tài),這就是處置困難的戰(zhàn)略。
?
????處置困難的戰(zhàn)略的第一條是盡量免避自己對面困難。這個意思當(dāng)然不是說到遇困難時推卸掉或者踢皮球,而是說在構(gòu)架,析分計劃,算法,思緒等等個每驟步和細(xì)節(jié)上都要注意采用簡略化的略策,免避現(xiàn)出困難的情況。這個略策是有點抵觸的,但是和特警決解機(jī)危件事的略策一樣。一方面要求特警的槍法盡可能的好,另一方面在臨場處置件事時則采用盡量不開槍的略策。當(dāng)然如果一定要開槍的話,那確定要求一槍決解問題。不要為了示顯個人的才能或者為了出風(fēng)頭而有事沒事的就去挑戰(zhàn)困難,這是非常不明智的作法,早晚會掛的很看難的。
?
????第二個略策是時光管理。事實上決解任何問題都是須要消費時光的,只是簡略的問題所消費的時光全完在可接受的范圍內(nèi)之,所以時光這個最要重最基本的制約件條常常不被我們到識意。但是決解一個困難所須要消費的時光是多少,常常是不確定的,當(dāng)時光出超甚至遠(yuǎn)遠(yuǎn)出超我們預(yù)計時,就會發(fā)生很大的煩麻。所以團(tuán)隊中的leader最好可以預(yù)先確定可能現(xiàn)出的困難,并預(yù)留夠足的時光來對應(yīng)這個情況。這當(dāng)然是悲觀的一面,但是也有踴躍的一面。因為我們也可以設(shè)假預(yù)留時光以后,困難是可以決解的,很多時候這個設(shè)假也是公道的。那么這樣再排安發(fā)開籌劃時就能夠便方一點了。
?
????第三個略策是風(fēng)險管理。這個意思就非常確明了,只須要斟酌一點,那就是一旦決解困難失敗,那么我們否是可以受承一切的效果。這是風(fēng)險管理的底線,如果這點都做不到,那么在定決決解困難時就要非常非常重慎了,我的法看是最好就廢棄吧。另一個一般標(biāo)準(zhǔn)的作法是,如果困難決解失敗,那么應(yīng)該有一個候選案方可以選擇。這樣我們就能進(jìn)能退了,會比擬自動一點,內(nèi)心也會實踏一點,這是一般分寸的作法。當(dāng)然現(xiàn)實情況會更為龐雜一些,常常是問題難度估計不對,或者有些困難沒有預(yù)估到,等等。所以終最被到遇困難的面局是有可能現(xiàn)出的,尤其是處在一個新品產(chǎn)的研發(fā)或者做原型階段時。這時候就要看內(nèi)力和運氣了。夸大一下,最少不要在戰(zhàn)術(shù)層面上確定自己可以決解困難,遠(yuǎn)永不要這樣。
?
????
????三.處置困難的法方以及決解困難的礎(chǔ)基件條
????
????當(dāng)對面一個會決解的問題時,我們一般就直接動手去決解了,即便是須要思考也是在“自己會的”這個前提下作思考。當(dāng)然這是一種思考,但是對面一個困難時我們須要另一種思考,這類思考就是對問題本身的識認(rèn)。我們須要通過一定量的重復(fù)的實際(或者說試嘗)和思考,才能逐漸的識認(rèn)清晰我們對面的是一個什么樣的問題,問題究竟是什么模樣的。從而讓我們對問題實質(zhì)有一個清晰的識認(rèn),進(jìn)而可以應(yīng)用我們的知識來描述問題,或者看清晰問題的結(jié)構(gòu),道知一個困難是由什么和多少簡略問題成組的。我把這個過程稱之為析分。然后直接應(yīng)用我們的知識或者依次決解每一個簡略問題來決解這個困難。與問題決解篇(中)里頭探討的內(nèi)容比相,這是一個要重的新的驟步。一旦析分的驟步完成,那么后面的工作就能夠按照處置普通問題那樣來做了。
?
????上一篇中提到了兩個決解問題的礎(chǔ)基件條,這里須要再說一個,那就是智商或者說你有多明聰。我覺得智商是這個三個礎(chǔ)基件條中是最要重的。當(dāng)然這聽上去不是一個什么好消息,因為智商貌似是老天給的。但是事實上不是這樣的,后天的努力可以在很大程度上改善先天的不足。
?
????上一篇中提到的知識在決解困難時當(dāng)然還是毫無疑問的有用。于上一篇中應(yīng)用的場景比相,在決解一個困難時如果只是簡略重復(fù)應(yīng)用自己的知識恐怕是不充分的。工程師們須要用更擁有創(chuàng)造性的思維方式來應(yīng)用自己的知識。在實際活動中還發(fā)現(xiàn)一些簡略的知識,甚至是很礎(chǔ)基的知識在決解問題時常常可以發(fā)揮更好的作用,扮演著主力的角色。
?
????
????四.思考法方
????
????分析幾個思考問題的法方,這些內(nèi)容在我看來是非常要重的,也是非常有實用價值的。
?
????1.數(shù)學(xué)家的思考法方
????先說一個數(shù)學(xué)家思考問題的法方。這個例子是很多年以前我在電視中看到的,當(dāng)時沒覺得怎么樣,但是隨著年齡的增加和處置的問題難度的加大,越來越開始領(lǐng)會到它的作用了。電視中在分析數(shù)學(xué)家如何思考問題時舉了面下這個燒水的例子。
?
????設(shè)假我們能做一件事情,這件事情是將一個裝滿水的水壺放到爐子上,然后把這壺水燒開。所以當(dāng)有人給你一個裝滿水的水壺,并要求你燒開水時,你是直接可以完成。好,現(xiàn)在設(shè)假有人把一個空的水壺拿給你,并且還是要求你燒開一壺水,那么你怎么決解這個問題?生活中處置這個問題是不用想的,直接把水灌到水壺中,然后放到爐子上燒就是了。但是我們用數(shù)學(xué)家的思維方式來決解這個問題時卻須要費一點周折。數(shù)學(xué)家是按照面下驟步來思考的:
?
????第一步,首先是到識意問題的差異,我們會處置的是裝滿水的壺,現(xiàn)在是空的水壺。放到現(xiàn)實工作中,這一步就是要求我們有夠足的觀察力,辨識能力和一種敏感的職業(yè)嗅覺來發(fā)現(xiàn)問題的癥結(jié)點和決解問題的正確方向。這個和之前博文中提到的對比法是雷同的,只是應(yīng)用的場所不同,當(dāng)然難度也不同。現(xiàn)實上這也是一個析分問題的驟步,但是這個驟步只是一個簡略的比擬。通過這個比擬讓我們發(fā)現(xiàn)了差異,這個差異告知我們困難和我們會決解的問題之間的聯(lián)系。
?
????第二步,然后斟酌有沒有方法把空的水壺處置成裝滿水的水壺。如果可以那么這個問題就決解了。數(shù)學(xué)家的思緒的亮點是在這一步,這是一個開啟決解問題之門的思考問題的技巧,讓我們看到了從不會到會的望希。很多情況下這個時候,我們的想法是換法方,或者是簡略就做出判斷我不會,而不是想方法去創(chuàng)造或者說試嘗創(chuàng)造我們決解問題所少缺的件條。這點上數(shù)學(xué)家的思維方式提供了一個要重的啟示。
?
????第三步,發(fā)現(xiàn)將空水壺處置成裝滿水的水壺法方之一(你也可以花錢讓人替你做)是將水灌到空水壺中。注意這是一個發(fā)現(xiàn),也是向決解問題邁出了一步,就這個例子而言還是癥結(jié)的一步。所以這個發(fā)現(xiàn)非常要重。在現(xiàn)實工作的表現(xiàn)就是看你的知識,驗經(jīng)和獲取的信息否是夠足讓我們來找到這個做法,同時對你如何應(yīng)用你的知識也提出了要求。上面兩個驟步是到遇問題和析分問題,這一步則是在析分的礎(chǔ)基上發(fā)現(xiàn)決解問題的法方。
?
????第四步,現(xiàn)在須要考察將水灌到空水壺中這件事情我們會不會做。在現(xiàn)實工作中的表現(xiàn)是在對一個問題思考析分后,對其中子問題(或者子驟步)的又一次思考。顯然現(xiàn)實的情況是我們會做的,最少絕大部份能用手敲代碼的程序員是會做的。好了,思考到這一步我們就能夠道知這個問題是可以決解的。這里第二步是癥結(jié),第三,四步是主體。
?
????這個例子或者說思考問題的法方,非常精彩的演示了如何應(yīng)用已有的知識來決解一個自己已有知識沒有蓋覆的問題。當(dāng)然這樣的例子有很多,限于筆墨,就不在說了。
?
????2.牛頓求解曲邊梯形面積的法方
????牛頓在他的傳世名著數(shù)學(xué)原理中應(yīng)用我們中學(xué)里的知識(現(xiàn)在的中學(xué)已講極限和導(dǎo)數(shù)了,這個不算,我是說我那個時候)定義并證明極限和導(dǎo)數(shù),進(jìn)而給出了曲邊梯形面積的計算法方。這是我目前為止看到的用自己會的簡略知識,決解困難的終最極的例子了。各位工科科班出來的都是學(xué)過高數(shù)的,建議看一下數(shù)學(xué)原理中那部份的推演和證明,就道知牛頓為什么是牛頓了。當(dāng)然我想夸大的是,這個例子告知我們還不止是這些。
?
????將數(shù)學(xué)原理中的證明過程,當(dāng)然還包括遣詞造句的論述部份,和我們學(xué)過的高等數(shù)學(xué)教科書中的證明做一個比擬,我們會發(fā)現(xiàn)數(shù)學(xué)原理中牛頓的證明很簡略,如果可以的話我想說是簡陋。如果我用這樣的描述來證明一個題目標(biāo)話,那么我的高數(shù)老師是不會允許我過關(guān)的。教科書中極限的概念是用ε-δ語言來描述的,而牛頓基本上應(yīng)用的是自然語言,甚至連符號都沒有(這里申明一下翻譯的水平問題不斟酌在內(nèi)),比相擬而言牛頓的證明不算什么。這個事實給我們的啟示在于,當(dāng)我們在決解困難時,不一定就能夠很快發(fā)現(xiàn)一個滿意的解,而常常只是一個看上去有可能是解的解。這個時候我們還是要堅持下去的,因為有一個解相對于沒有解你已是一個很大的進(jìn)步了,畢竟離目標(biāo)近了一步。如果當(dāng)年牛頓一定要等到用ε-δ語言描述極限概念時才來完成微積分的建立,那么工業(yè)革命有可能就會推遲一百年了。
?
????3.大爆炸理論的線索
????天文學(xué)家觀察到一個景象,那就是所有的星體相互之間的距離越來越遠(yuǎn)。基于這個事實我們可以得出什么結(jié)論?科學(xué)們就此提出了宇宙大爆炸理論,就是說宇宙從一個非常小的所謂奇點開始爆炸,從而發(fā)生了現(xiàn)在的宇宙。那么科學(xué)家是如何從這個簡略的事實推出大爆炸理論的呢?其推演過程簡略的令人吃驚。如果現(xiàn)在此時此刻所有的星體正在彼此遠(yuǎn)離,那么過去的某一個時刻,所有的星體的位置就比現(xiàn)在的位置要近,這個結(jié)論很顯然是對的。那么過去的過去的某一個時刻,所有星體的位置就比過去的某一個時刻的距離會更近一些,這個顯然也正確。好了,照這個思緒推理下去,星體的距離就會越來越近,最后只能在一起。于是大爆炸理論(當(dāng)然剛開始應(yīng)該只是一個假說)就這么誕生了。從這個例子可以看出優(yōu)秀或者巧妙的思維方式對決解問題會發(fā)生不可估量的作用。在大爆炸這個例子中根本沒有用到天文相關(guān)的任何專業(yè)知識,只是通過正確的推理,就得出了這個假說。望希發(fā)開者可以領(lǐng)會一下并從中吸取營養(yǎng)。
?
????上面的三個例子是給我留下印象并對我發(fā)生指導(dǎo)作用的例子,我相信類似的例子會有很多,大家可以找出適合自己的。數(shù)學(xué)家例子是最礎(chǔ)基也是最要重的,我覺的所有的法方都可以從這個例子中推演出來。牛頓的例子說明的如何創(chuàng)造性的應(yīng)用知識,最后的例子是考驗我們的智商了,或者說觀察力了。
每日一道理雖然你現(xiàn)在還只是一株稚嫩的幼苗。然而只要堅韌不拔,終會成為參天大樹;雖然你現(xiàn)在只是涓涓細(xì)流,然而只要鍥而不舍,終會擁抱大海;雖然你現(xiàn)在只是一只雛鷹,然而只要心存高遠(yuǎn),跌幾個跟頭之后,終會占有藍(lán)天。
?
????
????五.破解困難的法方
????
????破解困難之難有兩個法方可供考參,第一個就是所謂的析分。這個析分通俗來講就是識認(rèn)問題,當(dāng)然識認(rèn)的內(nèi)容除了審題和正確解理外,我們更關(guān)心的是能不能用一個格嚴(yán)描述來表達(dá)困難的結(jié)構(gòu)。如果一旦可以做到這一點,那么決解問題的可能性就極大提高了。從析分的手段來講,大概只有一個那就是實際,通過和事務(wù)的接觸和互動來考察問題的結(jié)構(gòu)和性質(zhì),進(jìn)而到達(dá)識認(rèn)問題的目標(biāo)。我有一次去面試,考官出了一個題,說是有三種圖形:矩形,圓和橢圓,要求如何計劃類來表現(xiàn)這三種圖形。我當(dāng)時沒有仔細(xì)斟酌,第一應(yīng)反就是按照幾何上的定義來計劃類。對于矩形就是矩形類,屬性是一個左上角的坐標(biāo),另外兩個是寬和高;圓類的屬性是兩個:圓心坐標(biāo)點和半徑;橢圓的定義當(dāng)時我忘了,所以向考官說明想法就不寫了。如果這時讓我用UML或者OOD來解釋一下的,有可能我會說上一段。但是,現(xiàn)實應(yīng)用的數(shù)據(jù)結(jié)構(gòu)只有一種:矩形。這一點在以后接觸GDI+編程時得到了證明。這個例子告知我們看出三種實質(zhì)在幾何上全完不同的圖形的外在差異,而問題的實質(zhì)只是一個矩形,這才是表述問題的正確結(jié)構(gòu)。
?
????在析分問題或者說在采用某些活動試嘗了解問題時,觀察力是一個要重的輔助能力。因為很多活動是通過人機(jī)交互完成的,那么觀察計算機(jī)的輸出設(shè)備(一般是示顯器)示顯的信息是識認(rèn)問題的極為要重的手段。任何細(xì)微的化變或者結(jié)果都有可能是破解的困難的要重線索。我曾經(jīng)有過這樣一個例子,要讓控件的背景示顯指定的顏色,當(dāng)時我還在用VC,于是我就用紅色做了一下試嘗。結(jié)果是控件的背景色沒有化變,當(dāng)時就很被動了,糾結(jié)在繪制了紅色為什么紅色不示顯,于是不道知該如何決解。結(jié)果在一次偶然的操作中,好像是窗口的最小化以后再最大化,結(jié)果發(fā)現(xiàn)控件的背景有一次閃動,重復(fù)操作一次再觀察發(fā)現(xiàn)是紅色閃了一下。這個景象說明,紅色的背景被畫上去了,但是又被控件以后的背景色蓋覆了。于是破解問題的線索是如何不讓控件的背景色蓋覆我繪制的顏色。從這個線索出發(fā)終最還是決解了問題。
?
????另外還須要夸大一下,在采用的識認(rèn)問題的活動,我認(rèn)為應(yīng)該是多樣的并富有化變的,可以盡可能多的讓自己了解問題。有些時候我們采用了一些行動,但是常常收獲不大,這個時候就須要思考了。不能簡略的重復(fù)活動,而是要采用不同的活動來識認(rèn)問題,癥結(jié)點是化變。舉一個簡略例子,如果我們實現(xiàn)一個文件復(fù)制的功能,結(jié)果復(fù)制失敗。這里先忽略復(fù)制函數(shù)的返回值或者拋出異常的信息這些內(nèi)容,直接問自己如何采用活動來了解不成功的原因進(jìn)而幫助決解問題?如果是我的話,我采用的活動可能會是這些:
????1.不寫程序,新建一個文本文件,然后直接復(fù)制該文件
????2.不寫程序,直接復(fù)制程序中須要復(fù)制的文件
????3.在程序中以直接執(zhí)行命令的方式復(fù)制文件
????4.不讀取文件內(nèi)容,而是將一個固定的字符串寫入到目標(biāo)文件
????5.在目標(biāo)位置新建文件否是可以
????6.直接在目標(biāo)位置新建一個同名文件,并且不讀取文件直接向新文件寫入須要復(fù)制的內(nèi)容
????7.讀取文件內(nèi)容,寫入到一個已復(fù)制成功過的文件中
????8.讀取文件內(nèi)容,但是只寫入成功復(fù)制文件的那部份內(nèi)容
????我估計這些活動基本上可以找出問題的原因了。發(fā)現(xiàn)不同的試嘗途徑和內(nèi)容,有時候不難,有時候卻相當(dāng)有難,我建議大家要學(xué)會思考。當(dāng)?shù)接鲞@類場景可以斟酌將雙手離開鍵盤,人站起來離開電腦,到外面散散步,在散步中仔細(xì)斟酌應(yīng)該采用的試嘗法方。
?
????析分問題的另一個有力工具是排列組合,簡略來講就是中學(xué)里學(xué)的加法定理和乘法定理,更完整的說法就是組合數(shù)學(xué)中的那些計數(shù)法方,定理及其性質(zhì)。排列組合現(xiàn)實上只有兩個核心內(nèi)容:計數(shù)和枚舉。如果可以對問題做到計數(shù),那么我們就完成了對問題在結(jié)構(gòu)上的識認(rèn);如果對計數(shù)結(jié)果可以完成枚舉,那么枚舉的法方和過程也就是決解問題的法方和過程。所以再次夸大一下,書本上的知識是有用的,并且是最有用的。
?
????困難破解的第二個法方是簡化。設(shè)假有一個問題A我們決解不了那么就能夠斟酌先忽略一些問題中的要求,使得問題的難度降低,然后再試嘗去決解這個簡化后的問題。如果還是不能決解,那么可以斟酌再次簡化,或者可以斟酌不斷的簡化。這個做法和迭代發(fā)開很類似。這里舉一個WideUnion團(tuán)隊現(xiàn)實到遇的問題。Entity Model Studio支持圖形化的UML建模,那么當(dāng)初計劃了一個功能,在生成代碼前對用戶計劃的UML模型做語法檢查,其中的一項就是不允許現(xiàn)出關(guān)系的環(huán)。比如繼承關(guān)系的環(huán):A類繼承自B類,B類繼承自C類,而C類又繼承自A類。顯然這個語言檢查須要查出模型中所有的這樣的關(guān)系環(huán)。更為規(guī)范的描述是:找出一個有向圖中的所有的環(huán)。
?
????在我學(xué)過的知識中,教課書只告知我如何判斷一個圖中否是存在環(huán)而不是找出所有的環(huán),所以這是出超我的知識范圍的,第一應(yīng)反當(dāng)然是不會,真心不會。采用的第一個驟步是構(gòu)造若干個構(gòu)成環(huán)的實例,看著圖讓自己有一個感性的識認(rèn)。然后簡化問題,這里有兩個略策可以走,第一個是設(shè)假是有一個環(huán);第二個是有環(huán)并且是直接構(gòu)成環(huán),就是兩個節(jié)點直接存在指向?qū)Ψ降倪叀N也捎玫氖堑谝粋€略策。然后完善算法,使得算法可以完成這個功能:只要圖中有一個環(huán),那么一定能找出來。這樣就進(jìn)入到?jīng)Q解問題的第二個驟步,查找多個環(huán),這一步現(xiàn)實上是分為兩個小驟步來完成的。第一個小驟步是,制約構(gòu)成不同的環(huán)只能現(xiàn)出不同的邊,不能現(xiàn)出不同的節(jié)點。換句話說,新的環(huán)是有相同的節(jié)點之間的不同有向邊構(gòu)成的。然后再次完善算法,保證圖中只要有這樣的多個環(huán)一定都能找出來。完成這幾步后,就能夠邁向最后一步了。任何一個環(huán)都是由節(jié)點和邊構(gòu)成的,上述的驟步實現(xiàn)了相同節(jié)點中不同邊構(gòu)成的所有的環(huán),這個算法簡稱為A的話,那么面下須要做的就是改變節(jié)點再次執(zhí)行算法A就能夠了。于是一個原來不會解的問題通過逐漸簡化就找到一個解了。最近在看書時偶然發(fā)現(xiàn)尋找哈密爾頓環(huán)的算法應(yīng)該也是可以考參的。
?
????有時候決解困難常常表現(xiàn)為少缺件條或者有些件條不確明。這個時候,有兩個簡略而實用的方法可以應(yīng)用。第一個是設(shè)假,這法方在做邏輯判斷題時經(jīng)常應(yīng)用,我們可以設(shè)假件條A成立,或者設(shè)假A的內(nèi)容是XX,從而構(gòu)造出一個確明的已知件條來幫助決解問題。另一個法方是非常熟悉的反證法。反證法的實質(zhì)也是設(shè)假,只不過設(shè)假的是結(jié)論成立。一旦設(shè)假結(jié)論成立,那么結(jié)論成立所以依賴的件條也必須成立,那么成功構(gòu)造出這些件條的方向常常就是決解問題的入口和起點。
?
????
????六.實例析分
????
????面下通過兩個有代表性或者能說明問題的實例來探討一下,如何應(yīng)用上面提到的內(nèi)容來決解困難。
?
????我想先分析一個偶然看到的電視節(jié)目。大概是3月中旬,央視的世界地理頻道播出了一期節(jié)目,其中一個橋段是說一個大夫如何給一個小男孩致傷的事情。件事的來龍去脈簡略的描述如下:
????癥狀:小男孩的背部和大腿上大概有好幾百根類似仙人球一樣的刺。
????問題:如何把這些刺拔出來?
????法方:1.直接用器械一根一根的拔。大夫的實際證明效率極低,無法接受。
? ? ? 2.用膠帶紙粘掉刺。結(jié)果也不行,膠帶紙的粘性不夠,刺還是拔不出來。
? ? ? 3.應(yīng)用女性用的脫毛用品和膠帶紙。成功,效果非常好。
?
????這個故事和我們軟件工程師如何決解問題的相關(guān)性是什么呢?簡略來講有以下幾點:
????1.醫(yī)生到遇的問題格嚴(yán)上來講不是治病,而是一種對人體的修理。樣同的軟件工程師到遇的問題也不一定是格嚴(yán)意義上的技術(shù)問題,但是只要你遇上了還是要你來決解的。不管會不會最少你要盡力去決解。
????2.膠帶紙的應(yīng)用。我相信那個大夫在學(xué)校里讀書的時候,他的教材上絕不會把膠帶紙作為一個工具告知學(xué)生去給病人治病的,但是在現(xiàn)實工作中他卻這么做了。對軟件工程師來講,問題的攻克常常也不是用正統(tǒng)的書本知識來決解的。所謂的“旁門左道”也是須要的。
????3.脫毛用品的應(yīng)用。這顯然是一個亮點。如果說應(yīng)用膠帶紙是脫離了書本知識,那么脫毛用品的加入則是一個創(chuàng)造性思維的質(zhì)變。這點對于程序員的借鑒意義在于,要求程序員們要有靈活和富有創(chuàng)造性的思維方式和能力。對于自己掌握的知識否是100%的用盡了,是不是創(chuàng)造性的應(yīng)用了自己掌握的知識,而不是僅僅簡略的重復(fù)。
?
????還可以再提出幾個問題,考察其中的若干細(xì)節(jié),我們能發(fā)現(xiàn)這個中程過還有更多的內(nèi)容可以給與我們啟示與借鑒。
????1.第一個法方是最正統(tǒng)的法方,但是效率低,那么什么理由定決廢棄?
????從節(jié)目看效率低是直接原因。但是一般來講同一個問題應(yīng)該有不同的法方可以決解。我在看到這里時,第一反映是否是可以改進(jìn)拔刺的動作,或者找另外的醫(yī)生一起來做。那么與那個醫(yī)生的選擇就會不同,于是就有了不同的法方。工程師在決解現(xiàn)實問題時,就要根據(jù)自己所處的環(huán)境來定決法方的應(yīng)用。
?
????另外醫(yī)生試嘗后覺得效率慢,那么是不是就一定很慢呢?我相信不同的醫(yī)生來做效率上是會有差異的。這個說明,決解問題是要發(fā)揮自己的技術(shù)特長,用長處來決解問題。
?
????2.膠帶紙的應(yīng)用
????刺插入身體,刺與身領(lǐng)會形成一個夾角,這個夾角導(dǎo)致刺和身體表面不是平行的。那么在用膠帶紙時就會有一定的煩麻。另外在撕下膠帶紙時,粘力和刺拔出的方向也不是平行的,顯然這個動作對男孩來講是會帶來痛苦的。這些細(xì)節(jié)告知我們在法方的具體實施時,工程師自身的操作過程也很要重。操作技巧常常可以彌補(bǔ)法方的不足,也有可能會影響法方的效果。當(dāng)我們定決否是廢棄或者應(yīng)用一個法方時,須要根據(jù)現(xiàn)實情況綜合斟酌的。所以可以看出膠帶紙的應(yīng)用表明那個醫(yī)生確實到遇了煩麻。
?
????3.脫毛用品的應(yīng)用
????大夫是在和護(hù)士不經(jīng)意的聊天中獲得了靈感,試嘗應(yīng)用脫毛用品的。這告知我們決解問題的思緒常常不是來自主戰(zhàn)場,有可能來自生活中的點點滴滴的細(xì)節(jié)中。另外一個須要注意的是,一個創(chuàng)造性的法方的應(yīng)用,須要斟酌其負(fù)面的影響,這點非常要重,務(wù)必注意。比如,脫毛用品的應(yīng)用不但沒有決解問題,反而帶來更大的煩麻,那么這個醫(yī)生的處境會有多么的被動和狼狽?!
?
????第二個例子來自Entity Model Studio品產(chǎn),這個問題是我們在發(fā)開時序圖時到遇的,先簡略交代一下問題的背景。在繪制時序圖時,用戶可以通過鼠標(biāo)拖動消息,從而改變消息和消息生命線在時序圖中的位置,這是所有時序圖都應(yīng)該支持的功能。以Visual Studio中的時序圖為例,當(dāng)用戶拖動消息后,直接相關(guān)的以及依次相鄰的圖形都會根據(jù)拖動的消息的新位置做出調(diào)整,從而保證拖動后各個圖形還是在一個公道的位置,這個稱之為自動調(diào)整。這就是我們想實現(xiàn)的功能。面下依次探討幾個要點。
?
????1.問題的提出
????這個功能如果能得到實現(xiàn)的話,用戶操作會非常便方,否則用戶就必須自己手工調(diào)整每一個相關(guān)的圖形,很煩麻的,體驗非常差。所以出于這個目標(biāo)就提出了實現(xiàn)該功能的要求
?
????2.實現(xiàn)的風(fēng)險和難度
????在我們考察的幾款品產(chǎn)中,沒有實現(xiàn)該功能的品產(chǎn)也是有的。所以從戰(zhàn)略層面上來講,這個自動調(diào)整功能不是必須的。這樣我們的風(fēng)險就小很多了,因為就算實現(xiàn)失敗,品產(chǎn)也是可行的,當(dāng)然能實現(xiàn)是最好的。實現(xiàn)該功能的難度在于,這是我們第一次試嘗決解圖形位置自動調(diào)整功能,對相關(guān)的算法和知識我們一無所知,也沒有相關(guān)的任何驗經(jīng),所以在最初我們不道知該如何去決解這個問題。但是終最定決去的原因,除了風(fēng)險不大之外,我確實想或者說非常非常想實現(xiàn)一個微軟做到的功能,因為在歷史上我曾兩次挑戰(zhàn)失敗,所以這次想雪恥。
?
????3.問題的析分
????對這個問題的析分,是從應(yīng)用Visual Studio的時序圖開始的,重復(fù)的構(gòu)造不同的圖,然后拖動消息,考察其行為,從而找出規(guī)律,對這個問題有一個最初的感性識認(rèn)。通過這個過程,識認(rèn)到數(shù)據(jù)結(jié)構(gòu)的計劃是須要改動的。通過觀察這些行為表現(xiàn),我們還到識意有可能須要應(yīng)用到某些我們不了解的定理和算法,這才是最可怕的。為了確認(rèn)這個疑問,于是又做了進(jìn)一步的析分。實際表明可以有變通法方?jīng)Q解,這個情況和牛頓用中學(xué)知識定義極限是有點類似的。都是在用已知的簡略知識去描述一個未知的新的內(nèi)容。這個中程過,觀察力和思考力起著非常要重的作用。
?
????4.問題的簡化
????問題簡化分兩步走,第一步試嘗最簡略的情況,然后考察實現(xiàn)的過程和結(jié)果,從反饋中獲得信息,判斷我們的識認(rèn)否是正確,難度否是可以接受。第二步是析分可能的存在的各種不同的結(jié)構(gòu),對每一種不同的結(jié)構(gòu)依次處置,從而把問題肢解掉。這里須要用到一些礎(chǔ)基的知識,比如計數(shù)法方之類的。
?
????通過上面幾步,基本上就能夠確定該問題從一個不會做的問題,變成了一個可以決解的問題。當(dāng)然法方不是唯一的,我相信行同們會有更好的作法。
?
?
????
????七.最后想說的話
????
????總體來講決解困難是一項很擁有難度和挑戰(zhàn)的事情。從應(yīng)用的法方和思緒上來講,我發(fā)現(xiàn)扮演主力角色的非常意外的是一些簡略的法方和知識,其難點是在于如何應(yīng)用。醫(yī)生拔刺,數(shù)學(xué)家,牛頓和天文學(xué)家的思考法方,給我們的啟示是:決解問題的法方和思維方式是互通的,沒有行業(yè)和領(lǐng)域的制約,正所謂它山之石可以攻玉。我們要學(xué)會去點滴累積這樣的驗經(jīng),吸收營養(yǎng),豐富知識,擴(kuò)展思緒從而提升我們析分問題并決解問題的能力。這類景象可以用這樣一句話來概括:功夫在題外。
?
????決解困難的過程是一個痛并快樂著的過程,工程師們要有勇氣和膽識去對面這樣的挑戰(zhàn)。你會經(jīng)受折磨但是也會有快樂的體驗。如果你愛一個就讓他去決解困難吧,因為那是天堂;如果你恨一個人那也讓他去決解困難吧,因為那是地獄。鑒于一些非常令人不愉快的行為,我這里申明一下如果達(dá)內(nèi)須要轉(zhuǎn)載或者修改本人寫的任何博文,那么請先獲得本人的許可。
?
????好了,這次就寫到這里,如何決解問題的話題到這里就算是告一個段落了,通過這次回顧我自己也有相當(dāng)?shù)念I(lǐng)會,確實也收獲了一些東西。行同們有興趣進(jìn)一步交流的可以加我的群:244054966,這個群定位是創(chuàng)業(yè),新手就不要去了。另一個是:231233168,這個群沒什么制約。入群時請加上消息:CSDN博客。下一篇談?wù)勀芰ο嚓P(guān)的話題,名字暫定為:能力養(yǎng)成篇。
文章結(jié)束給大家分享下程序員的一些笑話語錄: 不會,Intel會維持高利潤,也會維持競爭局面,國外的競爭不是打死對方的那種。你看日本有尼康,佳能,索尼,都做相機(jī),大家都過得很滋潤。別看一堆廠,其實真正控制的是后面的那幾個財團(tuán)——有些競爭對手,后面其實是一家人。
總結(jié)
以上是生活随笔為你收集整理的问题战略[置顶] 十八年开发经验分享(四)问题解决篇(下)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 要学好linux运维请从排版画图开始
- 下一篇: 130506datafile和table