写点什么

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

  • 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:129669
用户头像

发布了 1005 篇内容, 共 656.1 次阅读, 收获喜欢 2189 次。

关注

评论 3 条评论

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

被骂惨了!复旦版「MOSS」服务器挤崩,一口吃不成ChatGPT

引迈信息

人工智能 AI ChatGPT MOSS

DevEco Studio端云协同开发之云数据库

白晓明

云数据库 HarmonyOS 端云协同

CVE-2023-23752 Joomla未授权访问漏洞分析

墨菲安全

漏洞分析 软件供应链安全

接地电阻要小于4Ω,你知道是为什么吗?

元器件秋姐

科普 元器件 电阻 接地电阻

数据治理如何做?火山引擎DataLeap帮助这款产品3个月降低计算成本20%

字节跳动数据平台

大数据 数据治理 数据研发 企业号 2 月 PK 榜

CodeArts Repo:6大特性助力企业代码稳定可靠安全无忧

华为云开发者联盟

云计算 后端 华为云 企业号 2 月 PK 榜 华为云开发者联盟

如何将Excel文档转换为PDF文档

Geek_249eec

Java Excel PDF

基于SpringBoot实现操作GaussDB(DWS)的项目实战

华为云开发者联盟

数据库 后端 华为云 企业号 2 月 PK 榜 华为云开发者联盟

天翼云推出爬虫管理,助力企业安全高效发展

Geek_2d6073

宣布 Databricks 支持 Amazon Graviton2,性价比提高3倍

亚马逊云科技 (Amazon Web Services)

数据库 存储

智多星RPA重塑业务流程,全面赋能企业商业创新

YonBuilder低代码开发平台

IoT 物联网平台如何实现 100万/秒 消息广播?——实践类

阿里云AIoT

小程序 监控 物联网 传感器 测试技术

Python 基础练习题(二)

漫步桔田

LoRaWAN设备接入阿里云IoT企业物联网平台实战——实践类

阿里云AIoT

物联网 传感器

如何有效的解决代码的圈复杂度

京东科技开发者

代码 计算 圈复杂度 点边计算

Python基础练习题(一)

漫步桔田

【监控运维】消息轨迹全景图详解-独门秘籍——实践类

阿里云AIoT

运维 监控 物联网 数据可视化 消息中间件

TDengine 发布主流时序数据库对比分析报告,与 InfluxDB、TimescaleDB 展开全面对比测试

TDengine

tdengine 时序数据库 数据库·

MQTT 5.0介绍

EMQ映云科技

性能 物联网 IoT mqtt 企业号 2 月 PK 榜

电信NB-IoT设备对接阿里云IoT平台实战——实践类

阿里云AIoT

大数据 监控 物联网 存储 数据格式

CVE-2022-22947 SpringCloud GateWay SPEL RCE 漏洞分析

墨菲安全

漏洞分析 软件供应链安全

有没有夫妻相?刷一下脸就知道!

华为云开发者联盟

人工智能 华为云 企业号 2 月 PK 榜 华为云开发者联盟

脑洞|ChatGPT加持下,ChatOps将如何革新团队协作与运维管理?

极狐GitLab

团队管理 DevOps 团队协作 ChatOps ChatGPT

2023年Java面试题精选(蚂蚁金服/滴滴/美团/拼多多腾讯)

架构师之道

java面试

研发效能DevOps推荐书单

laofo

DevOps cicd 研发效能 持续交付

Java单元测试浅析(JUnit+Mockito)

京东科技开发者

Java 单元测试 代码 JUnit Mockito

F5 分布式云服务为软银集团的私有基础设施带来云原生能力

F5 Inc

NFTScan x TiDB丨一栈式 HTAP 数据库为 Web3 数据服务提供毫秒级多维查询

NFT Research

数据库 NFT

任务管理-轻松搞定 IoT 设备重启、资源包更新、固件升级等业务——实践类

阿里云AIoT

json 物联网 数据格式

墨菲安全参与信息通信软件供应链安全社区成员大会并获自主研发创新成果奖

墨菲安全

供应链安全 安全情报

PDF电子书下载 和 企业物联网实例 视频讲解——实践类

阿里云AIoT

运维 监控 物联网

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