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

快速验证CNN结构:用快马平台一键生成手写数字识别原型

快速验证CNN结构:用快马平台一键生成手写数字识别原型 最近在学深度学习,想试试用卷积神经网络(CNN)做个手写数字识别的小项目。传统从零开始写代码太费时间了,光是搭环境、调参数就能折腾半天。后来发现InsCode(快马)平台能直接生成可运行的…...

读懂 ABAP 调试器里的 ()XVBRP[]:这不是新语法,而是旧式内表加调试器命名表示法的组合

有朋友问我下面这个截图里的变量名是什么语法? 你这张截图里的 ()XVBRP[],结论上并不是一种新的 ABAP 变量声明语法。把它拆开看,更容易理解: XVBRP[] 这一段,核心含义是:XVBRP 是一个带 header line 的旧式内表,而 [] 明确表示你看到的是内表体 table body,不是同名的…...

IQuest-Coder-V1功能实测:一键生成高质量SQL查询脚本

IQuest-Coder-V1功能实测:一键生成高质量SQL查询脚本 在数据驱动的时代,SQL查询脚本的编写是每个数据分析师、后端工程师乃至产品经理的日常。面对复杂的业务逻辑和多表关联,手动编写SQL不仅耗时,还容易出错。有没有一种工具&…...

OpenClaw定时任务管理:Qwen3-4B每日早报自动生成与推送

OpenClaw定时任务管理:Qwen3-4B每日早报自动生成与推送 1. 为什么需要自动化早报服务 每天早上打开电脑第一件事,就是查看行业动态和技术新闻。但手动收集整理的过程实在太耗时——要打开十几个网页,筛选有价值的信息,再整理成简…...

分布式系统CAP理论之如何取舍

在分布式系统中,CAP 理论 是一个基石性、指导性的理论,它告诉我们:在设计分布式系统时,无法同时满足三个核心特性,只能在三者之间做权衡。🌐 一、CAP 理论的三个字母代表什么?字母含义说明CCons…...

提升Telegraf性能:未使用方法接收器的代码优化实战指南

提升Telegraf性能:未使用方法接收器的代码优化实战指南 在Go语言开发中,方法接收器(Method Receiver)是连接函数与结构体的重要桥梁,但过度使用或不当使用会导致性能损耗和代码冗余。Telegraf作为插件驱动的指标收集代…...

MCP Agent Graph: 基于上下文工程的多智能体系统构建指南

1. 引言: 从单一模型到多智能体协作 1.1 大语言模型的能力边界 大语言模型(LLM)的发展经历了从简单文本生成到复杂推理的演进过程。早期的应用场景主要集中在问答、翻译、摘要等相对独立的任务上,模型作为一个无状态的推理引擎,接收输入并产生输出。然…...

【仅限头部车企工控厂商内部流通】C++27静态反射安全合规包:覆盖MISRA C++:2023 Annex A.12及AUTOSAR C++14兼容性桥接层

第一章:C27 静态反射工业应用案例C27 将正式引入标准化的静态反射(Static Reflection)核心特性,基于 std::reflexpr 和反射元对象模型(ROM),使编译期类型结构可被直接查询与遍历,无需…...

2026 靠谱网站建设公司推荐|中大型企业 / 上市公司建站避坑与优选指南

摘要 在 AI 与 GEO(生成式引擎优化)主导的 2026 年,企业官网早已不是简单的展示窗口,而是品牌信任、获客转化、合规披露、全球触达的核心数字资产。选择一家靠谱的网站建设公司,直接决定企业数字化成果与长期商业价值。…...

STM32首次烧录选择erase sectors导致程序跑飞

一、故障现象小批量打样回来的板子,烧录程序后一切正常,蜂鸣器响0.5s,LED闪烁等待握手;但是断电重启后蜂鸣器长鸣,LED不闪烁,无法正常运行。二、分析解决过程首先我看了一下电源,电压、电流都是…...