当前位置: 首页 > 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…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

Android15默认授权浮窗权限

我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...