程序员为什么要写bug,不能一次性写好吗?
仅仅听到“Bug”这个词就会让你作为一个开发人员感到畏缩。我们相信,优秀的程序员是那些编写无错误代码的人。随着一些开发人员强调要成为一名零错误程序员,我们进行了更深刻的思考,并发现事实的准确性。
所有制作的软件都应该没有错误。对此没有第二发言权,因为几乎每个软件都被开发为长跑者,即使在边缘情况下也可以运行。因此,无错误的程序是必须的,但不是无错误的代码编写。我们的意思是,编写带有错误的程序会使您失去对编码的许多其他方面的关注,我们将在本文后面看到这些方面。零错误程序员是那些强调编写完美代码的人,理想情况下,甚至在程序完成和执行之前也没有错误。
开发人员需要面对这样一个事实,即无错误的写作是不可能的。不,我们不会质疑您在编码方面的能力和知识,但我们会在开发过程中考虑导致错误的其他因素。优秀的程序员明白,他们创建和实现软件的时间有限,因此功能的神圣化迫在眉睫。除了时间和紧迫的期限之外,资金限制是阻碍无错误软件开发的因素,因为运行手动代码审查的成本很高。因此,错误是不可避免的。重要的是,开发人员不应该害怕它们并准备犯错误。
不要试图编写无错误的代码
让我们看看每个开发人员在成为零错误开发人员的竞赛中错过的三件事,以及它如何给软件本身带来问题。
更注重功能而不是代码设计
那些擅长编写无错误代码的开发人员往往更关注功能。焦点如此之高,以至于他们忽略了可维护性使软件保持活力。可维护性应该是编码时的重中之重。只要你的代码是干净的,编写有缺陷的代码是可以接受的。零错误程序员也忽略或远离软件的设计标准,因为他们倾向于将软件视为需要由功能解决的问题。但他们忘记了,即使在软件完成后也可以轻松更改软件的功能,但提高可维护性是一项更艰巨的工作,而且成本高昂。许多程序员低估了他们的代码将被使用多长时间以及读取和修改的频率,因此忽略可维护性确实会非常昂贵。
忽略代码质量并产生异味
我们在之前的博客中看到,由于不良的编程习惯,代码异味是故意引入代码的,大多数时候是在不知情的情况下引入的。气味的原因之一是因为敏捷程序员倾向于在编写问题和错误后立即解决问题和错误。过早的优化或即时修复会产生臭代码,因为它们没有考虑软件的整体代码质量。
以一个错误为例,它提示你在已经很庞大的类中再写几行。你在同一类中发现了更多的错误,并继续输入代码行,最终得到一个似乎包含所有内容的上帝类。此外,在某些情况下,如果出现类似的错误,敏捷程序员将再次编写代码作为问题的即时修复,但最终会增加重复。代码质量是程序的灵魂;代码质量差意味着您的软件易受攻击、效率低下、速度缓慢,并且存在巨大的技术债务。
害怕错误的编码人员效率低下,创造力不足
如果你害怕做某事,你会在做之前多想一想,或者跳过去做。有些人会争辩说这是一件好事,但前提是你打算从飞机上跳伞。害怕编写代码只会降低您的工作效率并限制您的增长。错误是最好的老师,犯错最多的人最终会学到最多。编写错误代码意味着您正在做一些您不完全擅长或不舒服的事情,解决这些错误会给您带来学习经验。
开发人员在编写代码时需要展示他们的创造力,以提出独特、高效且设计更宏伟的东西。害怕错误的程序员或零错误程序员倾向于留在他们的知识保护圈中,实现他们所知道的,使他们的创造力和实验性降低。优秀的程序员不怕错误,全力以赴发挥创造力。嗯,这就是为什么最好的开发人员是计算机科学家。
优秀的程序员会产生更便宜的错误。
我们并不是说犯了很多错误和编写错误的代码意味着你是一个称职的程序员。我们认为优秀的程序员并不完美;它们确实会产生错误。那么如何区分一个好的程序员和一个有缺陷的脚本程序员呢?简单!好的程序员会犯更便宜的错误,在大多数情况下是为了避免犯昂贵的错误。更便宜的错误是那些解决速度更快并且对技术债务贡献不大的错误。糟糕的程序员会犯代价高昂的错误,复杂的错误甚至可能需要更改程序的多个部分才能解决它。相反,优秀的程序员知道如何欠足够的技术债务。当然,足够意味着更低,但对于开发人员来说,他们认为低和太高是非常主观的。但是编写无错误的代码绝不能与高额技术债务妥协。
优秀的程序员使用 CodeGrip 来查找错误。
那么,如果优秀的程序员不专注于无错误的写作,他们会怎么做呢?他们使用 CodeGrip,这是一种自动代码审查工具,可分析您的代码行以查找漏洞和错误。CodeGrip 显示您的代码可能存在的所有错误,指出它们的位置,并指定适当的解决方案,使其没有错误,但也使可维护性不受影响。您可以有更多时间展示解决问题的能力、设计技能和创造力,同时将错误检测和代码质量保证留给 CodeGrip。CodeGrip可以免费试用在线工具,该工具直接与您的GitHub或BitBucket存储库集成,使代码审查和无错误代码无忧无虑!
还想成为一名零错误程序员吗?尝试根本不编写代码。
相关文章:

程序员为什么要写bug,不能一次性写好吗?
仅仅听到“Bug”这个词就会让你作为一个开发人员感到畏缩。我们相信,优秀的程序员是那些编写无错误代码的人。随着一些开发人员强调要成为一名零错误程序员,我们进行了更深刻的思考,并发现事实的准确性。 所有制作的软件都应该没有错误。对此…...
Nginx反向代理其他服务
Nginx反向代理 嘿,你的网络遇到了限制,不能直接通过服务的端口进行访问?别担心,我们可以借助Nginx这个超级英雄来解决这个问题!让我给你讲讲关于Nginx反向代理的故事吧。 首先,让我们明确一下反向代理的概…...
MQ 简介-RabbitMQ
一. MQ 简介 消息队列作为高并发系统的核心组件之一,能够帮助业务系统结构提升开发效率和系统 稳定性,消息队列主要具有以下特点: 削峰填谷:主要解决瞬时写压力大于应用服务能力导致消息丢失、系统奔溃等问题系统解耦:解决不同重要程度、不…...
强化学习(2)
强化学习(1) 1.多智能体深度强化学习重要性采样 多智能体深度强化学习(Multi-Agent Deep Reinforcement Learning,MADRL)是指在多智能体环境下使用深度强化学习算法进行协同学习。重要性采样(Importance Sampling)是…...

Visual Studio 2022的MFC框架——theApp全局对象
我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来重新审视一下Visual Studio 2022下开发工具的MFC框架知识。 MFC中的WinMain函数是如何与MFC程序中的各个类组织在一起的呢?MFC程序中的类是如何与WinMain函数关联起来的呢?…...

SpringBoot Cache
一、基本概念 Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。 Spring Cache 提供了一层抽象,底层可以切换不同的缓存实现,例如: • EHCache • Caffeine …...

vue 简单实验 自定义组件 component
1.代码 <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"components-demo"><button-counter></button-counter> </div> <script> // 创建一个Vue 应用 const ap…...

C++ 改善程序的具体做法 学习笔记
1、尽量用const enum inline替换#define 因为#define是做预处理操作,编译器从未看见该常量,编译器刚开始编译,它就被预处理器移走了,而#define的本质就是做替换,它可能从来未进入记号表 解决方法是用常量替换宏 语言…...

Unity 之 GameObject.Find()在场景中查找指定名称的游戏对象
文章目录 GameObject.Find 是 Unity 中的一个函数,用于在场景中查找指定名称的游戏对象。这个函数的主要作用是根据游戏对象的名称来查找并返回一个引用,使您能够在代码中操作该对象。以下是有关 GameObject.Find 的详细介绍: 函数签名&…...

flink on yarn with kerberos 边缘提交
flink on yarn 带kerberos 远程提交 实现 flink kerberos 配置 先使用ugi进行一次认证正常提交 import com.google.common.io.Files; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org.apache.flink.client.cli.CliFrontend; import o…...

NodeJS的简介以及下载和安装
本章节会带大家下载并安装NodeJs 以及简单的入门,配有超详细的图片,一步步带大家进行下载与安装 NodeJs简介关于前端与后端Node是什么?为什么要学习NodeNodeJS的优点: NodeJS的下载与安装NodeJS的下载: NodeJS的快速入…...
量化面试-概率题
文章目录 一、题目1.糖果罐(绿皮书79页)2 折木棍(绿皮书89页)3 第一张ACE(绿皮书95页)4 n个均匀分布之和(绿皮书95页) 二、答案1. 糖果罐2 折木棍3 第一张ACE4 n个均匀分布之和 一、…...
【spark】java类在spark中的传递,scala object在spark中的传递
记录一个比较典型的问题,先讲一下背景,有这么一个用java写的类 public class JavaClass0 implements Serializable {private static String name;public static JavaClass0 getName(String str) {if (name null) {namestr;}return name;}... }然后在sp…...
php 文字生成图片保存到本地
你可以使用PHP的GD库来生成图片并保存到本地。首先,你需要确保你的PHP环境已经安装了GD库。然后,你可以使用GD库的函数来创建一个画布,并在上面绘制文字。最后,使用imagepng或imagejpeg函数将画布保存为PNG或JPEG格式的图片文件。…...
面试手撕—二叉搜索树及其后序遍历
一、引言 在面试地平线的时候,聊到了二叉搜索树,让手撕二叉搜索树,以下是要求 1、用类模板实现二叉搜索树 2、写一个函数,实现给一个vector数组,转换成二叉搜索树 3、写出二叉搜索树的后序遍历 二、代码实现 #inc…...
Java数据结构面试题以及答案
本专栏记录Java后端开发相关的面试题,欢迎大家阅读专栏的其他文章。 目录 1.B树和B树的区别?B树和B树的优点分别是? 2.排序算法的种类和复杂度 3.HashMap和Hashtable的原理、区别、应用场景 4.ConcurrentHashMap的原理、应用场景 5.Arra…...

Java——它要求用户输入一个整数(实际上是一个字符串),然后计算该整数的平方值,并将结果输出。
这是一个Java程序,它要求用户输入一个整数(实际上是一个字符串),然后计算该整数的平方值,并将结果输出。程序的基本流程如下: 首先,声明并初始化变量data和result,它们的初始值都为…...

【科研论文配图绘制】task6直方图绘制
【科研论文配图绘制】task6直方图绘制 task6 主要掌握直方图的绘制技巧,了解直方图含义,清楚统计指标的添加方式 1.直方图 直方图是一种用于表示数据分布和离散情况的统计图形,它的外观和柱形图相近,但它所 表达的含义和柱形图…...

Leetcode刷题:395. 至少有 K 个重复字符的最长子串、823. 带因子的二叉树
Leetcode刷题:395. 至少有 K 个重复字符的最长子串、823. 带因子的二叉树 1. 395. 至少有 K 个重复字符的最长子串算法思路参考代码和运行结果 2. 823. 带因子的二叉树算法思路参考代码和运行结果 1. 395. 至少有 K 个重复字符的最长子串 题目难度:中等 标签&#…...

java八股文面试[多线程]——Synchronized的底层实现原理
笔试:画出Synchronized 线程状态流转实现原理图 synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized 翻译为中文的意思是同步,也称之为”同步锁“。 synchronized的作用是保证在同一时刻, 被修饰的代码块或方…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...