CSDN - 文档中心 - 其他 标题 * 软件开发高手:十年磨一剑* beiyan(原作) 关键字 software design development 设计 开发 要成为武林高手,需要长时间的勤学苦练。要成为软件开发高手,又需要多长时间 呢?《Modern C++ Design》的作者Andrei Alexandrescu认为:一个人有可能在20 几岁就成为编程高手,但要成为设计高手却需要熬到35岁左右。以23岁大学毕 业计算,要经过漫长的12年时间。 以我个人为例(我尚不敢自认是设计高手),22岁大学毕业后,在某研究所用 8086汇编语言写一些小规模的程序,颇觉得心应手。凡是能用流传图表示的问 题,都似乎不在话下。工作中,与同事共同切磋结构化程序设计,并能有意识地用 于实践中。 三年后,承接一个纵向课题:在Windows上开发一个交互式排版系统。用Windows SDK开发。兴奋之余,自然想起用结构化方法进行设计:把整个系统当成一个黑盒 子(black box),输出当然是排版结果,不管是什么格式,输入是···。我卡住 了。难道用户操作是输入吗?但用户操作有那么多,怎么表示呢?系统的数据流图 该怎么画?数据字典该怎么写?和同事讨论n次后,仍不得其解。懊丧之余,先模 仿Quark Express搭个界面吧。然后研究排版算法。程序结构经过至少三次大规模 修改,终于能排出一些版式,并在两年后通过了鉴定(鉴定后当然是将其束之高 阁)。我从中体会到结构化开发方法不适合开发交互式系统。在开发初期,你不太 可能正确地画出数据流图,而结构化设计方法完全依赖数据流图。数据流图发生改 变,整个程序结构就要随之改变。 后来,加入一家合资公司,担任开发组长,有五、六个组员。这时我已读过了邵维 忠等译的《面向对象的分析》、杨芙清等编译的《面向对象的设计》和《Code Complete》中译本。对面向对象的程序设计虽有所了解但仍是一知半解。 首先,我们用MSVC 1.5开发一个图形编辑软件。我用纸画了20几张对象图,与同事 讨论通过后,开始编程。有人负责数据模型,有人负责用户界面,有人负责图形显 示。几个月后,老板已可向潜在用户进行展示,反应良好。老板和开发人员都被一 种兴奋的心情笼罩着。我们不断地加新功能,老板不时地到展览会上做演示。功能 加齐了,开始让潜在用户试用。老板和我们都松了一口气:就剩下改错了,咱们是 兵来将挡、水来土屯,没什么可怕的。错误报告来了。我们信心满满地开始查错改 错。有些错误很快地被改掉了。但最后我们发现错误源源不断。改了一个错误有可 能引起别的错误。软件永远达不到能用的地步。最后,时机被错过。该软件不得不 被砍掉。懊丧之余,我们做了反省。大家都认为应尽早改错。同时模模糊糊地觉得 数据模型和用户界面的程序一定要严格分开,否则程序极难修改。 后来,我们又开发一个类似Adobe Acrobat Exchange的PDF文件浏览器兼编辑器 (当时Acrobat Exchange还不能显示中、日、韩文)。这时,老板带来一些过期的 《C/C++ Users’ Journal》《Dr. Dobbs’ Journal》杂志。从书评中,我被几本书吸引 住了。一本是James Rumbough等著的《Object-Oriented Modeling and Design》, 一本是现在大名鼎鼎的《Design Patterns》,还有就是Scott Meyers著的 《Effective C++》和《More Effective C++》。我劝说老板买了这几本书,并撺掇他 买了一个CASE(计算机辅助软件工程)工具:Select OMT。 仔细研读这几本书后,颇有顿开茅塞之感。最大的收获在于了解到降低类之间耦合 度的重要性。一个类的实现细节发生变化,不应该影响使用该类的其它类的内部实 现。更妙的是有不少Design Pattern能马上用到我们的软件中。 我用Select OMT软件画了一些高层的类图、状态图和数据流图等,并让同事们审 查。同事们都觉得通过这些图对软件的总体设计有了更好的把握。在写程序的过程 中,我们不断调整程序结构以尽可能减小类之间的耦合度。老板很早就安排了专职 测试人员。发现问题,马上修改。一年后,我们的软件终于通过了用户的试用,卖 出去了。当时,我可说是信心满满。 此后,我做了一年半多媒体编程。发现还是对系统开发更感兴趣。于是加入了 Quark软件公司,开发一个基于CORBA的文件管理系统。这是我第一次参与异地开 发,也是第一次大规模使用STL。我惊叹于STL设计之妙,同时也对自己的信心打了 折扣。此后,我阅读了Martin Fowler著的《UML Distilled》、Bertrand Meyer著的 《Object Oriented Software Construction》等书籍。并开始使用Rational Rose。 Quark公司的技术文档管理、设计复查、代码复查、质量管理以及德国人(Quark公 司德国分公司)严谨的工作态度都给我留下了深刻印象。 项目组下分开发组和测试组。开发组中有一个4到5人组成的设计小组负责软件总 体设计,其中一个人负责技术文档,确保文档反映最新的设计。定期进行设计复 查。复查时,项目组成员全部参加,并可提出问题或建议。得出结论后,马上付诸 实施。 开发组下又设若干小组。小组内定期进行代码复查。由组长选出每个组员的源文 件,交其他组员复查,尽量挑出所有的毛病。如果代码太次,要打回从新写过。代 码复查既能保证软件质量,又是大家学习的一个机会。 一年半后,我离开Quark,加盟Sybase,参与PowerBuilder的维护和新版本的开 发。这是我第一次参与软件维护,令我认识到软件维护的重要性,认识到编写可维 护的代码是软件开发的一个重要课题。Sybase系统化的质量跟踪系统和用户支援系 统让我获益匪浅。在此期间,我阅读了《Large-scale Software Development in C++》、Martin Fowler著的《Refectoring》、Andrei Alexandrescu著的《Modern C++ Design》,Herb Sutter著的《Exceptional C++》和《More exceptional C++》,以及 Kent Beck著的《Extreme Programming Explained》等书籍。对软件开发与维护有了 进一步了解,但同时也更认识到软件开发之难。 回想十几年蹒跚走过的路,好像也略有所悟。试总结出以供参考: 1) 要熟练掌握至少一种编程语言。我觉得最好是C++。掌握了C++,学习其它语 言如Java或C#等并非难事,因为各种面向对象的程序语言尽管在语法上可能有很大 区别,在语义上却大同小异。 2) 不要寄希望于一次就把软件设计好。在开发初期,要尽量用最简单的设计实 现最基本的功能,以使你的软件尽早地能实际运行,不要过于拘泥于细节。这样你 才能尽早得到反馈,才能更直观更全面地理解你所面对的问题。你所关注的重点应 依次是Make it work, make it right, make it fast。 3) 软件结构要分块分层。低层模块不要依赖于上层模块。一个类、一个接口或 一个函数都应只做一件事。没有本质联系的类或接口就不应有耦合关系。举例而 言,要用MVC(Model View Controller)Design Pattern切断用户界面与数据模型 之间的直接关联。 4) 软件设计的主要工作是给类分配责任(responsibilities)。尽量不要把类 设计成控制者(controller),而要设计成协调者(coordinator)。控制者凡事 自己做,协调者让别人做。控制者的逻辑往往很复杂,难于维护;协调者逻辑简 单,易于维护。要站在类的使用者角度设计类的外部行为。要讲究一点软件美学, 即简单、清晰、一致、平衡等。 5) 了解并运用UML、Design Patterns、Unit Test、Design by Contract等。 6) 使用代码管理系统和质量跟踪系统。 //版本控制系统和bug跟踪系统 7) 了解各种软件开发过程控制方法,并找出适合你的方法。 8) 阅读经典书籍,研读经典代码,订阅杂志,与同行切磋。 在这行越久越觉得软件开发难。软件开发历史还很短,才50年,还不是一门系统化 的学科。有些人甚至认为软件设计与编程是一门艺术。但软件艺术大师还太少,而 且我们很难直接欣赏到他们的杰作,除非所有的设计文档和代码都公开。软件更容 易藏污纳垢。一个用户界面很漂亮的软件,内部设计和代码却很可能臭不可闻。一 个地板倾斜、墙壁裂缝、屋顶漏水的房子没有人会买。一个设计很烂的软件却可能 卖得不错。但这样的软件能撑多久呢? 软件设计与编程已经很难,而这仅仅是软件开发的一个方面,软件开发过程控制也 很难,也许更难。成为软件开发高手要走一条漫长的路,何日才能仗剑走天涯? 对该文的评论 agu/(2003-1-9 8:46:01)/ 看来我还是刚出道的阿!还有很长的路要走阿,何时才能磨一剑! 要达到削铁如泥要多久呢? gfh21cn/(2003-1-9 8:38:51)/ 代码管理系统和质量跟踪系统 是什么? gfh21cn/(2003-1-9 8:37:46)/ 不错,相比较起来,我可幸运多了,不要再去研究汇编了 wt13/(2003-1-9 8:31:34)/ 不可否认作者是高手。 不过高到这个程度就能开发PowerBuild?我表示怀疑 我没有用过PowerBuild,不知道它带不带编译器 vsking/(2003-1-9 0:16:42)/ 我还需7年才能磨好剑,大家一起来磨剑 liuty2006/(2003-1-8 23:17:43)/ 不错! 没有多年的实际经验,也不会有深刻的体会 BlueTrees/(2003-1-8 23:11:50)/ 我还差5年才能磨好剑,继续磨,大家一起加油磨。 Entermaner/(2003-1-8 22:19:09)/ 2000年后的今天,相对于作者靠着十年磨一剑的精神而得到的像:面向对象、 MVC、Patterns等等经验,却早已是最基本的软件设计方法而已了 (当然,并非否定作者,而只是现在的我们还有更多更新的方面需要我们去努力) 5200/(2003-1-8 22:07:23)/ 靠 那你现在站在什么位置啊 netseek/(2003-1-8 22:04:05)/ 做软件最重要的是“坚、忍”两个字,不断有问题出来,不断有新的功能要加入,坚 持,忍耐,会让你成为软件高手。 一点愚见。 smartread@263.net 60min/(2003-1-8 21:19:27)/ 写的好, 列举的书目很有用 佩服! _GodFather/(2003-1-8 19:52:56)/ 看起来C++就好像经典哲学一样学好就四通八达 leslin/(2003-1-8 18:36:33)/ 好文章,但写得有些像C++书的广告啊 :) majorsoft/(2003-1-8 18:05:23)/ support !~ Befresh/(2003-1-8 15:06:54)/ 其实从需求 ——〉体系结构的设计是最重要的一步,无论你准备用什么过程来开发。 体系结构的设计决定了软件的最高质量。