令人惊奇的是,软件每天都能正常工作。
我们发明了一些复杂的系统来支撑我们的应用程序,通过层层的抽象来保持它们的运行。
但当你真正停下来思考时,你刚刚构建的应用实际上依赖于某个开源框架。而这个框架依赖于很多其他的开源项目,每一个都有其自己的依赖项。
在几天内,这条依赖链就会过时。底层的包都有了新版本。
几个月内,你需要进行一些依赖更新,因为底层包中存在一些安全或许可证的漏洞。
对于遗留软件来说,升级通常可能会落后好几年。而使应用程序达到最新状态所需的工作是巨大的。
近期的困境
在过去的一周工作中,我开始了一个项目,目标是用现代的依赖关系来更新一个遗留应用程序。
令人惊讶的是,很多事情都可能出错:
- 我从GitHub拉取了源代码,立即遇到了很多错误,只是为了在本地构建应用。
- 更新一个包可能会导致它与另一个包的当前版本不兼容。级联更新意味着找到一个新的稳定构建可能会是个挑战。
- 往往要求会直接冲突。这周我有一个时候,一个包需要
click<8
,而另一个包需要click>8
。我要么需要降级一个依赖,要么需要对另一个带有破坏性更改的依赖进行主要版本升级。 - 当依赖项之间不能很好地相互协作时,可能会出现奇怪的错误。用不匹配的依赖项运行应用可能会导致你之前从未见过的异常,这些异常深藏在包的内部。需要大量的猜测和检查来确保所有人都能和谐地工作。
依赖地狱
我不认识一个软件工程师,没有一个经历过这种挣扎的版本。依赖管理确实很难。
升级、导航破坏性更改、以及在Stack Overflow上花费大量时间来诊断为什么我会得到某些错误。
这使得很多时候,软件能够按照我们的预期工作,这一点更加令人惊讶。再考虑一下,你会意识到为了让你的应用运行,数十个不同的、独立的软件包之间的每一件事都必须恰到好处。
这真是太疯狂了!但这是现代软件的真相。
每周清单
请记住,始终保持学习的态度,并享受编码的乐趣!祝您编码愉快!
如果你喜欢我的文章,点赞,关注,转发!