高效程序员的45个习惯敏捷开发修炼之道
- 格式:doc
- 大小:235.50 KB
- 文档页数:22
敏捷开发原则
1、优先要做的是通过尽早的、持续的交付有价值的软件来使客户满意。
2、即使到了开发的后期,也欢迎改变需求。
3、经常性地交付可以工作的软件,交付的间隔可以从几周到几个月,交付的时间间隔越短越好。
4、在整个项目开发期间,业务人员和开发人员必须天天都在一起工作。
5、围绕被激励起来的个人来构建项目。
6、在团队内部,最具有效果并且富有效率的传递信息的方法,就是面对面的交谈。
7、工作的软件是首要的进度度量标准。
8、敏捷过程提倡平稳的开发节奏;发起人、开发者和用户应该能够保持一个长期的、恒定的开发速度。
9、不断地关注优秀的技能和好的设计会增强敏捷能力。
10、简单化是根本(不做过度设计和预测)。
11、最好的构架、需求和设计出自于自组织的团队。
12、每隔一定时间,团队会在如何才能更有效地工作方面进行反思并对自己的行为进行相应调整。
敏捷开发方法教程敏捷开发(Agile Development)是一种以人为核心、快速迭代、灵活应变的软件开发方法。
它强调团队协作、持续交付和快速反馈,可帮助开发团队更好地应对需求的变化,提高项目的成功率。
本教程将介绍敏捷开发的基本原则、常用方法和最佳实践,帮助读者全面了解敏捷开发的精髓。
一、敏捷开发简介敏捷开发起源于1990年代的极限编程(Extreme Programming)方法,在过去几十年中不断演化和发展。
与传统的瀑布模型相比,敏捷开发注重快速迭代和用户参与,能够更好地应对需求变化和项目风险。
二、敏捷开发原则敏捷开发遵循以下核心原则:1. 个体和互动高于流程和工具:注重团队协作和沟通,激发创造力和创新。
2. 可以工作的软件高于详尽的文档:通过快速迭代交付价值,提供及时的产品演示和用户反馈。
3. 客户合作高于合同谈判:与客户积极合作,灵活应对需求变化和优先级调整。
4. 响应变化高于遵循计划:在需求变化时调整方向,保持高度灵活性和可调整性。
三、敏捷开发方法敏捷开发有多种方法和框架,下面介绍几种常用的方法:1. 极限编程(Extreme Programming,简称XP):强调团队合作、持续集成和测试驱动开发(TDD)等实践,推崇简单和高质量的设计。
2. Scrum:通过定义角色、仪式和工件等,实现实时掌控项目进度和风险。
将项目拆分为若干个迭代周期(Sprint),每个迭代周期都可以交付部分功能。
3. 敏捷建模(Agile Modeling):强调可视化和简化的建模技术,帮助团队更好地理解问题和需求。
4. 结对编程(Pair Programming):两位开发者合作完成一个编码任务,提高代码质量和团队协作效率。
四、敏捷开发实践实践是敏捷开发成功的关键,以下是几个重要的实践建议:1. 迭代开发:将开发工作划分为若干个迭代周期,每个迭代都能交付可工作的软件。
每次迭代结束后,团队根据反馈进行优化和调整。
**敏捷开发的管理办法**敏捷开发是一种以迭代、增量和协作为核心的软件开发方法。
它强调快速响应变化、持续交付价值和团队自组织等原则。
为了有效地实施敏捷开发,需要采取一些管理办法来提高团队的协作效率和项目的成功率。
以下是一些敏捷开发的管理办法,包括明确目标、制定优先级、迭代规划、持续反馈、团队自组织、跨功能合作、持续改进和适应变化。
一、明确目标在敏捷开发中,明确目标非常重要。
团队成员应该清楚地了解项目的愿景和目标,并将其转化为可执行的任务和需求。
明确的目标有助于团队集中精力、协调行动,并提高工作效率。
二、制定优先级在敏捷开发中,团队应该根据项目的价值和风险,制定任务和需求的优先级。
通过设定优先级,团队可以集中精力解决最重要的问题和需求,并在每个迭代中交付高价值的功能和成果。
三、迭代规划敏捷开发通过迭代的方式进行工作。
团队应该进行迭代规划,即在每个迭代开始时确定要完成的任务和需求。
迭代规划需要考虑项目目标、优先级和资源等因素,并制定相应的计划和时间表。
四、持续反馈敏捷开发强调持续反馈和学习。
团队应该与利益相关者保持密切的沟通和反馈,及时了解需求变化和用户反馈,并据此做出调整和改进。
持续反馈有助于提高产品质量、满足用户需求,并增加团队对项目的理解和参与度。
五、团队自组织在敏捷开发中,团队应该具备自组织和自主决策的能力。
团队成员应该共同决定任务分配、工作流程和问题解决方法等。
团队自组织有助于激发成员的创造力、承担责任和合作精神。
六、跨功能合作敏捷开发强调跨功能合作。
团队成员应该具备不同领域的技能和知识,并互相协作,以实现项目的成功。
跨功能合作可以促进知识共享和团队的全面发展,提高工作效率和质量。
七、持续改进敏捷开发是一个持续学习和改进的过程。
团队应该不断反思和评估自己的工作方式和结果,并寻找改进的机会。
这可以通过定期的回顾会议、团队讨论、客户反馈等方式来实现。
持续改进有助于提高团队的协作能力、产品质量和项目交付效率。
软件开发中的敏捷开发方法论现代软件开发行业已经从传统的瀑布模型逐渐转向敏捷开发方法论。
它强调快速、高效、反馈式的开发方式,合理地管理团队、时间和资源,更好地满足客户需求。
敏捷开发的基本原则有以下几个方面:一、关注个体与交互,而非流程与工具敏捷开发强调个体之间的交互与沟通,强制建立高度协作的开发环境。
在敏捷开发过程中,开发人员和用户之间建立了一个有效的反馈循环,让开发人员能够通过不断的调整和优化来满足用户的需求。
二、关注可工作的软件,而非详尽的文档敏捷开发注重开发出可工作的软件,而不是花时间写详细的文档。
软件需要预留足够的时间和精力来测试验证,这样才能确保软件的可用性和稳定性,同时也可以保证项目的可靠性和质量。
三、关注客户合作,而非合同谈判敏捷开发方法强调开发人员与客户之间的紧密合作。
这意味着客户在整个开发过程中都需要参与其中,以便确保软件的开发可以更好地满足他们的需求,从而提高软件用户的满意度。
四、关注响应变化,而非遵循计划敏捷开发认为,软件开发是一个不断变化和改进的过程,开发团队应该随时做出及时的调整。
开发人员需要快速反应,不断挑战自己,以及根据需求的变化来优化软件。
同时,软件开发过程中还需要注意不断地完善自己的技能,使团队更加高效地开发软件。
以上是敏捷开发所关注的四个基本原则,深刻地反映了软件开发的实际情况。
这种开发方法不仅可以保证客户的需求得到充分的满足,还可以有效地提高团队的成员间交流和沟通的效率。
当然,敏捷开发在实际的运用过程中也有一些弊端,例如在开发过程中容易出现需求变动、时间压力大、文档不完善等问题。
因此,我们在采用敏捷开发方法时,也需要根据项目的特点和具体情况进行灵活地调整和优化。
最终的目标是在保持敏捷开发的优点的同时,减少其缺点所带来的负面影响。
总的来说,敏捷开发方法论是一种适应变化的、反馈式的、高效的软件开发方式,已经在全球范围内得到了广泛的应用。
它以其高效性、实用性和客户满意度的提高,成为现代软件开发的重要方法之一。
如何进行敏捷开发敏捷开发是一种快速高效的软件开发方法,它强调人员协作、快速迭代和适应需求变化。
在当今快节奏的市场环境下,敏捷开发已经成为许多软件开发团队的首选方法。
本文将介绍敏捷开发的基本原则、关键实践和常见误区,以及如何正确地实施敏捷开发。
一、敏捷开发的基本原则敏捷开发具有以下基本原则:1. 高人员密集度:敏捷开发强调开发团队成员之间的交流和协作。
一个典型的敏捷开发团队通常由开发者、测试人员、产品负责人和用户代表组成。
他们通常会频繁地进行站立式会议,以确保每个人都了解整个项目的进展情况。
2. 迭代开发:敏捷开发采用迭代的方式进行开发,每个迭代通常持续2到4周。
在每个迭代结束时,团队会展示他们完成的工作成果,并接受反馈。
这有助于及早发现问题并及时解决。
3. 快速响应需求变化:敏捷开发团队能够快速响应客户的需求变化,并及时进行调整。
通过频繁的客户反馈和团队内部沟通,团队能够更好地理解客户需求,并根据需求进行优先级排序。
二、敏捷开发的关键实践敏捷开发的成功离不开以下关键实践:1. 产品待办事项清单:团队需要建立一个待办事项清单,其中包含产品的所有功能和任务。
这个清单应该根据优先级排序,并根据需求变化进行不断更新。
2. 迭代计划会议:在每个迭代开始时,团队需要进行迭代计划会议,确定本次迭代的目标和计划。
在会议上,团队成员可以进行交流、协商,确保每个人对迭代的目标有清晰的认识。
3. 每日站立会议:每天固定时间进行短暂的站立会议,让每个团队成员汇报自己的工作进展、遇到的问题以及计划。
这有助于团队成员之间的协调,及时解决问题。
4. 结对编程:结对编程是指两名开发者共同完成一段代码。
这种方式可以提高代码质量,减少错误,并提升团队内部的知识共享。
5. 持续集成:持续集成是指开发团队将代码频繁地集成到共享的代码仓库,并进行自动化的构建和测试。
这有助于发现问题并及早解决,同时也提供了更快速的反馈。
6. 客户参与:敏捷开发鼓励客户的积极参与,包括参与需求讨论、提供反馈和验收产品。
敏捷开发的12条原则敏捷开发是一种以迭代、循序渐进的方式进行软件开发的方法论,它强调团队协作、反馈机制和不断学习的理念。
为了更好地理解和应用敏捷开发,以下是敏捷开发的12条原则。
原则一:最重要的是满足客户需求,通过早期且持续的交付可行产品来获得客户的反馈并作出相应调整。
客户的满意度是成功的关键。
原则二:要频繁地进行交付。
通过将开发过程划分为多个短期的迭代周期,每个周期都会生成一个可运行的软件版本,有助于团队及时发现问题并进行修正。
原则三:以面对面的沟通为主。
通过直接交流和面对面的会议,而不是仅仅通过文档进行沟通,可以更好地理解需求和解决问题。
原则四:团队成员之间要保持密切合作。
通过组建稳定的开发团队,每个成员都能充分发挥自己的优势,提高工作效率和协同能力。
原则五:激发项目团队的动力和信任。
给予团队成员更多的自主权和责任感,鼓励他们提出优化方案和解决问题,以实现项目的成功。
原则六:追求技术卓越和良好的设计。
通过适当地应用技术手段和工具,能够提高软件的稳定性、可扩展性和可维护性。
原则七:注意可持续发展。
要在一个可持续的开发速度和进展方向之间取得平衡,避免过度投入或过度延期,以确保项目的健康发展。
原则八:保持简单和持续改进。
通过尽量简化开发过程和减少不必要的工作量,能够更高效地开展工作并保持团队的积极性。
原则九:注重团队反馈和自我调整。
通过及时收集团队成员和客户的反馈意见,进行项目的调整和优化,以便更好地满足需求和改善产品。
原则十:灵活应对变化。
要接受需求的变更和不确定性,并通过迅速调整和适应来应对变化,以保持项目的进展和质量。
原则十一:倡导自主组织和自我管理。
给予团队成员更多的决策自由和责任感,能够提高工作效率和积极性。
原则十二:关注可视化和透明度。
通过适当的可视化工具和技术手段,可以使工作进展和问题得以及时跟踪和解决,提高项目的透明度和沟通效率。
总之,敏捷开发的12条原则以客户满意、持续交付、个体和团队协作、不断反思和改进等为核心,使软件开发更加高效、灵活和贴近用户需求。
软件工程/开发项目管理类书目----------------------------------------------------------------------------------------- 2010-3-10-----------------------------------------------------------------------------------------1.《软件调试实战》(图灵程序设计丛书)(The Developer's Guide to Debugging)作者:(德国)Thorsten Grotker (德国)Ulrich Holtmann (德国)Holger Keding等译者:赵俐·出版社:人民邮电出版社·页码:190 页·出版日期:2010年02月·ISBN:9787115218858内容简介《软件调试实战》主要讲述C/C++程序的调试和分析,书中的调试技术也可以应用于其他语言编写的程序。
《软件调试实战》在讲述简单的源代码分析和测试的基础上,讲述了现实的程序中经常遇到的一些问题(如程序链接、内存访问、并行处理和性能分析)并给出了解决方案。
《软件调试实战》适合软件开发人员、调试人员阅读和使用。
2.《高效程序员的45个习惯:敏捷开发修炼之道》(图灵程序设计丛书)(Practices of An Agile Developer:Working in the Real World)作者:(美国)苏帕拉马尼亚姆(Venkat Subramaniam) (美国)亨特(Andy Hunt)译者:钱安川郑柯·出版社:人民邮电出版社·页码:186 页·出版日期:2010年01月·ISBN:7115215537/9787115215536作者简介苏帕拉马尼亚姆(Venkat Subramaniam),博士Agile Developer公司创始人。
敏捷开发流程详解敏捷开发流程详解敏捷开发是一种以人为核心、迭代、循序渐进的软件开发方法。
它强调团队合作、客户需求和适应变化。
敏捷开发流程包括许多不同的方法和框架,例如Scrum、极限编程(XP)和精益开发(Lean Development)等。
本篇文章将详细介绍敏捷开发的核心原则、方法和实践。
一、敏捷开发的核心原则1.以人为本:敏捷开发强调人的重要性,包括开发人员、测试人员、产品负责人和客户。
它认为只有当人们能够有效地协作和沟通时,才能实现最大的效益。
2.可持续的开发:敏捷开发追求可持续的开发速度,保持长期稳定的工作节奏。
这需要避免突击和过度工作,以保持团队成员的积极性和效率。
3.适应变化:敏捷开发能够灵活地适应需求变化,因为客户和业务环境的变化是不可避免的。
敏捷团队应该能够快速响应这些变化,以满足客户需求。
4.快速反馈:敏捷开发通过频繁的反馈循环来优化开发过程。
团队成员应该能够及时获得反馈,以便对产品进行持续改进。
5.质量保证:敏捷开发注重质量保证,通过持续测试和代码审查来确保软件质量。
团队成员应该对代码质量负责,并采用自动化工具来提高效率。
二、敏捷开发方法1.Scrum:Scrum是一种流行的敏捷开发框架,它采用迭代式开发方法,将大型项目分解为小的可交付成果。
Scrum团队由产品负责人、开发人员、测试人员和利益相关者组成,他们共同协作完成产品目标。
2.极限编程(XP):XP是一种以实践为基础的敏捷开发方法,它强调高效率和高质量的软件开发。
XP的核心原则包括简单性、沟通、反馈、勇气和尊重。
XP实践包括测试驱动开发(TDD)、持续集成(CI)和重构等。
3.精益开发(Lean Development):精益开发是一种旨在消除浪费和提高生产率的开发方法。
它强调价值流分析、持续改进和客户需求,以最小化成本和最大化价值为目标。
精益开发框架包括价值流映射、5S管理、看板管理等。
4.Kanban:Kanban是一种可视化工作流管理方法,它通过可视化板和卡片来跟踪工作进度。
技术规范的敏捷开发方法敏捷开发是一种以迅速适应变化为核心的开发方法,它能够在快速反应市场需求的同时提供持续交付和高质量的软件产品。
技术规范则作为敏捷开发的基石,确保团队在开发过程中能够遵循统一的标准和规范。
一、敏捷开发方法的概述敏捷开发方法是一种迭代、增量的软件开发过程,它强调紧密合作、快速响应变化和持续交付。
相比于传统的瀑布模型,敏捷开发更加适合日益变化的市场需求,能够更好地满足用户的期望。
二、敏捷开发的原则1. 客户满意优先:满足客户需求是敏捷开发的首要目标,通过持续交付、频繁反馈和客户参与,确保客户对成果满意。
2. 面对面沟通:团队成员之间的直接对话是传递信息最高效的方式,它能够减少误解和沟通成本。
3. 可用软件交付:敏捷开发强调持续交付,尽早将可用的软件交付给用户,通过用户反馈快速改进。
4. 变化接受度高:敏捷开发鼓励接受变化,随时调整开发计划和需求,以适应不断变化的环境和需求。
5. 简洁为美:避免过度设计和开发,保持代码和文档简洁,专注于核心功能。
6. 自组织团队:团队成员具有高度自主性和责任心,能够根据需求自行安排工作和调整计划。
7. 反馈机制:通过频繁的反馈,及时发现问题和改进,确保软件质量和团队效率。
三、敏捷开发的技术规范敏捷开发的技术规范是确保团队在开发过程中能够遵循统一标准和规范的重要保障。
以下是一些常见的敏捷开发技术规范:1. 代码规范:统一的代码规范能够提高代码的可读性和可维护性,减少团队成员之间的集成问题。
常见的代码规范包括命名规范、缩进规范、注释规范等。
2. 版本控制规范:团队使用版本控制系统(如Git)进行代码管理,统一的版本控制规范可以确保团队成员之间的协作顺畅,避免代码冲突和丢失。
3. 测试规范:敏捷开发强调持续集成和自动化测试,测试规范确保团队在开发过程中能够进行有效的单元测试、集成测试和验收测试,确保软件质量。
4. 文档规范:敏捷开发鼓励有适量的文档,文档规范可以确保文档的一致性和易读性,方便团队成员之间的沟通和知识分享。
软件开发项目敏捷管理制度一、引言在当前快节奏的软件开发领域,敏捷管理成为提高项目开发效率和质量的重要手段。
本文将介绍软件开发项目敏捷管理制度的相关内容,并探讨其在项目实施中的作用。
二、敏捷开发概述敏捷开发是一种以迭代、增量方式进行的软件开发方法,强调团队合作、快速反馈和持续优化。
它与传统的瀑布模型相比,更加灵活、可适应变化,并能更好地满足客户需求。
三、敏捷管理原则1. 个体和交互优先于流程和工具:注重团队成员之间的协作和沟通,使项目能够更好地适应变化。
2. 可工作的软件优先于详尽的文档:提倡以实际可执行的软件成果为核心,而不是沉溺于过多繁琐的文档编写。
3. 客户合作优先于合同谈判:强调与客户的紧密合作,及时了解和响应客户的需求变化。
4. 响应变化优先于遵循计划:鼓励在项目过程中灵活调整计划,以适应变化的需求和市场环境。
四、敏捷管理实施步骤1. 项目启动:明确项目目标和范围,并制定详细的项目计划。
2. 组建敏捷团队:根据项目需求组建高效、协作的敏捷团队,确保各个角色的明确分工。
3. 制定产品特性列表:与客户合作,梳理并明确产品的功能需求,形成产品特性列表。
4. 规划迭代周期:将整个项目按照迭代周期进行切分,并根据优先级确定每个迭代的目标。
5. 迭代开发:团队根据产品特性列表进行迭代开发,每个迭代周期输出可工作的软件成果。
6. 持续集成与反馈:团队通过持续集成和测试,及时发现和解决问题,并根据反馈进行迭代优化。
7. 项目评估和总结:每个迭代结束后进行项目评估,总结经验教训,并根据情况进行调整和改进。
五、敏捷管理工具1. 产品管理工具:如Trello、Jira等,用于管理产品特性列表、需求优先级及任务分配。
2. 团队协作工具:如Slack、Microsoft Teams等,用于团队成员的协同工作和沟通。
3. 代码管理工具:如Git、SVN等,用于代码的版本控制和协同开发。
4. 自动化测试工具:如JUnit、Selenium等,用于测试代码和保证软件质量。
动态评估取舍——高效程序员的45个习惯之一“性能、生产力、优雅、成本以及上市时间,在软件开发过程中都是至关重要的因素。
每一项都必须达到最理想状态。
”可能曾经身处这样的团队:管理层和客户将很大一部分注意力都放在应用的界面展示上。
也有这样的团队,其客户认为性能表现非常重要。
在团队中,你可能会发现,有这样一个开发主管或者架构师,他会强调遵守“正确”的范式比其他任何事情都重要。
对任何单个因素如此独断地强调,而不考虑它是否是项目成功的必要因素,必然导致灾难的发生。
强调性能的重要性情有可原,因为恶劣的性能表现会让一个应用在市场上铩羽而归。
然而,如果应用的性能已经足够好了,还有必要继续投入精力让其运行得更快一点吗?大概不用了吧。
一个应用还有很多其他方面的因素同样重要。
与其花费时间去提升千分之一的性能表现,也许减少开发投入,降低成本,并尽快让应用程序上市销售更有价值。
举例来说,考虑一个必须要与远程Windows 服务器进行通讯的 .NET Windows 应用程序。
可以选择使用 .NET Remoting 技术或Web Services 来实现这个功能。
现在,针对使用Web Services 的提议,有些开发者会说:“我们要在Windows 之间进行通信,通常此类情况下,推荐使用 .NET Remoting 。
而且,Web Services 很慢,我们会遇到性能问题。
”嗯,一般来说确实是这样。
然而,在这个例子中,使用Web Services 很容易开发。
对Web Services 的性能测试表明XML 文档很小,并且相对应用程序自己的响应时间来讲,花在创建和解析XML 上的时间几乎可以忽略不计。
使用Web Services 不但可以在短期内节省开发时间,且在此后团队被迫使用第三方提供的服务时,Web Services 也是个明智的选择。
Andy 说。
过犹不及我曾经遇到这样一个客户,他们坚信可配置性的重要性,致使他们的应用有大概10 000个可配置变量。
新增代码变得异常艰难,因为要花费大量时间来维护配置应用程序和数据库。
但是他们坚信需要这种程度的灵活性,因为每个客户都有不同的需求,需要不同的设置。
可实际上,他们只有19个客户,而且预计将来也不会超过50个。
他们并没有很好地去权衡。
考虑这样一个应用,从数据库中读取数据,并以表格方式显示。
你可以使用一种优雅的、面向对象的方式,从数据库中取数据,创建对象,再将它们返回给UI 层。
在UI 层中,你再从对象中拆分出数据,并组织为表格方式显示。
除了看起来优雅之外,这样做还有什么好处吗?也许你只需要让数据层返回一个dataset 或数据集合,然后用表格显示这些数据即可。
这样还可以避免对象创建和销毁所耗费的资源。
如果需要的只是数据展示,为什么要创建对象去自找麻烦呢?不按书上说的OO 方式来做,可以减少投入,同时获得性能上的提升。
当然,这种方式有很多缺点,但问题的关键是要多长个心眼儿,而不是总按照习惯的思路去解决问题。
总而言之,要想让应用成功,降低开发成本与缩短上市时间,二者的影响同样重要。
由于计算机硬件价格日益便宜,处理速度日益加快,所以可在硬件上多投入以换取性能的提升,并将节省下来的时间放在应用的其他方面。
当然,这也不完全对。
如果硬件需求非常庞大,需要一个巨大的计算机网格以及众多的支持人员才能维持其正常运转(比如类似Google 那样的需求),那么考虑就要向天平的另一端倾斜了。
但是谁来最终判定性能表现已经足够好,或是应用的展现已经足够“炫”了呢?客户或是利益相关者必须进行评估,并做出相关决定(见第45 页中习惯10 )。
如果团队认为性能上还有提升的空间,或者觉得可以让某些界面看起来更吸引人,那么就去咨询一下利益相关者,让他们决定应将重点放在哪里。
没有适宜所有状况的最佳解决方案。
你必须对手上的问题进行评估,并选出最合适的解决方案。
每个设计都是针对特定问题的——只有明确地进行评估和权衡,才能得出更好的解决方案。
没有最佳解决方案(No best solution)动态评估权衡考虑性能、便利性、生产力、成本和上市时间。
如果性能表现足够了,就将注意力放在其他因素上。
不要为了感觉上的性能提升或者设计的优雅,而将设计复杂化。
切身感受即使不能面面俱到,你也应该觉得已经得到了最重要的东西——客户认为有价值的特性。
平衡的艺术如果现在投入额外的资源和精力,是为了将来可能得到的好处,要确认投入一定要得到回报(大部分情况下,是不会有回报的)。
真正的高性能系统,从一开始设计时就在向这个方向努力。
过早的优化是万恶之源。
过去用过的解决方案对当前的问题可能适用,也可能不适用。
不要事先预设结论,先看看现在是什么状况。
代码要清晰地表达意图——高效程序员的45 个习惯之一“可以工作而且易于理解的代码挺好,但是让人觉得聪明更加重要。
别人给你钱是因为你脑子好使,让我们看看你到底有多聪明。
”Hoare 谈软件设计C.A.R. Hoare设计软件有两种方式。
一种是设计得尽量简单,并且明显没有缺陷。
另一种方式是设计得尽量复杂,并且没有明显的缺陷。
我们大概都见过不少难以理解和维护的代码,而且(最坏的是)还有错误。
当开发人员们像一群旁观者见到UFO 一样围在代码四周,同样也感到恐惧、困惑与无助时,这个代码的质量就可想而知了。
如果没有人理解一段代码的工作方式,那这段代码还有什么用呢?开发代码时,应该更注重可读性,而不是只图自己方便。
代码被阅读的次数要远远超过被编写的次数,所以在编写的时候值得花点功夫让它读起来更加简单。
实际上,从衡量标准上来看,代码清晰程度的优先级应该排在执行效率之前。
例如,如果默认参数或可选参数会影响代码可读性,使其更难以理解和调试,那最好明确地指明参数,而不是在以后让人觉得迷惑。
在改动代码以修复bug 或者添加新功能时,应该有条不紊地进行。
首先,应该理解代码做了什么,它是如何做的。
接下来,搞清楚将要改变哪些部分,然后着手修改并进行测试。
作为第 1 步的理解代码,往往是最难的。
如果别人给你的代码很容易理解,接下来的工作就省心多了。
要敬重这个黄金法则,你欠他们一份情,因此也要让你自己的代码简单、便于阅读。
明白地告诉阅读程序的人,代码都做了什么,这是让其便于理解的一种方式。
让我们看一些例子。
coffeeShop.PlaceOrder(2);通过阅读上面的代码,可以大致明白这是要在咖啡店中下一个订单。
但是, 2 到底是什么意思?是意味着要两杯咖啡?要再加两次?还是杯子的大小?要想搞清楚,唯一的方式就是去看方法定义或者文档,因为这段代码没有做到清晰易懂。
所以我们不妨添加一些注释。
coffeeShop.PlaceOrder(2 /* large cup*/);现在看起来好一点了,但是注释有时候是用来对写得很差的代码进行补偿的(见第105 页中习惯26 :用代码沟通)。
Java 5 与 .NET 中有枚举值的概念,我们不妨使用一下。
使用C# ,我们可以定义一个名为CoffeeCupSize 的枚举,如下所示。
public enum CoffeeCupSize{Small,Medium,Large}接下来就可以用它来下单要咖啡了。
coffeeShop.PlaceOrder(rgxe);这段代码就很明白了,我们是要一个大杯[①]的咖啡。
作为一个开发者,应该时常提醒自己是否有办法让写出的代码更容易理解。
下面是另一个例子。
Line 1 public int compute(int val)- {- int result = val << 1;- //... more code ...5 return result;- }第3 行中的位移操作符是用来干什么的?如果善于进行位运算,或者熟悉逻辑设计或汇编编程,就会明白我们所做的只是把val 的值乘以2 。
PIE原则所写的代码必须明确表达你的意图,而且必须富有表现力。
这样可以让代码更易于被别人阅读和理解。
代码不让人迷惑,也就减少了发生潜在错误的可能。
代码要清晰地表达意图。
但对没有类似背景的人们来说,又会如何——他们能明白吗?也许团队中有一些刚刚转行做开发、没有太多经验的成员。
他们会挠头不已,直到把头发抓下来②]。
代码执行效率也许很高,但是缺少明确的意图和表现力。
用位移做乘法,是在对代码进行不必要且危险的性能优化。
result=val*2 看起来更加清晰,也可以达到目的,而且对于某种给定的编译器来说,可能效率更高(积习难改,见第34 页的习惯7 )。
不要表现得好像很聪明似的,要遵循PIE 原则:代码要清晰地表达意图。
要是违反了PIE 原则,造成的问题可就不只是代码可读性那么简单了——它会影响到代码的正确性。
下列代码是一个C# 方法,试图同步对CoffeeMaker 中MakeCo ffee() 方法进行调用。
Public void MakeCoffee(){lock(this){// ... operation}}这个方法的作者想设置一个临界区(critical section )——任何时候最多只能有一个线程来执行operation 中的代码。
要达到这个目的,作者在CoffeeMaker 实例中声明了一个锁。
一个线程只有获得这个锁,才能执行这个方法。
(在Java 中,会使用synchronized 而不是lock ,不过想法是一样的。
)对于Java 或 .NET 程序员来说,这样写顺理成章,但是其中有两个小问题。
首先,锁的使用影响范围过大;其次,对一个全局可见的对象使用了锁。
我们进一步来看看这两个问题。
假设Coffeemaker 同时可以提供热水,因为有些人希望早上能够享用一点伯爵红茶。
我想同步GetWater() 方法,因此调用其中的lock(this) 。
这会同步任何在Coff eeMaker 上使用lock 的代码,也就意味着不能同时制作咖啡以及获取热水。
这是开发者原本的意图吗?还是锁的影响范围太大了?通过阅读代码并不能明白这一点,使用代码的人也就迷惑不已了。
同时,MakeCoffee() 方法的实现在CoffeeMaker 对象上声明了一个锁,而应用的其他部分都可以访问CoffeeMaker 对象。
如果在一个线程中锁定了CoffeeMaker 对象实例,然后在另外一个线程中调用那个实例之上的MakeCoffee() 方法呢?最好的状况也会执行效率很差,最坏的状况会带来死锁。
让我们在这段代码上应用PIE 原则,通过修改让它变得更加明确吧。
我们不希望同时有两个或更多的线程来执行MakeCoffee() 方法。
那为什么不能为这个目的创建一个对象并锁定它呢?Private object makeCoffeeLock = new Object();Public void MakeCoffee(){lock(makeCoffeeLock){// ... operation}}这段代码解决了上面的两个问题——我们通过指定一个外部对象来进行同步操作,而且更加明确地表达了意图。