我看“软件隐喻(metaphor)”

Sina WeiboBaiduLinkedInQQGoogle+RedditEvernote分享




在《Code Complete》开篇,作者就强调了隐喻对于理解软件开发的重要性,例如有些人理解软件开发为盖房子,有些人理解为种地。不同人有不同的看法,而软件隐喻能力对于研发人员意义重大,本人切身体会,深以为然。

每个人的大脑有差异我觉得可以这样类比,硬件部分:

CPU主频,有些人脑子转得快,另一些人不太灵光。

多核、单核CPU,少数人能可以处理多任务,大多数人在同一时刻仅仅可以干一件事情。

缓存,有些老大可以瞬间记录数十位长度的数字,大多数普通人可以记录十多位。

硬件差异,爹生娘养没有办法,也只能没事干多吃点核桃。因此软件部分的开发对于个人成长显得更为重要,而其中隐喻子系统作用很大。隐喻其实更确切的说是类比,即将不熟悉的空间的事物映射到熟悉的空间中,这样才能进步或者称为积累经验。对于不同事物,隐喻的难度不尽相同。例如,对于我来说隐喻难度从低到高的依次是链表、二叉树、递归、最短路径算法、英语。

链表很好理解, 任何吃过糖葫芦的普通人(不必是理工科毕业)很快就可以明白,而二叉树在现实世界中就没有了,但是可以通过简单的图画加以类比。至于最难的英语,没有西方人的思维逻辑以及环境对大部分国人来说很难。当然人的软件隐喻系统差异很大,有些人的隐喻系统天生对于英语就可以很好的类比,于是就学的好,学得快(我等推卸学习责任的借口)。

隐喻能力是快速理解知识融入工作的重要能力,我觉得这种能力是可以培养的。我的粗浅的经验是涉足的领域越多,可以用于隐喻的素材越多,例如在嵌入式系统开发中如果可以应用以前的数据库系统开发的经验作隐喻,则可以快速理解应用。同理理工知识之外涉足人文或许对于隐喻也有帮助,因为虽然学科不同但是逻辑思考是类似的,这个论断被英文专业的新东方老师王强验证过,我想这也是很多理工大师有深厚的文学造诣的原因吧。

另外,隐喻是可以总结的。将机器码映射为汇编就是一大创新。同理汇编映射为c,c映射为脚本语言等等都是隐喻系统的演进。更高层次的隐喻有设计模式的总结等等。

牛人的大脑硬件系统同常人固然有差异,但是笔者觉得人的认知差异和理解水平更大的差异在于隐喻软件子系统,例如被誉为最聪明的人数学家陶哲轩,除了硬件超长,我觉得其在数学方面隐喻系统和平常人相比应该处在云端。

(10个打分, 平均:4.40 / 5)

雁过留声

“我看“软件隐喻(metaphor)””有11个回复

  1. 邓侃 于 2010-04-19 3:30 下午

    是不是可以理解为,隐喻就是联想,就是融会贯通?

    融会贯通,这是理解的程度比较深入的一个表象。

  2. peter 于 2010-04-19 6:01 下午

    赞同楼上的看法,隐喻这个词有点牵强。

    融会贯通,举一反三更会合理一些,更白一些,就是将看似没有关联的事物联系在一起。

    英文是最高形式的隐喻,的确很调侃:)

  3. appleleaf 于 2010-04-19 6:05 下午

    我的理解隐喻是联想,属于将未知领域的概念模型关联到已知领域之中。如果幸运,关联成功,则可以牢记甚至有大的创新,例如苯分子环、DNA双螺旋结构的发现就是例子。

    如果联想不成功则很难记忆,简单的如二进制,我如果提问什么是补码、什么是异或估计很多计算机毕业的也答不上来,原因在于人有10个指头,而现实世界没有二进制。

    这里的关键在于隐喻的观念可培养,经验可积累,作用很重大。

  4. 逆流而上 于 2010-04-19 9:19 下午

    嗯,隐喻其实就是把现实世界不存在的东西,映射到现实世界中比较接近的模型,但这个隐喻可能由于各人经历、爱好不同而不同。比如我喜欢把架构和编程模型对应到战略规划,而把子模块内部的代码技巧等等对应为战术实施。

  5. appleleaf 于 2010-04-19 9:26 下午

    To 逆流而上, 个人经验不同,体会也不一样。
    例如在code complete中的隐喻很有意思,
    对于小的软件项目,可以用搭建狗窝来隐喻,找几个函数拼起来就行了。
    对于中等规模的项目,可以用架构建筑来隐喻,需要管线、暖气一应考虑。
    对于超大型项目,架构只在局部了,因为没有人类可以理解全部内容。这时可以用种地来类比体验,软件负责人基本上就看到一堆工程师在地里播种、除草、debug,秋天软件就长出来了。
    想想很有意思。

  6. ABC 于 2010-04-19 11:40 下午

    叶子同学在说开心网的菜地么?

  7. appleleaf 于 2010-04-20 12:27 上午

    不完全一样,这里是很多人一块种菜。

  8. been2100 于 2010-04-20 5:52 上午

    to:appleleaf前辈
    “种地”的那个在中是被成为“培植系统”。作者用“每次只做一点”来概括它。并且说“这个主意可能在某些方面和农作物生长十分相近,但把软件构建比作耕作就很不贴切,也没太多意义。”
    作者不认为“培植系统”这个隐喻适合大型项目,"建造软件(建造帝国大厦,盖房子,造狗窝)"适用于各种大/中/小项目。
    我曾在读书笔记中写下这样的段落:
    培植系统更注重每次做一点的理念。在没有架构或者架构简单的情况下,并不能实现核心。而是每实现一个功能就堆积到软件中,在堆积的过程中还有对软件和实现功能的小程序做做测试,修修架构,改改接口为了某个功能的实现。去掉一个或者修改一个以适应刚刚修正或刚刚明确的一个需求。
    把软件构建比作耕作就很不贴切,也没太多意义.原因在于人们很难把”耕作“这个隐喻引申到”每次做一点事情“之外。
    小步前进意味着进度较慢,但至少刚完成的功能是独立正确的,所以麻烦较少。这种方法不易空着,不能做太多的干预比如拔苗助长。
    ”耕作“隐喻的弱点正在于此,它暗示了人们无法对开发软件的过程和方式进行任何直接的控制。

    读了前辈的文章后,只有佩服的份,但看了前辈给”逆流而上“的回复,又有一点疑惑所以翻了书和笔记。
    或许前辈是对书中知识的更近一步的理解和引申,但我只是说了我自己的想法。有不对之处。还请前辈指出,指点。

  9. rhapsodyn 于 2010-04-20 7:43 上午

    我觉得比隐喻更能体现能力是类比。

    隐喻,按您的意思,应该是把软件映射成其他事物的能力。

    而我理解的类比,就是反向的操作:把其他事物映射到软件上的能力。

    真正的高人应该是用思考软件的方式思考种地:用表的方式划分田地,然后用表驱动解开每块地之间的耦合,让他们可以随时替换成其他作物等等。。。

    ;-)

  10. appleleaf 于 2010-04-20 4:05 下午

    been2100我也查来一下原文,你说的对,我的记忆有误,作者举出耕种是个反例,因为如果用耕种描述系统开发则隐含的意思是生长的过程不可控,靠天吃饭。这样同软件开发的过程不契合。

    还是使用后面的珍珠培育的比喻较好,通过层层的积累最终形成珍珠,可以类比迭代式的开发方法。

  11. appleleaf 于 2010-04-20 4:07 下午

    to rhapsodyn
    我和你的理解一样的,隐喻就是类比。
    不管那个方向映射,最终的目的是理解和牢记。