工程師的佛系自省,避開邏輯的陷阱
《請(qǐng)回答1988》第一集就讓我這個(gè)三十多歲的肥膩中年男哭了個(gè)稀里嘩啦,在普通而瑣碎的日常生活里,母子之間、父女之間那種似淡卻濃、連綿不絕的親情總會(huì)在不經(jīng)意間戳中為人父母/為人子女的淚點(diǎn)。這種感情的質(zhì)地亙千年而不變,表達(dá)的形式則歷萬(wàn)古而常新。古有孟母三遷的美談,現(xiàn)有幼兒園門口的親子大戰(zhàn)。
本文引用地址:http://cafeforensic.com/article/201908/403636.htm上班路過幼兒園門口,經(jīng)常看到娃娃和媽媽們相愛相殺的一幕。有的抱著媽媽的大腿,攤在地上撕心裂肺地哭喊,有的拽著媽媽的胳膊,上氣不接下氣地邊哭邊講條件。媽媽們的表現(xiàn)倒出奇的一致,一副雖九死而尤未悔的慨然,怒目相向,橫眉冷對(duì)。
大多數(shù)孩子體力不濟(jì),打不了持久戰(zhàn),于是乖乖就范,耷拉著小腦袋一步三回頭,在媽媽們志得意滿的目光中走向幼兒園。但是,在這種敵我雙方力量懸殊的戰(zhàn)局中,偶有那種意志堅(jiān)定的小戰(zhàn)士,始終滿懷著敢叫日月?lián)Q新天的豪情,雖千萬(wàn)人吾往矣地宣告著自己的價(jià)值主張-玩、在家玩。
這種戰(zhàn)略相持的場(chǎng)面并不多見,每每目睹,不以為怪。直到有一次,我突然對(duì)堅(jiān)持抵抗的小戰(zhàn)士充滿了深深的景仰之情:意志這么堅(jiān)定,肯定是個(gè)干工程師的好苗子。
1
老衲之所以感慨萬(wàn)端,自然是因?yàn)楣ぷ魃嫌龅搅穗y以克服的挑戰(zhàn)。在解決的過程中,屢屢感到自己意志不堅(jiān),想當(dāng)逃兵離開這迷離的火線。
老衲開發(fā)的一款工控產(chǎn)品中有一個(gè)異常電壓保護(hù)功能,當(dāng)外部供電電壓異常時(shí)需要關(guān)斷所有輸出,當(dāng)供電電壓回到正常范圍時(shí)恢復(fù)所有輸出。
這個(gè)功能乍看起來(lái)有些簡(jiǎn)單,有經(jīng)驗(yàn)的工程師肯定已經(jīng)在腦海里想好了解決方案:
設(shè)定供電電壓的正常范圍上下限,用ADC周期性地檢測(cè)外部供電電壓并周期性地判斷。設(shè)置判斷電壓異常的周期計(jì)時(shí)次數(shù)N,當(dāng)供電電壓持續(xù)低于下限或者持續(xù)高于上限一定次數(shù)(N)的周期時(shí),關(guān)斷當(dāng)前正在導(dǎo)通狀態(tài)下的所有輸出。當(dāng)供電電壓持續(xù)處于正常區(qū)間(N個(gè)ADC檢測(cè)周期)時(shí),根據(jù)產(chǎn)品的功能邏輯,控制輸出的開通和關(guān)斷。
悲催的老衲最初就是這么干的,但是很快,老衲就意識(shí)到這種方法蠢笨至極,根本實(shí)現(xiàn)不了異常電壓保護(hù)。
原因無(wú)他,輸出太多爾,控制邏輯太復(fù)雜爾!
這款工控產(chǎn)品的輸出通道高達(dá)30多路,每路輸出都需要單獨(dú)控制,而且有的通道互有關(guān)聯(lián)。輸入信號(hào)則來(lái)自多路傳感器、RS485總線、zigbee??刂戚敵鰰r(shí),主要是根據(jù)輸入信號(hào)、產(chǎn)品內(nèi)部狀態(tài),按照一定的邏輯開通或關(guān)斷。
輸入輸出信號(hào)繁多,控制邏輯錯(cuò)綜復(fù)雜,以至于那個(gè)“想當(dāng)然”的解決方案根本實(shí)現(xiàn)不了。
拍一拍腦袋想想吧。假設(shè)供電電壓異常時(shí),有15路輸出處于開通狀態(tài)。經(jīng)過N個(gè)檢測(cè)周期發(fā)現(xiàn)電壓始終異常,于是乎把這15路通通關(guān)斷。
咔咔咔,猶如抽刀砍西瓜,一刀剖去,紅瓤黑子分明儼然,那真叫一個(gè)不亦快哉!
可是且慢,“快哉”了之后呢?現(xiàn)在供電電壓恢復(fù)正常了,您這15路通道怎么恢復(fù)之前的開通狀態(tài)?
2
傻眼了吧?不管你們傻不傻,反正我當(dāng)時(shí)就傻眼了!
關(guān)斷總是容易,但是恢復(fù)太難。就好像把房子推倒容易,再建起來(lái)很難一樣。
老衲得承認(rèn),剛開始盡管傻了眼,但是我并沒有開竅。我傻傻地為這30多路輸出定義了30多個(gè)狀態(tài)變量,“不亦快哉”之前先統(tǒng)計(jì)處于導(dǎo)通狀態(tài)的通道,“快哉”之后需要恢復(fù)時(shí),再把處于導(dǎo)通狀態(tài)的一一恢復(fù)。
可是,在導(dǎo)通狀態(tài)的恢復(fù)程序中,仍然需要面對(duì)30多路輸出。每一路輸出都有自己的控制邏輯,在控制邏輯里既要看輸入信號(hào),還要看內(nèi)部狀態(tài)。而且有的輸出還比較膈應(yīng)人,它可以被好幾個(gè)輸入信號(hào)同時(shí)控制,最終處于什么狀態(tài)要看這些輸入信號(hào)之間的優(yōu)先級(jí)。就是說(shuō),不僅要看信號(hào)的當(dāng)前狀態(tài),還要看它的歷史狀態(tài)!
從理論上來(lái)講,硬扛不是不可以。一共30多路,余生還長(zhǎng),鼓起勇氣一路一路來(lái)唄。程序上電運(yùn)行后,將各個(gè)輸入信號(hào)的歷史狀態(tài)、先后次序都存儲(chǔ)下來(lái),并實(shí)時(shí)更新。在異常電壓關(guān)斷保護(hù)之后的恢復(fù)程序子分支中,再把每一路的控制邏輯都重寫一遍。
從實(shí)踐上來(lái)看,這種方案簡(jiǎn)直笨的離譜。老衲花了半天功夫,弄了一路輸出之后,測(cè)試了一番,發(fā)現(xiàn)這一路也沒有恢復(fù)對(duì)。
這路輸出有四種控制邏輯,可以通過zigbee信號(hào)控制,輸出形式是常開,通過RS485控制,則應(yīng)該是閃爍,通過一個(gè)傳感器控制,則應(yīng)該是頻率更低的閃爍,也可以通過一個(gè)本地開罐直接開通或者關(guān)斷。這四種信號(hào)的優(yōu)先級(jí)是最簡(jiǎn)單的那種:最后出現(xiàn)的信號(hào)說(shuō)了算。這里沒有恢復(fù)對(duì),顯然是因?yàn)槲蚁惹按鎯?chǔ)歷史狀態(tài)時(shí),把這些信號(hào)的先后次序搞亂了,但是信號(hào)這么多,程序搞得這么亂,出錯(cuò)也是理所當(dāng)然。
剛弄了一路還沒弄對(duì),關(guān)鍵是還有那么多路,我滴個(gè)乖乖,這豈止一個(gè)麻煩了得!
想通了這一點(diǎn)之后,老衲的意志在一剎那間崩潰了。
崩地那么猝不及防,以至于很長(zhǎng)一段時(shí)間,我都深陷在椅子上,“關(guān)斷”了自己的大腦輸出,再也不想恢復(fù)。
3
魯迅先生說(shuō),這世上本沒有路,走的人多了,自然就有了路。
在被幼兒園的小戰(zhàn)士重新鼓舞了斗志之后,老衲的“小我”在腦海里左沖右突,尋找晦暗的出路。
顯然,必須讓輸出通道的恢復(fù)邏輯和平時(shí)的控制邏輯有所區(qū)隔,才能從那么繁復(fù)的控制網(wǎng)絡(luò)中解放出來(lái)。
古龍說(shuō)過:最高明的招數(shù)就是沒有招數(shù),以無(wú)招勝有招。金剛經(jīng)曰:菩薩無(wú)我相,無(wú)人相,無(wú)眾生相,無(wú)壽者相,方能成道。
那么,最高明的恢復(fù)邏輯就是沒有任何邏輯,讓這三十多路輸出通道恢復(fù)時(shí)不遵從任何邏輯,不就是最為高妙的“邏輯”嗎?
很快,我就順著佛陀的開示思路開展了下去。
大路千萬(wàn)條,最妙的是老衲這一條。我只需要在MCU的輸出控制端口上做文章,當(dāng)電壓異常時(shí)禁能MCU端口的輸出功能,電壓恢復(fù)正常時(shí)恢復(fù)MCU端口的輸出功能,就整齊劃一、簡(jiǎn)明有力地實(shí)現(xiàn)了異常電壓下的輸出保護(hù)、正常電壓下的輸出恢復(fù)。
管它電壓異常時(shí)處于導(dǎo)通狀態(tài)還是關(guān)斷狀態(tài),管它的控制信號(hào)狀態(tài)如何,諸信號(hào)間的優(yōu)先級(jí)如何,通通不重要。關(guān)斷保護(hù)前是導(dǎo)通狀態(tài),禁能了MCU的輸出就自動(dòng)起到了輸出保護(hù)作用,恢復(fù)時(shí)也能自動(dòng)恢復(fù)導(dǎo)通狀態(tài)。關(guān)斷保護(hù)前是關(guān)斷狀態(tài),禁能MCU的輸出后還是處于關(guān)斷狀態(tài),相當(dāng)于做了個(gè)“雙保險(xiǎn)”,恢復(fù)時(shí)還是自動(dòng)恢復(fù)關(guān)斷狀態(tài)!
老衲再一次被自己的佛學(xué)素養(yǎng)驚呆了。只有不遵從任何產(chǎn)品功能上的邏輯,才是最為簡(jiǎn)潔的邏輯,更為關(guān)鍵的一點(diǎn)是,這種實(shí)現(xiàn)方案還能被應(yīng)用在其它任何產(chǎn)品的異常電壓保護(hù)上。
誰(shuí)說(shuō)工程師學(xué)佛沒用來(lái)著?
4
以這種近乎離奇的方式實(shí)現(xiàn)了異常電壓保護(hù)功能之后,一直善于內(nèi)省的老衲又開始“向內(nèi)尋求”,總結(jié)經(jīng)驗(yàn)教訓(xùn)了。
在技術(shù)問題上,首先還是要克服畏難心理,把畏戰(zhàn)怯戰(zhàn)情緒盡量壓制住??縿?dòng)腦袋解決的事兒,必須先鼓足了心勁,堅(jiān)定意志,好好地把腦袋磨尖,才能在技術(shù)上深入地向下鉆。
其次,人的思路總是有自己的局限性。就像老衲在這里把思路局限在產(chǎn)品的功能邏輯上一樣,像是蒙了眼的驢一樣,來(lái)回地兜圈子。殊不知,跳出這局限,還廣有一番洞天。
說(shuō)到底,還是破除“執(zhí)著”。真正的高手,解決問題時(shí)從來(lái)不局限在兵器上,刀槍劍戟斧鉞鉤叉,哪個(gè)趁手用哪個(gè)。也不局限在一招一式上,縱橫捭闔如行云流水。只靠三板斧的笨功夫,在工程師這條道路上只會(huì)越走越窄。
思路上盡量開闊,不要粘滯在一隅。在這上面,我們還是要取法自然,多看看荷塘里盛開的荷花和蓮葉,多看看掛在天邊的月亮。仔細(xì)體會(huì)體會(huì)這兩句明言:猶如蓮花不著水,亦如日月不住空!
水珠在蓮葉上滾來(lái)滾去,絲毫也不粘滯。彎彎的月亮掛在天邊,但是我們能明顯地體會(huì)到它并沒有“住”在虛空里。
這對(duì)我們工程師,不正是很好的啟發(fā)嗎?多說(shuō)無(wú)益,望諸君善思之!
評(píng)論