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