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

开发同事辞职,接手到垃圾代码怎么办?

小王新加入了一家公司,这家公司有点年头,所以连屎山都是发酵过的,味道很冲。

和大多数时运不济的程序员一样,到了这种公司,做的大多数工作,就是修补这些祖传代码,为其添砖加瓦。每当被折腾的筋疲力尽,就忍不住鼻孔喷着浑浊的空气:“设计这个系统的人,真的是太垃圾了”!

当然,设计这个系统的人,可能早就离职了,也可能就是你的顶头上司。如果你有幸获得一个脾气温和的前辈,他会带着无比后悔的口气告诉你:“这个系统确实千疮百孔,如果我们当初按照正确的思路设计就好了”!

没有程序员不后悔过,就像亏钱的人都后悔买了股票,长大的人都后悔来到这个世界。

很多人看到烂代码,那都是事后来看的。在代码跑起来的那个时刻,“能运行”才是最重要的。烂代码能够进入仓库并投入生产,一定是某些环节的缺失造成的。

烂代码自有它的背景。

1 工期赶

有数不清的管理者,想要量化程序员的工作,由此产生了KPI、OKR这样的工具。在某个时期,它或许是有用的,但这种以截止时间点来衡量的工作方式,会造成技术债的大量积累。

在工期的压迫下,很少有人能够思考需求的合理性,以及后续的扩展性。烂代码在未经过Review的情况下,缺少重构、有限测试,就火急火燎的跑到线上运行。有些设计,可以说从源头上就是不合理的,但由于需要快速实现,方案上就不得不进行妥协。

大多数情况下,朝生夕死的代码并不会产生多大的问题。但总有一些项目,生命周期非常长,修修补补的需求还非常多。在一个地基不稳的地方造一座大厦,总有崩塌的一天。

不过管它呢,只要不是塌在自己手里就可以了。

2 练手项目

我甚至发现了一个非常有意思的现象。很多部门为了培养新人,会特意把一些非常重要的模块和功能,交给新人去做。

由于缺乏经验,新人在方案设计上有诸多的缺陷。但在时间成本上,它和老鸟相差并不太多。很多练手用的项目,在不经意间也会成长为巨无霸,然后它留下的缺陷就会被放大。

和大多数人的认知正好相反,新人在技术方案上,会采用更多的新技术和奇技淫巧,而老鸟善于使用最基本最朴素的工具来完成设计。这可能是一种想要把学到的东西付诸实践的功利心与追求时尚的虚荣心在作怪。

很不幸,追求技巧的代码,会有非常多的约定与规范在里面,如果不是项目统一把控,这种约定和规范会与项目中的其他约定和规范相悖,造成代码风格不统一,调试困难,无法扩展。

3 自起炉灶

很多程序员非常的自信,认为自己的english水平和编码水平特别高,表现在代码上就是龙飞凤舞,自起炉灶。

他们不去关心整个技术社区的约定和规范,在接口命名,对外API上倾注了自己过多的心血,我们通常把这些人称为东施效颦的轮子哥。

比如/health接口,我偏不叫health,我叫/server_status。

再比如错误码,我非要一个叫做 success_200,一个叫做fail_500。后续入职的修正帝看到这样的错误码,嗤之以鼻但是并不敢改动,于是他自己做了一套200和500。

这样的约定和修正约定,会在岁月的侵蚀下越积越多,以至于没人知道它是什么。

所以,如果你看到一个项目的代码非常的烂,不要着急修改,一定要按照它的烂逻辑写下去。相信我,它必定比你的修正稳妥的多。

4 copy帝

在很多公司,你去看他们的产品和代码,会有一种似曾相识的感觉。

没错,他们是抄的。

在缺乏产品设计和经费的前提下,老板下达了终极命令。

“照着xxx给我copy一个,连一个按钮也别放过”。

copy一个和设计一个是两个概念,copy通常意味着浅显的思考,在细节和功能上都比模子差了很多。

更要命的是,模子在变。如果运气不好,一个团队刚copy好了一个产品,结果第二天打开别人的产品一看,好家伙,人家全部改版了。

四不像和未经过设计的代码由此而来。

当然copy帝还指的是cv工程师,但他们的破坏力有限,初心也是好的,并不能造成多大的破坏力。

5 怎么办?

后悔,起码是好的。

这是相对于从不后悔的人来说的。后悔说明了他知道怎么做才是正确的,只是在某些特殊的环境中造成了这样的后果。

如果同样的轮回交给有后悔经历的人来说,他会有更多的思考在项目的时间和人员分配上。而从不后悔的人可能是倔驴,也可能是真的认为他自己是对的,这是非常可悲的一件事情。

如果你不幸在维护这些祖传代码,千万记得要做力所能及的事情,不要冒进,也不要过度修正。除非你的团队给了真正的时间和人员,来决定真正铲一铲。

相关文章:

开发同事辞职,接手到垃圾代码怎么办?

小王新加入了一家公司,这家公司有点年头,所以连屎山都是发酵过的,味道很冲。和大多数时运不济的程序员一样,到了这种公司,做的大多数工作,就是修补这些祖传代码,为其添砖加瓦。每当被折腾的筋疲…...

gRPC简介

grpc简介 grpc介绍可以参考官网。无论是rpc还是grpc,可以这样理解,都知道过去使用的单单体架构,而在2011年5月威尼斯的一个软件架构会议上提出了微服务架构,围绕业务功能进行组织(organized around business capability)&#xf…...

《MySQL系列-InnoDB引擎25》表-InnoDB逻辑存储结构

InnoDB逻辑存储结构 从InnoDB存储引擎的逻辑存储结构看,所有数据都被逻辑地存放在一个空间中,称之为表空间(tablespace)。表空间又由段(segment)、区(extent)、页(page)组成。页在一些文档中有时也称为块(block),InnoDB存储引擎的逻辑存储结构…...

YOLOv8之C2f模块——与YOLOv5的C3模块对比

一、源码对比 YOLOv8完整工程代码下载:ultralytics/ultralytic   C2f模块源码在ultralytics/nn/modules.py下,源码如下: class C2f(nn.Module):# CSP Bottleneck with 2 convolutionsdef __init__(self, c1, c2, n1, shortcutFalse, g1, e…...

动态规划实例——换零钱的方法数(C++详解版)

原写了 Java 版本的如何求解换钱的方法数,近期进行了一些细节上的补充,以及部分错误更正,将语言换为了 C 语言。 基础题目 假设你现在拥有不限量的 1 元、5 元、10 元面值纸币,路人甲希望找你换一些零钱,路人甲拿出的…...

linux c

射频驱动 管理硬件设备、分配系统资源 内核由中断服务程序 调度程序 内存管理程序 网络和进程间进程通信程序 linux支持动态加载内核模块 支持多处理smp机制 内核可以抢占preemptive linux系统拥有多个发行版,可能由一个组织 公司和个人发行 VGA兼容或者更…...

第十三章 系统错误消息 - 一般系统错误消息 S - Z

文章目录第十三章 系统错误消息 - 一般系统错误消息 S - Z第十三章 系统错误消息 - 一般系统错误消息 S - Z 错误代码描述<SUBSCRIPT>下标值不合法或Global引用过长。<SWIZZLE FAIL>打开了一个oref&#xff0c;然后试图在另一个无法引用的相关对象中进行搅拌。这可…...

移动web基础

初始缩小&#xff1a;布局视口大于视觉视口 初始放大&#xff1a;布局视口小于视觉视口 布局视口等于视觉视口&#xff08;这种动作行为叫做理想视口&#xff09; <meta name"viewport" content"width375" /> <meta name"viewport"…...

MyBatis和MyBatis_Plus有什么区别【面试常考题】

MyBatis和MyBatis_Plus的区别 MyBatis_Plus MyBatis_Plus 是一个 MyBatis 的增强工具&#xff0c;只是在 MyBatis 的基础上增强了却没有做改变&#xff0c;MyBatis-Plus支持所有MyBatis原生的特性&#xff0c;所有引入MyBatis-Plus不会对现有的MyBatis框架产生任何影响。 MyBa…...

华为OD机试用Python实现 -【统一限载货物数最小值】(2023-Q1 新题)

华为OD机试题 华为OD机试300题大纲统一限载货物数最小值题目描述输入描述输出描述说明示例一输入输出说明示例二输入输出说明Python 代码实现算法逻辑华为OD机试300题大纲 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查…...

Vue入门小练习

文章目录Hello VueVue文本指令Vue属性绑定Vue双向绑定Vue事件绑定Vue猜数字Vue简单计算器Vue简单计算器升级版Vue循环遍历Vue员工列表练习Vue小练习Vue显示隐藏相关使用一些简单的小案例来熟悉Vue的基本使用方法 Hello Vue <!DOCTYPE html> <html lang"en"…...

Oracle-09-集合运算符篇

2022年4月13日23:01:25 通过本章学习,您将可以:1、描述 SET 操作符2、将多个查询用 SET 操作符连接组成一个新的查询目录 🏆一、SET OPERATORS ⭐️1.1、UNION /UNION ALL ⭐️1.2、INSTERSECT ⭐️1.3、MINUS dz...

获取浏览器(服务端)请求中特定的Cookie

有必要解释一下HttpServletRequest接口&#xff0c;因为我们需要从它里面获取Cookie。 HttpServletRequest HttpServletRequest是一个Java接口&#xff0c;提供了访问HTTP请求信息的方法&#xff0c;例如HTTP方法、请求URI、头部、参数和会话属性。它是Java Servlet API的一部…...

c++11 标准模板(STL)(std::unordered_set)(九)

定义于头文件 <unordered_set>template< class Key, class Hash std::hash<Key>, class KeyEqual std::equal_to<Key>, class Allocator std::allocator<Key> > class unordered_set;(1)(C11 起)namespace pmr { templat…...

python实战应用讲解-【实战应用篇】文件操作(附python示例代码)

目录 知识储备 使用 python-libarchive-c 模块 创建压缩文件 解压文件 查看信息...

OpenCV-Python系列(二)—— 图像处理(灰度图、二值化、边缘检测、高斯模糊、轮廓检测)

一、【灰度图、二值化】 import cv2 img cv2.imread("lz2.png") gray_img cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 灰度图 # 二值化&#xff0c;(127,255)为阈值 retval,bit_img cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY) cv2.imshow(photo1,im…...

ccc-台大林轩田机器学习基石-hw1

文章目录Question1-14Question15-PLAQuestion16-PLA平均迭代次数Question17-不同迭代系数的PLAQuestion18-Pocket_PLAQuestion19-PLA的错误率Question20-修改Pocket_PLA迭代次数Question1-14 对于有明确公式和定义的不需要使用到ml 智能系统在与环境的连续互动中学习最优行为策…...

hadoop03-MapReduce【尚硅谷】

大数据学习笔记 MapReduce 一、MapReduce概述 MapReduce是一个分布式运算程序的编程框架&#xff0c;是基于Hadoop的数据分析计算的核心框架。 MapReduce处理过程为两个阶段&#xff1a;Map和Reduce。 Map负责把一个任务分解成多个任务&#xff1b;Reduce负责把分解后多任务处…...

测牛学堂:软件测试python学习之异常处理

python的捕获异常 程序在运行时&#xff0c;如果python解释器遇到一个错误&#xff0c;则会停止程序的执行&#xff0c;并且提示一些错误信息&#xff0c;这就是异常。 程序停止执行并且提示错误信息&#xff0c;称之为抛出异常。 因为程序遇到错误会停止执行&#xff0c;有时…...

图神经网络--图神经网络

图神经网络 图神经网络图神经网络一、PageRank简介1.1互联网的图表示1.2PageRank算法概述1.3求解PageRank二、代码实战2.1引入库2.2加载数据&#xff0c;并构建图2.3计算每个节点PageRank重要度2.4用节点尺寸可视化PageRank值一、PageRank简介 PageRank是Google最早的搜索引擎…...

超越GUI:用Tcl命令流高效编辑Tessent DftSpecification的三种进阶玩法

超越GUI&#xff1a;用Tcl命令流高效编辑Tessent DftSpecification的三种进阶玩法 在大型SoC项目中&#xff0c;频繁修改IJTAG网络结构是每位资深DFT工程师的日常。当设计迭代进入深水区&#xff0c;图形界面操作和手动文本编辑的效率瓶颈会愈发明显——每次增减SIB、调整TDR位…...

解放你的创造力:用TEdit打造泰拉瑞亚专属世界地图

解放你的创造力&#xff1a;用TEdit打造泰拉瑞亚专属世界地图 【免费下载链接】Terraria-Map-Editor TEdit - Terraria Map Editor - TEdit is a stand alone, open source map editor for Terraria. It lets you edit maps just like (almost) paint! It also lets you change…...

M2LOrder模型在STM32项目中的潜在应用:边缘设备情绪反馈

M2LOrder模型在STM32项目中的潜在应用&#xff1a;边缘设备情绪反馈 最近在捣鼓一个基于STM32的智能硬件项目&#xff0c;想给它加点“人情味”。比如&#xff0c;当用户对它说话时&#xff0c;它能感知到用户的情绪是开心还是沮丧&#xff0c;并给出更贴切的反馈。这听起来很…...

VoxCPM-1.5-WEBUI问题解决:部署常见错误与一键启动脚本详解

VoxCPM-1.5-WEBUI问题解决&#xff1a;部署常见错误与一键启动脚本详解 1. 快速入门指南 1.1 镜像部署准备 在开始使用VoxCPM-1.5-WEBUI之前&#xff0c;您需要确保具备以下条件&#xff1a; 支持CUDA的NVIDIA显卡&#xff08;建议RTX 3060及以上&#xff09;至少16GB系统内…...

不止于超市:用QGIS缓冲区+叠置分析,为你的奶茶店、自习室找个好位置

从奶茶店到自习室&#xff1a;QGIS空间分析赋能小微商业选址决策 走在街头&#xff0c;你是否好奇为什么某些奶茶店总是门庭若市&#xff0c;而几步之隔的同类店铺却冷冷清清&#xff1f;商业选址从来不是简单的"地段好"三个字能概括的。对于资金有限的小微创业者来说…...

如何降低ai率?盘点3个降ai率神器与5个手改技巧,降aigc全流程解析!

最近我发现很多同学都在苦恼ai率这件事&#xff0c;后台发来的截图里&#xff0c;那报告&#xff0c;简直红得触目惊心。 现在的系统早已是next level&#xff0c;不是看你用了什么词&#xff0c;而是在分析你的文本生成逻辑。今天这篇文章&#xff0c;我不讲虚的&#xff0c;…...

告别云端依赖:AnythingLLM本地Whisper实现完全离线语音转文字

告别云端依赖&#xff1a;AnythingLLM本地Whisper实现完全离线语音转文字 【免费下载链接】anything-llm The all-in-one AI productivity accelerator. On device and privacy first with no annoying setup or configuration. 项目地址: https://gitcode.com/GitHub_Trendi…...

CasADi实战:用Python搞定机器人路径规划中的数值优化问题(附IPOPT配置)

CasADi实战&#xff1a;用Python搞定机器人路径规划中的数值优化问题&#xff08;附IPOPT配置&#xff09; 机器人路径规划的核心在于如何在复杂环境中找到一条既安全又高效的轨迹。这本质上是一个带约束的数值优化问题——我们需要最小化某种代价函数&#xff08;如路径长度或…...

springboot+vue基于web的药店管理系统 药品商城在线购药系统

目录同行可拿货,招校园代理 ,本人源头供货商功能模块分析技术实现要点扩展功能建议项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能模块分析 后台管理系统&#xff08;SpringBoot&…...

抖音批量下载助手:轻松管理您的抖音视频资源库

抖音批量下载助手&#xff1a;轻松管理您的抖音视频资源库 【免费下载链接】douyinhelper 抖音批量下载助手 项目地址: https://gitcode.com/gh_mirrors/do/douyinhelper 还在为手动保存抖音视频而烦恼吗&#xff1f;抖音批量下载助手正是您需要的效率工具&#xff01;这…...