`
laorer
  • 浏览: 435723 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

<转>软件开发,代码是核心

阅读更多

软件开发,代码是核心

2007-08-20 来自:lizhe1985  [收藏到我的网摘]

http://sd.csdn.net/page/52c1012a-8174-459c-9a9c-f0ca38b19001

在一个有效的组织中,必定拥有杰出的一线人才。软件设计也是一样的,一线人才的素质决定了软件的质量。从敏捷的观点来看,代码是检验软件过程是否有效的最终标准。目前为止,以及在短时间的未来,我们都不太可能完全脱离代码进行软件设计。所以,软件过程中的任何一个活动都是为了能够产出优秀的代码。所以,代码才是核心。

1. 代码是软件开发的基础

  编码是软件开发过程中最基本、最底层的技艺,然而也是最重要的技艺。任何一个领域的专家都需要花费大量的时间来进行基本技艺的锻炼,木匠需要花费大量的时间来锻炼他们对各种工具的掌握,厨师则需要练习刀工和火候。程序员也是一样的,对我们来说,语言的各种特性必须要了然于胸。而对软件的管理也需要从代码做起。

  从2000年到现在,国内兴起了一股软件工程热,需求管理、配置管理、甚至CMM。面对纷至沓来的各种方法学、UML、OOA,大家似乎已经热衷于这些概念本身了,却往往忽略了软件开发中最基本的元素-代码。在和很多软件组织的接触过程中,我们认为大多数组织急切需要的并不是这些工程理论,不是说这些理论不重要,而是这些组织的症结不在于此。很多的组织连代码的质量都管理不好,又何谈其它呢?代码管理是基础的基础,从管理的角度上来看,任何一个组织的管理都需要一个从上至下的管理过程,有基层的管理人员,也有高层的管理人员。对代码的管理就是软件开发中的基层管理,它起到的作用就是能够把需求、设计的思路贯彻到最终的代码中。

  "管理无大事"。对软件的管理也是一样,大部分的问题都是由于很小的原因引起的。例如,一个产品如果后期在debug上花费了大量的时间,那么,这种现象是由于什么原因引起的?一种可能的原因是前期的代码设计中对代码质量的把握不严。每一次代码功能的演化并不会产生太多的问题,但是当代码累积越来越多的时候,问题也就慢慢出现了。那么如何解决呢?可以加强QA的力量,也可以引入复审,还可以引入单元测试。总之,要有一种方法对代码进行控制。

  软件的开发过程就象是一部精密的机器,任何一个环节的变化,都会对其它的环节产生影响。把软件过程按照瀑布的形式进行划分是一种分解的处理思路,但同时我们还应该看到不同活动之间的相互影响。软件开发中的生命周期模型也是一个层次模型,从业务建模一直到软件实现,需要跨越数个层次,同样会出现执行不力的情况,例如,代码设计偏离需求、偏离设计的情况比比皆是。

  如何避免这种情况呢?这就需要我们从源代码的角度,反思其上游的实践活动,是否足以约束代码设计?就拿XP来说,他解决这个问题的方式是尽快的进入代码开发阶段,从代码开发中发现问题,并在下一轮的开发中解决。这种思路是正确的,但XP毕竟是方法论,他不会告诉你过于细节的东西,尽管XP已经提供了大量面向代码的实践。因为方法论的抽象级别比较高,使得他必须舍弃部分的细节。而这篇文章告诉你的,就是这些细节。就像我们在下一节中讨论的例子,需要在代码中加入对异常的处理,那么,异常的源头在哪里呢?是需求,在需求中,我们发现了一些业务的非正常的处理序列,发现了一些业务实体的限制性的要求,所以在代码实现中,就需要有相应的异常处理。在例如,一个优秀的异常处理,还需要让客户端程序员了解可能发生的异常,以保证不同代码间正确的集成。

2. 面向对象的代码

  面向对象的代码已经在现在的软件开发中占据了主流的位置,面向对象的思路也有其优势所在,就像后文所讨论的,面向对象代码有着非面向对象代码的很多优势,而软件业中很多新的思潮的产生,也都是基于面向对象语言的,所以我们关注的代码将是面向对象代码。

  面向对象的思想来自于抽象数据类型。对于面向对象来说,它最重要的改进就是把世间万物都描述为对象,而类则描述了同一种对象的特征,而不是像传统的开发方法那样,按照机器指令的执行顺序来进行设计。当然,面向对象代码最终仍然是要按照时序来执行的,但是从程序员的角度看来,面向对象代码更侧重于对象之间的交互,多个对象各司其职,相互协作以完成目标。而面向对象技术的发展,也是朝着更加贴近我们世界观的方向发展。从这点来看,有人说完全没有程序设计经验的人学习面向对象可能会更加的容易,因为他不需要从原先的时序程序的桎梏中摆脱出来,但这未必是事实。面向对象决不是一种简单的程序设计思路。这是我们的观点,也会在下文中反复的论证。

  和所有的职业一样,程序员,或者是面向对象程序员,始终坚持的一点就是严谨。你会看到各种各样优秀的代码,但那决不是一次能够写成的,要不断的尝试,不断的改进。为什么重构和测试优先是敏捷方法中很重要的一项实践?因为程序员不是神,他们需要慢慢改进他们的代码。虽然罗马不是一天能够建成的,但是在编写面向对象代码的过程中,有一些实践是需要坚持的,它体现了我们所说的严谨。

3. 编写并管理面向对象的代码

  编写优秀的面向对象代码并不是一件容易的事情,优秀的OO代码如行云流水,糟糕的OO代码让人觉得浑身起鸡皮疙瘩。编写优秀的OO代码要求程序员有一定的自我修养,能够以抽象的思路看待问题,找到问题的核心并对问题域进行分解。它强调的是一种解题的思路,但这个解不是唯一的。

  典型的例子是设计模式,设计模式确实给了我们以很大的启发,通过它,我们能够了解到优秀的代码是如何用于解决实际问题的。但是是不是你必须在软件中照搬设计模式呢?如果你这么做,那么你对设计模式的理解仍然不够。我曾和在建筑行业的朋友聊起Christopher Alexander的建筑的永恒之道。他很兴奋的告诉我,那确实是一本很好的书,能够引发人很深的思考,但是现在也有另外的一种观点,认为美仍然是无形的,应该发自建筑师的内心。对这句话我思考了很久,其实建筑是给人使用的,因此最重要的是它能都给人带来的价值,隐含在其中的那种活生生的气质,这是建筑师文化底蕴的外在表露。所以,Christopher Alexander在那本书中的目的,也是为了找到一种总结自己观点的方法,来总结自己对人文的认识。至于现在大家对他的思路提出了质疑,那也是一件好事,这说明大家对建筑之道的认识到了新的高度。建筑是这样,软件中的模式也是一样的,我也曾热衷于研究模式的使用,直到某一天我猛然惊醒,与其沉迷于模式的表面形式,为什么不去研究隐藏在它背后的文化底蕴呢?武侠小说中常说无招胜有招,模式的应用也应当到达这个境界,你如果可以在不经意间应用模式的思想,那又何必拘泥于模式的形式呢?

  编写优秀OO代码虽难,但还有更难的事情,就是让整个开发团队都产出优秀的OO代码。我们刚才说了,OO对问题的解不是唯一的,但各个不同的优秀解汇集到一起,可能就是一个糟糕的解,这是风格和架构的问题。你如何在团队中制定制度,营造氛围,让优秀OO代码成为团队最终的成果?这些问题,在我看来,要比CMM难得多,这个问题并不是靠花钱就能够解决的。如果能够解决这个问题,这个团队的创造力一定是惊人的。

4. 面向对象软件开发过程

  普通的软件开发过程和面向对象开发过程有着很大的不同。回想我们在非面向对象中开发过程中,最经常采用的任务分配方法就是以软件模块为单位,这样的好处是分配简单,不同任务之间耦合程度低,容易操作。坏处是几乎无法做到重用,也缺乏整体性的设计。而面向对象软件开发则不同,它是以类、类集合作为基本单位的。类之间关系错综复杂(虽然我们提倡低耦合的设计,但类之间的关系仍然是相对复杂的)。这种情况下程序员之间相互协作的要求就非常之高,这种关系如果处理恰当,则能够完全体现出面向对象的威力,否则,那将会是一场大灾难,面向对象的软件开发过程要养成一些好的习惯:

4. 1 尽量简化和稳定客户端。

  个人编程可以是一种享受,但团队开发始终是一项严谨的职业活动,因此多考虑别人,不要设计复杂的接口,虽然你省事了,但这会给理解和使用你的接口和人造成障碍。

4.2 准备一份简洁的文档,并保持更新。

  随便一种形式的稳定,可以是代码,可以是UML图,也可以是纯粹的文字(估计没几个程序员喜欢这种形式)。只要它能够传达你的代码的目的,那就足够。记住,更新代码后,同时更新你的文档。过期的文档不仅是废纸这么简单,它会给其它人造成麻烦。切记!

4. 3 尽可能多的考虑异常和错误的情况。

  写出一个功能并没有什么,但是要把这个功能写的非常的完善那就很难了,因为你需要考虑各种各样的情况,正常的、非正常的。所以,写完一个类的定义应该是,完成编码和稳定,并通过原定的测试。

5. 基于面向对象代码的分析框架

  在一个开发过程中,往往有着多种复杂的因素:过程、技能、工具、规范、组织、个性。所有的这些,都会对最终的代码产生影响,对代码的成本和质量产生影响。软件最有价值的部分是代码,根据敏捷方法和精益编程的思路,除了代码之外的产出物,都不具有价值,或者说对最终用户没有价值。但它们都需要成本的投入,而我们应该考虑如何节省这些成本。

  要考虑如何节约成本,关键的因素就是需要分析两点:

  首先,哪些活动对代码的成本和质量有正面的帮助。如果一个活动对代码没有帮助,那么它就没有存在的意义。有一些软件组织实施了UML,但是开发人员画好了UML图之后,就把它仍在一边,仍然按照老的方式开发。这种的活动就没有任何意义,只是徒增成本。我们称之为有效原则。

  其次,如果活动对代码的成本和质量有正面的帮助,那么,这种帮助的价值足够大吗?是否存在其他的活动,其价值能够超出现有的活动呢?软件需求规约(SRS)对代码产生当然有帮助,因为它对软件要干什么进行了定义。问题是,SRS往往需要很大的功夫去制作、维护。有没有成本更低、效果更好的方法来替代它呢?用例技术是一种考虑方向,CRC卡片也是一种敏捷的处理思路。我们称之为更优原则。

  有了这两个概念,我们在后文中的分析将会以此为中心展开,讨论代码和过程、技能、工具、规范、组织、个性之间的关系。我们把它们之间的关系称为基于代码的分析框架。在下一篇中,我们选择一个实际的案例进行演练,然后我们从四个方面 -- 重用、优化代码组织、针对契约设计、业务建模 -- 来深入的分析该框架中的一些共通的特性。我们再次重申:软件开发过程是一个复杂的生态环境,我们没有办法对其进行机械的划分,我们能够做的就是把握平衡-成本和质量的平衡。

关于作者

  林星,辰讯软件工作室项目管理组资深项目经理,有多年项目实施经验。辰讯软件工作室致力于先进软件思想、软件技术的应用,主要的研究方向在于软件过程思想、Linux集群技术、OO技术和软件工厂模式。

分享到:
评论

相关推荐

    J2EE经典实例详解 <2>

    &lt;br&gt;&lt;br&gt;本书结合了作者丰富的美国IT工业的工作经验和多年的IT培训经验,是一部既适用于自学的参考书,又适用于培训的教程,可供计算机专业及相关专业的大学生、研究生,从事软件开发、电子商务开发的软件工程师和...

    J2EE经典实例详解 <3>

    &lt;br&gt;&lt;br&gt;本书结合了作者丰富的美国IT工业的工作经验和多年的IT培训经验,是一部既适用于自学的参考书,又适用于培训的教程,可供计算机专业及相关专业的大学生、研究生,从事软件开发、电子商务开发的软件工程师和...

    AppFramework数据库访问组件_代码生成插件_V1.1.rar

    18.0&lt;br&gt;1.23&lt;br&gt;&lt;br&gt;1.10&lt;br&gt;&lt;br&gt;每秒插入实体&lt;br&gt;&lt;br&gt;(20次insert)&lt;br&gt;41&lt;br&gt;21&lt;br&gt;1.95&lt;br&gt;&lt;br&gt;更新实体&lt;br&gt;&lt;br&gt;(20次单条update)&lt;br&gt;27&lt;br&gt;19&lt;br&gt;&lt;br&gt;SqlMap:24&lt;br&gt;1.42&lt;br&gt;&lt;br&gt;1.13&lt;br&gt;&lt;br&gt;查询结果集(平均101...

    Linux环境数据库管理员指南

    在Linux上安装MySQL 198&lt;br&gt;7.1 引言 198&lt;br&gt;7.2 安装 199&lt;br&gt;7.2.1 命名约定 199&lt;br&gt;7.2.2 二进制分发包的安装 201&lt;br&gt;7.2.3 RPM 分发包的安装 202&lt;br&gt;7.2.4 源代码分发包的安装 202&lt;br&gt;7.3 配置 204&lt;br&gt;7.3.1 安全...

    Python核心编程

    Chun (陈仲才) 著&lt;br&gt;&lt;br&gt;杨涛 王建桥 杨晓云 高文雅 等译&lt;br&gt;&lt;br&gt;《Python核心编程》&lt;br&gt;&lt;br&gt;原书名:Core Python Programming&lt;br&gt;&lt;br&gt;从书名:软件开发技术丛书&lt;br&gt;&lt;br&gt;Python是一种不复杂但很健全的编程语言。...

    BOS组件系统

    这个环境不仅使得软件的结构更佳,更进一步使得软件开发的性质发生变化—开发人员不再为特定的程序付出封闭的辛劳,他们写下的每一行代码现在都属于某个组件,因而总有可能在将来被复用。&lt;br&gt;&lt;br&gt;BOS还是一个动态的...

    <<重构>>的进阶版,修改代码的艺术

    《重构:修改代码的艺术》是软件开发领域中一本极具影响力的著作,它深入探讨了如何通过逐步改善代码结构来提升软件质量。在这个进阶版中,作者更深入地讲解了重构的核心理念、方法与技巧,旨在帮助开发者提升代码的...

    Access2000 Resize窗体自适应程序access2000

    &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;〖accResize1.0〗说明文件&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;一、【主要功能】&lt;BR&gt;实现窗口在缩放的时候各控件位置和大小自动调整功能&lt;BR&gt;二、文件列表&lt;BR&gt;&lt;BR&gt;resize.mde 控件缩放的核心代码&lt;BR&gt;testresize.mdb 测试...

    EMOS嵌入式操作系统基础

    基于uCOS-ii 的核心思想和核心代码,进行了如下改写:&lt;br&gt;&lt;br&gt;(1) 所有核心代码基于商业代码常用风格进行重写。结合笔者多年嵌入式软件开发经验总结进行重写和归纳。&lt;br&gt;(2) 提供MinGW仿真平台环境,无需基于...

    玩转校内&时间观念

    &lt;br&gt;&lt;br&gt; 开发初衷:&lt;br&gt; 2007年9月的一天,和好友西蒙漫步于中国矿业大学校园内,在谈及院实验机房记费软件时,萌生编写这样一款软件的想法:精确报时,累计计算机无故障工作时间…… &lt;br&gt;&lt;br&gt; 开发语言:&lt;br&gt; ...

    玩转校内&时间观念(终结版Ⅱ)

    和好友西蒙漫步于中国矿业大学校园内,在谈及院实验机房记费软件时,萌生编写这样一款软件的想法:精确报时,累计计算机无故障工作时间…… &lt;br&gt;&lt;br&gt;开发语言:&lt;br&gt;Microsoft Visual Basic 6.0&lt;br&gt;&lt;br&gt;核心技术:&lt;br...

    玩转校内[精简免安装版] Ver 2.4.27.95

    &lt;br&gt;&lt;br&gt; 开发初衷:&lt;br&gt; 2007年9月的一天,和好友西蒙漫步于中国矿业大学校园内,在谈及院实验机房记费软件时,萌生编写这样一款软件的想法:精确报时,累计计算机无故障工作时间…… &lt;br&gt;&lt;br&gt; 开发语言:&lt;br&gt; ...

    ubuntu终端命令+android 命令

    4. 系统消息相关命令:&lt;date&gt; 显示/设置当前时间、&lt;uptime&gt; 显示系统运行时间、&lt;arch&gt; 显示机器的核心构架、&lt;uname&gt; 显示操作系统信息、&lt;tty&gt; 显示终端名、&lt;last&gt; 显示登录/登出在履历、&lt;lastb&gt; 显示非法登录信息、...

    基于maven的scala与java相互调用的简单实例

    在现代软件开发中,多语言集成是常见的需求。本示例着重讲解如何在Java和Scala之间进行互调用,这是基于Maven构建系统的。Maven是Apache开发的项目管理工具,它可以帮助开发者管理项目的构建、依赖关系以及文档的...

    vtigerCRMv5.x 中文使用指南

    核心模块比SugarCRM开源版略有增加,包括:&lt;br&gt;&lt;br&gt;1、客户&lt;br&gt;2、联系人&lt;br&gt;3、产品/价格&lt;br&gt;4、报价单&lt;br&gt;5、线索&lt;br&gt;6、机会&lt;br&gt;7、订单(采购订单和销售订单)&lt;br&gt;8、发票&lt;br&gt;9、统计报表&lt;br&gt;10、统计图表&lt;br&gt;11...

    scala和java混合编译

    在现代软件开发中,Java和Scala是两种广泛使用的编程语言。它们各有特色,Java以其稳定性和广泛的社区支持而著名,Scala则以其强大的函数式编程特性及对Java虚拟机(JVM)的无缝集成受到青睐。当一个项目中同时包含...

    JavaClass二进制文件加密专家

    &lt;br&gt; 系统介绍&lt;br&gt; JavaClass文件加密专家是一款针对Java应用程序Class二进制文件加密的软件,系统核心由纯C语言编写,运行效率极&lt;br&gt;高。传统的Java程序加密的方式多为代码混迹方式,但是无论多么复杂的混迹方式,...

    OpenSceneGraph快速入门指导

    OSG 是一个跨平台&lt;br&gt;的开源场景图形程序开发接口(API)。本书特别地针对OSG 1.3 的版本。OSG&lt;br&gt;在3D 应用程序的层级中扮演着重要的角色。它作为中间件(middleware)为应&lt;br&gt;用软件提供了各种高级渲染特性,IO,...

    Cpush会员管理系统2007源代码

    &lt;br&gt;系统采用三层模式开发&lt;br&gt;后台功能模块有:&lt;br&gt;系统设置:系统基本设置 系统日志管理 添加自定义文本 自定义文本管理&lt;br&gt;帐户管理:批量更改C币 冲值流水帐 &lt;br&gt;C币交换比设置&lt;br&gt;会员帐户管理:帐户手动续费&lt;br...

    maven 配置多仓库

    在软件开发中,Maven作为Java项目管理和构建工具,其依赖管理的核心机制是通过仓库(Repository)来获取项目所需的依赖库。Maven默认使用中央仓库,但有时我们需要配置多个仓库,例如私有仓库,以提高依赖下载速度或...

Global site tag (gtag.js) - Google Analytics