避免这些编程陷阱:七种让你代码失控的开发风格
散弹枪编程火力覆盖,蒙中就行 “嗯,这个报错……把参数从 false 改成 true 试试?还不行?那把这行注释掉看看?” 开发者使用非常随意的方式对待代码,像持散弹枪般,不加分析地向问题盲目射击,通过随机、反复地修改代码来碰运气,直到错误消失。这是一种极其消极的调试方式,往往在解决一个表面问题的同时,制造了多个隐藏更深的 Bug。 代码被破坏,逻辑变得不可预测,且无人理解为何这样改能“工作”。 撞大运编程迷糊前进,侥幸过关 “这段代码为啥能跑通?我也不太确定,但先别动它!” 比散弹枪编程更温和,但也更常见。程序员对模块的内在逻辑一知半解,依靠直觉和偶然的成功编写代码。一旦出现问题,会面临关键抉择:一是停下来,理解一下程序,找到出错的原因,二是使用散弹枪编程方式开始解决问题。 项目充满了“神秘代码”,后人不敢轻易触碰,形成知识黑洞。 Cargo-Cult 编程Cargo Cults 这个词儿来自二战期间的某些太平洋上小岛里的土著人。在战争期间,美国利用这些小岛作为太平洋战场上的补给站。他们在这些小岛上修建自己的飞机跑道以用来运输战争物资。而那些小岛上的土著人从来没有见过飞机,当他...
如何做好技术面试?
在公司承担技术面试的职责,刚开始的时候可能会感到困惑,不知道如何去面试别人,这里总结了一些技术面试的经验,以及一些在面试过程中的一些思考 技术面试应该要问些什么?技术面试通常是对于候选人的技术能力的评估和相关知识进行评估的面试环节,在技术面试中,面试官通常要评估候选人在以下方面的职责: 技术基础知识和基础:面试官应该要问技术相关职位相关领域的技术知识问题,以验证其对基本概念、原理和技术的了解程度 编程能力:面试官要一定程度上考察候选人的编码能力,包括熟练掌握相应的编程语言、数据结构和算法相应的知识,以及解决问题和实现功能的能力 技术经验:面试官应该要结合候选人简历,沟通项目和工作中涉及的技术栈、开发流程、工具和框架等方面的知识,以评估其实际应用能力和项目经验 系统设计能力:面试官应该要考察候选人在系统设计和架构方面的能力,包括对系统组件、模块化、拓展性、可靠性和安全性等方面的理解和实践 问题解决和沟通能力:面试官有时也应该根据候选人的沟通情况,提出一些实际问题或场景,评估候选人解决问题的能力、思维方式和沟通表达能力 自我学习和技术热情:面试官应该要和候选人沟通学习的知识或者...
Obsidian打造个人知识库
之前都是使用Typora编辑笔记和文档,Markdown写笔记或者文档简直不要太方便,熟练语法后,双手可以不离开键盘,目光始终聚焦再文字上面,写作体验非常流畅。 随着文档的增多,发现文档越来越不好管理,尝试语雀、印象笔记、腾讯文档、飞书文档等软件,功能虽然很多但是总感觉和自己不太搭,而且软件商业化的原因开始绑架免费用户,虽然能够理解但还是很不爽。尝试了Obsidian觉得眼前一亮,颜值是第一吸引力,可以自由搭配的插件以及主题可以解决我的需求。 数据同步身为一名资深的白嫖党,果断拒绝了Obsidian自带的同步功能,可以使用GitHub进行替代,无限容量,私人仓库也是完全免费,用来管理笔记文档简直是降维打击。总的来说就是建立一个git仓库,把笔记都丢进去,将一些文件和目录都忽略掉,然后使用Obsidian打开这个git仓库作为Obsidian的仓库使用。由于Obsidian使用过程中有些自带的文件一直变化,直接忽略掉。 由于国内网络的问题,我使用的是阿里云效的代码仓库进行托管 .gitignore 文件内容 123456789101112## obsidian的工作区配置.ob...
性能优化全景图:七大维度深度解析
代码之所以把代码放到第一位,是因为这一点最容易引起技术人员的忽视。很多技术人员拿到一个性能优化的需求以后,首先想到的是缓存、异步、JVM等。实际上,第一步就应该是分析相关的代码,找出相应的瓶颈,再来考虑具体的优化策略。有一些性能问题,完全是由于代码写的不合理,通过直接修改一下代码就能解决问题的,比如for循环次数过多、作了很多无谓的条件判断、相同逻辑重复多次等。 数据库数据库的调优,总的来说分为以下三部分: SQL调优这是最常用、每一个技术人员都应该掌握基本的SQL调优手段(包括方法、工具、辅助系统等)。这里以MySQL为例,最常见的方式是,由自带的慢查询日志或者开源的慢查询系统定位到具体的出问题的SQL,然后使用explain、profile等工具来逐步调优,最后经过测试达到效果后上线。 架构层面的调优这一类调优包括读写分离、多从库负载均衡、水平和垂直分库分表等方面,一般需要的改动较大,但是频率没有SQL调优高,那么什么时候需要做这些事情?我们可以通过内部监控报警系统,定期跟踪一些指标数据是否达到瓶颈,一旦达到瓶颈或者警戒值,就需要考虑这些事情。 连接池调优我们的应用为了实现数...
翻译翻译什么是惊喜:一次线上问题的思考
💡TIP在线上商城的一次功能迭代中,我们遇到了一个线上问题。虽然很快解决,但是觉得这个问题在软件设计开发中非常典型,对问题产生的原因以及如何避免类似问题的产生做一次复盘分析 背景商城的用户具有不同的会员等级,包括黄金会员、白银会员和普通会员。根据会员等级的不同,商品的价格策略也不同。具体来说,黄金会员购买商品时享受黄金会员价,普通会员购买时享受普通会员价,白银会员比较特殊购买时享受黄金会员价。 商品的后台管理功能只维护商品的黄金会员价和普通会员价,白银会员的价格显示和购买时的价格计算在业务代码中进行判断,如果是白银会员价格按照黄金会员执行。 数据库设计:一个商品sku和会员价格存在一对多的关系 产生问题在优惠券功能迭代中,产品要求增加商品兑换券的功能,兑换券在进行商品购买时==优惠金额 = 商品价格 - 0.01元==,由于不同会员等级享受的商品价格不同,那么同一个兑换券对于不同的会员来说,优惠金额也就不一样,优惠金额需要根据使用优惠券时当前会员等级以及能够兑换的商品进行计算。 在功能开发时,遗漏了一个场景,...
计算机组成原理
计算机结构计算机的经典结构是冯·诺依曼结构,它由五大部件组成:运算器、控制器、存储器、输入设备和输出设备。现代计算机结构通常包括中央处理器(CPU)、内存、存储设备、输入/输出设备以及连接这些设备的总线系统。 运算器 算数逻辑单元(ALU):执行算数和逻辑运算 累加寄存器(AC):通用寄存器,为ALU提供一个工作区,用在暂存数据 数据缓冲寄存器(DR):读/写内存时,暂存指令或数据 状态条件寄存器(PSW):存状态标志与控制标志 软考中存在争议,也有将其归为控制器的 控制器 程序计数器(PC):存储下一条要执行指令的地址 指令寄存器(IR):存储正在执行的指令 指令译码器(ID):对指令中的操作码字段进行分析解释 时序部件:产生时钟脉冲(Clock Pulse),为整个CPU提供基准时序信号 计算机体系结构分类-FlynnSISD - 单指令流单数据流 (Single Instruction, Single Data) 描述: 单指令流:在任何时钟周期,只有一个控制单元(CU)从内存中取出一条指令。 单数据流:该指令在单个处理单元(PU)上操作一个数据...
使用nvs工具切换node版本
安装nvs官方仓库 nvs 有跨平台的特性,支持 Windows 、 macOS和 Linux 系统,下面分别介绍两种安装方法。 windows推荐通过 msi 的方式安装,就跟正常安装软件一下,双击下一步即可: https://github.com/jasongin/nvs/releases mac用下面三行命令即可: 1export NVS_HOME="$HOME/.nvs" git clone https://github.com/jasongin/nvs "$NVS_HOME" . "$NVS_HOME/nvs.sh" install 常见命令添加Node版本如果你想安装最新的 LTS 版本,可以用命令: 1nvs add lts 如果你需要新增一个 Node.js 16的版本,可以用以下命令: 1nvs add 16 更新当前的 Node 小版本如果你想要升级 Node 小版本,比方说从 20.13.1升级到20.14.0(当前大版本的最新版),可以使用如下命令: 1nvs upgrade 配置默认 N...
蒙提霍尔问题-经典的三扇门问题
问题设定 三扇门:一扇后面有汽车(奖品),两扇后面有山羊。 你随机选择一扇门(比如 1 号门)。 主持人(知道汽车在哪里)打开另一扇门,露出一只山羊(比如 3 号门)。 主持人问你:是否换到剩下的那扇门(2 号门)? 关键点 主持人 总是 会打开一扇有山羊的门,且不会打开你选的门。 主持人的行动不是随机的,而是根据你的选择和门后的情况刻意为之,这提供了额外信息。 概率分析初始概率 你第一次选择时,选中汽车的概率是 1/3,选中山羊的概率是 2/3。 两种情形 你第一次选中了汽车(概率 1/3) 剩下的两扇门都是山羊。 主持人打开其中一扇山羊门。 如果你 换门,会换到另一扇山羊门 → 失败。 如果你 不换,保留原来的门 → 获胜。 你第一次选中山羊(概率 2/3) 剩下的两扇门中,一扇是汽车,一扇是山羊。 主持人 只能 打开剩下的那扇山羊门(因为不能打开你的门,也不能直接打开汽车门)。 如果你 换门,一定会换到剩下的那扇汽车门 → 获胜。 如果你 不换,保留原来的山羊门 → 失败。 总结策略结果...
事件驱动架构:业务解耦与异步处理
1. 事件驱动架构概述事件驱动是一种经典的编程和系统设计模式,其核心思想是系统的运作由事件来驱动。当事件发生时,系统的各个组件会对事件做出反应并执行相应的操作。这些事件可以是外部触发的(如用户点击、网络请求),也可以是系统内部产生的(如状态变更、定时调度)。 2. 事件驱动在业务系统中的价值2.1 接口解耦在业务系统中,事件驱动机制被广泛用于接口解耦。以电商系统为例: 商品发布、订单变更等都可以作为事件进行发布 商品信息同步、订单信息推送等操作可以作为事件监听器 主业务流程只需关注核心业务逻辑,使功能更加内聚,耦合性更低 2.2 划分主业务流程与事件消费者的方法一个简单的判断标准是:如果某些操作不执行,仅从业务域本身考虑,系统是否仍能正常运行?如果答案是肯定的,那么这些操作就可以被定义为事件的消费者。 示例分析:在电商系统的商品发布流程中,将商品信息同步给下游系统如果失败或未执行,商品系统本身仍应能正常发布商品。同步问题可以通过定时推送、失败补偿等机制解决,因此商品信息同步操作适合作为事件消费者。 3. 实践中的挑战与解决方案3.1 下游系统约束的处理当下游系统对业务有约束...
Spring事件监听在业务使用中的优化
事件驱动的开发方式在业务系统开发中扮演着关键角色,若能妥善运用,将对系统的拓展性产生至关重要的影响。Spring框架对事件驱动进行了出色的封装,然而在实际业务应用中,我们发现了一些可优化的领域,因此针对这些问题进行了封装和优化工作。 Spring事件驱动的使用在电商订单创建的场景中,一旦订单成功创建,必须执行一系列附加的业务操作。这些操作包括向用户发送相关信息,并将订单信息同步到相关系统中。考虑到此场景的特点,事件驱动的开发方式被广泛认为是最合适的选择,因其能够在不对业务系统造成负面影响的前提下进行处理。 事件定义在订单创建事件中,可以定义包含订单对象以及与订单相关的属性,例如订单ID等。通过此事件,能够有效地传递订单信息,并为其他业务操作提供必要的数据依据。 12345678@Data@AllArgsConstructorpublic class CreateTradeEvent{ // 可以在此定义订单创建事件中的相关属性 private Trade trade; } 事件发布在订单成功创建之后,我们可以获取到订单实体或其他...
知其然知其所以然:Boolean类型命名规范
对应阿里巴巴开发手册-编码规约-命名风格第9条,规约中写的比较模糊,之前只知道这样命名可能会存在问题,这里探索一下具体什么场景会存在问题。 对上面举的反例感觉有些怪,**基本数据类型Boolean isDeleted属性的Getter方法是isDeleted()**,手册应该写的有问题,印象中基本数据类型boolean是这样的,但是Boolean包装类型并不是如此,后面会对这里进行探索,坑很大。 实例深究JavaBean规范首先了解下JavaBean的规范,属性应该由一组读写方法(Getter/Setter)来访问,如果操作的字段为boolean类型,此时Getter不应命名为getXXX方法,而应该是isXXX,如果boolean类型的属性名以is开头,则将属性名中的is自动去除,例如boolean isSuccess的Getter是isSuccess(),但是对于Boolean类型的属性并没有明确的规范进行约定。 以下示例基于IDEA 2023.1 JDK11 布尔类型存在基本数据类型和包装类型,所以存在四种情况 1234private boolean succe...
Ubuntu 安装 Docker 操作手册
官方操作手册 操作系统要求要安装 Docker 引擎,您需要以下 Ubuntu 版本的 64 位版本之一: Ubuntu Questing 25.10 Ubuntu 探索版 25.10 Ubuntu Plucky 25.04 Ubuntu 勇敢版 25.04 Ubuntu Noble 24.04 (LTS) Ubuntu 贵族版 24.04 (LTS) Ubuntu Jammy 22.04 (LTS) Ubuntu 甜蜜版 22.04 (LTS) Ubuntu 的 Docker Engine 与 x86_64(或 amd64)、armhf、arm64、s390x 和 ppc64le(ppc64el)架构兼容。 查看系统版本 1234567891011121314sharkidon@ubuntu:~$ cat /etc/os-releasePRETTY_NAME="Ubuntu 25.10"NAME="Ubuntu"VERSION_ID="25.10"VERSION="25.10 (Questing ...






