把握行业变革关键节点,12 月 19 日 - 20 日,AICon北京站即将重磅启幕! 了解详情
写点什么

我在软件工程师生涯中犯下的七大错误

  • 2021-08-05
  • 本文字数:2136 字

    阅读完需:约 7 分钟

我在软件工程师生涯中犯下的七大错误

本文最初发布于 Medium 网站,经原作者授权由 InfoQ 中文站翻译并分享。


大家很少会看到人们(包括我自己!)公开谈论他们犯过的错误。但我觉得我们最好时不时反思一下自己过去犯过哪些错误,这样我们就不会在未来重蹈覆辙了。


我成为专业程序员已经有大约五年时间了。和其他人一样,我在这条职业道路上也犯过不少错误。一般来说,我不会在犯错的当时就意识到自己做错了什么事情;我往往是在接触了正确的做事方式之后才知道自己之前的路走岔了。希望在阅读这篇文章后,你会从中得到一些有用的东西,这样以后就不要再像我一样犯错——并付出那么多代价了。

一、没有使用合适的 ORM

数据访问层代码总是会一团乱麻、无聊和令人生厌。我还记得我第一次做一个简单的内部簿记应用程序时的场面;那时我看到仅仅是为了完成基本的管道就要编写那么多代码,为此震惊不已。所以我开始放弃 ADO.NET,并手工编写一个自制的,带有特别定制的特定表模式的 ORM 来满足我的需求。


几个月后,那个应用程序的业务需求发生了一些变化,这导致表模式也发生了变化,于是我不得不去修改我的 ORM。修改过程非常痛苦,以至于我将它全部扔掉了,换成了一个强类型的数据集适配器。


有一段时间,这东西确实奏效了。但我还是希望自己一开始就能使用合适的 ORM(例如 NHibernate)来完成这项工作。至少当我的用户数量不断增长时,我就用不着再担心改变数据库供应商的事情了。

二、没有足够快地学习泛型

我的职业生涯一开始的时候,我是.Net 1.1 版的程序员。.Net 1.1 的问题在于它没有泛型支持。于是乎,我们无法拥有强类型列表,只能凑合着用平淡无奇的 ArrayList。但使用 Arraylist 时,你的代码中会到处都是 casting 和 boxing,所以代码无论是阅读还是编写起来都很痛苦。于是我们使用了 CodeSmith 来生成一个强类型集合列表。但是随着代码库的增长,那些自制的列表本身就变成了一个个怪物。因为我可以很容易地修改代码,所以我会经常介入并改变一个方法的行为以适应我的需求,这又导致了后来的诸多混乱和错误。


我本来应该切换到.Net 2.0,并在它可用时立即开始使用泛型才对,而不是去创建越来越多根本无法维护的自定义集合列表。

三、重新发明轮子

新手程序员总是喜欢重新发明轮子:“现有的实现对我来说还不够好,所以我必须从头开始重写整个东西。”我自己也曾经想过编写自己的 UI 控件,因为 Windows Forms UI 控件对我来说太简单了。


众所周知,市面上有很多优秀的.Net UI 控件工具可供使用;当然,我的 GUI 工具并不像那些商业工具那么好用。那时我太天真了。

四、太多的文档

代码文档是很好的东西,因为它用简单的人类语言解释了你的代码具体在做什么事情,对吧?


这个观点是错误的。


文档往往是陈旧、过时或完全错误的东西。我曾花了很多时间来给我的代码编写文档(还是 XML 文档,还记得吗?),结果只是发现每当我更改代码时都需要更新文档才行。更新代码是必要的,但更新 XML 文档就不是那回事了:这是一种负担,它只会浪费你的时间,而且毫无意义。到最后,我在更改 XML 文档时失去了耐心,转而去做其他更有意义的事情。

五、没有自动构建

应用程序部署和打包工作相对来说比编写代码更容易一些,所以我把这两件事情放在了很低的优先级上。很快,我就收到了所有人的抱怨,他们都说构建无法正常工作。“缺少先决条件,如何解决这个问题?”“dll 没有更新,你能给我发个补丁吗?”“为什么图标都跑掉了?”电话像雪崩一样打到了我的办公桌上。


那一天结束的时候,我已经筋疲力尽了。这不是因为编程太累人,而是因为那些令人麻木的重新部署和重新打包的过程。我本可以通过编写自动化脚本来真正“节约”一些时间,但是我浪费在修复每个错误和支持其他人上的时间比我可以“节约”的时间要多很多倍。你的软件应该支持一键构建;需要的操作再多一点都是浪费时间。

六、过分依赖视觉检查和调试

做出一个表格并显示你的输出是非常容易的事情。而且 Visual Studio 是如此强大,以至于人们可以轻松地一步步检查代码并即时检查代码中的值。但是,如果你沉迷在调试器里面,它就会带来害处。想象一下,如果你的方法只在应用程序启动并运行 45 分钟后才会被调用,你是否要等待 45 分钟才能到达这个点上,然后才开始调试呢?


更好的办法是将应用程序分解为一些可以独立调用的子模块。通过这种方式,你可以只关注那些产生错误输出的输入,并从那里开始对其进行测试。

七、没有单元测试

我曾认为我的应用程序是如此稀松平常,以至于通过手工测试就能轻松覆盖。我以为单元测试是为了一些大而复杂的事情准备的,而不是我做的那种小型应用程序。这样做的结果是我的应用程序变成了一个怪物(没有关注点分离、难以重构和完全无法维护的代码库)。


曾经有一段时间,我害怕对我的代码进行哪怕是最轻微的修改,因为任何更改都可能会,也可能不会导致破坏性更改。有几次,一个神秘的问题突然冒出来,追究其根本原因却发现是我几个月前引入的一个重大更改。应付这种遗留代码不仅无聊和累人,而且精神上也给人带来很大压力。


但是有了单元测试后,你的开发生活就会得到显著的改善。我希望我能从第一天开始就学习单元测试的艺术,从第一天开始就勤加练习单元测试。可惜学校并不教单元测试。


原文链接:


https://betterprogramming.pub/7-big-mistakes-i-have-made-in-my-career-as-a-software-engineer-f14ef540be10

2021-08-05 10:002343
用户头像
刘燕 InfoQ高级技术编辑

发布了 1123 篇内容, 共 603.4 次阅读, 收获喜欢 1982 次。

关注

评论 2 条评论

发布
用户头像
说的情况因人而异
三、重新发明轮子
四、太多的文档
七、没有单元测试
3不发明轮子来内卷,绩效不好怎么办呢
不写文档内卷,怎么才能看到你的产出呢
业务一天3变,单测写完再推到,互联网公司的c端业务这种事情太多了,不少项目刚开始就不能写单测,只有稳定运行,产生收益了,这时候单测能够提早发现问题、提高效率、减少问题,才能凸显价值,大部分生命周期短的项目可能活不到那个时候
展开
2022-03-18 11:53
回复
用户头像
内容有点意思
2021-08-23 11:46
回复
没有更多了
发现更多内容

布隆过滤器:后端开发者必学的知识点

华为云开发者联盟

后端 开发 华为云 华为云开发者联盟 企业号 4 月 PK 榜

MySQL8.0 优化器介绍(二)

GreatSQL

MySQL greatsql greatsql社区

记一次 MySQL 主从同步异常的排查记录,百转千回

Java MySQL 主从同步

高性能存储SIG月度动态:ANCK ublk完成POC测试,EROFS优化xattr元数据开销

OpenAnolis小助手

操作系统 内核 高性能存储 龙蜥社区 sig

发现Mysql的主从数据库没有同步,差点凉凉了

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 4 月 PK 榜

对话大咖 | 人工智能+视频编解码能带来新的变革吗

小红书技术REDtech

人工智能 深度学习 活动回顾

镭速Raysync v6.6.8.0版本发布

镭速

深入浅出的实践大数据DAG图

数新网络官方账号

小红书广告投放机制详解,如何用算法实现全站自动化投放

小红书技术REDtech

大数据 搜索

详解,LED显示屏灰度等级

Dylan

灰度 LED显示屏 色彩

零拷贝浅析

数新网络官方账号

大数据 零拷贝

从零开始学习 GraphQL:入门指南和教程

Apifox

程序员 gRPC 后端 协议 graphql

大数据基础知识

数新网络官方账号

大数据

突破规模化运维瓶颈 SREWorks云原生数智运维平台揭秘

阿里云大数据AI技术

大数据 运维 企业号 4 月 PK 榜 规模化

企业应用可观测性利器!华为云CodeArts APM发布

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 企业号 4 月 PK 榜

带你用三种不同的工具体验AI作诗

华为云开发者联盟

云计算 华为云 华为云开发者联盟 企业号 4 月 PK 榜

SpringBoot设计了哪些可拓展的机制?

深入理解 Redis 新特性:Stream

Java你猿哥

redis SSM框架 Redis 核心技术与实战 redis 底层原理

云原生助力数字原生企业业务快速迭代|阿里云峰会精彩回顾

阿里巴巴云原生

阿里云 云原生

从此告别写SQL!DataLeap帮你零门槛完成“数据探查”

字节跳动数据平台

MySQL 数据分析 数据治理 数据探查 企业号 4 月 PK 榜

eBPF动手实践系列一:解构内核源码eBPF样例编译过程

阿里云大数据AI技术

运维 代码 企业号 4 月 PK 榜

原来XXL-JOB可以这么造

六月的雨在InfoQ

Serverless XXL-JOB SAE 三周年连更

C语言_sprintf固定字符串输出位数

DS小龙哥

三周年连更

Github上标星68.5K,阿里巴巴《MySQL成长手册》火了

Java MySQL 数据库

报名啦!来飞桨中国行,听深度学习平台+大模型如何破局产业智能化

飞桨PaddlePaddle

飞桨 产业赋能

论文解读:基于 OpenMLDB 的流式特征计算优化

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

ChatGPT的狂欢背后:短板犹在,启发甚多,2023有这些事可以做……

小红书技术REDtech

人工智能 ChatGPT 活动回顾

面试官:如何动态的给一个类增加功能?

成长计划知识赋能 | 第十期:DAYU200开发入门秒Get

OpenHarmony开发者

OpenHarmony

架构师才需要学习的知识:亿级流量调优方法+实战

Java 性能优化 性能调优

阿里P8:Java性能调优(独孤版),带你打造淘宝秒杀架构

Java 架构 性能调优

我在软件工程师生涯中犯下的七大错误_AI&大模型_Mohamed Barouma_InfoQ精选文章