NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

  • 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

公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

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

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

关注

评论 2 条评论

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

华为全球首发《全光自动驾驶网络白皮书》,助力打造品质联接新体验

EMQ 在2021电力人工智能大会:稳健数据基础设施架构支撑电力数字化发展

EMQ映云科技

人工智能 物联网 电力 mqtt

自定义View:resolveSizeAndState方法

Changing Lin

10月月更

ironSource 斩获 2021 年度鲸鸣奖三大重量级奖项

打造价值交付体系,企业 CIO 如何应对 DevOps 命题?

BoCloud博云

DevOps 云原生

华为云企业级Redis:助力VMALL打造先进特征平台

华为云数据库小助手

GaussDB GaussDB ( for Redis ) 华为云数据库

各位Oracle DBA们,你们期待的在线实训环境终于来了

墨天轮

MySQL 数据库 oracle redis 实训

面试官:如何防止 Java 源码被反编译?我竟然答不上来。。

Java 编程 程序员 架构 面试

[架构实战营] 模块一作业

张祥

架构实战营

Android 音视频 - EGL 源码解析以及 C++ 实现

声网

android 音视频 OpenGL ES

kotlin库,大佬带你看源码

android 程序员 移动开发

5面阿里斩获offer(Java岗),原来阿里面试官总喜欢问这种问题

进击的王小二

Java java面试 大厂面试

技术干货 | 闲鱼:一个优秀的 Push 平台,需要经历怎样的前世今生

蚂蚁集团移动开发平台 mPaaS

消息推送 push mPaaS

3面蚂蚁,一路过关斩将 成功拿到offer定级P6,大厂面试雀食有点难!

进击的王小二

java面试 大厂面试 阿里巴巴面经总结 java

EMQ 映云科技5G 边缘计算工业解决方案获中国移动创客马拉松大赛三等奖

EMQ映云科技

5G 物联网 边缘计算 移动互联网

喜大普奔!BFE 控制平面正式开源发布!

百度开发者中心

负载均衡 云原生 Go 语言 开源技术

硝烟弥漫的安全战场,只等一位超级英雄登场

白洞计划

kotlin实现接口,已开源下载

android 程序员 移动开发

Python爬虫实战 | 利用多线程爬取 LOL 高清壁纸

JackTian

Python 程序员 爬虫 后端 实战

企业系统太多?WorkPlus让工作事半功倍

WorkPlus

产业数字化的思考

陈俊

GrowingIO 数据安全实践

GrowingIO技术专栏

隐私保护 数据安全 隐私安全 数据安全法

揭秘!探访百度AI反诈第一线

脑极体

从区块链到元宇宙 Metaverse

devpoint

区块链 元宇宙 10月月更

kotlin开发网站,字节跳动大神讲座

android 程序员 移动开发

RTE2021 实时互联网大会参会感想

轻口味

1024我在现场 10月月更

端智能研发核心套件:MNN 工作台深度剖析

阿里巴巴终端技术

深度学习 ios android 移动端 端智能

开源应用中心 | KodBox快捷高效的私有云在线文档管理系统

开源技术

来,肝了这份网络安全学习计划无敌

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 学习安全

以“有用”为圆心:重新认识智慧城市的“高手之路”

脑极体

从芯片公司到VR,字节跳动为了元宇宙加码布局

海比研究院

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