庖丁解羊
----闲谈编程思想
作者:HolyFire
经过多年的编程,我发现编程的思想对一个程序员是至关重要的,以前拿到一个问题,马上就开始考虑如何来一点一点把他用代码来实现,于是啃啊啃啊于愁眉笼罩千辛万苦下每完成了一点就欣喜若狂。编着编着发现这里不足,那里没考虑到于是东补补西凑凑,异常蹩脚的完成了一个小程序,当时的感觉就像我完成了全世界,或许那个时代是我最开心的。
完成了四五个程序的我,开始发现我做了很多重复的劳动,于是乎开始做我的程序库,编写功能型模块。想到了这些模块只要写一遍就可以受用无穷不禁得意洋洋,或许那个时代我是聪明。
当我写了五六千行代码的时候,我发现我写的功能模块已经记不清什么是干什么的了,而我已经习惯使用别人写的比我好的模块时,我开始迷茫,我做的一切究竟是为了什么。这时我开始研究别人的代码,开始懂得什么是优化,什么是数据结构,什么是数学建模,我开始研究应用数学和软件工程。这时我开始使用C++用类来写程序,或许那个年代我是明智的。
当我写了四五十个*.h和*.cpp后,开始发现我写的类一点都不通用,无法再利用。我开始深入学习类以及面向对象,明白了继承和封装,这时的我才开始深深思考什么是重要的,于是我开始分析问题而不是一上手就开始编代码。或许以前的我是个傻瓜^_^。
我足足花了三年多的时间来浪费我的青春做了别人仅需一年的事情(当然着三年中我积累的经验不可能是一年能做到的,但是对于编程上的修养,我浪费的时间已太多),如果你们没有意识到这点,或许也会浪费很多时间。
分析能力对一个程序员来说是一个重要的属性,它直接关系到你对事物的理解能力和组织能力,程序员做的工作就是将一个事物分解成数学元素然后重新组织在计算机里重现,所以如何处理事物是个要点。
我们了解一个事物并进行描述的时候,往往是先处理它的一部分,接着处理另一部分,然后等所有的部分都处理完的时候,具体的事物就重现了。比如给一个不知道山羊的人介绍山羊,如果你对他说山羊就是山羊,他是无论如何都不会明白的。如果你说山羊是一种有四只脚的脑袋上有两只角,还有短短的尾巴,那他模模糊糊会有些形象在脑海里了,如果加上有绒绒的毛,可笑的胡子,咩咩的叫的食草动物,至少他不会和牛混淆起来,如果你能描述的更详细更好,那他有九成知道山羊是什么样子了,当他看见山羊的时候就会立刻明白。对于什么都不懂得计算机你不用说明什么,但是要是别人或者几年以后的你自己能看明白你的文档,详细的说明是必须的。而从上面的过程看来,将事物分成小块来处理是个好办法,我们把这个过程叫做划分。当然划分是可以继续下去,将划分的小块继续划分直到不能划分为止。当然要对一只山羊划分需要一个对山羊有着全面了解的人,所以划分你的问题的时候要对问题有全面的了解。看上去这对一个还没有了解这个问题的人是一个矛盾,划分一个事物有助于了解这个事物而要很好的划分却需要对事物充分的了解。于是我们要有所改变,要改变的是我们的做法。我们先粗略的了解问题,然后粗略的划分一下,将划分的模块再粗略的了解一下,然后将它粗略的划分,等到都成为不可划分的小块时,我们再来组织它。而且这个时候,我们对问题已经有全面的了解了,这时候我们将小块的重复部分扔掉(一般一定会有重复的部分),然后将这些小块重新将问题组合起来,想一下将一只大卸八块的山羊组合起来,哈哈,一定是活不过来了,不过有羊肉吃也不错。如果你很顺利的组合起来了,表示你很好的划分了这个问题而且了解的很透彻,以后的事将会一帆风顺,你这时脑袋里一定充满了解决这个问题的方案,已经跃跃欲试了。不要急,聪明的人会仔细的将划分的过程多看几遍,重组的方法多试几种,这不但对以后和编程有好处,也是更好解决方案的起点。
现在我们来解剖一只山羊,如果你愿意还可以细分,动物爱好者请回避。
山羊
-> 脑袋
-> 躯体
-> 四肢
-> 尾部
脑袋
躯体
四肢
尾部
-> 五官
-> 胸
-> 两只前肢
-> 尾巴
-> 胡子
-> 腹
-> 两只后肢
-> 绒毛
-> 绒毛
-> 背
-> 骨架
-> 骨架
-> 内脏
-> 绒毛
-> 骨架
五官
-> 耳朵
-> 眼睛
-> 鼻子
-> 嘴巴
内脏
-> 心
-> 脾
-> 肝
-> 肺
-> 胃
-> 肠
-> 肾
前肢
后肢
-> 脚
-> 脚
-> 绒毛
-> 绒毛
-> 骨架
-> 骨架
最后我们得到的是:
山羊 脑袋 躯体 四肢 尾部 脑袋 五官 胡子 绒毛 骨架 躯体 胸 腹 背 内脏 绒毛 骨架 四肢 两只前肢 两只后肢 尾部 尾巴 绒毛 骨架 五官 耳朵 眼睛 鼻子 嘴巴 内脏 心 脾 肝 肺 肾 胃 肠 前肢 脚 绒毛 骨架 后肢 脚 绒毛 骨架
去掉重复的部分:
山羊 脑袋 躯体 四肢 尾部 五官 胡子 绒毛 骨架 胸 腹 背 内脏 两只前肢 两只后肢 尾巴 耳朵 眼睛 鼻子 嘴巴 心 脾 肝 肺 肾 胃 肠 脚 脚
最终的不可划分的子模块:
胡子 绒毛 骨架 胸 腹 背 尾巴 耳朵 眼睛 鼻子 嘴巴 心 脾 肝 肺 胃 肠 脚
现在我们将它重新组合一下,是不是很简单的就完成了。而且我们需要处理的东西并不多。现在我们来用数学元素来描述一下
胡子: 数量不多的多种形状的轮廓,有各种颜色
绒毛: 非常多的多种形状的轮廓,有各种颜色
骨架: 多种形状的轮廓,有一种颜色
胸: 某形状的轮廓,有一种颜色
腹: 某形状的轮廓,有各种颜色
背: 某形状的轮廓,有各种颜色
尾巴: 某形状的轮廓,有各种颜色
耳朵: 最多两个的某形状的轮廓,有各种颜色
眼睛: 最多两个的某形状的轮廓,有各种颜色
鼻子: 最多一个的某形状的轮廓,有各种颜色
嘴巴: 某形状的轮廓,有各种颜色
心: 某形状的轮廓,有一种颜色
脾: 某形状的轮廓,有一种颜色
肝: 某形状的轮廓,有一种颜色
肺: 某形状的轮廓,有一种颜色
胃: 某形状的轮廓,有一种颜色
肠: 多种形状的轮廓,有一种颜色
脚: 多种形状的轮廓,有各种颜色
现在我们又得出了数量、轮廓和颜色这个三个元素,他们是所有元素都有的共性,我们找到了组合山羊的最小划分,虽然在科学上这不是正确答案,但粗略地表达一只山羊这已足够。好,虽然历时不多,我们在脑海里已经解决了这个问题。
2001/8/05
丁宁