当前位置: 首页 > news >正文

设计软件最重要的目标是可理解性?

当您设计一款软件时,设计时最重要的一点就是可理解性。安全性、性能和正确性都很重要,但它们次优于可理解性。

被误解的软件会产生Bug缺陷
如果软件的实施者和维护者对软件存在误解,那么软件最终就会出现缺陷。主要缺陷。这些缺陷有多种形式。

最明显的就是正确性问题。如果你无法理解一段代码,你就无法读懂它,无法理解它在做什么,应该做什么。在这里,测试不是你的救命稻草,因为

  • (1)它们只能覆盖有限的表面区域,
  • (2)它们也会遇到同样的问题:如果你不理解软件,你很可能就无法很好地测试它。

这也会与安全和性能要求纠缠在一起。如果你不了解系统,如何保证它的安全性?你不可能通过理解来获得完美的安全性--这是一个过程,不是一蹴而就的。但是,如果你一开始就不了解你的软件,那么任何安全的希望都会破灭。你会错过一些基本要求,带来严重的简单安全问题,而不是组件之间复杂而微妙的交互所带来的问题。

而当你不了解软件时,为提高性能而做出的任何改变都可能从根本上破坏关键功能或安全行为。缓存可能会泄露信息或扰乱业务逻辑。为解决性能问题而改进查询可能会产生重大缺陷,甚至最终导致性能下降1。

因此,如果您不了解代码,那么尝试对代码进行任何改动都是失败的:添加新功能、修复错误、提高安全性。

我们怎样才能让它变得容易理解呢?
所以剩下的问题就是如何让事情变得容易理解。有几种通用方法。您可以使代码本身易于理解,也可以提供支持文档来帮助理解它。两者都是需要的,但都有局限性。

让代码易于理解
这是我们在软件工程中经常做的事情,尽管很容易忽视它。当我这样做时,我会考虑一些关键因素:

  • 记住你的观众。该代码的其他维护者合理地期望知道什么?如果某些内容在您的团队或行业中不是常识,那么您可能应该添加一些注释来解释它。
  • 隔离最高复杂性。如果某些东西很复杂,那么值得将其提取到自己的单元(模块,函数,等等)中,以便您可以定义其接口并以更流畅的可读方式使用它,同时也限制了那些试图使用它的人的复杂性。稍后再了解。
  • 用新的眼光来阅读它。评估自己的代码的可读性是很困难的。一个技巧是将代码存放几天,然后在一两天后将其全部从工作记忆中移出后,再次阅读它。这将帮助您了解可能会困扰新读者的事情。
  • 集成任何代码审查评论。如果有人问代码审查中的某些内容是如何工作的,不要只是在评论中向他们解释。这意味着您的读者不清楚谁拥有您的拉取请求的所有上下文,因此缺乏该上下文的未来读者也不清楚。相反,更新代码以使其更加清晰(结构上或带有注释),然后回复询问他们更改是否有帮助。

添加支持文档
有时,代码会很难理解。这通常发生在需求之间存在紧张关系的时候。例如,性能改进通常会导致代码不太清晰。

从代码本身理解代码库的完整上下文也很困难(不可能?)。尽管我们谈论自记录代码,但代码库并不包含整个系统。

所以我们需要一些支持文档。以下是一些对于理解代码库非常有帮助的内容。

  • 系统架构文档。我喜欢为我工作的系统保留系统架构图、关键术语和服务的术语表以及整个系统的解释。这些确实会过时,但过期一个月的文档总比没有好。对于这些,我保留了一个定期的日历任务来更新它,这样它就不会过时。对于成长中的公司来说,入职也是确保其最新的好时机。

  • 架构决策记录和设计评审。作为软件工程师,我们在架构和代码设计方面做出了很多决定。当我们做出这些决定时,就是把它们写下来的好时机。这具有三个效果。第一个是明确的:它提供了一个记录,我们可以用它来了解后来做出了什么决定或为什么做出这个决定。第二个不太明显,那就是通过必须写下我们的决定,我们自己会变得更清楚,这迫使我们尝试向其他人解释它。这使得我们更加关注可理解性。第三,这是插入设计审查过程的好地方,或者至少将这些过程广播出来,这样您就可以在编写代码之前在过程的早期阶段获得有关清晰度的反馈。

  • 产品需求文件。这些对于我们了解我们正在实施的内容及其重要性非常有帮助。但它们对于以后理解代码的上下文也非常有帮助。这种奇怪的行为到底是有意为之,还是一个错误?如果您可以看看为什么要实施它以及最初的要求,这将有助于您回答这个问题。

  • 代码注释。这些是房间里的大象。它们有助于解释特定代码单元的作用及其存在的原因。这些在任何令人惊讶的情况下都非常有帮助,因此它们应该用于人们会关注和困惑的事情。它们也适合指向相关文档,否则在维护代码时很难发现相关文档来理解代码。

这些只是您可以添加支持文档以帮助理解的几种方法!

(banq注:可理解性是一个有关上下文,凡是有关上下文的,都可能有关多个视角,多种状态,同一个符号在不同上下文中理解不同,因此,可理解性虽然最重要,也是最难,基本属于complex和complicated两种复杂性综合体。属于正确废话,最终沦为教条主义)

相关文章:

设计软件最重要的目标是可理解性?

当您设计一款软件时,设计时最重要的一点就是可理解性。安全性、性能和正确性都很重要,但它们次优于可理解性。 被误解的软件会产生Bug缺陷 如果软件的实施者和维护者对软件存在误解,那么软件最终就会出现缺陷。主要缺陷。这些缺陷有多种形式…...

酒店|酒店管理小程序|基于微信小程序的酒店管理系统设计与实现(源码+数据库+文档)

酒店管理小程序目录 目录 基于微信小程序的酒店管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员模块的实现 (1) 用户信息管理 (2) 酒店管理员管理 (3) 房间信息管理 2、小程序序会员模块的实现 (1)系统首页 &#xff0…...

C++ 数论相关题目,博弈论,SG函数,集合-Nim游戏

给定 n 堆石子以及一个由 k 个不同正整数构成的数字集合 S 。 现在有两位玩家轮流操作,每次操作可以从任意一堆石子中拿取石子,每次拿取的石子数量必须包含于集合 S ,最后无法进行操作的人视为失败。 问如果两人都采用最优策略,…...

​学者观察 | 区块链技术理论研究与实践观察——中央财经大学朱建明

导语 当下区块链研究成果质量越来越高,技术应用越来越成熟。在现阶段的研究中存在哪些短板需要弥补,如何将研究成果转化为推动数字经济高质量发展的实际应用,区块链技术与其他新技术结合发展将带来哪些新的机遇? 中央财经大学朱…...

使用Promethues+Grafana监控Elasticsearch

PromethuesGrafana监控Elasticsearch 监控选用说明指标上报流程说明实现监控的步骤搭建elasticsearch-exporter服务搭建promethues和grafana服务 监控选用说明 虽然用Kibana来监控ES,能展示一些关键指标,但ES本身收集的指标并不全面,还需要在…...

研学活动报名平台源码开发方案

一、项目背景与目标 (一)项目背景 研学活动报名平台旨在为活动组织者提供方便快捷的研学活动管理工具,同时为用户提供全面的活动搜索、报名和支付等功能。通过该系统,活动组织者能够更好地管理活动报名信息,用户也可…...

一篇文章,彻底理解数据库操作语言:DDL、DML、DCL、TCL

最近与开发和运维讨论数据库账号及赋权问题时,发现大家对DDL和DML两个概念并不了解。于是写一篇文章,系统的整理一下在数据库领域中的DDL、DML、DQL、DCL的使用及区别。 通常,数据库SQL语言共分为四大类:数据定义语言DDL&#xf…...

Linux编辑器之vim的使用

文章目录 一、vim简介二、vim的基本概念三、vim的基本操作四、vim正常模式命令集移动光标删除文字复制替换撤销上一次操作更改跳至指定的行vim末行模式命令集列出行号跳到文件中的某一行查找字符保存文件离开vim 五、进阶vim玩法打开文件批量注释代码执行shell命令指定注释窗口…...

制作OpenSSH 9.6 for openEuler 22.03 LTS的rpm升级包

OpenSSH作为操作系统底层管理平台软件,需要保持更新以免遭受安全攻击,编译生成rpm包是生产环境中批量升级的最佳途径。本文在国产openEuler 22.03 LTS系统上完成OpenSSH 9.6的编译工作。 一、编译环境 1、准备环境 基于vmware workstation发布的x86虚…...

DNS配置文件讲解

1. 概述 BIND:Berkeley Internet Name Domain ,伯克利因特网域名解析服务是一种全球使用最广泛的、 最高效的、最安全的域名解析服务程序 2. 安装软件 [rootserver ~]# yum install bind -y 3. bind服务中三个关键文件 /etc/named.conf : 主配置文件…...

142:vue+leaflet 加载tomtom地图(多种形式)

第142个 点击查看专栏目录 本示例介绍如何在vue+leaflet中添加tomtom地图,这里包含了多种形式,诸如中文标记、英文标记、白天地图、晚上地图、卫星影像图,高山海拔地形图等。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例…...

Android Mac电脑更改aar中的文件再打包

一 问题 要在Mac电脑上替换AAR中的文件并重新打包。 二 解决方案 1.解压AAR文件 将AAR文件重命名为.zip,并解压缩它,得到一个文件夹。 2.替换文件 在解压后的文件夹中找到您想替换的文件,将其替换为新文件。 3.重新打包 打开终端&…...

Jmeter脚本录制:抓取IOS手机请求包!

现在移动端的项目越来越多,今天给大家介绍一下,在IOS下Jmeter如何抓包。 1、电脑连上wifi; 2、Jmeter中配置“HTTP代理服务器” 1)启动Jmeter; 2)“测试计划”中添加“线程组”; 3)“测试计划”中添加“HTTP代理服务器”&#…...

大数据分析案例-基于随机森林算法构建电影票房预测模型

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…...

关于Gitlab用户登录提示无限重定向循环ERR_TOO_MANY_REDIRECTS

#工作笔记# 查阅了网上所有相关的记录,都没有解决gitlab登录/users/sign_up/welcome提示ERR_TOO_MANY_REDIRECTS,好在最终解决了,记录在此。 先说下起因: github哼哼不想用了,原因太多,所以内部讨论用git…...

突破瓶颈,提升开发效率:Spring框架进阶与最佳实践-IOC

IOC相关内容 1.1 bean基础配置1.1.1 bean基础配置(id与class)1.1.2 bean的name属性步骤1:配置别名步骤2:根据名称容器中获取bean对象步骤3:运行程序 1.1.3 bean作用范围scope配置1.1.3.1 验证IOC容器中对象是否为单例验证思路具体实现 1.1.3.2 配置bean为非单例1.1.…...

西方网络安全人才培养的挑战及对策

文章目录 前言一、网络安全人才力量发展现状(一)注重从战略上重视网络安全人才培养和发展。(二)注重从多渠道多路径招募网络安全人才。(三)注重分层次分阶段系统规划网络安全人才培养模式。(四)注重通过实践锻炼进一步提升网络攻防实战能力。二、网络安全人才面临的形势…...

计算机网络之三次握手,四次挥手

TCP(传输控制协议)是一种面向连接的、可靠的传输层协议,用于在网络中的两个应用程序之间建立可靠的通信连接。TCP的核心特征之一是它使用“三次握手”过程来建立连接,以及“四次挥手”过程来终止连接。 三次握手(建立…...

深度强化学习(王树森)笔记09

深度强化学习(DRL) 本文是学习笔记,如有侵权,请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接:https://github.com/wangshusen/DRL 源代码链接:https://github.c…...

调试OpenHarmony应用/服务

调试流程 DevEco Studio提供了丰富的OpenHarmony应用/服务调试能力,帮助开发者更方便、高效的调试应用/服务。 OpenHarmony应用/服务调试支持使用真机设备调试。使用真机设备进行调试前,需要对HAP进行签名后进行调试。详细的调试流程如下图所示&#x…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

OpenLayers 分屏对比(地图联动)

注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...