正则表达式灾难:重新认识“KISS原则”的意义
RSS Feed 文章标题整理
微积分在生活中的应用与思维启发
捕鹿到瞬时速度的趣味探索
微积分是一扇通往更广阔世界的门,从生活中学习思维的工具。
数据库才是最强架构
你还在被“复杂架构”误导吗?
把业务逻辑写入数据库,重新定义简单与效率。
正则表达式灾难
重新认识“KISS原则”的意义
从复杂逻辑到系统性风险,回归编程简单之道。
编程的终极难题
0=1?从缓存失效到人类选择的Bug
探讨零索引的历史遗留问题,编程语言的哲学思考。
读代码真的能让你成为更好的程序员吗
深入解析编程学习的正确方法
不只是代码,更是问题与解决方案的思维碰撞。
错误处理的历史与未来
你真的会写Try-Catch吗?
从C++到Rust,重新审视错误处理范式。
程序员必看
让代码“活起来”的三步法则
从“Make it work”到“Make it fast”,编程的升华之旅。
免费午餐的代价
开源软件白嫖的真相!
选择成熟框架,避开开源的潜在风险。
大家好,这里是hikktn!
最近,我在重读经典名著《The Art of Unix Programming》,又一次被那句广为人知的“KISS”原则(Keep It Simple, Stupid)吸引。这句计算机领域的金科玉律,很多人只停留在字面理解,却未必知道它背后更深层次的含义。
今天我们就来聊聊“KISS原则”,特别是它对现代软件开发的启示。重点关注两个问题:什么是“简单”?什么是“愚蠢”?
KISS原则的核心:简单的三大维度
在书中,作者将软件复杂度分为三个维度:
- 实现复杂度(Implementation Complexity):指对程序员来说,开发和维护的难度。
- 接口复杂度(Interface Complexity):指对用户来说,使用软件的难度。
- 代码量(Code Base Size):指代码的总量,通常被认为越少越好。
前两个维度较为直观,但第三个维度“代码量”却经常被过度简化。代码少真的意味着简单吗?历史告诉我们答案并非如此。
案例一:CloudStrike的蓝屏事故
时间: 2024年7月19日
影响: 850万台设备蓝屏,5%全球航班取消。
原因: 安全公司CloudStrike发布的更新包中包含了一个错误的正则表达式。
- 测试覆盖不足: 这段有问题的正则表达式早在事故发生的半年之前就存在于代码库中,但开发和测试团队为了赶进度,使用通配符跳过了这一部分的测试。
- 灰度发布缺失: 新代码直接上线,导致所有客户同时受到影响。
结果是,全球范围内的医疗、交通、金融、通讯等关键领域设备大规模瘫痪,直接引发了史无前例的混乱。

案例二:Cloudflare的大规模瘫痪
时间: 2019年7月2日
影响: 半小时内,Reddit、GitHub、Twitch等数十个平台宕机。
原因: 一行正则表达式中的逻辑错误。
- 灾难性回溯: 错误的写法导致CPU进入指数级叠加循环,瞬间将使用率推高至100%。
- 测试盲区: 尽管代码经过高强度测试,但恰好遗漏了能触发问题的特定字符。
Cloudflare团队的测试流程比CloudStrike更严格,却依然没能避免问题,这揭示了一个令人不安的事实:正则表达式的隐藏风险并非普通测试工具可以完全覆盖。
正则表达式的问题:它真的适合现代开发吗?
正则表达式自50年代诞生以来,凭借其短小精悍的特点,成为软件开发的重要工具。它在早期计算机发展中具有无可替代的地位——能够用最少的代码完成大量工作。然而,随着技术发展,正则表达式的问题也逐渐暴露:
- *难以调试: *短小的语法隐藏了高复杂度,任何小错误都可能引发大问题。
- 不易测试: 传统工具难以全面覆盖其逻辑结构。
- 可读性差: 复杂的正则表达式对于开发者来说,就像在阅读机器语言一样晦涩。
现代编程需要什么?
在2024年的今天,计算机硬件性能远超50年前,内存和存储已不再是稀缺资源。我们追求的是更快、更稳、更强的系统,而正则表达式的“强大”却与“快速”和“稳定”直接冲突。
更简单的选择:拥抱“愚蠢”
两次事故中,问题的根源并不是程序员的不称职,而是复杂逻辑引发的系统性风险。聪明的方案固然看起来高效,但却更容易失败。解决之道并不是抛弃程序员,而是接受自己的局限,选择更加简单直白的方法:
- 分步解决问题:将复杂逻辑拆解为多个小模块,逐一解决。
- 使用易读代码:选择更易理解的语法和工具,哪怕它们可能更耗时或更冗长。
- 加强测试覆盖:针对所有可能的边界情况进行全面测试,而不是依赖“通配符”跳过。
KISS原则的真正含义:适合“愚蠢”的设计
著名程序员Ottoman Energy曾说过:
We always overlook the hidden risk of smart solutions—the dumb people.
聪明的代码解决方案往往隐藏着高门槛,这种门槛提高了出错的概率。当代码从“天才”程序员手中交给普通开发者时,复杂性就会变成一场灾难。
因此,KISS原则的本质并不是简单到极致,而是足够简单到让“普通人”也能理解、使用和维护。正如其真实含义:
Keep It Simple Enough for Stupid People to Handle.
重点信息排版:
1. 为什么KISS原则重要?
- 简化开发:降低团队协作难度。
- 降低风险:减少Bug的传播可能。
- 提高维护:让更多人理解代码逻辑。
2. 正则表达式的教训
- 短小但高风险:隐藏复杂性,难以测试和维护。
- 灾难性后果:逻辑错误引发全球系统瘫痪。
3. 我们应该怎么做?
- 接受愚蠢: 选择直白易懂的解决方案。
- 分步处理: 将复杂逻辑拆解为小模块。
- 加强测试: 覆盖所有可能的边界情况。
互动话题:
你在编程时有没有因为“聪明反被聪明误”的情况?你觉得“简单直白”是否比“功能强大”更重要?欢迎在评论区分享你的看法!
点赞收藏,关注hikktn,我们下期见!
相关文章:
正则表达式灾难:重新认识“KISS原则”的意义
RSS Feed 文章标题整理 微积分在生活中的应用与思维启发 捕鹿到瞬时速度的趣味探索 微积分是一扇通往更广阔世界的门,从生活中学习思维的工具。 数据库才是最强架构 你还在被“复杂架构”误导吗? 把业务逻辑写入数据库,重新定义简单与效率。…...
eNSP-缺省路由配置
缺省路由是一种特殊的静态路由,其目的地址为0.0.0.0,子网掩码为0.0.0.0。 1.拓扑图搭建 2.配置路由器 AR2 <Huawei>sys #进入系统视图 [Huawei]ip route-static 0.0.0.0 0.0.0.0 192.168.3.2 #设置缺省路由 [Huawei]q #返回上一层 <Huawe…...
solr 远程命令执行 (CVE-2019-17558)
漏洞描述 Apache Velocity是一个基于Java的模板引擎,它提供了一个模板语言去引用由Java代码定义的对象。Velocity是Apache基金会旗下的一个开源软件项目,旨在确保Web应用程序在表示层和业务逻辑层之间的隔离(即MVC设计模式)。 Apa…...
STM32端口模拟编码器输入
文章目录 前言一、正交编码器是什么?二、使用步骤2.1开启时钟2.2配置编码器引脚 TIM3 CH1(PA6) CH2 (PA7)上拉输入2.3.初始化编码器时基2.4 初始化编码器输入2.5 配置编码器接口2.6 开启定时器2.7获取编码器数据 三、参考程序四、测试结果4.1测试方法4.2串口输出结果…...
Centos 8, add repo
Centos repo前言 Centos 8更换在线阿里云创建一键更换repo 自动化脚本 华为Centos 源 , 阿里云Centos 源 华为epel 源 , 阿里云epel 源vim /centos8_repo.sh #!/bin/bash # -*- coding: utf-8 -*- # Author: make.han...
MYSQL- 查看存储过程调式信息语句(二十七)
13.7.5.27 SHOW PROCEDURE CODE 语句 SHOW PROCEDURE CODE proc_name此语句是MySQL扩展,仅适用于已构建有调试支持的服务器。它显示了命名存储过程的内部实现的表示。类似的语句SHOW FUNCTION CODE显示有关存储函数的信息(见第13.7.5.19节“SHOW FUNTIO…...
C#基础上机练习题
21.计算500-800区间内素数的个数cn,并按所求素数的值从大到小的顺序排列,再计算其间隔加、减之和,即第1个素数-第2个素数第3个素数-第4个素数第5个素数……的值sum。请编写函数实现程序的要求,把结果cn和sum输出。 22.在三位整数…...
5.5 W5500 TCP服务端与客户端
文章目录 1、TCP介绍2、W5500简介2.1 关键函数socketlistensendgetSn_RX_RSRrecv自动心跳包检测getSn_SR 1、TCP介绍 TCP 服务端: 创建套接字[socket]:服务器首先创建一个套接字,这是网络通信的端点。绑定套接字[bind]:服务器将…...
一区北方苍鹰算法优化+创新改进Transformer!NGO-Transformer-LSTM多变量回归预测
一区北方苍鹰算法优化创新改进Transformer!NGO-Transformer-LSTM多变量回归预测 目录 一区北方苍鹰算法优化创新改进Transformer!NGO-Transformer-LSTM多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab NGO-Transformer-LST…...
深入理解 MyBatis 的缓存机制:一级缓存与二级缓存
MyBatis 是目前 Java 开发中常用的一种 ORM(对象关系映射)框架,它不仅简化了 SQL 语句的编写和管理,还提供了强大的缓存机制,用以提高数据库访问的性能。MyBatis 的缓存分为一级缓存和二级缓存,分别应用于不…...
移远通信推出全新5G RedCap模组RG255AA系列,以更高性价比加速5G轻量化大规模商用
11月20,全球领先的物联网整体解决方案供应商移远通信宣布,正式推出其全新5G RedCap模组RG255AA系列。该系列模组支持5G NR独立组网(SA)和LTE Cat 4双模通信,具有高性能高集成度、低功耗、小尺寸、高性价比等优势&#…...
架构-微服务-环境搭建
文章目录 前言一、案例准备1. 技术选型2. 模块设计3. 微服务调用 二、创建父工程三、创建基础模块四、创建用户微服务五、创建商品微服务六、创建订单微服务 前言 微服务环境搭建 使用的电商项目中的商品、订单、用户为案例进行讲解。 一、案例准备 1. 技术选型 maven&a…...
conda下载与pip下载的区别
一、conda下载与pip下载的区别 最重要是依赖关系: pip安装包时,尽管也对当前包的依赖做检查,但是并不保证当前环境的所有包的所有依赖关系都同时满足。 当某个环境所安装的包越来越多,产生冲突的可能性就越来越大。conda会检查当…...
MySQL获取数据库内所有表格数据总数
在 MySQL 中,要获取数据库内所有表格的数据总数,可以编写一个查询脚本来遍历每个表并计算其行数。你可以使用 INFORMATION_SCHEMA 数据库,它包含了关于数据库元数据的表格,如 TABLES 和 COLUMNS。 以下是一个示例脚本,…...
Matlab 深度学习工具箱 案例学习与测试————求二阶微分方程
clc clear% 定义输入变量 x linspace(0,2,10000);% 定义网络的层参数 inputSize 1; layers [featureInputLayer(inputSize,Normalization"none")fullyConnectedLayer(10)sigmoidLayerfullyConnectedLayer(1)sigmoidLayer]; % 创建网络 net dlnetwork(layers);% 训…...
django authentication 登录注册
文章目录 前言一、django配置二、后端实现1.新建app2.编写view3.配置路由 三、前端编写1、index.html2、register.html3、 login.html 总结 前言 之前,写了django制作简易登录系统,这次利用django内置的authentication功能实现注册、登录 提示ÿ…...
三种蓝牙架构实现方案
一、蓝牙架构方案 1、hostcontroller双芯片标准架构 手机里面包含很多SoC或者模块,每颗SoC或者模块都有自己独有的功能,比如手机应用跑在AP芯片上,显示屏,3G/4G通信,WiFi/蓝牙等都有自己专门的SoC或者模块࿰…...
ffmpeg 视频滤镜:高斯模糊-gblur
滤镜描述 gblur 官网地址 > FFmpeg Filters Documentation 这个滤镜会将视频变得模糊。 滤镜使用 参数 gblur AVOptions:sigma <float> ..FV.....T. set sigma (from 0 to 1024) (default 0.5)steps <int> ..FV.....T…...
期权懂|在期权市场中,如何用好双买期权?
期权小懂每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 在期权市场中,如何用好双买期权? 期权双买操作,即同时买入认购期权(看涨期权)和认沽期权(看跌期权…...
【Linux学习】【Ubuntu入门】2-3 make工具和makefile引入
1.使用命令新建三个.c文件vi main.c,vi input.c,vi caclcu.c,两个.h文件vi input.h,vi caclcu.h 2.vi Makefile:新建Makefile文件,输入一下内容 注意:命令列表中每条命令前用TAB键,不…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
