昨日傍晚時分京城突降大雨,恰逢與同事去公司附近學校食堂吃晚飯,於是我一路狂奔,不過同事倒是淡定,慢慢悠悠,我就問他你不怕挨淋啊,他回答道,走得快走的慢,距離一樣,淋的雨一樣多啦。
這回答讓我一愣,心裡有些犯嘀咕。等到食堂開吃時,我的程式員病就犯了(打個傘就不淋了,非要鑽牛角尖。。),於是我再次提出這個問題:
2個人下雨天由公司去食堂吃飯,一個走的快,一個走的慢,哪個淋雨少。
飯間我想到瞭解決方法。我覺得還是很有意思的,有必要記錄下。
首先說呢,這是問題有複雜的環境因素,所以我能想到的是先將這個問題抽象成一個數學問題,也就是數學建模。
將一些複雜的影響因素,先假定為理想的因素。
這其中不確定的問題有:如何定義下雨,如何定義人的速度,如何定義人的受雨面積。
於是以上問題我先抽象成如下的數學問題。
假設公司距食堂200m,天正下雨(雨量穩定,雨與人行進方向垂直,雨是靜止參考物),雨量是1平方米內1秒有100滴,A以2m/s速度前進,B以1m/s速度前進,人的受雨面積一致,是1平方米,請問到達食堂時誰淋雨少。
抽象成了數學問題,就會與實際問題有所偏差,但數學問題的結果對實際問題還是很有參考意義的。
人的受雨面積是1平方米,可以解釋為一個人在雨中待1秒,會收到100滴雨。
根據這個數學問題,A速度是2m/s,則其走1m是0.5s。B速度1m/s,走1m是1s。
分析到這裡,靈光一閃,想到了核心調度的核心思想,宏觀並行,微觀串列啊。
把要走的200m分為200個1m來看,我們來看下每個人在1m內淋雨量,乘以200,就是總的淋雨量啦。
A走1m用0.5s,可以想象為A在1m內停留0.5s,而人的受雨面積是1平方米,
則A走1m淋雨50滴。
同樣道理,B走1m淋雨100滴。
想到這裡,我突然想到,這個問題完全可以簡化為如下:
A站在雨中100秒,B站在雨中200秒,誰淋雨少。
答案夠明顯了吧,哈哈。
不管我這套方法對錯,由實際問題進行抽象,一步步簡化問題,這個思路對我來說還是很寶貴的。
在平時的工作中,除了嵌入式系統的開發移植,debug也是一個很重要的工作。在解決一些linux kernel系統級的bug時,可能不像某個driver的bug那麼明確好定位,有時會不知道從哪裡下手。
我的感覺,解bug的思路跟淋雨問題的解決思路是一樣的,抽象簡化,可能這個問題有很複雜的異常現象,從這個複雜的異常現象不好debug。
可以先找一個簡單的異常現象入手,抽絲剝繭,肯定會找到bug所在。
之前遇到的一個奇葩bug就是這樣來解決的,連結如下:
http://blog.csdn.net/skyflying2012/article/details/44623515
淋雨問題的這套思路我不敢保證是最好的,畢竟是即興想出來的。
但是我覺得解決這個問題,我想到的數學建模,由繁入簡的思路一定是沒錯的,這對於平時工作中debug還是很有借鑒意義的。
還是那句話,想做系統級程式員,廣闊的思路永遠比知識更重要。
但求好事,莫問前程。