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

发布了 1164 篇内容, 共 908.4 次阅读, 收获喜欢 2345 次。

关注

评论 3 条评论

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

photoshop 2023【存储为窗口显示空白、黑屏】解决方法

Rose

ps 2023储存黑屏 Photoshop 2023

从源码全面解析 ArrayBlockingQueue 的来龙去脉

做梦都在改BUG

Java 源码 ArrayBlockingQueue

微服务 SpringBoot 整合 Redis GEO 实现附近商户功能

Bug终结者

java; Redis 核心技术与实战 三周年连更

macOS 13 Ventura (苹果最新系统) v13.3.1正式版

Rose

macOS Ventura 苹果系统下载 Mac最新系统

灵活高效,华为云桌面实现随时随地办公

YG科技

浅谈华为云CDN在互联网领域的应用场景落地

YG科技

达芬奇18补丁版下载 支持m1/m2/intel/win

Rose

DaVinci Resolve 18 达芬奇18破解版 视频剪辑调色软件

AlDente免费版,限制 Macbook 最大充电量,保护电池健康

Rose

AlDente Mac版 AlDente macOS 充电量阈值

华为云CDN赋能企业数字化转型

YG科技

NFT加密钱包交易系统开发搭建技术

薇電13242772558

NFT

Qz学算法-数据结构篇(排序算法--基数、总结)

浅辄

数据结构 三周年连更

Linux面试必备

袁袁袁袁满

三周年连更

摆脱终端束缚,华为云桌面助力企业数字化转型

平平无奇爱好科技

THREE.JS实现炫酷的3D简历网站

知心宝贝

前端 后端 3D ThreeJS 三周年连更

面试官:介绍一下什么是缓存雪崩、缓存击穿、缓存穿透?

做梦都在改BUG

Java redis 缓存穿透 缓存击穿 缓存雪崩

4月26日-30日,KaiwuDB 在数字中国等你!

KaiwuDB

数字中国 KaiwuDB

华为云桌面,如何为企业构建新型工作方式

平平无奇爱好科技

华为云虚拟专用网络VPN常见问题解答

YG科技

Spring Boot之log4j2基础使用入门|超级详细,建议收藏

bug菌

Spring Boot log4j2 三周年连更

Matlab实现粒子群算法

Shine

三周年连更

Oracle Apex学习之系统变量

back_wang

oracle ebs oracle apex

【直播回顾】数字化转型成为银行业发展的关键(下)

易观分析

数字化转型 银行

华为云大数据BI解决方案,助力企业数字化运营

平平无奇爱好科技

华为云桌面随需而至,让办公数字化触手可及

平平无奇爱好科技

复旦MOSS大模型开源了「中国版ChatGPT」,Github和Hugging Face同时上线

肥晨

三周年连更

PHP 中数组是如何灵活支持多数据类型的?

架构精进之路

php 数组 后端 三周年连更

Downie下载vip会员视频教程?Downie4最新许可证

Rose

Downie下载 Downie使用教程 Downie 4许可证 Mac视频下载器 Downie破解版

跨平台应用开发进阶(五十五):uni-app 获取设备信息及 APP 报无相应权限问题分析及解决

No Silver Bullet

uni-app 跨平台应用开发 三周年连更 问题分析及解决 设备信息

华为云桌面——云端上“最卷的云”

平平无奇爱好科技

华为云CDN加速,赋能企业数字化转型升级

YG科技

面试还不懂JVM调优,看这篇就够了

程序员小毕

程序员 面试 后端 架构师 jvm调优

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