YoloKokura

本文翻译自We have used too many levels of abstractions and now the future looks bleak,以下是译文。

如今,许多所谓的专家只知道如何配置一些超工具(hype-tool),但对于工具的底层原理一无所知。这对行业的未来造成了巨大的问题和挑战。

方向盘是一种抽象,简化了我驾车的操作。动力转向是另一层次的抽象,能进一步改善驾驶体验。抽象是很棒的,因为它们能提高生活质量。然而,在丹麦,我们有这样一句老话:

Too little and too much spoils everything.

要是抽象层出现问题,而没人了解其底层原理,抽象还会给我们带来好处吗?

工业界的一切都是靠利益驱动的,因此需要尽可能快地推出新产品或者新服务,这将导致更多的抽象层、更多的自动化、更少的人力和更少的深层次理解。

程序员和系统管理员已经不复存在,取而代之的是DevOps甚至DevSecOps,工业界想要把所有的任务都堆到一个人身上。搞技术的人得做开发(development,Dev)、安全(security,Sec)和运维(operations,Ops),换句话说就是系统管理。然而,由于没人能真正的掌握上述所有技能,我们需要尽可能多的自动化工作流程,以节约经济成本和跨部门的沟通成本。这也就意味着,现代技术人员只会使用特定工具,但不理解底层的技术。

技术确实变得越来越难懂了,但现代生活也越来越依赖于技术。当我们对技术的理解到达了某个低点,大部分人甚至都不会修复自己使用的工具时,会发生什么呢?

人们已经对抽象习以为常,觉得这才是正确的道路。他们还在一层一层地增加更多的抽象层,为这团乱麻做出自己的“贡献”。

好的好的,我们干脆回到汇编得了! —— 一位生气的开发者讽刺道

我们无疑需要抽象,但每一层抽象都有代价,最后将导致利润损失。

现在已经出现了不少不懂安全的“安全人员”,他们只会使用一些预制的侵入测试工具。一旦这些工具的web GUI上亮起了绿灯,他们就觉得一切正常。然而,一个真正的安全专家可能早就黑进了这个系统,一直在暗网上售卖有价值的数据。这一切都悄无声息地发生着,多少年也没人能发现,毕竟GUI上显示

一个简单的例子

我曾帮助过这样一家公司解决安全问题,他们采用了第三方的服务,而这第三方就是我前面提到的那一类人。开发者知道怎么把网站和使用了“现代化框架”的API拼凑到一起,但不甚了解框架代码,也不懂安全。很快,问题就浮现出来了,而且没人能搞清楚为什么。这家公司花了几个月来排查问题,最后才决定找人帮忙。

显然有什么地方出问题了。我把所有的东西都拷贝下来做离线测试,直接排查系统代码,花了一个晚上逐行查找,逐文件查找,对原始的框架代码和实际运行的项目代码做了些简单的对比。只是查看代码和文件而已。

当然,仔细排查一切并非我的本意,但我们总能通过人工视察学到很多。很多情况下问题藏得都不深,只要有点耐心就能找出来。但这也代表,你总得了解一点技术的工作原理。现在有些学生都不知道文件和文件夹的区别了

长话短说,在这个例子里,项目被黑掉了,系统被黑客用作某种分布式数据库的后端,用来存色情片和别的乱七八糟的东西。系统的性能问题并非黑客导致的,而是框架自身的弊病,这就是另一个故事了。黑客干涉的地方很零散,要不是我决定要“代码和文件到处都看看”,可能一直都不会被发现。

NOTE: 这个例子里的安全问题和性能问题和这篇post主题无关,这里就不偏题了。

给学技术的朋友的建议

  • 不要只停留在追逐技术热点的层次。
  • 要有好奇心,别只学工具,试试理解工具依赖的技术。
  • 如果有机会,至少手动试一次(比如手动配置一次项目,而不是使用配置工具)。
  • 如果可能的话,看一眼你使用的工具的代码。对代码基本的理解甚至都很有用。
  • 保持好奇,持续学习,实验,深挖你感兴趣的技术。有条件可以搭建一个homelab,用于深层学习和实验。
  • 质疑一切,尤其是那些你不理解的东西,千万别假设有人比你懂——这将导致你变成一个盲目的追随者。可能确实存在比你懂得多的人,但不要预设这种情况。要勇敢,要和真相,和你的判断站在一起,即使这让你感到分外孤独。

后续的更新

我在这篇post里要表达的,并非一切都要从底层学起,也不是说你就不应该使用任何工具。我们需要抽象。不同的领域也都有专家,比如司机会开卡车,有专家直到如何修理卡车。

我要强调的是:一种工程师一般的对技术的态度

比如,在软件开发领域,太多所谓专家被抽象带偏,被工具和自动化取代,没多少人去理解哪怕应用层下一层的东西。

这会导致很严重的问题,因为最终只有很少的人能够解决下层的问题,而我们已经一只脚踏入了这种困境中。

大概半年前,我遇到这样一群前端开发者,他们都不知道网站开发可以不依靠部署工具和JavaScript,甚至网站要支持支付功能也不需要。因为他们就是这样学的。我问了我一个教Python的朋友,他是这么说的:

不必大惊小怪,这就是现状。工业界想要我们培养哪些知道怎么“按按钮”的人,而不是了解深层原理的人。工业界或多或少倾向于敏捷开发。

我知道总有人对软件开发的深层知识感兴趣,但这不是我要说的点。我要表达的是,在软件开发领域,我们已经增加了太多的抽象,很少有人能明白他们到底在干什么。

如果你是一个web开发工程师,不管是前端还是后端,或者你在做所谓的“集成工作”,你就能在低代码或者不懂TCP/IP、DNS、HTTP、TLS等知识的情况下写一个网站,使用的仅仅是预制工具或框架。但你千万别选择这条路,要是什么地方出了差错,你就会像一只会用扳手的猴子一样束手无策。你也别把自己当成“软件工程师”,因为你做的工作里基本不涉及任何软件开发或者软件工程

Tags: