首页 > 通讯 > >内容页

硬件发展越来越快,软件却越编越慢

2018-10-10 11:04:51 来源:36氪

编者按:硬件越来越快,软件却越编越慢。只是在前者的作用下才让人勉强维持了应用的性能。有人说程序员的时间要比计算机的时间昂贵。所以只要硬件过得去,程序凑合过去就行了。其结果是搭积木出来的软件越来越臃肿,已经到了积重难返的地步了——Windows 95只有30Mb,今天我们的一个网页都要比它大!难道真的没有办法了吗?有没有可能做出简单、有效,清爽的应用呢?有15年编程经历的Nikita说,有,不过首先要程序员这个群体用心。

硬件性能飞涨、软件却越来越臃肿,所以一切还是那么慢

我编程到现在已经有15年了。最近我们这个行业缺少了对效率、简洁性以及卓越的关心,甚至已经到了令我对自身的职业生涯和整个IT业感到沮丧的地步。

出于讨论的方便,这么说吧,现代汽车用当前的引擎设计在98%的技术可能性上面是可行的。现代建筑需要用足够的材料来填充功能并且在特定条件下保持安全。所有的飞机都会朝着优化的大小/形态/载荷收敛,而且外形基本上是一样的。

而只有软件,哪怕程序性能表现只有最大可能的1%甚至0.01%也过得去。对此每个人似乎也觉得没什么。甚至大家经常对它的低效率还很自豪,拿“为什么要担心呢?计算机已经足够快了。”作为借口。

@tveastman:我有个Python程序每天都要跑,耗时是1.5秒。我用了6个小时的时间用rust重写了一遍,现在它只用0.06秒。这种效率改进意味着我节省了41年零24天的时间。

你大概听说过这句口号:“程序员的时间要比计算机的时间昂贵。”这话的意思其实是说我们正在以空前的规模浪费计算机。每100公里要烧100升汽油的汽车你愿不愿买呢?1000升呢?这样的事情换成计算机我们天天都在做。

硬件性能飞涨、软件却越来越臃肿,所以一切还是那么慢

——软件开发机制是这样的:我们需要在这道墙上打500个洞。所以我做了这个自动钻孔机。它配置了优雅精确的传动装置,可以不断地根据需要调整扭矩和速度。

——很好,重量很合适!我们就装500颗进去打到这面墙上。

一切都慢到难以忍受

看看周围吧:我们的便携式计算机比当初把人类带上月球的那些都要强大几千倍。但是每一个网页都要想方设法在最新的顶配MacBook Pro上滚动时维持平滑的60fps。我可以舒适地玩游戏,看4K视频,但是网页滚动一下都不行?这怎么能行?

Google写的web应用Google Inbox,跑在也是Google写的Chrome浏览器上,要想打开一封大小适度的邮件需要花费的时间是13秒。

它还动画显示空的白箱子而不是显示内容,因为这是能在网页上以过得去的性能进行动画演示的唯一方式。不,过得去意味的不是60fps,相反,是“尽可能地快”。我极其想看看web社区怎么回答120Hz显示什么时候才能成为主流。

Windows 10升级要花30分钟。为什么要那么久?这么久足够把我的SSD硬盘完全格式化,下载一份新的然后安装5次了。

硬件性能飞涨、软件却越来越臃肿,所以一切还是那么慢

Pavel Fatin:在编辑器输入是个相对简单的过程,所以即便是286 PC也能提供相对流畅的输入体验。

现代文本编辑器的时延比已有42年历史的Emacs还要长。那可是文本编辑器!还有比这更简单的东西吗?每一次按键你只需要更新一下那小小的矩形区,可是现代文本编辑器却不能在16毫秒内做到这个。这已经是很长一段时间了。很长。在16秒之内3D游戏可以用几十万个多边形填充整个屏幕并且处理好输入,重新计算好并动态加载/卸载资源了。怎么会这样?

软件功能越多不会变得越快是普遍趋势。我们得到的是更快的硬件更慢的软件个还是一样。一切跑得都要比可能的速度慢得多。你想到过自己耳朵手机启动需要30秒到60秒的时间吗?为什么就不能在1秒钟之内启动完毕?这里面并不存在物理限制。我喜欢看到这个。我喜欢看到极限被突破,为了以有意义的方式实现某个有意义的东西而榨干最后一位的性能。

一切都太大了

然后还有臃肿问题。如果把所有广告都屏蔽掉的话web app的打开速度可以快10倍。Google用AMP计划来乞求大家别再搬起石头砸自己的脚——这种技术解决方案解决的是一个并不需要任何技术只需要一点点常识的问题。如果你把臃肿干掉,web自然就会变得快得要命。理解这一点需要多聪明呢?

没有装app的android系统几乎占了6Gb。想一下,想想看这个数字有多大。里面都有什么呢?高清电影?我猜基本上都是代码:内核、驱动程序。当然,还有一些字符串和资源,但是这些不会很大。那么,一个手机到底需要多少驱动程序呢?

硬件性能飞涨、软件却越来越臃肿,所以一切还是那么慢

Windows 95只有30Mb。今天我们的一个网页都要比它大!Windows 10是4Gb,大了133倍。但是后者是不是比前者出色133倍呢?我的意思是,它们在功能上基本上是相同的。是,我们有Cortana,但我那总不会占掉3970Mb吧。可不管Windows 10是什么东西,Android真的顶它的150%吗?

Google键盘app通常就占150Mb。在屏幕上画30个键的app难道真的比整个Windows 95复杂5倍吗?Google app这个基本上相当于Google Web Search的应用是350Mb!Google Play Service,这个我不用的玩意儿(我不在这里买书、音乐或者视频)有300Mb,可是我却删不掉它。

硬件性能飞涨、软件却越来越臃肿,所以一切还是那么慢

当我把所有那些必不可少的app(社交媒体、聊天应用、地图、打的、银行应用等)都装完之后,留给我的照片的大概就只有1Gb了。而且这还没装游戏和音乐呢!还记得OS、应用和所有数据都能进一张软盘的时候吗?

你的桌面待办事宜应用也许是用Electron编写的,因此会为了支持Xbox 360控制器而内置了userland驱动在里面,可以渲染3d图形,可以演奏音频,还可以用你的web摄像头拍照。

硬件性能飞涨、软件却越来越臃肿,所以一切还是那么慢

一个简单的文字聊天因为加载速度和内存消耗而恶名昭彰。是的,你真的可以把Slack归类成资源消耗型应用。我饿意思是说,聊天室再加上勉强算个文字编辑器,这些本来应该是需求没那么大的应用的。欢迎来到2018。

可至少它能用啊。你也许会说。好吧,更大并不意味着更好。更大意味着有人已经失去控制。更大意味着我们不知道发生了什么。更大意味着复杂性、性能以及可靠性方面要增加负担。正常来说不是这样的,这也不应该成为常态。块头过大的应用意味着红色警报。这应该意味着快跑。

全都烂了

在3年前16Gb的Android就完全够用了。而在今天,如果OS是Android 8.1的话已经几乎不够用了,因为每一个app都至少是过去的2倍,但却没有明显的理由。功能又没有增加。速度没有变快或者经过了优化。样子也没有改变。难道它们也会长身体?

iPhone 4s面世的时候配的是iOS 5,但是几乎已经带不动iOS 9。这不是因为iOS 9太出色了——其实9跟5基本上是一样的。但是它们的新硬件更快,所以它们就把软件做得慢一点。别担心——你会得到令人兴奋的新能力的……比如用相同的速度跑同样的应用!

iOS 11放弃了对32位应用的支持。这意味着如果开发者不愿意回到过去,更新一度十分好用的app的话,你可能就再也看不到他们的应用了。

@jckarter:DOS程序不用做任何修改就能在上世纪80年代以来制造的几乎所有计算机上面运行。可如果明天Chrome升级一下,一个JavaScript应用也许就用不了了。

今天的网页放回到10年前的任何浏览器都兼容不了(可能时间还要更短一点)。

“为了保持不掉队它用尽了全力。”可是这有什么意义呢?我可能偶尔会跟旁边的家伙一样买部新手机和新的MacBook,但是这么做只是为了能跑同样变慢的相同应用?

我认为我们可以也应该比这做得更好。每个人都忙着开发为今天而不是明天准备的东西。但是拥有比这持续时间更久一点的东西会是件好事。

越糟越好

如果出问题的话网页的解决方案就是让你刷新一下。谁有时间弄清楚发生了什么啊?

任何web应用都会经常产生“随机”的JS错误,甚至在兼容的浏览器上也会。

硬件性能飞涨、软件却越来越臃肿,所以一切还是那么慢

整个网页/SQL数据库架构都是建立在一个假设(甚至是希望)的基础之上:那就是当你在浏览渲染过的网页时没人会碰你的数据。

大多数协作的实现都是“尽力而为”,丢失数据在很多情况下都是司空见惯。见过下面这个对话框吗:“你想保留哪一个版本?”我的意思是说,今天的门槛已经这么低了,以至于你的用户对有这么一个窗口提示就已经感恩戴德了。

硬件性能飞涨、软件却越来越臃肿,所以一切还是那么慢

你们的标准太低了。在我的世界里,“我准备要干掉你的部分工作,但是你可以选择干掉哪一个”这样的说法是不可接受的。

Linux会故意杀死随机进程。但仍然是最流行的服务器端OS。

我手头的每一台设备都会经常失效。我的Dell监视器时不时因为里面的软件而需要硬重启。Airdrop?如果它能检测到你的设备的话,那你就幸运了,否则的话我该怎么办?蓝牙?规范说明太复杂,设备之间无法对话,定期重启就是最好的解决办法。

我还没谈到物联网呢。这个超出笑点范围太多了。我甚至都不确定该加点什么。

我希望能对自己的工作感到自豪。我希望交出来的东西能用,稳定。为此,我们需要理解我们在开发的是什么,彻底地,而在臃肿、设计过度的系统里面是没法做到这一点的。

编程也是同样的一团糟

似乎没人对品质、速度、效率、持久、基础性的东西感兴趣了。甚至当手上有很久以来就众所周知的效率解决方案时,我们仍然在跟同样的问题搏斗:打包管理、编译系统、编译器、语言设计,还有IDE。

编译系统天生就是不可靠的,而且定期需要彻底清理,甚至尽管所有的必要信息都在那里了。没有任何东西阻挡我们让编译过程变得可靠,可预测且100%可复制。只是没人认为这些事情是重要的。NPM多年来仍停留在“有时候能用”的状态。

@przemyslawdabek在我看来,开发Node.js/JavaScript项目的时候rm -rf node_modules(删除所有模块)是工作流不可或缺的一部分。

至于编译时间?没人认为编译器工作几分钟或者甚至几小时是个问题。不是说“程序员的时间更加重要吗?”几乎所有的编译器、预处理其和后处理器都给你的编译过程增加了重大、有时候甚至是灾难性的时间负担,但是又没有提供相称的实质性的好处。

硬件性能飞涨、软件却越来越臃肿,所以一切还是那么慢

程序员合法放松的头号借口:“我的代码正在编译!”

你指望程序员通常会做出理性决定,但有时候他们做的恰恰相反。比方说,哪怕在单机上跑同样的任务速度更慢也要选Hadoop。

在大部分计算机都还不够可靠的时候,机器学习和“AI”就让软件开始猜起来了。

@rakhim:当一个应用或者服务被说成是“AI驱动”或者“基于机器学习”时,我的解读是“不可靠、不可预测、不可能推理行为。”我会尽量避开“AI”,因为我希望计算机是相反的:可靠、可预测、合理的。

我们把虚机放进了Linux,然后我们把Docker放进了虚机里面,这仅仅是因为没人会清理大多数程序、语言及其环境造成的混乱。我们用一块布盖住了那堆屎但就是不处理。比方说,“Single binary(单二进制)”仍然是Go的一大卖点。没有混乱 = 成功。

依赖关系?大家很容易就会把过度设计的“完整包解决方案”塞进最简单的问题里面而不考虑它们的成本。而那些依赖关系又会带来新的依赖关系。最后你得到的就是一棵介乎恐怖故事(噢天呐那么大那么多冲突)与喜剧(我们不可能会把这些包含进来的,但事实就是如此)的依赖树。

程序再也不能连续好几年都不用重启了。有时候甚至连续工作好几天都已经变成一种奢望。随机的情况时有发生,没人知道为什么。

更糟的是,没人有时间停下来找出发生了什么。如果花钱就能搞定的话为什么还要自寻烦恼。再弄多个AWS实例。重启进程。卸载然后恢复整个数据库。写个监视程序每20分钟重启一下损坏的app。把相同的资源多放几次,压缩然后交付。快速行动,不要修复。

工程不是这么做的。这是惰性编程。工程是要深刻地理解性能、结构以及开发的东西的局限性。将写得很糟糕的东西跟写得更糟糕的东西组合到一起跟着在原则完全背道而驰。要想取得进步,我妈需要理解我们在做什么以及为什么要这么做。

我们已经陷进去了

所以一切都是一堆勉强能用的代码堆在此前编写的勉强能用的代码上面。东西的规模越来越大越来越复杂,任何修改的机会都没了。

要想拥有一个健康的生态体系你需要回过头来重新审视。你需要偶尔把东西扔掉用更好的东西取而代之。

硬件性能飞涨、软件却越来越臃肿,所以一切还是那么慢

设计的返璞归真

但是谁有时间干这事儿?我们很久没见过新的OS内核了吧,有没有25年了?现在想重写了事不行了,太复杂了。浏览器充斥着各种边缘案例和历史先例,没人敢从头再写过布局引擎。

今天对流程的定义也在火上浇油:

@sahrizv:2014_我们必须采用#microservices(微服务)解决一体化程序的所有问题。

2016——我们必须采用#docker来解决微服务的一切问题。

201——我们必须采用#kubernetes解决docker的一切问题。

或者重新发明轮子:

@dr_c0d3:2000:写100行XML“声明性”地配置你的servlets和EJB。

2018:写100行YAML“声明性”地配置你的微服务。

至少XML还有schema……

我们无法摆脱我们现有的东西,没人能拯救我们。

企业不会关心这个

用户也不会。他们只会期待我们能提供什么。我们(工程师)说每一个Android app都要350Mb?好吧,他们会忍受的。我们说我们无法提供流畅的滚屏?好吧,他们能忍受一个会卡顿的手机。我们说“如果不行的话就重启”?他们就会重启。毕竟,他们没有选择。

而且也没有竞争。大家开发的产品都是一样的臃肿、缓慢,不可靠。偶尔质量上领先一步的确能带来竞争优势(iPhone/iOS对比其他智能手机,Chrome对比其他浏览器)冲切批示每个人重组,但持续不了多久。

所以我们作为工程师的使命就是向全世界展示用今天的计算机在性能、可靠性、品质和可用性方面能做成什么样子。如果我们用心的话,大家会学的。除了我们没人可以证明这是很有可能的。前提是我们用心了。

也不是全都是坏事

有一些亮点表明改进目前的情况并非不可能。

Martin Thompson正在做的工作令人印象深刻,简单、有效,清爽。

Raph Levien的Xi编辑器似乎采用了正确的开发原则。

Jonathan Blow给自己的游戏开发了一门语言,用他的笔记本编译可以达到每秒钟50万行。这是cold compile(冷编译),没有中间缓存,没有增量编译。

写出速度快的程序不需要你是个天才。这里没有魔术。唯一需要的是不要在一堆现代工具链构成的垃圾基础上开发。

让世界更美好的宣言

我希望看到进步。我希望改变。我希望软件工程能推陈出新而不是原地踏步。我不希望反复重新发明同样的东西而且性能越来越差却越来越臃肿。我希望做出来的东西值得信赖,有崇高的终极目标,希望未来比今天更美好,我还希望有一个一起接受这一愿景的工程师社区。

我们今天所取得的并不是进步。我们勉强用建构在糟糕工具基础上的东西满足了商业目标。我们陷入到了局部最优里面,没人想要摆脱出来。这甚至都还不是个好地方,又臃肿又低效。我们只是对此习惯了。

所以我想向大家呼吁:我们现在的东西就是一堆狗屎。作为工程师,我们可以,也应该做得更好。我们可以有更好的工具,我们可以开发更好的应用,更快、更加可预测,更可靠,使用更少的资源(少好几个量级!)。我们需要深刻理解我们在做什么,为什么要这样做。我们需要提供可靠、可预测、最高品质的东西。我们可以,也应该对自己的工作感到自豪。

我希望我不是一个人在战斗。我希望还有其他人也想这么做。哪怕先开始讨论一下软件业之怪现状也好。接着我们可以再思考一下如何走出这种困境。

标签: 越来越 硬件 软件