写点什么

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

  • 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:002142
用户头像
刘燕 InfoQ高级技术编辑

发布了 1112 篇内容, 共 545.9 次阅读, 收获喜欢 1978 次。

关注

评论 2 条评论

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

还没有表白神器?情人节来喽,快为心爱的她送上一份专属的礼物吧~

是Dream呀

Python 2月月更

Go 语言Web开发很简单:使用模板将视图与逻辑分离

宇宙之一粟

Go 语言 Web应用开发 2月月更

云原生落地大爆发,企业和开发者如何把握先机?

阿里巴巴云原生

阿里云 云原生 ACK ACK Anywhere

专访 OpenKruise 负责人:现在的云原生应用自动化发展到什么程度了?

阿里巴巴云原生

阿里云 开源 云原生

平安保险基于 SPI 机制的 RocketMQ 定制化应用

阿里巴巴云原生

阿里云 云原生 消息队列 开源云工具

如何快速构建服务发现的高可用能力

阿里巴巴云原生

阿里云 开源 微服务 云原生

Linux系统编程-进程间通信(mmap内存映射)

DS小龙哥

2月月更 mmap内存映射

SSH远程连接命令执行没反应不报错问题解决(-bash: fork: retry: Resource temporarily unavailable.[资源暂时不可用])

山河已无恙

SSH Linxu 2月月更

微信朋友圈高性能架构方案

Geek_36cc7c

Kotlin语法手册(三)

寻找生命中的美好

android kotlin 安卓

为什么start方法不能重复调用?而run方法却可以?

王磊

Java 面试

甜言蜜语生成器、定时问候邮件机…开源程序员为这个情人节付出太多

腾源会

开源

运营给产品送的情人节礼物是?

阿里云弹性计算

产品运营 情人节 轻量征文 用户投稿

国内唯一!阿里云容器服务进入 Forrester 领导者象限

阿里巴巴云原生

阿里云 云原生 容器平台

计算机网络面试知识点

yuexin_tech

面试 计算机网络

美团动态线程池实践思路,开源了

yanhom

Java 线程池 动态调整线程池参数 动态线程池 美团线程池

阿里云容器服务差异化 SLO 混部技术实践

阿里巴巴云原生

阿里云 Kubernetes 云原生 混部技术

独家下载!阿里云云原生携 10+ 技术专家带来《云原生与云未来的新可能》

阿里巴巴云原生

阿里云 Kubernetes 云原生 电子书

人人都是 Serverless 架构师 | 现代化 Web 应用开发实战

阿里巴巴云原生

阿里云 Serverless 云原生

流量录制与回放在vivo的落地实践

vivo互联网技术

测试工具 回归测试 流量回放

DevOps进阶(三)走近 DevOps 工程师

No Silver Bullet

DevOps 敏捷 jenkins 2月月更

Spring Boot Serverless 实战系列 | 性能调优

阿里巴巴云原生

阿里云 Serverless 架构 云原生

《MySQL入门很轻松》第4章:数据表中能存放的数据类型

乌龟哥哥

数据库 2月月更

DGIOT 工业物联网开源平台简介

dgiot

物联网 2月月更 2月日更 dgiot dgiot物联网

详细讲解mybatis的执行流程

编程江湖

mybatis

KubeDL HostNetwork:加速分布式训练通信效率

阿里巴巴云原生

阿里云 云原生 分布式训练 KubeDL

剑指Offer——企业级项目中分层的含义与依据及多态的优势

No Silver Bullet

封装 offer 继承 多态 2月月更

给面试加点硬菜:延迟任务场景,该如何提高吞吐量和时效性!

小傅哥

小傅哥 架构设计 Redis 6.0 任务系统

虎啸春来!丰树电子与中联重科签署战略合作协议

联营汇聚

教程直播第8期|一文详解 OceanBase 社区版生态工具 ODP & OCP

OceanBase 数据库

数据库 分布式 直播 OceanBase 开源

企业为什么要做应用多活?

阿里巴巴云原生

阿里云 云原生 容灾

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