软件研发--“扭曲变形正成为一种常态”

        现在越来越多的声称提质增效的的工具,被一批所谓的只知道无脑上马的“专家”,拎起来放到了我们这一代工程师头顶,所谓的仰望星辰,逐渐的成了乱花渐入迷人眼的状态。那些深层次的底层的运作方式确实支撑起这个时代的基础。这是一个很大的问题,甚至正在毁掉我们的未来发展空间。

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

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

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

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

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

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

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

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

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

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

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

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

        好多现在的公司用到的一般都是第三方的开发伙伴,“快餐”时代带来的后遗症。那边的开发人员指导怎么使用“现代框架”把网站和API组合起来,但对框架本身的编码了解不多,对安全行更是一无所知。一旦出现问题,没人能判断到底发生了什么。于是在遇到问题并挣扎了几个月后,他们最终放弃并选择对外求助。

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

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

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

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

        1、别总跟着炒作话题或热门趋势跑

        2、保持好奇心。不断单纯学习工具,更要了解其底层技术是如何起效的。

        3、如果可能,至少试着手动执行操作,例如如何配置工具来满足实际需求。

        4、如果可能,请查实查看当前工具的代码。对这些代码的基本了解将非常有价值。

        5、培养良好的求知习惯、保持学习、不断试验,深入钻研你感兴趣的技术。最好能建立一个家庭实验室,在这里探索并尝试剖析一切。

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

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

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

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

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

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

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

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

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

网友怎么看?

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

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

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

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

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

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

你可能感兴趣的:(软件工程,经验分享,程序人生)