一场大雨引发的思考

昨日傍晚时分京城突降大雨,恰逢与同事去公司附近学校食堂吃晚饭,于是我一路狂奔,不过同事倒是淡定,慢慢悠悠,我就问他你不怕挨淋啊,他回答道,走得快走的慢,距离一样,淋的雨一样多啦。
这回答让我一愣,心里有些犯嘀咕。等到食堂开吃时,我的程序员病就犯了(打个伞就不淋了,非要钻牛角尖。。),于是我再次提出这个问题:

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还是很有借鉴意义的。

还是那句话,想做系统级程序员,广阔的思路永远比知识更重要!

但求好事,莫问前程!

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页