`

可理解性(Understandability)——一个扩展视角

阅读更多

   可理解性与可测试性,可维护性,可扩展性,可重用性等属性一起组成了软件开发的内部质量属性。

 

   所有这些质量属性中,我认为最重要的的就是可理解性。

 

   首先我们来看看人是如何行动的。比如我要买一个手机,我会去网上找我喜欢的牌子,了解功能,价格,售后服务等信息。了解了情况之后,我们可能去手机卖场,淘宝等地方去实施购买行为。我在这里想表达的意思是,人们在做出行动之前,都会获取用于指导行动的信息,然后再进行行动。

 

   下面,我简要描述一个典型的软件开发过程:

 

   首先,销售联系客户,了解客户的需求后,和客户达成初步合作意向。销售带领公司售前技术支持去客户那里对解决方案进行演讲,以获得客户的认可。假设经过招标,最终拿下项目。这时,我们的需求分析人员开始需求分析,包括对客户高层,中层以及终端用户的访谈,收集报表等基础数据资料。需求分析人员写就《需求分析报告》,可能的话,和美工一起,把界面原型做出来。然后,开始去客户处演示。经过几轮的交流,需求基本得到认可。

 

    需求分析人员和设计人员交流,设计人员给出系统架构设计,数据库设计以及详细设计等等。然后经过设计和开发人员的交流,开发人员根据详细设计进行编码。如果前期设计人员只给出了架构设计和数据库设计,开发人员可能承担详细设计的任务。开发人员开始编码。开发人员交付测试。测试人员进行集成测试,测试人员进行确认。部署人员进行部署发布。

 

    可以看的出来,每个人都是其中的一个沟通单元,每个人获得信息,然后输出处理结果。每个人都是流程中的一部分,信息获取的多少,正确与否,都会影响我们的行为,进而影响你的输出。如果一个地方出错了,就会不断放大,而使整个系统处于颠簸和不稳定的状态。拿设计人员做一个例子:

 

    1)接受 需求分析人员传递的信息,通过召开需求宣讲会或是需求规格说明书

    2)设计人员理解 接收到的信息。

    3)设计人员根据理解的信息进行设计

    4)设计人员编写设计说明书

 

   设计的质量取决于需求人员传递的信息,设计人员本身对需求提供信息的理解,设计人员以往的经验这三方面。

 

   这里面最容易出问题的是三个地方:

 

   a. 设计人员接受的信息,也就是需求分析人员提供的信息可能是不完整的。

   b. 设计人员本身的理解也可能产生误差,取决于经验和对领域的了解程度。

   c.  需求规格说明书本身可能是不易理解的,也就是说工作单元产生的制品不具备可理解性。

 

    所有这些都可能造成工作的浪费,造成返工。这在软件开发中已经非常常见了。

 

    如果把这种沟通抽象出来,是三个方面:

 

   1)人和人之间的可理解性。

 

     我们每天的开会,日常交流,任务分配,培训,Presentation都是在人和人的交流。如果每个人都是一个可理解性强的人,就是说有足够的理解别人的能力(倾听,实现准备),有足够的正确表达自己想法的能力(需要不断训练)。信息就不会在我们之间堵塞(部分传递),变质(错误传递)。应该注意到信息是一个控制变量,遗漏信息和误传信息会影响到接收信息人的行为。

 

     我认为一个沟通流畅的团队就是一个优秀的团队。

 

   2)人和文档之间的可理解性。

 

     每天我们都在看文档,它是承载信息的方式。与人相比,它不会说话,不会回应。你唯一做的就是对它强加于你自己的理解。如果文档组织的好,结构清晰,就好像它会说话一样,那我就比较容易了解它的意图。仿佛它就是一个向导。反过来,可能会阻碍我的理解,更坏的结果是把我引向错误的道路。

 

     信息只有被用心组织才能有更好的可理解性。


   3)人和代码之间的可理解性。

 

    开发人员每天和代码为伴,很多人会修改以前别人的代码。好的代码会说话,坏的代码一句话不说,而且面目狰狞,五官发育不全。代码的可理解性是靠开发人员来控制的,是造一个天使还是一个怪物,全看我们的态度是怎么样的。

 

    写可理解性强的代码是一门艺术。

 

    总结下来,我想说的是,作为团队中的一员,你首先尽可能使你自己成为一个可理解性强的人,能够用心倾听,接受信息。也能够仔细思考你自己的表达方式,不要做闷葫芦,也不要用随意的表达方式表达你自己的想法。而是要考虑一下,接收你信息具体是什么样的人,如果我是他,我会怎么想。要针对不同的人呢,自己思考你的表达方式。要有意识的获取反馈,随时调整你自己的表达方式。写文档要考虑看文档的人,写代码要考虑看代码的人。

 

     两句总结:

 

    Do everything by intent。

 

    痛,则不通;通,则不痛。

 

 

0
0
分享到:
评论

相关推荐

    设计模式真的能改善软件质量吗?

    很多人都宣称设计模式的使用会给一些软件质量属性带来正面的影响,将改善软件质量,特别是改善软件的扩展性(Expandability)、可重用性(Reusability)和易理解性(Understandability),,但是也有一些人持怀疑态度。...

    MAAB建模规范5.0版本

     Improve graphical understandability  Improve readability of functional analysis  Prevent connection mistakes  Comments, etc. • Simulation and verification  Mechanism to enable simulation ...

    Terms and Definitions of LDO Voltage

    TI application report. This report provides an understanding of the terms and definitions of low dropout (LDO) voltage regulators, and describes ...includes an example to increase the understandability.

    understanding linux network internals

    深入理解Linux网络内幕(英文) If you've ever wondered how Linux carries out the complicated tasks assigned to it by the IP protocols -- or if you just want to learn about modern networking through ...

    基于Android 7.0与Android Studio的安卓学习.zip

    Android是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的移动操作系统,主要应用于移动设备,如智能手机和平板电脑。该系统最初由安迪·鲁宾开发,后被Google公司收购并注资,随后与多家硬件制造商、软件开发商及电信营运商共同研发改良。 Android操作系统的特点包括: 开放源代码:Android系统采用开放源代码模式,允许开发者自由访问、修改和定制操作系统,这促进了技术的创新和发展,使得Android系统具有高度的灵活性和可定制性。 多任务处理:Android允许用户同时运行多个应用程序,并且可以轻松地在不同应用程序之间切换,提高了效率和便利性。 丰富的应用生态系统:Android系统拥有庞大的应用程序生态系统,用户可以从Google Play商店或其他第三方应用市场下载和安装各种各样的应用程序,满足各种需求。 可定制性:Android操作系统可以根据用户的个人喜好进行定制,用户可以更改主题、小部件和图标等,以使其界面更符合个人风格和偏好。 多种设备支持:Android操作系统可以运行在多种不同类型的设备上,包括手机、平板电脑、智能电视、汽车导航系统等。 此外,Android系统还有一些常见的问题,如应用崩溃、电池耗电过快、Wi-Fi连接问题、存储空间不足、更新问题等。针对这些问题,用户可以尝试一些基本的解决方法,如清除应用缓存和数据、降低屏幕亮度、关闭没有使用的连接和传感器、限制后台运行的应用、删除不需要的文件和应用等。 随着Android系统的不断发展,其功能和性能也在不断提升。例如,最新的Android版本引入了更多的安全性和隐私保护功能,以及更流畅的用户界面和更强大的性能。此外,Android系统也在不断探索新的应用场景,如智能家居、虚拟现实、人工智能等领域。 总之,Android系统是一种功能强大、灵活可定制、拥有丰富应用生态系统的移动操作系统,在全球范围内拥有广泛的用户基础。

    node-v4.6.1-sunos-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v6.3.0-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v6.9.2-darwin-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    甲壳虫ADB助手v1.3.0@高级版.apk

    甲壳虫ADB助手v1.3.0@高级版.apk

    机房工程 能源管理 综合运维 大样图.rar

    新旧理念对比:在信息化建设中,数据中心基础设施至关重要,因控制系统数字化,数据中心承载核心组件和数据。目前数据中心资源利用率低,面临节能减排挑战。新型绿色数据中心与传统相比,更注重节能、模块化设计、技术应用和精细化管理,以提高能源效率和减少环境影响。 机房详细设计:省数据机房作为业务处理和数据中心,承担通讯枢纽角色,需保证安全、可靠运行和良好工作环境。依据国家相关政策和标准,设计绿色数据中心机房,包括建筑照明、采暖通风、计算机房用空调机、民用建筑热工设计等规范。 机房设计思路:数据中心发展为高性能计算机集中地,面临能耗效率和资源整合问题。绿色数据中心集成网络设施、服务器、UPS供电等,采用模块化设计,提升机房利用率。 机房总体划分:根据需求和功能,机房划分为主机房区、支持区和辅助区。主机房区包括技侦、刑侦、电话、网监机房等;支持区包括动力电源、发电机房、UPS电源机房等;辅助区包括休息区、监控室等。设计考虑微模块化、空间结构、数据路由和信息点。 机房详细设计:IDC机房建设包括装饰装修、电气系统、弱电集成。装修原则注重防尘、防火、保温、防水和色彩设计。材料选择原则为防火、防水、防静电、不起尘且环保。系统概述包括供配电系统、UPS不间断电源、照明与应急照明、防雷接地等。 数据中心布线系统:基于GB50174-2008和TIA/EIA-942标准,采用光纤与双绞线结合,线缆选型为CMP级电缆,OFNP或OFCP光缆。布线设计采用卡博菲式网格桥架,减轻承重压力,节省空间。 空调新风系统:新型系统采用模块化组合,提高冷气流利用率,智能温感控制,降低PUE值,节能高效。与传统系统相比,具有显著节能优势。 消防自动报警及气体灭火系统:设计为有管网式,包括感烟、感温探测器,声光报警器,紧急启停按钮等。系统实现自动报警、联动控制和手动远程启动。 集中监控管理系统:集成机房动力、环境、安防和服务器系统资源监控,基于WEB远程访问,具备日志和报表管理功能,适合集成监控。 KVM监控管理系统:安装主服务器和交换机,实现全域用户管理和日志服务。系统支持多厂商模拟KVM级联,通过主服务器集群实现统一管理和访问控制。

    node-v6.6.0-linux-arm64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于Dagger+RxJava+Retrofit的Android开发框架.zip

    Android是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的移动操作系统,主要应用于移动设备,如智能手机和平板电脑。该系统最初由安迪·鲁宾开发,后被Google公司收购并注资,随后与多家硬件制造商、软件开发商及电信营运商共同研发改良。 Android操作系统的特点包括: 开放源代码:Android系统采用开放源代码模式,允许开发者自由访问、修改和定制操作系统,这促进了技术的创新和发展,使得Android系统具有高度的灵活性和可定制性。 多任务处理:Android允许用户同时运行多个应用程序,并且可以轻松地在不同应用程序之间切换,提高了效率和便利性。 丰富的应用生态系统:Android系统拥有庞大的应用程序生态系统,用户可以从Google Play商店或其他第三方应用市场下载和安装各种各样的应用程序,满足各种需求。 可定制性:Android操作系统可以根据用户的个人喜好进行定制,用户可以更改主题、小部件和图标等,以使其界面更符合个人风格和偏好。 多种设备支持:Android操作系统可以运行在多种不同类型的设备上,包括手机、平板电脑、智能电视、汽车导航系统等。 此外,Android系统还有一些常见的问题,如应用崩溃、电池耗电过快、Wi-Fi连接问题、存储空间不足、更新问题等。针对这些问题,用户可以尝试一些基本的解决方法,如清除应用缓存和数据、降低屏幕亮度、关闭没有使用的连接和传感器、限制后台运行的应用、删除不需要的文件和应用等。 随着Android系统的不断发展,其功能和性能也在不断提升。例如,最新的Android版本引入了更多的安全性和隐私保护功能,以及更流畅的用户界面和更强大的性能。此外,Android系统也在不断探索新的应用场景,如智能家居、虚拟现实、人工智能等领域。 总之,Android系统是一种功能强大、灵活可定制、拥有丰富应用生态系统的移动操作系统,在全球范围内拥有广泛的用户基础。

    tensorflow-gpu-2.2.2-cp38-cp38-win-amd64.whl

    resnet

    企业数字化转型物流信息化咨询项目规划方案qy.pptx

    企业数字化转型物流信息化咨询项目规划方案qy.pptx

    node-v4.7.2-linux-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v5.5.0-linux-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    42-42.渗透测试-漏洞扫描原理.mp4

    42-42.渗透测试-漏洞扫描原理.mp4

    40-40.XSS跨站脚本攻击植入方式.mp4

    40-40.XSS跨站脚本攻击植入方式.mp4

    4.12作业.sql.sql

    4.12作业.sql.sql

    当提及“奇怪的数列”时,我首先想到的是斐波那契数列和康托尔数列,这两个数列因其独特的生成规则和性质而显得与众不同 以下是关于这两

    当提及“奇怪的数列”时,我首先想到的是斐波那契数列和康托尔数列,这两个数列因其独特的生成规则和性质而显得与众不同。以下是关于这两个数列的500字资源介绍: 斐波那契数列,这是一个充满魅力的数列,它以0和1开始,之后的每一项都是前两项的和。具体地说,斐波那契数列的定义是:F(0) = 0,F(1) = 1,F(n) = F(n-1) + F(n-2),其中n≥2。这个数列的前几项为:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55...斐波那契数列的奇特之处在于,许多自然界和人类生活中的现象都与它相关联,比如黄金分割、植物的生长模式等。 而康托尔数列则呈现出另一种独特的风貌。它以1开始,每一项为其前一项的反码。具体定义是:C(1) = 1,C(n) = ~C(n-1),其中n≥2。康托尔数列的前几项为:1, 0, 01, 10, 0110, 1001, 01101001, 10010110...这个数列的奇特之处在于,它每一项都是前一项的二进制反码。这样的定义使得康托尔数列在计算机科学领域中具有着重要的应用,比如数据编码、错误检测等。 这两个数列虽然看似简单,

Global site tag (gtag.js) - Google Analytics