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

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

JVM垃圾回收机制全解析

Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

如何为服务器生成TLS证书

TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

Map相关知识

数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐)​​ 在 save_images 方法中,​​删除或注释掉所有与 metadata …...