QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

“我不懂的,总有人懂”,软件开发行业已经开始扭曲变形

  • 2023-11-02
    北京
  • 本文字数:3271 字

    阅读完需:约 11 分钟

大小:1.56M时长:09:04
“我不懂的,总有人懂”,软件开发行业已经开始扭曲变形

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

 

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

 

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

 

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

 

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

 

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

 

如今,早就不存在什么程序员和系统管理员了,取而代之的是 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

 

2023-11-02 14:129953
用户头像

发布了 1139 篇内容, 共 860.5 次阅读, 收获喜欢 2318 次。

关注

评论 3 条评论

发布
用户头像
这篇文章像是在讨论基础知识是否重要。对于有成熟工具的岗位,基础知识是增值的存在。对于缺少成熟工具的岗位,基础知识是工作的基础。
2023-11-13 11:10 · 山东
回复
用户头像
现在软件编写要求很短时间内给出答案,几天内完整某个功能,几天内给出bug解决方案,测试人员测试能用不报错就可以了。框架是别人搭建的,框架依赖很多库,每个库提供自己的API,框架集成的时候又自定义一层调用的API,往往很简单的调用,被封装或者叫被抽象成很多层。具体的实现代码值得阅读吗?开发时间往往不允许去阅读源码,反正能跑就行了。毕竟软件项目的生命周期一般不会很久,过一两年,可能被淘汰了,或者被重构了。
2023-11-06 13:48 · 天津
回复
用户头像
文章提出了一个好问题:如何促进做软件的人,解决抽象层级多且复杂的软件系统的bug。解决方法其实很简单,就是老手把这些bug如何产生、如何复现、如何分析、如何定位、如何修复、如何验证的过程记录并分享出来,吸引新手学习,而不是自己修完就完了。
2023-11-03 15:00 · 北京
回复
没有更多了
发现更多内容

测试开发 | 数字化创新在文化保护中的崭新探索

测吧(北京)科技有限公司

测试

软件测试/测试开发/人工智能 | 测试管理核心问题,提升管理实力!

测试人

人工智能 软件测试 测试开发

产品经理该不该设计数据库表?

菜根老谭

文心一言 VS 讯飞星火 VS chatgpt (160)-- 算法导论12.4 2题

福大大架构师每日一题

福大大架构师每日一题

MegEngine 优化 dataloader 使用体验!data monitor 帮助更好定位性能瓶颈

MegEngineBot

性能优化 Data 开源框架

BMF 开箱体验 开源赛道 1:高效视频处理

Echo_Wish

Python 视频处理 开源赛道1 BMF 高效视频处理

深入解读ReAct框架

Bob Lin

AI Python3 openai GPT-4 #LangChain

火热的低代码,蕴藏怎样的机会和挑战?

互联网工科生

软件开发 低代码开发 JNPF

测试开发 | 人工智能的未来发展:科技新时代的奇迹之旅

测吧(北京)科技有限公司

测试

用AI为AI PC打造最强内核,英特尔是怎么做到的?

E科讯

E往无前 | 腾讯云大数据ES日志轻接入和免运维最佳实践

腾讯云大数据

ES

软件测试/测试管理圆桌讨论会 | 解锁测试管理的核心问题,提升您的管理实力!

霍格沃兹测试开发学社

我们为什么要标准定价?如何定价?

菜根老谭

产品经理 产品标准化

每日一题:LeetCode-394. 字符串解码

Geek_4z9ami

Go 算法 递归 LeetCode 字符串

支持GPU虚拟化的云桌面厂家有哪些?

青椒云云电脑

云桌面 云桌面厂家

KubeWharf:云原生操作系统引领大规模分布式应用的新时代

熬夜磕代码、

你需要的圣诞祝福模板都在这里了!过不过圣诞都能用!

九凌网络

独家好书丨《智算时代的容器技术演进与实践》免费下载

阿里巴巴云原生

阿里云 云原生 容器服务

大模型之提示工程的使用与总结 主赛道:技术人的 2023 总结

Echo_Wish

技术 年度总结 大模型 2023 提示工程

华为云多活高可用服务MAS荣获“2023年香港星光奖“

华为云PaaS服务小智

云计算 华为云

【写作训练营打卡|10】内容创作方式

产品破局思考:一个思维,一种策略

菜根老谭

大模型实践 | 为慧眼智能可观测平台插上ChatInsight的翅膀

网易数帆

可观测性 网易 大模型 AIGC ChatInsight

Google 沙盒效应是什么?网站如何避免谷歌沙盒!

九凌网络

【FAQ】运动健康服务云侧数据常见问题及解答

HarmonyOS SDK

“我不懂的,总有人懂”,软件开发行业已经开始扭曲变形_研发效能_unixsheikh_InfoQ精选文章