五步过程及其与软件工程的关系
我最近听了 Elon Musk 对 Everyday Astronaut 的 Tim Dodd 的采访,因为 Elon 带他参观了 SpaceX Starbase 站点。这是一个 YouTube 视频,但我说是听而不是看,因为我骑自行车时口袋里放着手机。
在回答有关 火箭部分设计更改的问题时,埃隆开始描述一个五步过程,他试图让 SpaceX 的每个人都严格执行。当我继续在乌兰巴托的街道和人行道上骑自行车时,我开始想知道这些工程原理如何应用于软件开发。接下来的内容是这些想法的延续。编号的章节标题和大文本是埃隆·马斯克的引述。
1.让你的要求不那么愚蠢
你的要求绝对是愚蠢的。谁给你的并不重要。如果一个聪明人给你要求,因为你可能没有足够地质疑他们,这是特别危险的。
我作为软件开发人员所做的很多事情都是因为有人告诉我这是“最佳实践”。所以我遵循这种做法,但我真的不知道为什么它这么好。我是谁来质疑资深程序员?我什至没有接近他们的水平。
- 遵循 SOLID 原则
- 不要重复自己
- 旨在实现 100% 的测试覆盖率
- 使用依赖注入
- 首选单引号
最后一个是 Flutter 的。自从我在文档中阅读它后,我就非常虔诚地遵循它。
随着我的经验和技能水平的增长,我开始在我学到的许多编程原则中看到智慧。但是,我现在正在从事的特定项目中需要它们吗?如果我不质疑他们并了解他们背后的原因,我怎么会知道?
我认为这就是重点。你真的需要问问你在一些博客上读到的原则或你从雇主那里得到的要求是否真的有必要。事实可能确实如此,但如果你盲目地遵循它,那么你就无法做得更好。如果您认为可能有更好的方法,请尝试一下。不要害怕失败。如果你失败了,你就会学到一些东西。如果您个人还没有感受到编写糟糕代码的痛苦,那么您还没有准备好编写好代码。
2. 非常努力地删除零件或过程
如果您不偶尔重新添加内容,则说明您删除的还不够多。倾向于非常强烈地倾向于“让我们添加这个部分或流程步骤,以防我们需要它。”
这才是真正让我思考的点。在我的一个 Web 服务器 API 中,我编写了一些代码来处理客户端的缓存。如果客户端使用旧时间戳发出请求,则服务器仅发送新数据。当我构建服务器时,这一切都在我的想象中运作良好,但是一旦我实现了客户端,缓存就变成了一个主要的痛苦。所以我最终发布了没有客户端缓存的应用程序。该应用程序总是使用旧时间戳发出请求,以“欺骗”服务器每次都提供数据。不过,我没有费心更新服务器代码,因为我认为缓存仍然是我将来想要处理的事情。非功能性缓存是我应该删除的一个主要例子。没有它肯定会简化系统。
想到的更多例子与评论有关。我TODO已经围坐在我的代码多年意见。显然它们还不够重要,不需要实施,那么删除它们怎么样?如果这些任务确实看起来像我仍然需要实现的东西,那么也许将它们转换为 GitHub 问题会比将它们留在代码中更好。
我有时做的另一件事是注释掉代码并将其留在那里(因为我以后可能需要它)。不过,这就是源代码控制的用途。只需删除注释掉的代码。如果你真的需要它,你可以随时返回并从之前的 Git 提交中获取它。
到目前为止我谈到的删除是我自己代码中的删除。他们只影响我。“删除部分或过程”如何适用于其他人使用的语言、框架和库?这有点难,因为删除公共方法会破坏其他人的代码。弃用是指向新的做事方式的指针,但弃用不是删除。有多少语言和框架已弃用已存在多年的方法?对此的一种解决方案是使用语义版本控制。之后,您可以在次要版本中弃用,然后在下一个主要版本中删除。
应用功能方面怎么样?用户总是想要更多、更多、更多,因此功能蔓延继续。从应用程序中删除功能是否有意义?我认为可能。花费大量开发人员时间但对少数用户提供相对较少价值的功能似乎很适合删除。当然,有些人会不高兴,但是如果删除功能可以让您更快地达到目标,那么您应该认真考虑。
对于大公司,甚至小公司,你真的需要这么多开发人员吗?如果您正在由一个本地团队在 Android 上开发移动应用程序,另一个在 iOS 上,请考虑使用单一代码库的跨平台方法,例如 Flutter 或 React Native。我并不是说这对每个项目都是合适的选择,但如果它适合您的项目,那么这将节省大量的时间、金钱和精力。我曾经在本地开发 Android 和 iOS 应用程序,但我厌倦了两次做同样的事情。我现在在 Flutter 中开发过一次,我再也不会回去了。
3. 简化或优化
这是第三步的原因是因为它很常见——这可能是聪明工程师最常见的错误……优化不应该存在的东西。
在编写代码时,我经常想进行一些微小的优化。我想知道这里的列表或地图是否会更快?我应该将我的小部件提取到类或方法中吗?但是,当您制作新功能时,这些都是预先优化。你不应该一开始就想到这一点。只要让它工作。如果它会失败,让它快速失败。有什么可以删除的吗(回到第 2 步)?跳出框框思考。
最后,当您拥有可以运行的代码时,您可以使用您的开发工具或运行基准测试来查看它的速度和消耗的内存量。使用这些数据,您可以看到性能瓶颈或内存泄漏的位置,然后就如何优化代码做出明智的决策。
这是测试有用的步骤。如果您有单元测试来确认所有主要部分都正常工作,那么您就可以优化代码而不必担心会破坏某些内容。对打破事物的恐惧是快速变化和发展的一大障碍。
4. 加快循环时间
你走得太慢了,快点。但是,在您先完成其他三件事之前,不要加快速度。......如果你正在挖掘,你知道,你的坟墓,不要挖得更快,停止挖掘你的坟墓。
当你第一次开始一个新项目时,很容易很快取得很多进展。然而,随着时间的推移,进行新的更新往往变得越来越困难。那么答案是更快地工作更长时间,或者雇佣更多人,或者尝试在下一个冲刺中适应更多人?我不这么认为。
是什么让软件开发的周期时间变慢?技术债务是一个很大的问题。错误、写得不好的代码和草率的架构使得即使是很小的更改也会破坏代码库中其他看似无关的部分。
我听过鲍勃叔叔多次说过,要走得快,唯一的办法就是走得好。这就是代码质量发挥作用的地方。遵循 SOLID 原则、良好的架构模式和彻底的测试可以成就或破坏代码库。回到第 1 步,我并不是说你不应该质疑那里所有的干净编码原则,但也有很多积累的智慧表明它们有效。
5. 自动化
为了制造火箭、汽车和电池,自动化涉及机器人。对于软件工程,传统上涉及代码生成和持续集成以及开发/部署 (CI/CD)。
对于像我这样几年前不知道这些是什么的人,让我快速总结一下。代码生成基本上是编写代码的代码。如果您发现自己一次又一次地编写样板代码,那么自动生成该代码可以为您节省大量时间,甚至可以防止出现错误。它可以像代码片段一样简单,您可以在 IDE 中使用快捷方式将其插入到功能更齐全的插件中,这些插件可生成数据类、文档或架构样板。
持续集成 (CI) 涉及诸如每次将提交推送到源代码控制时自动运行测试之类的事情(假设您有测试并使用源代码控制)。更进一步的是持续开发或部署 (CD)。这与自动发布新的软件更新有关。目前我有一个静态 Web 应用程序,每次进行更改时,我都会手动生成内容,然后将其复制到源代码管理文件夹,然后推送更改,然后登录到服务器,然后提取更改。这很痛苦,我真的需要设置CD。
对你来说,编程中有哪些无聊和重复的部分?这些是您应该寻求自动化的事情。不过,在我看来,如果你做的事情还不够长,以至于它变得无聊和重复,那么你不应该让它自动化。否则,你正在自动化一些你并不真正理解的东西,这意味着你需要回到第 1 步。
结论
我个人犯了多次倒退所有五个步骤的错误。...从字面上看,我自动化、加速、简化然后删除。……所以自动化是一个错误。然后加速是一个错误。然后优化是一个错误。
我从这个思考练习中得到的是,步骤的顺序非常重要。您需要首先质疑每个部分是否真的需要,如果不需要,则将其删除。只有这样,优化、加速和自动化才有意义。
自从开始写这篇文章以来,我回到了我的一个项目并删除了代码库的一些重要部分……所有这些都没有影响用户体验。我对简化感到更高兴。如果我想重新添加它,它就在 GitHub 上。
你需要删除什么?
加入我们一起学习
QQ群:程序员副业交流
QQ群号:931035409
教程网站:https://ai2opencode.com/