科技爱好者周刊(第 210 期):为什么软件变得复杂

作者: 阮一峰

日期: 2022年6月17日

这里记录每周值得分享的科技内容,周五发布。

本杂志开源(GitHub: ruanyf/weekly),欢迎提交 issue,投稿或推荐科技内容。

周刊讨论区的帖子《谁在招人?》,提供大量程序员就业信息,欢迎访问或发布工作/实习岗位。

封面图

中国科学家绘制的世界首幅、最详细的1:250万月球全月地质图发布,统计出月球包含12341个撞击坑、17种岩石、14类地质构造。(via

本周话题:为什么软件变得复杂

我一直认为,软件开发的最大关注点,就是避免复杂性。软件设计越简单越好,太多的程序员以构建复杂的解决方案为荣。

但是,本周有一篇文章让我反思,我的想法是不现实的:软件肯定会越变越复杂。

(一)

这篇文章的作者是 Saleforce 公司的前端工程师诺拉·劳森(Nolan Lawson),题目就叫做《复杂软件的崩溃》(下图)。

大家可能知道,Salesforce 是一家世界级软件公司,专门开发企业软件,以产品复杂而闻名。

所以,这件事情很讽刺。一家出产复杂软件的公司,自家的著名程序员公开说,复杂软件会崩溃。

当然,他在文章里面没提 Salesforce 的名字,但是怎么读都像在写亲身经历。下面摘录一段他的原文和配图,大家品味一下。

"任何在科技行业工作足够长的人,尤其是在大公司工作的人,都曾见过下面的场景。

有一个遗留系统,很大很复杂,没有人完全理解它是如何工作的。

架构师被要求"修复"系统,他们找来一块大的白板,把这个大系统分解成很多方框和箭头。对于遇到的问题,他们的解决方案就是......添加更多方框和箭头。没有任何一个可以从系统中消去,每个人都只是加上自己的那部分。

这一段是不是写得很形象,就像是日常场景的描述。

根据他的文章,我整理了一下,Saleforce 内部的情况大概是这样的。

  1. 客户的需求非常复杂。为了满足这些需求,大型软件不可避免变得复杂。
  2. 软件公司的管理者真正在意的不是系统的复杂性,而是利润。只要软件能赚钱,高层并不在意软件变得复杂。
  3. 软件复杂性都落到少数架构师和高级程序员的头上。每个人加上自己的解决方案(方框和箭头),让软件越来越复杂,然后不可避免地,他们就会在一段时间后离开公司。
  4. 复杂系统最终变得难以理解和维护,唯一的解决方法就是放弃旧系统,从头开始写一个新系统。

所以,诺拉·劳森的结论很悲观:怎么解决软件的复杂性?解决不了。最后就是你走人,公司把软件推倒重来。

这就是一个大厂高级程序员的真实想法。国内的情况其实差不多,上面的描述完全适用于 BAT 内部的复杂系统。

(二)

诺拉·劳森还说了一个观点。大家通常认为,复杂系统往往会在经济繁荣的时候崩溃,因为业务太多,支撑不过来,但他认为不是这样的,系统崩溃往往发生在经济收缩期。

经济繁荣时期,软件公司会大量雇佣新员工,投入更多的财力和人力,支撑复杂系统。等到经济收缩期,公司开始减少投入、冻结招聘或裁员,复杂系统可能就会在这个时候出问题,变得难以维护。

现在就是经济收缩期,那么接下来,会不会就是软件故障的高发期,我们将看到很多复杂系统的崩溃?

前端高频面试题(2022版)

这两年,客观地说,前端开发的热度有所下降。主要原因是前端技术逐步稳定,以及智能手机的普及度见顶了。

但是,前端依然是 IT 行业中最活跃的分支。一年一度的 GitHub 调查中,JavaScript 多年来一直稳居第一,TypeScript 更是快速上升到今年的第四位,仅次于 Python 和 Java。

技术稳定带来的一个后果,就是新框架、新工具少了,大家更关注已有框架/工具的改进和功能增加。

大厂的前端团队也转向了精细化探索,注重如何做得更细、更好,垂直化的技术领域(比如可视化、工程化等)得到了更多的关注。企业的用人要求也越来越高,从能够上手工作就可以要人,变成了要求深入某个领域。

总的来说,现在的前端开发处在下图右侧的那个椭圆,比前一个阶段的难度上升了

如果你已经有一定的前端开发基础,近期打算应聘前端岗位,这里有一份有用的资料,可以帮助大家准备面试。

这份资料就是 《前端大厂的高频面试题(2022版)》,一共有174页,收集了最新的面试题,由国内著名的程序员培训平台"极客时间"联系国内大厂制作。

所有的题目都分门别类,由浅入深排列,每道题都附有答案详解,方便大家知识梳理、准备面试。

此外,还会额外赠送 《三位资深程序员的面试跳槽经验分享》,分享技术之外的跳槽准备、简历准备、面试应对......这些值得借鉴的前人经验。

微信扫描上方二维码,就可以 免费领取 这份前端面试资料。添加客服后,请耐心等待,后台是手动通过的。

最后提醒一下,这份资料不适合刚刚学习前端的学生,更适合有前端开发基础和编程经验的从业人员。

科技动态

1、虚拟接吻

卡内基梅隆大学开发了一种新技术,让 VR 头盔的佩戴者可以感受到虚拟接吻。具体做法是,头盔向嘴唇发射超声波,里面包含了一些微小颗粒,让嘴唇、牙齿甚至舌头产生触感。

上图可以看到,VR 头盔的下方安装了一排超声波发生器,对准红点的位置发射。科学家开玩笑,可以用它开发"接吻机"。

除了产生嘴唇的触感,这种技术还可以在游戏中,让用户感受到风拂过脸部、蜘蛛网碰到脸,甚至食物和饮料进入嘴里的虚拟感受。

上图是一只巨大的虚拟蜘蛛将大量毒药倾泻到用户身上,用户可以感觉到毒药溅到嘴唇上。

2、LED 篮球场

5月30日,国际篮联正式宣布,允许篮球世界杯等大赛启用 LED 篮球场。

传统的篮球场都是木地板,木头具有弹性,可以吸收震动,保护球员。现在,最新的 LED 玻璃也已经能够提供足够的弹性。

LED 球场有很多好处,省去了划线的麻烦,能够快速切换成篮球场、手球场、排球场、羽毛球场。

并且,它自身能发光,可以作为显示屏,实时显示比赛数据,并且配合球场活动,营造气氛。在黑暗中,界线依然保持醒目。

3、树皮字体

五年前,一个丹麦艺术家将字体刻在一棵树上,想看看随着树木的成长,字体会变成什么样,也就是大自然会怎样呈现字体。

下面是字母 a 和 o 在五年中的变化。

这些字体应用到印刷品,就是下面的样子。

他发现,这些字母主要是横向成长,变得更宽更粗,高度反而变化不大。这说明,树木成形后,树干高度就基本不再变化了,开始不断长粗。

4、禁止白炽灯泡

拜登政府宣布,美国将禁止销售每瓦产生低于45流明的灯泡。这实际上禁掉了白炽灯泡。

这个决定是为了提高照明的能量效率。一般来说,白炽灯泡每瓦的发光量在10流明左右,LED 灯泡则可以达到每瓦100流明以上。

文章

1、我为什么与中国游戏发行商签约又分手(中文)

这是一篇日本独立游戏开发者的文章,被译成了中文。作者以亲身经历,解释了目前的独立游戏的发行制度和现状。

2、Intel 4 工艺宣布(中文)

上周,英特尔公司正式宣布了 Intel 4 工艺。这是英特尔公司第一次将 EUV 技术用于 CPU 的生产,实现了7纳米的制程,开始追赶台积电。本文介绍该工艺的一些情况。

3、我如何搭建家用 NAS(中文)

本文详细记录了作者选购硬件、安装软件,搭建一台 22TB 的家用 NAS (网络存储)服务器的过程,可以当作自己架设 NAS 的参考。这里是中文翻译,另有英文原文。(@yangchuansheng 投稿)

4、最简单的任务管理系统(英文)

本文介绍作者自己发明的最简单任务管理系统,就是把每天的任务写在卡片上,用一个架子放在眼前,做完一件就划掉一件。

5、使用 Cloudflare + Backblaze B2 打造一个免费的图像 CDN(英文)

本文是一篇详细的教程,教你怎么把图片托管在 Backblaze B2 对象存储,然后连接到 Cloudflare 的 CDN 服务。两者都有免费额度,对于小网站来说,不用花钱就解决了图片的存储和带宽问题。

6、如何用 iOS 快捷指令防止沉迷?(英文)

作者发现自己在社交媒体上,浪费了大量时间。他想出了一个办法,制作了一个 iOS 快捷指令(shortcuts),只要一打开社交 App,就会跳出提示"请专心工作"。

7、我的免费摄影软件工作流(英文)

作者是一个专业的摄影师,完全采用免费软件处理数码照片。本文介绍他的解决方案。

8、我在单个服务器上托管几十个网站(英文)

作者详细介绍,他如何在一个服务器上托管几十个网站,大部分是 API 调用。这里最大的难题还不是把服务架起来,而是如何同时维护和管理它们。

9、如何估算流入加密货币的资金(英文)

多少资金流入了加密货币市场?这显然是无法准确计算的,作者想到了一个办法,可以间接估算。那就是看稳定币每月增长的发行量,上图是过去两年稳定币每个月的增长百分比。

工具

1、CloudMP3.cc

一个云服务,可以将 SoundCloud 上面的音频,转成 mp3 下载。

2、ToolJet

一个低代码框架,用来开发内部工具。部署到服务器后,它有一个 Web 界面,通过拖拽,就可以连接各种数据源,生成各种应用或管理面板。

3、i 微信读书

Chrome 浏览器插件,配合网页版微信读书使用,支持划线摘抄句子、划线生成分享图片、一键导出笔记等功能。(@secreter 投稿)

4、Sogou C++ Workflow

搜狗公司开源的 C++ 服务器引擎,支撑搜狗几乎所有后端 C++ 在线服务,提供了大量异步服务的功能。(@Barenboim 投稿)

5、FastGit

GitHub 有时在国内不容易打开,这里有一个服务是 GitHub 的镜像加速器。提醒一下,如果要登陆 GitHub,使用这种服务会有安全顾虑,大家自己权衡。(@dllen 投稿)

6、Go-Ldap-Admin

一个国产软件,基于 Go+Vue 实现的 openLDAP 管理后台,可以作为打通 IM(钉钉、企业微信、飞书)与支持 ldap 认证的应用的桥梁。(@eryajf 投稿)

7、Japa

一个 Node.js 的测试框架,简单快速,功能也很多,而且可以直接运行测试脚本,不必通过测试框架来运行。

8、@xata.io/screenshot

这个网页脚本可以生成当前页面的截图。

9、GitLens

一个 VSCode 的插件,大大增强了 Git 集成,可以在编辑器里面执行很多 Git 操作,特别适合多人合作的项目。

Deno 框架

Deno 是 JavaScript 语言的服务器运行环境,跟 Node.js 是竞争关系。

Deno 本身的开发已经接近稳定了,下一步只要有一个好用的框架,就能推广了。

1、Fresh 框架

上周,基于 Deno 的 Fresh 框架发布了预览。

该框架直接使用 TypeScript 脚本,号称零配置、零构建,页面由服务端渲染,客户端不需要 JS 生成内容,也没有多余的 JS 脚本,追求小而快,值得关注。

2、Aleph.js

Aleph.js 是另一个基于 Deno 的全栈框架,类似于 Next.js,目前处于早期开发阶段,也可以关注。

3、Express

顺便提一下,老牌的 Node.js 框架 Express,最近要发布5.0版了。这是一件大事,因为4.0版是八年前发布的。这篇文章介绍了5.0版的新特性

可视化作品

1、全球海底光缆

这个网页提供了一个互动式的地球,上面有全世界海底光缆和骨干机房的位置。

2、极光

这个网页构造了一个极地的背景,让你手绘动态的极光效果。

3、波斯波利斯

波斯波利斯是古代波斯帝国的首都,位于现在的伊朗,已经是一片废墟了。这个页面还原了这座雄伟的帝国都城,重建了 3D 街景,让你在其中漫游。

图片

1、咸海

哈萨克斯坦曾经有一个巨大的湖泊,叫做咸海,面积68000平方公里,相当于两个海南岛,是世界第四大湖泊。

但是,从1960年代开始,前苏联建造了很多灌溉工程,从咸海大量引水,又没有补充,导致咸海快速干涸,目前已经接近消失了。

1985年的咸海。

1997年的咸海。

2014年的咸海。

2、住宅墙

加拿大有一个小镇,靠近北极,终年刮着强劲的北风。

为了挡风,当地修建了高50米,长1.3公里的挡风墙,同时这堵墙里面还是住宅、商业和教育设置,里面可以住人。

因为有了这堵住宅墙,小镇居民就拥有了一个无风的、温暖的小气候。

文摘

1、如何增加牙膏的销量

1950年代,一家国外的牙膏公司,向公众征求能够大幅提高销售额的点子。

几天之后,有一个人来应征,声称他有办法让销售额快速增长40%,而且实施起来不需要很大成本。他要价10万美元。

公司管理层犹豫了数周,最后还是同意了给钱。

等到法律手续和付款流程完成后,这个人给出装有一张小纸条的信封,小纸条上只有四个英文单词:

"Make The Hole Bigger"

这句话翻译成中文,就是"让牙膏开口更大一点"。

此前,管状牙膏的开口一般是5毫米直径。稍加计算就可以知道,当直径从5毫米增加到6毫米时,假设挤出的牙膏长度不变,挤出量会增加44%。

原先顾客用一管牙膏的时间,现在要1.4管牙膏才能满足需求。看似很小的改变,却刷新了这家公司的销售记录,创造了历史。

言论

1、

一件事最可怕的时刻,总是在你开始做之前。

-- 斯蒂芬·金

2、

对于那些没有想象力的人来说,保持常态就是他们的理想。

-- 荣格

3、

IT 行业与传统制造业有一个重要区别,就是 IT 行业有着严重的垄断。

全世界的智能手机有70亿部,比汽车多出5倍(14亿辆)。但是,智能手机制造商比汽车制造商少了好几个数量级。搜索引擎、社交网络、操作系统都是这样,几个巨头就垄断了整个市场。

-- Hacker News 读者

4、

电动汽车虽然售价高,但是每公里的行驶成本低,因此用得越久越划算。这就要求汽车厂商制造耐用的电动汽车。

-- Hacker News 读者

5、

2021年只有两种人在写博客,一种是试图建立受众并从中获利的人,另一种是只想写出想法、而没有任何目标的人。

这两种人的行为都非常好。选择做你喜欢的事,坚持下去,它们最终都可以对他人产生价值。

-- 《我从博客中学到的东西》

历史上的本周

2021年(第 162 期):生活就像《吃豆人》游戏

2020年(第 111 期):智能电视的误区

2019年(第 60 期):一本介绍人类起源的学术自传

2018年(第 9 期):身份证可以植入人体

订阅

这个周刊每周五发布,同步更新在阮一峰的网络日志微信公众号

微信搜索"阮一峰的网络日志"或者扫描二维码,即可订阅。

(完)

广告(购买广告位)

留言(46条)

1、加拿大的挡风墙怕是消防不过关呢
2、选择做你喜欢的事,坚持下去,它们最终都可以对他人产生价值。
其实就是一直选择做对的事情而不用在意目的,然而很难去实践,人总是选择短暂的快感

阮老师,想问下你的文章,发布到微信公众号,所有的链接,都会在结尾形成 References 这是有什么工具实现么?

面积68000万平方公里,这个可能比地球还大了

周五都不早起嘛?

咸海原始面积多了个万吧

打卡????咸海的面积单位错了哦

哈萨克斯坦曾经有一个巨大的湖泊,叫做咸海,面积68000万平方公里....这个要么数字错了,要么单位错了。中国国土面积才960W平方公里。。。。。

当地修建了高50米,长1.3公里的挡风墙。

根据图片看,高度不会超过15米吧。

我想要那个 “如何用 iOS 快捷指令防止沉迷?”,有资源吗

Designed by a tree~ 总是时不时冒出一些好玩的想法

波斯波利斯那个3D的场景是怎么做出来的啊,感觉好牛逼啊!

是不是node作者发现它有一个无法避免的漏洞,所以放弃node转头去开发deno?几年前听过这么一种说法不知道真伪。

“咸海,面积68000万平方公里,相当于两个海南岛。”貌似多个万

1、咸海:面积68000万平方公里;中国:960万平方公里;这个咸海的面积是70.8个中国;
2、住宅墙:50米高约等于16层楼的高度,但是第二张图看起来只有5层楼而已;

引用羯瑞的发言:

阮老师,想问下你的文章,发布到微信公众号,所有的链接,都会在结尾形成 References 这是有什么工具实现么?

mdnice可以生成

如何用 iOS 快捷指令防止沉迷 链接搞错了吧?打开是apple官网页面

介个LED篮球场 有赛博朋克那味了

我手上的一个项目就是:曾经有两个互相竞争的系统,他们完成同样的功能,现在是一个团队了,所以要求我们接手这两个系统合成一个系统,同时不影响他们旧的数据和业务。 然后昨天下午画了一天的箭头。。。。

3、我如何搭建家用 NAS(中文)


排查了一通后发现我把 HDMI 线插到了 DisplayPort 接口中,我被自己蠢哭了????

大力。。出奇迹?

作为一个爱树人士,我强烈谴责国外这些把破坏植物自称为艺术的人,皿煮的垃圾

最简单的任务系统——现在几乎每天都在用这种手写方式,就写在手边的纸上,做完一件划掉一件。试过很多方式,还是这种最方便,缺点是后期要归纳整理就得电子化

只要一打开社交 App,就会跳出提示"请专心工作"
只要一到23点,闹钟就会提醒我该睡觉了,但我仍然每天2点睡觉

iOS 快捷指令可以自己做,手机上安装了快捷指令 App 就行。
这个链接 成功实践了本文提到的功能:打开某个 App 时,自动弹出提示并回到主屏幕。

iOS 快捷指令可以自己制作。https://github.com/qq345386817/ARTS/blob/master/2022/0617.md 这里成功实践了文中提到的修改:打开某个 App 时自动提示并回到主屏幕。

引用羯瑞的发言:

阮老师,想问下你的文章,发布到微信公众号,所有的链接,都会在结尾形成 References 这是有什么工具实现么?

试试这个呢https://md.redream.cn/

牙膏的销量增加我觉得是一个退步的营销宣传,根本就是杀鸡取卵,当今这种营销方式现在大面积的应用到了药品和一些不可能用到这种方法的行业,药品是重灾区,现在很多药品的功效即使用到很大的计量还是没有效果,特别是中药行业,……所以牙膏的这种营销理念简直就是害人不浅。

所以如何避免软件越来越复杂,长期负责的一个项目确实遇到了开发瓶颈

内容很棒

微信、米家崩溃可能是因为裁员呀,那以后......

引用MarsOnly的发言:

波斯波利斯那个3D的场景是怎么做出来的啊,感觉好牛逼啊!

从数据上来看是用3D重建了整个都城,用页面scroll来控制WebGL描绘场景。做得挺厉害的。

图中的挡风墙不高,就算高100米也不可能造成无风环境啊,SUV后窗下雨天啥样没见过吗?想无风只能封闭环境

“我在单个服务器上托管几十个网站”我还没有几十个,目前是几个,后面会越来越多吧。

波斯波利斯这个网站,前几个月,我在其他地方看到过。今天访问,发现访问不了了,进去就一个数字0,动画效果不见了。Chrome、Edge、Firefox都不行。????

加拿大墙那个网址很有趣,houseporn,又一个porn

https://icloudnative.io/posts/budget-nas/
这网站开启后设备变得很烫,有人也这样吗?

看到咸海,想到了我家乡的青海湖,之前面积缩减,现在正在治理,我知道的有空中南水北调……

软件越来越复杂是必然的,就像QQ·功能太丰富了,太完美了.也肯定很复杂。
树上刻字那个太无聊了。
牙膏那个办法很无耻

引用try的发言:

所以如何避免软件越来越复杂,长期负责的一个项目确实遇到了开发瓶颈

除非说“今后的需求我都不接”,不然变大、变复杂是必然的。可以通过好的架构设计去缓解,但不能避免。

Aurora 那个极光的页面,开着当背景音乐听还是很放松的。

小米正在制作LED蓝球场中.....

iOS 快捷指令防止沉迷
这不是掩耳盗铃 自欺欺人么

这风格,我以为这是一个古老的网站; 整页正文只有5分之一;

是Salesforce ,有好几处理少了个s,目前就是做Salesforce实施的,该软件已经发展20多年了,又是云平台,加上全球前500强大部分都是他的客户,同时又从这个平台上搭建出不同的云产品,PaaS+SaaS,正因为复杂,所以国内只能模仿出皮肤。

引用树的发言:

作为一个爱树人士,我强烈谴责国外这些把破坏植物自称为艺术的人,皿煮的垃圾

作为一个爱土人士,我觉着你走在路上就是对大地的亵渎

阮老师标题文章中提到的结论“复杂系统最终变得难以理解和维护,唯一的解决方法就是放弃旧系统,从头开始写一个新系统。”

然而,原文并无此意。

复杂系统经常会不得不重写是一个观察到的现象。

现象不等于评价,事实不等于结论。

原文列举他看到的复杂的产生过程和现象,给出的解法是:

1. 抵制复杂性,意识到复杂性植根于内心,以及复杂性导致的危害
2. 因此,如果有一个问题的两个方案,那么尽可能选择简单的

重写不但不是很好的方案,也更加不是唯一的解决方案。

点击如下链接,查看重写导致的累累教训。

https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/


那个TS前面的黄线,在2016之后就断了的是什么语言?

我要发表看法

«-必填

«-必填,不公开

«-我信任你,不会填写广告链接