当前位置: 首页 > news >正文

何为屎山代码?

在这里插入图片描述

在编程界,有一种代码被称为"屎山代码"。这并非指某种编程语言或方法,而是对那些庞大而复杂的项目的一种形象称呼。屎山代码,也被称为"祖传代码",是历史遗留问题,是前人留给我们的"宝藏"。它不是一个人堆成的,而是无数前辈一层一层堆起来的。

在这里插入图片描述

一些新手程序员,自信满满,决定重构或修改这些屎山代码。但听我一句劝:屎山代码虽然看着难受,但一旦动手,山就可能塌了,将自己深埋于屎山之中,臭不可闻。

在这里插入图片描述

想象一下,你有一个满是锁的箱子,手上拿着一串没有备注的钥匙。你一个一个锁地试,最终打开了箱子,却没想到里边还有一个满是锁的箱子。当你费尽心思解决了所有锁,钥匙却断了。你完全不明白为什么要这样设计,它看起来那么愚蠢。

在这里插入图片描述

当你有了个新想法,忙碌之后,可能会发现自己写得更蠢。不要试图去理解它,改变它。罗马不是一天建成的,屎山也不是一天堆出来的。千万不要凭一己之力,愚公移山。谁愿意搭上子子孙孙去搞屎山?

那有什么办法解决呢?我告诉你,无解。只要这坨屎山还能支撑业务运作,就不会有领导关心。你一个人和领导沟通,领导又不懂技术,对牛弹琴。你一个人硬着头皮改,你必然疲惫不堪,身心俱疲,最后也必成拉屎之人,千万不要明知山有屎,偏向屎山行。

在这里插入图片描述

编程圈流传着这样一个有趣的小故事:一个哥们上班忽然怒气冲冲,大声质问:“这 TMD 谁写的代码,这么明显的 bug 都能写出来,还不写注释?简直就是一坨屎”。当时项目组的码农们都心惊胆战,不敢说话,瑟瑟发抖,生怕把自己揪出来示众。项目经理听到后发话:"哥们查一下 git 记录。"查出来后通报。哥们说:"在查了。"过了几分钟后,哥们说:"不可能吧!"大家都凑过来看,发现这段代码是哥们一年前自己提交的。为了避免尴尬,大家都没有再提这件事情。

言归正传,造成屎山代码的原因有很多:

  1. 离职工作交接不重视
  2. 无项目文档
  3. 代码注释不全
  4. 团队机制不完备
  5. 领导客户的原因

如果项目需要添加新功能怎么办?那只能在屎山上挖个坑,然后自己再拉坨屎上去。

在这里插入图片描述

屎山是神圣的,为了让你的下一任有点事情做,你可以这样:

  1. 定义看不懂的命名
  2. 定义过长的类或者函数
  3. 写大段重复代码,不进行封装
  4. 写一堆没有注释的代码
  5. 定义 100 个参数的函数
  6. 让业务过度耦合

不幸的是,大多数项目中,上述屎山代码是随处可见的。毕竟几百个人写的屎山代码,就像几百个人堆积木,堆得歪歪扭扭、摇摇晃晃、乱七八糟。你千万不能抽掉一块,指不定抽了一块就塌了。只能看见哪里不牢靠,不停地往哪边堆积木,只要不倒就好,这也是大部分程序员的工作。

在这里插入图片描述

其他行业里的祖传是指有传统的根基,良好的信誉品质好,可以说是前人栽树后人乘凉。但代码如果挂上祖传二字,就意味着无数修不完的 bug。

面对屎山代码,我们或许无法完全避免,但我们可以尽力减少它的产生。通过良好的编程习惯,清晰的代码结构,充分的注释和文档,我们可以为后来者留下一个更加稳固的代码基础…,好了我编不下去了,因为我也是挖坑拉屎的人~~~

![[Pasted image 20240608000755.png]]

原文地址:https://mp.weixin.qq.com/s/uIhRYcZ0IqNGpNeMuJk1rQ
往期文章合集:https://stormsha.blog.csdn.net/article/details/139203741

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Facebook海外户|如何制作出引人注目的Facebook广告素材?
  • lua vm 五: upvalue
  • django ORM model update常规用法
  • java面试题:java三大特性多态又是如何实现的
  • 作文笔记11 推荐一本书
  • 磁力狗ciligou,磁力链接使用步骤
  • Java--Math类和Random类
  • 【设计模式】面向对象与UML
  • uni-app加持下的Vue开发:效率与功能的双赢
  • requests库的常用方法
  • 数据结构--第七章--树和二叉树
  • 调研管理系统的设计
  • odoo15升级odoo16遇到的问题及解决过程
  • 关于fedora中的wheel组
  • spring boot使用自定义注解做AOP
  • 时间复杂度分析经典问题——最大子序列和
  • css布局,左右固定中间自适应实现
  • golang 发送GET和POST示例
  • JS字符串转数字方法总结
  • maya建模与骨骼动画快速实现人工鱼
  • PaddlePaddle-GitHub的正确打开姿势
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Travix是如何部署应用程序到Kubernetes上的
  • 服务器从安装到部署全过程(二)
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 计算机常识 - 收藏集 - 掘金
  • 排序(1):冒泡排序
  • 前端
  • 前端面试之闭包
  • 手写双向链表LinkedList的几个常用功能
  • 在weex里面使用chart图表
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • Hibernate主键生成策略及选择
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #pragma once与条件编译
  • #单片机(TB6600驱动42步进电机)
  • ( 10 )MySQL中的外键
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (八)Spring源码解析:Spring MVC
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (五)IO流之ByteArrayInput/OutputStream
  • (一)SpringBoot3---尚硅谷总结
  • (转)scrum常见工具列表
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • **《Linux/Unix系统编程手册》读书笔记24章**
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .a文件和.so文件
  • .bashrc在哪里,alias妙用
  • .libPaths()设置包加载目录
  • .mysql secret在哪_MySQL如何使用索引
  • .NET Core跨平台微服务学习资源
  • .Net小白的大学四年,内含面经