• 软件设计的一些感想
    时间:2012-09-06   作者:everdom   出处:cnblogs.com/everdom

    已经好久没有写博客了,不是因为没有学东西,而是因为学的东西不够系统,不够具体,没有整理起来(外加人懒),所以不想浪费笔墨。所以一直潜水。。但总会有感想的,在学习的过程中,时常会遇到一些令人惊喜的东西,令人拍案叫绝的东西,但学会之后觉得简单或者不值一提,于是没有当机立断写出一些洞见。事后用的时候倒觉得理所当然了。

          其实这是要不得的,学习的过程我认为不应该是纯粹的吸收,而是要有选择的过滤,留其精华,去其糟粕,如果能加入自己的总结就更好了,只可惜我在很多时候忘记了这事儿,或者在很多时候没有空下来专门做一次如此认真的总结。但在技术的层面上,一般的说法是,任何一种技术都是基于某种设计思想,而至于用什么来具体实现并不是最重要的。其实思想和设计不能用简单的一对一和一对多关系来说明。经常会有人说一种思想可以衍生多种技术,其实他只说对了一半,因为一种技术并不只是一种思想的实现,而是多种思想的交融。

          拿软件设计来说,对于基于窗口的程序设计,我们有多种技术方案可以选择,在windows下有mfc,.net, wpf,在linux下有gtk, qt, wxWidgets,在mac下有cocoa, 但核心思想差不多,大多用到了mvc思想,但mvc思想本身也是一个组合思想,它组合了策略模式,观察者模式等。对于这样的一个设计思想来说,它其实是一个对设计的高度抽象。我甚至可以做这样一个奇怪的思考:如果将mvc模式套用到人身上,那么人所看到的就是view,人所想到的就是controller,人所使用的便是model了,那么针对一个人来说,他的基本动作可能如下:看到东西->产生需求->寻找工具来实现自己的需求。所以我感觉,软件设计有时更像对人的行为模拟,软件系统更像是一个虚拟的人(这个人的智商要看你给他多少知识和能力),或者说,软件设计归根到底是以人的认知来实现的,所以我们要划分模块,要理清各个模块之间的关系,要考虑它们之间的相互影响,还要考虑他们之间的交互。如果各个模块之间关系混乱不清,那么你将会的到一个很烂的系统,置于会出现什么结果,那就不得而知了。举个简单的例子:试想一下如果你吃饭咬到舌头了,却发现屁股痛,这是一件多么尴尬的事情。

          所以,软件的设计实际上是一个很复杂的事情,一个高超的软件更为复杂,因为你要考虑太多的情况,一个人是极其复杂的。但正如所有的物质都是由简单的原子组成的,所有的复杂性都能划分成最简单最基本的东西。就好比操作系统这样一个常人很难企及的东西,其实最底层也就六个操作,引用linux创始人linus的话来说就是:“你在UNIX上完成的大部分任务都是通过六个基本操作完成的,它们被称作"系统呼叫"(system call)。第一个基本操作是"创建子进程"(fork),一个程序把自身完全复制出来,这样你就有了两个相同的拷贝。第二个基本操作是复制出来的程序,再用一个新项目替换自己。其他四个基本系统呼叫--打开、关闭、读和写--都是为了访问文件的。这六个系统呼叫便组成了UNIX的简单操作。然后,你只需在程序之间创造出交流渠道(pipes),就能解决复杂的问题。”,那么归结到人身上,也就是那么几种:活动(身体活动和思维活动),新陈代谢,睡觉(纯属个人想法勿喷)。

          记得以前看bbc的纪录片《混沌理论》中讲到图灵的一段,图灵曾经提出一个伟大的构想:自然界由一个最简单的数学公式组成。这个理论促进了后来的“混沌理论”和“分形学”的研究和发展,包括著名的“蝴蝶效应”,也和“混沌理论”有关。我们都知道,图灵被称为“计算机之父”,而现代的软件设计方法和这种构想肯定存在千丝万缕的联系。所以,我认为,软件设计如果是一种把问题搞复杂的设计,那将是一个失败的设计。软件设计应该是将一个复杂的系统一步一步划分成“原子”的过程,而软件架构的目标应该是使每一个分块都容易理解而且容易改变(所谓的可维护性和可扩展性)。

          而对于人来说,人生活在一个“实体”的世界里,如果把人类的历史看作一天,那么人拥有真正的思想是在一分钟以前,所以上帝无法阻止人类用“面向对象”的方式来进行软件设计,也无法阻止程序员用mvc的思想来实现一个软件系统,因为这一切看起来理所当然。所以,无论你的技术多么高超,我都可以想象你在面对一堆复杂的算法和一堆鲜活的对象的时候的不同感受,因为我也可以感同身受:)。所有的人都喜欢用简单的方式解决问题(如果你不是,那你也许是公务员,:)),更喜欢用简单的方式解决复杂的问题,那样会有成就感,程序员是最佳案例。为什么说一个会偷懒的程序员是一个好的程序员?那是因为程序员的偷懒是对问题的抽象和扩展,对之前冗长而繁琐的解决问题的方式建立一个更为宽泛的适用模型,从而应对类似重复的问题。而所谓的抽象,便是思维的结晶。其实,抽象在各行各业都有应用,只不过在软件开发领域,这个词被提及的非常之广范非常之响亮,以至于成了某些编程语言的关键字。其实抽象是一个很宽泛的概念,它是一种对事物本质的提取过程(《数据结构》中有这样的定义),所以我觉得在软件设计中的抽象,可以运用到其他领域,在其他领域中的抽象,也能应用到软件设计中来。所以,没必要惊讶图灵是个数学家,或者唐纳德也是数学家...,因为从本质上来说,数学这门科学就是一种抽象科学,把自然界抽象成数学模型,而计算机就是对数学抽象模型的模拟器。

          胡说了一大堆,也不知从哪儿来的灵感,但作为一个软件工程师,我觉得这些东西是应该而且值得去思考的。上次看到一则博文讲到,这个世界由三种人推动:科学家,艺术家,工程师。也许这种说法并不一定正确,但至少说明了一个观点:工程师想要实现优秀的产品,必须懂得科学家和艺术家的抽象,因为那是他们的思维结晶。而一个好的工程师,从某种程度来说,也是一个科学家或者一个艺术家。

    网友留言/评论

    我要留言/评论

    相关文章

    从零开始打造完整评分系统:本文介绍了从零到完整的评分系统的进化,其中有些算法上的优化,值得参考。
    如何成为“天才”一员: 苹果内部秘密培训手册曝光:最近苹果的 “天才吧” 训练手册流出了,让许多想进入苹果零售店工作,并且想成为“天才吧”团队的粉丝大饱眼福。苹果会告诉它的新兵“天才”怎么去做、怎么去想,这里有着苹果独特的心理掌握、禁止言论、角色扮演、Dos和Don’ts, 都够当机器人大学的101课本了。但是苹果的主要目的就是让内部“天才”员工们了解顾客并让他们快乐。
    产品价值和用户体验:大家都知道产品价值和用户体验都很重要。有人说产品价值为王,有人说用户体验为王,那么产品价值和用户体验的关系究竟是怎样的呢?最近工作一直很忙,没时间写近期的工作感悟。抽点空闲,表达一下我的产品观:产品价值大于用户体验,用户体验决定产品成败。
    王垠:如何掌握程序语言:学习程序语言是每个程序员的必经之路。可是这个世界上有太多的程序语言,每一种都号称具有最新的“特性”。所以程序员的苦恼就在于总是需要学习各种稀奇古怪的语言,而且必须紧跟“潮流”,否则就怕被时代所淘汰。
    20个热门jQuery的提示和技巧:以下是一些非常有用的jQuery提示和所有jQuery的开发技巧。我分享这些,因为我认为他们将是非常有用的给你。声明:我没有写下面的代码,但已经从Internet收集各种来源。
    优秀设计师应当知道的20大UI设计原则:世界级图形设计大师Paul Rand(保罗.兰德)曾经说过:“设计绝不是简单的排列组合与简单地再编辑,它应当充满着价值和意义,去说明道理,去删繁就简,去阐明演绎,去修饰美化,去赞美褒扬,使其有戏剧意味,让人们信服你所言……”,由此可见,设计绝非轻而易举之事,优秀的设计更是难上加难,今日小编偶然发现一篇界面设计师Joshua Porter博客当中的一篇文章——《Principles of User Interface Design》,文章中列举了20大UI设计原则,看完之后,觉得挺受启发,于是试着将其编译,希望能够给广大设计师——特别是刚入门的初级设计师,提供较好的学习机会。
    程序员的时间换算表:一个曾经与我一起工作过的经验丰富的项目经理声称,他拿到程序员的时间估算以后,先将它乘以π,然后转化下一个时间数量级后,才能得到真正的值。1天转化成3.14周。他过去因为程序员不擅长估算时间而吃尽了苦头。我创建了一个用来翻译程序员时间估算的表格,来尽量缩小估算错误。
    心态和想法,是提高编程水平的关键:你是否有时候会觉得自己的技术水平停滞不前,想突破但又找不到门路?最近在stackexchange上看到了一个非常好的问答。有人问:你做过的最有效的提高你的编程水平的一件事情是什么?
    提升Android应用视觉效果的10个UI设计技巧:在Android应用开发中,风格和设计或许不是最关键的要素,但它们在决定Android应用成功与否上确实扮演重要的角色。以下是10个Android应用的UI设计技巧,还有个附加技巧,能够提供你的Android应用的视觉吸引力。
    Android 4.0设计初体验:Android系统是目前智能移动设备中增长速度最快的平台,但App的设计却没有形成自己的风格,绝大都数都是ios风格的移植适配。Google 在去年的10月份发布了Android 4.0 的界面规范,在样式、控件上都做了非常个性化的革新,但由于Rom的多样化,设备的不统一,新的4.0设计规范并没有得到广泛的普及。但以移动设备更新换代的速度,Android 4.0将会是趋势,与ios的差异性也会越来越明显。由于博主的性格属于典型的喜新厌旧,所以打算结合手上的项目做一个吃螃蟹的人…