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