软件开发行业的变革:我不懂的,总有人懂

发表时间: 2023-11-03 16:05

作者 | unixsheikh

译者 | 核子可乐

策划 | 李冬梅

如今,一批所谓的专家只知道无脑上马那些炒作工具,但对其更深层次的运作方式却一无所知。这是个大问题,甚至正在毁掉我们的未来发展空间。


方向盘就是个抽象概念,却能帮助我们轻松驾驭车辆。动力转向又是另一个抽象层次,用于进一步改善驾控体验。所以抽象本身并没有错,只是在丹麦流传着这样一句谚语:


“无论太少还是太多,都会毁掉一切”。


如果抽象过度泛滥,那么如果有一天再没人理解其底层实现逻辑,我们又该如何应对呢?


自动化和信息化让程序员们变懒了


科技行业的一切其实都是以利润为核心进行驱动,人们对其他任何事情都没有兴趣。所以厂商必须要尽快发布新的产品或者服务,也就必须采取更多的抽象和自动化元素、努力压缩人手,对于整个系统底层的理解自然愈发浅薄。


如今,早就不存在什么程序员和系统管理员了,取而代之的是 DevOps 甚至是 DevSecOps。行业正努力把每项任务都塞进同一个职能角色的日常工作当中,就是说技术人员需要独力完成开发(Dev)、安全(Sec)和运营(Ops),即整个系统管理流程。但由于没有哪个人敢自称真正的通才,所以我们只能匆忙上马自动化方案,在节约资金的同时避免不同技术部门间的成员在复杂的交互中迷失方向。于是乎,现代技术人员被教导只使用特定的工具,而对其底层实现知之甚少。


所以一方面技术正变得越来越难以理解,另一方面我们的现代生活正越来越多地依赖于这些技术。那么,当科技行业的理解水平不断下滑,大多数人甚至根本不知道该如何修复自己手头的工具时,会引发怎样的后果?


换言之,人们已经习惯了高度抽象的状态,并认为这才是正确的方式。他们也很乐意添加更多抽象来加剧这种混乱。


也许会有傲慢的开发者嘲讽道:既然这样,那咱们直接用回汇编语言得了!


毫无疑问,我们是需要抽象的,但每一个层次的抽象都有相应的代价。而且讽刺的是,出于利润追求抽象最终可能引发巨大的收益损失。


现在,大多数“安全人员”对于安全知之甚少,只晓得如何使用某种预制的渗透测试工具。渗透测试工具的 Web GUI 板上显示了一大堆绿灯,就代表系统运行良好。但也许某位心存恶意的技术大牛早就入侵了该系统,并不断把有价值数据卖到暗网上去。整个过程看似毫无异常,也许会持续数年而无人发现,毕竟 GUI 仪表板说没问题的嘛。


过度依赖抽象,埋得不深的真相永远不会有人发现

我曾为一家公司推荐过第三方开发伙伴,那边的开发人员知道怎么使用“现代框架”把网站和 API 组合起来,但对框架自身的编码了解不多,对安全性更是一无所知。一旦出现问题,没人能判断到底发生了什么。于是在遇到问题并挣扎了几个月后,他们最终放弃并选择对外求助。


其实只要看看系统的真实运行情况,就能知道肯定是出了问题。我复制了所有内容来进行离线检查,之后花了一个晚上直接查看系统文件中的各个代码行,并把公司主机上运行的文件跟原始框架文件进行了简单比较。


其实我并不是建议大家手动检查所有内容,但保持这种手动检查习惯能让我们学到很多东西。真相往往埋得并不深,只要有点耐心就肯定可以找到。当然,这也要求我们对技术原理有基本的了解。


长话短说,我最终发现他们已经遭到黑客入侵,其系统被用作某种色情内容的后端分发数据库。但性能问题并非源自黑客攻击,而是由框架本身所引发,因为该框架速度极慢。另外,这次黑客攻击也是高度离散,要不是我决定“四下打探”并认真查看了文件和代码,很可能永远发现不了。


写给技术人们的建议:别跟风、保持好奇、不断学习

  • 别总跟着炒作话题或热门趋势跑。
  • 保持好奇心。不要单纯学习工具,更要了解其底层技术是如何起效的。
  • 如果可能,至少试着手动执行操作,例如如何配置工具来满足实际需求。
  • 如果可能,请尝试查看当前工具的代码。对这些代码的基本了解将非常有价值。
  • 培养良好的求知习惯、保持学习、不断实验,深入钻研你感兴趣的技术。最好能建立一个家庭实验室,在这里探索并尝试剖析一切。


记得质疑一切,特别是那些看似没有意义的事情。不要简单假设“我不懂的,总有人懂”——这只会让你变成盲目的追随者。有时候其他人确实懂,但这是不够的。我们要勇敢起来,坚持追寻自己的理念和客观事实,哪怕这会显得跟其他同行格格不入。


我想在本文中强调的,并不是每个人都要从第一原理出发认识一切,或者说就不该使用便利的自动化工具。文章开头我就提到,抽象当然是好的。而且不同的专业事务当然要由不同的专家来做,比如驾驶卡车有司机,修理卡车有技师。


我真正要说的,是工程师到底该用怎样的态度对待技术工作,以及这种态度对于技术从业者们的重要意义。


软件开发为例,有太多的专业知识都被抽象了出来,进而被工具和自动化所取代。了解整个体系的人越来越少,很多人甚至连当前工作的往下一层都不愿深挖


这已经是个严重问题,导致很少有人能够修复垂直领域中的技术细节。没错,大家扪心自问,究竟是不是这样?


大约半年前,我偶然发现有些前端 Web 开发者根本不知道无需部署工具就能创建网站,甚至连 JavaScript 都可以不用。他们开发的可是赚钱的商业网站!带着惊讶之情,我询问了一位教授 Python 编程课的朋友,他的反应倒是很平静:


别那么吃惊,这就是如今的常态。技术行业希望我们培养更多只知道“按按钮”的从业者,而不是把专业学深、学透的人。


我知道,总会有人想要把专业学深、学透,但这不是重点。关键在于,我们的软件开发行业已经开始扭曲变形:由于加入了太多的抽象层,大家已经看不懂整个体系在如何运作。最终,这个行业一定会搬起石头砸了自己的脚。


我敢肯定,当一位 Web 开发者——无论是前端、后端还是“整合工作”——在制作网站时,完全不需要编码、TCP/IP、DNS、HTTP、TLS 或者安全性知识,而只靠预制的工具和框架就能搞定的时候,那大麻烦恐怕就离我们不远了。


网友怎么看?


这篇贴文在 Hacker News 上发布后,引来了诸多围观者。不少开发者在下方留言发表了自己的观点。


有网友称,文中提到的现象的确存在,但这不能完全怪开发者不去主动学习,因为一项优秀、可靠的技术需要很长时间的积累才能出现,开发者实际上不需要理解它就能操作它。


举个例子,文中提到了“是的,让我们都回到汇编编码吧!” 事实是:在高级语言成为主流之后的很长一段时间里,开发者仍然必须了解汇编才能成为一名开发者员,即使你的大部分工作是用 C 或 C 语言完成的。这是因为高级语言的编译器及其调试工具最初是一个“有漏洞的”抽象。当你的程序失败时,你必须了解汇编才能找出问题所在。如今,编译器和调试工具已经变得如此出色,那些日子已经一去不复返了,你真的不需要再了解汇编了。

但我们今天面临的问题是:我们一层又一层地堆积有漏洞的抽象,却没有给它成熟所需的时间。我们的设计是为了缩短开发人员完成某件事所花费的时间,但其实这是个错误的假设,因为开发者只想要一切按计划进行,不想花费大部分时间来调试计划之外的工作。这些抽象就是复杂且无意义的。


ID 名为 figassis 的网友称,自己一直不理解那些没上过大学就能从事编程工作的开发者。figassis 表示自己看到了一个怪象:过去几年还是十几年间,不需要上大学就可以成为程序员似乎成为一种趋势。figassis 称:


“确实,我的大部分技能都是在大学毕业后获得的,但是你从大学中获得了某种全球系统的理解(在我的例子中是计算机+软件+网络工程),掌握了这些基础技能,你可以快速缩小问题的潜在根源,包括 TCP/IP 堆栈、CPU 架构、内存管理,以及编译器如何错误地优化某些代码。它对于提出正确的问题也有很大帮助。如果你所知道的只是最新的框架/语言/工具,那么当出现问题时,周围的整个世界都会‘咬你一口’。关于抽象:我总是逃避那些鼓励抽象的语言。Java 就是其中之一,即使在大学里,整个 OOP 趋势对我来说也只是平淡无奇。我对框架(尤其是 JS)最大的恐惧是它们被抽象到这样的程度,以至于我无法希望在不寻求论坛或 Github 帮助的情况下在合理的时间内解决问题,因为我甚至不理解这些概念。什么是效果?反应如何工作?等等。”


原文链接:

https://unixsheikh.com/articles/we-have-used-too-many-levels-of-abstractions-and-now-the-future-looks-bleak.html