duangsuse::Echo
https://tttttt.me/seedless_channel/1655 #statement #PLT #dev #reaction “我有一个每天都要运行的Python程序,每次运行需要1.5秒。我花了六个小时用rust重写了这个程序,现在这个程序运行一次只需要0.06秒了。41年零24天以后,效率提升节约下来的时间补偿了我重写程序的六个小时。:) 这条没错啊,这个作者,根本没搞清楚「大型软件」和demo里,开销都花在哪里 所有软件都巨巨巨巨大无比,这也是和性能无关的 “整个网页/SQL 数据库的架构…
对「日用软件工程」的讽刺文章 内容更新了
真知灼见,字字珠玑啊 #design 😨❤️
> 你会买百公里耗油100升,甚至1000升的汽车吗?在软件行业,我们一直这么做。
> “你需要拼命地奔跑,才能保持呆在原地”。从iOS 11开始,系统将不再支持32位的应用,Chrome的一次更新,就能够让某个JS插件失灵
> 小白用户换上新设备,只是为了运行变得越来越慢的Apps吗?
现代汽车工作效率可以达到当前引擎设计的98%的水准
现代建筑使用刚好的材料来搭建并且在确定条件下保持安全
现代软件行业,大厂普遍接受程序存储和运行在1%甚至0.1%的算法效率上。
当大多数开源还不可靠的时候,机器学习和“人工智能(AI)”又将软件推向了靠猜测的阶段。
> Jonathan Blow 自己开发给自己游戏开发用的编程语言,在笔记本上每秒可以编译50万行代码。而且是全新编译,没有中间缓存,没有增量编译。
> 编写高效的程序不需要你是天才。这并不需要什么魔法。只是不要在现在的臃肿不堪的工具链上去构建就行。
最新的顶级Macbook Pro上,谷歌邮箱,在谷歌自己开发的Chrome浏览器上,需要花费13秒的时间打开邮件
Windows 10大小是4GB,是Windows 95的133倍大。但是Windows 10比Windows 95高级133倍吗?难道整个安卓比这4GB还复杂1.5倍?
Windows 10需要花费30分钟来更新系统,什么流程需要这么长的时间呢?30分钟都够我彻底格式化我的SSD硬盘
你有没有想过为什么你的智能手机需要30到60秒的时间来启动。为什么它不能在1秒内启动?这里并没有硬件限制^
10年前一张光盘就能存储操作系统,系统应用和你所有的数据内容。
3年前,16GB手机能良好运行使用,但是到了今天,16GB和膨胀两倍的安卓8.1的手机,已经没有选择游戏和"微"信的余地
然而安卓8.1,并没有带来性能的变化和功能提升,它就这么膨胀了?
一个没有安装任何其他APP的Android8占用6GB的存储空间。请比10年前的软件想一下,程序员们该有多么巨大的进步。
这里面有高清电影吗?我猜大部分应该是代码:系统内核,驱动,翻译字符串,这些资源都不应该很大!
谷歌App,基本上就是谷歌网页搜索,需要350MB空间!谷歌Play服务,我基本不用,需要300MB空间
——
现代editor的输入延迟远输于42年前开发的Emacs。还有比编辑器更简单的功能吗?每敲击一次键盘,你所需要做的仅仅是更新一个小小的方形区域
一个3D游戏可以在这个时间内刷新整个屏幕,渲染成千上万的多边形。同时还处理用户输入,重新计算环境世界
Web应用都会报出大量的“随机”JS错误。
如果网页出现什么问题,只会提示你F5。谁有时间去研究到底什么地方改变了?
整个网页/SQL数据库的架构都建立在当用户浏览渲染出来的网页时,不会去操作任何数据的假设 🔥
原始讽刺:https://motherfuckingwebsite.com/
进阶讽刺:https://thebestmotherfucking.website/
反向讽刺:
https://thebestmotherfuckingwebsite.co/
你桌面的todo应用可能是基于Electron写的,所以它包含了一个Xbox 360控制器的用户态驱动在里面(QQ虚幻引擎警告 😅),这个驱动能渲染3D图像,播放音频,用你的网络摄像头拍照。
你应该将Slack划分为极其耗电型应用。聊天室和简单的文本编辑工具,这些应该都不是资源消耗型的应用才对。欢迎来到2018。
开发Node.js/Javscript项目,rm -rf node_modules 一直是码农工作过程不可或缺的部分。
在虚拟机上构建Docker容器,ONNX,就因为没人可以理清楚程序,编程语言和运行环境的混乱状况。
^注 #bash
1.986s lightdm.service
2.1GHz 8G 的x86_64 Linux上启动只需2s 🥰 安卓慢不是Linux的锅
另外,pacman 的安装速度比apt;rpm几乎是快一倍的
不同的CPU指令集有体积差异,arm64几乎是32的二倍,这就显得Android的字节性价比奇低了-堪比JavaEE。 不知是不是系统apk的冗余res/文件太多
每次你 ./configure ,gcc都会重新计算一个完全能被缓存的CPU info,即使不换语言用cmake也能避免这点。 C指针语法的繁琐和预处理也会极大拖慢parse的时间
长度:107423744 (102M) [application/octet-stream]
长度:220485632 (210M) [application/octet-stream]
长度:167772160 (160M) [application/octet-stream]
长度:217055232 (207M) [application/octet-stream]
💭
一些人可能觉得W95时没有 .NET 这样的框架,各种UI也很简陋,但这也是扯淡
要知道 7zip.org 可以用1M实现文件管理器的功能
qemu.org,ffmpeg.org,msys2.org 加起来也只250M, 难道内核驱动会包含更多算法吗?
而自带驱动的
功能类似的PS和 gimp.org 居然差0.7G https://helpx.adobe.com/creative-cloud/kb/file-size-creative-cloud-installers.html#:~:text=Photoshop%20CS6
功能和代码量似乎根本没有对应性
难道框架接口不是为服务于apps存在的吗? 随着技术进步,过分冗余的功能组件太多了
我觉得编程界的市场也是挺有趣的,明明速度在下降, 工资却依然涨
这又可以说成资本对劳动和技术的异化 又可以说成资本故意淘汰老设备
但其实编程界好像就是这样…… 无法多快好省地换代,有得有失
我觉得可以搞个绝对化,一切有局部类型标注,或者为val/var数据类型做区分的语法都是噪音(
一个编译期黑盒assert 当成金科律玉,说明根本没有做自顶向下复用 就开始敲键盘,根本是过度工程
文档写成测试,测试写成汇编,类型写成代码……
弱类型还简单些,module导入,interface多态和扩展,data和临时对象 创建个闭包,查个dict就行了
type能和函数字典很好地对应,序列化和集合类型都字面, 完全不需要keywords
这点许多新创建的静态语言都做不到,kt现在的listOf() 也没法好好实现
more: https://news.ycombinator.com/item?id=34936729
https://pointersgonewild.com/2018/02/18/minimalism-in-programming/ #dalao
真知灼见,字字珠玑啊 #design 😨❤️
> 你会买百公里耗油100升,甚至1000升的汽车吗?在软件行业,我们一直这么做。
> “你需要拼命地奔跑,才能保持呆在原地”。从iOS 11开始,系统将不再支持32位的应用,Chrome的一次更新,就能够让某个JS插件失灵
> 小白用户换上新设备,只是为了运行变得越来越慢的Apps吗?
现代汽车工作效率可以达到当前引擎设计的98%的水准
现代建筑使用刚好的材料来搭建并且在确定条件下保持安全
现代软件行业,大厂普遍接受程序存储和运行在1%甚至0.1%的算法效率上。
当大多数开源还不可靠的时候,机器学习和“人工智能(AI)”又将软件推向了靠猜测的阶段。
> Jonathan Blow 自己开发给自己游戏开发用的编程语言,在笔记本上每秒可以编译50万行代码。而且是全新编译,没有中间缓存,没有增量编译。
> 编写高效的程序不需要你是天才。这并不需要什么魔法。只是不要在现在的臃肿不堪的工具链上去构建就行。
最新的顶级Macbook Pro上,谷歌邮箱,在谷歌自己开发的Chrome浏览器上,需要花费13秒的时间打开邮件
Windows 10大小是4GB,是Windows 95的133倍大。但是Windows 10比Windows 95高级133倍吗?难道整个安卓比这4GB还复杂1.5倍?
Windows 10需要花费30分钟来更新系统,什么流程需要这么长的时间呢?30分钟都够我彻底格式化我的SSD硬盘
你有没有想过为什么你的智能手机需要30到60秒的时间来启动。为什么它不能在1秒内启动?这里并没有硬件限制^
10年前一张光盘就能存储操作系统,系统应用和你所有的数据内容。
3年前,16GB手机能良好运行使用,但是到了今天,16GB和膨胀两倍的安卓8.1的手机,已经没有选择游戏和"微"信的余地
然而安卓8.1,并没有带来性能的变化和功能提升,它就这么膨胀了?
一个没有安装任何其他APP的Android8占用6GB的存储空间。请比10年前的软件想一下,程序员们该有多么巨大的进步。
这里面有高清电影吗?我猜大部分应该是代码:系统内核,驱动,翻译字符串,这些资源都不应该很大!
谷歌App,基本上就是谷歌网页搜索,需要350MB空间!谷歌Play服务,我基本不用,需要300MB空间
——
现代editor的输入延迟远输于42年前开发的Emacs。还有比编辑器更简单的功能吗?每敲击一次键盘,你所需要做的仅仅是更新一个小小的方形区域
一个3D游戏可以在这个时间内刷新整个屏幕,渲染成千上万的多边形。同时还处理用户输入,重新计算环境世界
Web应用都会报出大量的“随机”JS错误。
如果网页出现什么问题,只会提示你F5。谁有时间去研究到底什么地方改变了?
整个网页/SQL数据库的架构都建立在当用户浏览渲染出来的网页时,不会去操作任何数据的假设 🔥
原始讽刺:https://motherfuckingwebsite.com/
进阶讽刺:https://thebestmotherfucking.website/
反向讽刺:
https://thebestmotherfuckingwebsite.co/
你桌面的todo应用可能是基于Electron写的,所以它包含了一个Xbox 360控制器的用户态驱动在里面(QQ虚幻引擎警告 😅),这个驱动能渲染3D图像,播放音频,用你的网络摄像头拍照。
你应该将Slack划分为极其耗电型应用。聊天室和简单的文本编辑工具,这些应该都不是资源消耗型的应用才对。欢迎来到2018。
开发Node.js/Javscript项目,rm -rf node_modules 一直是码农工作过程不可或缺的部分。
在虚拟机上构建Docker容器,ONNX,就因为没人可以理清楚程序,编程语言和运行环境的混乱状况。
^注 #bash
systemd-analyze blame|tac|sed '/lightdm/q'
1.986s lightdm.service
2.1GHz 8G 的x86_64 Linux上启动只需2s 🥰 安卓慢不是Linux的锅
另外,pacman 的安装速度比apt;rpm几乎是快一倍的
不同的CPU指令集有体积差异,arm64几乎是32的二倍,这就显得Android的字节性价比奇低了-堪比JavaEE。 不知是不是系统apk的冗余res/文件太多
每次你 ./configure ,gcc都会重新计算一个完全能被缓存的CPU info,即使不换语言用cmake也能避免这点。 C指针语法的繁琐和预处理也会极大拖慢parse的时间
(for A in armv7 aarch64 x86 x86_64; do wget --spider 2>&1 https://mirrors.ustc.edu.cn/alpine/v3.19/releases/$A/alpine-standard-3.19.0-$A.iso; done)|grep 长度
长度:107423744 (102M) [application/octet-stream]
长度:220485632 (210M) [application/octet-stream]
长度:167772160 (160M) [application/octet-stream]
长度:217055232 (207M) [application/octet-stream]
💭
一些人可能觉得W95时没有 .NET 这样的框架,各种UI也很简陋,但这也是扯淡
要知道 7zip.org 可以用1M实现文件管理器的功能
qemu.org,ffmpeg.org,msys2.org 加起来也只250M, 难道内核驱动会包含更多算法吗?
而自带驱动的
pacman -Qi linux
6.7 x64是130M,原文作者 #rust 吹并非空穴来风功能类似的PS和 gimp.org 居然差0.7G https://helpx.adobe.com/creative-cloud/kb/file-size-creative-cloud-installers.html#:~:text=Photoshop%20CS6
功能和代码量似乎根本没有对应性
难道框架接口不是为服务于apps存在的吗? 随着技术进步,过分冗余的功能组件太多了
我觉得编程界的市场也是挺有趣的,明明速度在下降, 工资却依然涨
这又可以说成资本对劳动和技术的异化 又可以说成资本故意淘汰老设备
但其实编程界好像就是这样…… 无法多快好省地换代,有得有失
我觉得可以搞个绝对化,一切有局部类型标注,或者为val/var数据类型做区分的语法都是噪音(
一个编译期黑盒assert 当成金科律玉,说明根本没有做自顶向下复用 就开始敲键盘,根本是过度工程
文档写成测试,测试写成汇编,类型写成代码……
弱类型还简单些,module导入,interface多态和扩展,data和临时对象 创建个闭包,查个dict就行了
type能和函数字典很好地对应,序列化和集合类型都字面, 完全不需要keywords
这点许多新创建的静态语言都做不到,kt现在的listOf() 也没法好好实现
more: https://news.ycombinator.com/item?id=34936729
https://pointersgonewild.com/2018/02/18/minimalism-in-programming/ #dalao
https://tttttt.me/c/1320136548/46137 #statement #design 🥰 又和 @rynif 群人吵了
1. ASCII码表(这些代码质量已逼近Unity等CG算法的“优化”)不是关键问题, 因为PC的算力也是在提升
另外,编译器和语言的设计者,应该也是站在「设计模式」的对立面的。
「只需更新1个矩形」 这样的批评或许很空洞,但淘汰了Atom编辑器的 VSCode Monaco 编辑框呢? F12一下,你会发现别说 CSS.hilight 了,它甚至没用DOM Scroll,而是拿js更新style=transform !
至于为什么作者怪App层是怪对人了,你看 Kate,GNOME Builder 等开源实现的60fps滚动和低内存多开就懂了。 竟品们并没有复杂数百倍,体积上也体现不出
2.
这是作者推崇单exe ,认为Docker只是做了拙劣的apt+管理面板+systemctl 封装 🐳
单exe本质上是对「成品软件」,也就是整个供应链v1.0 后就不需要新功能的设计品的推崇
举个例子,现在Linux上会有各种 cpp,js py,go,rust,java,php,haskell 产品的安装包,但它们的标准库几乎不改变,这就是因为语言在设计初期,生态完备
Linux会差一些,用户要学诸多/etc “标记语言”的复杂设计,但在py里基本都是yml ,因为统一,也有fire,jupyter 这些自动UI
3. 当时的人们在抱怨当时的软件效率低下、编码质量拙劣、后期维护困难,所以我们有了程序组织范式、现代化的软件工程,设计余裕、构建系统、代码审查、单元测试等等一系列东西。
连当前给无数,并未如那些前人般在数学、电子信息、系统工程、架构设计等等方面都卓有成效的一般开发者,留下的余荫,都没完全搞懂,还充什么吊古伤今的做派?
但是这些「现代工具」带给人们的只是过度工程,是导致1个代码库>4G的从不反思的堆砌。比如 Java 那个非常可笑的 assertEquals(a,b) ,和随机proptest ,哪怕和具有良好调试的groovy assert没法比
关于软件“工程效果”和行数的关系,请比较 Blender.org 与 https://www.shadertoy.com/user/iq 的大部分3d demo。 有多少是“余荫”,多少是毒? 简洁并不是微不足道的Marginal Error
我不否认,shadertoy等「创作式编程」圈子里代码的复用率完全不配称为一种工程,但他们实现的逻辑性,确实值得「工程师」们反思
坦白说,这方面我支持AI取代人类,因为…… 他们不配写代码。至少,如果连自顶向下思考(这样才能与Copilot合作) 都不懂,恐怕软件界也只会不断跨端复制「旧问题」 🤖
Matrew:
1. 码表本身是非常关键的问题,忽略这个东西本身就是在剥离这个问题的讨论价值。因为有了“只支持ASCII码表”做保证,早期软件工程在处理字符时就可以随心所欲的假设一个字符完全对应一个字节,从而用各种内存魔法在硬件底层上加快处理速度。也正是因为当时的渲染硬件使用的是固定的码表渲染,界面有着“划分为字符方格”的保证,所以渲染显示可以随心所欲的在显示Buffer上寻址写入。虽然算力按照摩尔定律指数级别提升,但是软件工程的复杂度远比硬件加速的速度快早期软件工程容易实现“成品软件”的原因正是因为早期硬件设计的诸多限制本身是设计上不需要处理Edge case的完好保证——内存安全?沙盒机制?软件把操作系统搞死了大不了你重启嘛,有什么问题吗?
2. 推崇单EXE大可扩展到“所有软件都静态链编”,毕竟这样就不需要解决依赖,一个文件通行天下了嘛。代价呢?所有软件都带一份自己的libc实现吗?都在骂Electron拖着自己的Chromium狗屎走,有没有想过如果每个软件都拖着自己的libc实现走呢?那会是什么地狱场面?
Linux靠包管理器和无数人力的维护勉强解决了这个问题,Windows至今还会出现运行程序缺DLL需要自己去找去下VC_Redist的问题。这些问题并非是现代软件工程所有的,而是现代软件工程所致力于解决的。
至于你说“标准库几乎不改变”,我觉得不用我多回复。最好把这句话到底是什么意思理清楚了再看看这个断言本身正不正确。“在设计初期生态完备”?那C++从C98一直到C26,标准化工作里都在做些什么?不就是让那些互不兼容、各有所短的实现最终共识于一个由众多人力物力确保安全稳定高效的实现?带着“成品软件”的眼光去看编程语言的发展本身就是一个错误的观点。
“编译器和语言的设计者站在设计模式的对立面”,那么为什么他们要实现自己心目中的语言,用自己期望的“设计模式”去自缚手脚?既然他们讨厌设计模式,那就不设计设计模式,直接写字节码不好吗?你没有发现你的很多论点自相矛盾吗?
3. “多少是‘余荫’,多少是‘毒’”,Blender和Shadertoy的例子我觉得不用我辩驳。一边是在泛用型工程上做的规范化可维护实现,一边是避而不展示背后支撑架构的堆砌魔法公式的One-off成品。随便打开后者的一个例子,你能一眼解释作者做了什么吗?他们实现的逻辑性不值得工程师反思,因为正如倒数平方根算法一样,那些特定于硬件、特定与底层实现、特定于语言版本甚至特定于编译产物的“奇迹”并不能为后人指导什么。
以上几点所提及正是作者的短视之处:他只看到了过去那些“成品软件”的高效简洁,却没有看到那些老旧技术债之中埋藏了多少匪夷所思的代码炸弹。多少老代码倒在了千禧年之前,就因为节省两位内存用来存储年份?“成品程序”Lotus Spreadsheet一时的求速让Excel埋下了多少年的兼容问题?
你举了两个反例,一个Electron、一个Docker,我不否认这两个工程所代表的“沙盒化”、“容器化”本身的思想是懒惰的产物,是一味的Panacea,但是原作者的意见大有把现代操作系统数十年以来为了让规范的抽象设计推广到工程实践中所做的努力都贬为“懒惰的产物”的意思。我强烈反对这种倾向,因为软件工程如今已经不仅仅是象牙塔里的玩具,实验室里的襁褓,而是关乎无数行业生产力的行业基石,是“安全”“效率”“体积”“开发速度”“维护难度”等等因素无限交叠的维恩图。一味追求“快”“小”的产物所做出来的东西应用在生产中只会是灾难。
最后,我同意你的说法,“人类不配写代码”。也正因如此,你我现在用于写下这段文字的产物,不过是电子之神的庇护罢了,是祂启示了人类写下那些“代码本天成,妙手偶得之”的神奇产物,是祂拯救人类于原子时代的水火,让信息时代惠泽万物,机门。
duangsuse, [2024/3/23 12:42]
1.那些魔法不重要, g.drawText(s,xy) 渲染的实现并不是核心开销,无论是什么编码、ttf ligature 它都不是Atom这种(功能严重冗余的、滚动时修改每个 div.view-line 的)代码编辑器比notepad++更慢的理由
而且我也没有批评Linux多进程调度器分配器,我是说app层总有种自己比WebKit快-因为算法更长 的幻觉,请不要扯到汇编上
2.VC_Redist是一个<10M 的dll,这是win32自己的生态问题。 至少只用下.NET 这样的运行时,也比逐个依赖每次去make install 好的多了(Arch的PKGBUILD 基于fakeroot基本就是照抄,apt系我不知道,显然apt的繁杂更“工程化”)
“标准库几乎不改变”,你可以把rust这些和libc,py 2/3 的导出表更新频率来比, 然而,即便是更新最快的stdlib,想删既有API也是不可能的,更是严重的工程错误
一门语言能做最错的决定,就是像Perl那样挤压社区库的空间、即不直观又浪费语法的扩展性,什么都似是其非地管起来
3.你对创作式编程批评其移植性完全搞错了方向,因为WebGL,WASM 这些技术都是有标准的,其文档不和JVM或ES6 spec 一样大几百页都是废话,而全都是能看能动的demo
如果64k-intro这样对大道至简、精益求精 的追求都不叫工程, 那些连自己写过什么函数都不记得的,到处
一些人觉得JS没有class,做不了“大型软件”,那么 https://hello.andremichelle.io/#AUTOMATOR 呢?
4. >多少老代码倒在了千禧年之前,就因为节省两位内存用来存储年份?“成品程序”Lotus Spreadsheet一时的求速让Excel埋下了多少年的兼容问题?
1. ASCII码表(这些代码质量已逼近Unity等CG算法的“优化”)不是关键问题, 因为PC的算力也是在提升
另外,编译器和语言的设计者,应该也是站在「设计模式」的对立面的。
「只需更新1个矩形」 这样的批评或许很空洞,但淘汰了Atom编辑器的 VSCode Monaco 编辑框呢? F12一下,你会发现别说 CSS.hilight 了,它甚至没用DOM Scroll,而是拿js更新style=transform !
至于为什么作者怪App层是怪对人了,你看 Kate,GNOME Builder 等开源实现的60fps滚动和低内存多开就懂了。 竟品们并没有复杂数百倍,体积上也体现不出
pacman -Qi kate ktexteditor5 vscode|grep MiB #~40M ~90M
2.
在80年代,一个DOS程序不需要任何修改就能在大部分的DOS兼容计算机上运行。
这是作者推崇单exe ,认为Docker只是做了拙劣的apt+管理面板+systemctl 封装 🐳
单exe本质上是对「成品软件」,也就是整个供应链v1.0 后就不需要新功能的设计品的推崇
举个例子,现在Linux上会有各种 cpp,js py,go,rust,java,php,haskell 产品的安装包,但它们的标准库几乎不改变,这就是因为语言在设计初期,生态完备
Linux会差一些,用户要学诸多/etc “标记语言”的复杂设计,但在py里基本都是yml ,因为统一,也有fire,jupyter 这些自动UI
3. 当时的人们在抱怨当时的软件效率低下、编码质量拙劣、后期维护困难,所以我们有了程序组织范式、现代化的软件工程,设计余裕、构建系统、代码审查、单元测试等等一系列东西。
连当前给无数,并未如那些前人般在数学、电子信息、系统工程、架构设计等等方面都卓有成效的一般开发者,留下的余荫,都没完全搞懂,还充什么吊古伤今的做派?
但是这些「现代工具」带给人们的只是过度工程,是导致1个代码库>4G的从不反思的堆砌。比如 Java 那个非常可笑的 assertEquals(a,b) ,和随机proptest ,哪怕和具有良好调试的groovy assert没法比
关于软件“工程效果”和行数的关系,请比较 Blender.org 与 https://www.shadertoy.com/user/iq 的大部分3d demo。 有多少是“余荫”,多少是毒? 简洁并不是微不足道的Marginal Error
我不否认,shadertoy等「创作式编程」圈子里代码的复用率完全不配称为一种工程,但他们实现的逻辑性,确实值得「工程师」们反思
坦白说,这方面我支持AI取代人类,因为…… 他们不配写代码。至少,如果连自顶向下思考(这样才能与Copilot合作) 都不懂,恐怕软件界也只会不断跨端复制「旧问题」 🤖
Matrew:
1. 码表本身是非常关键的问题,忽略这个东西本身就是在剥离这个问题的讨论价值。因为有了“只支持ASCII码表”做保证,早期软件工程在处理字符时就可以随心所欲的假设一个字符完全对应一个字节,从而用各种内存魔法在硬件底层上加快处理速度。也正是因为当时的渲染硬件使用的是固定的码表渲染,界面有着“划分为字符方格”的保证,所以渲染显示可以随心所欲的在显示Buffer上寻址写入。虽然算力按照摩尔定律指数级别提升,但是软件工程的复杂度远比硬件加速的速度快早期软件工程容易实现“成品软件”的原因正是因为早期硬件设计的诸多限制本身是设计上不需要处理Edge case的完好保证——内存安全?沙盒机制?软件把操作系统搞死了大不了你重启嘛,有什么问题吗?
2. 推崇单EXE大可扩展到“所有软件都静态链编”,毕竟这样就不需要解决依赖,一个文件通行天下了嘛。代价呢?所有软件都带一份自己的libc实现吗?都在骂Electron拖着自己的Chromium狗屎走,有没有想过如果每个软件都拖着自己的libc实现走呢?那会是什么地狱场面?
Linux靠包管理器和无数人力的维护勉强解决了这个问题,Windows至今还会出现运行程序缺DLL需要自己去找去下VC_Redist的问题。这些问题并非是现代软件工程所有的,而是现代软件工程所致力于解决的。
至于你说“标准库几乎不改变”,我觉得不用我多回复。最好把这句话到底是什么意思理清楚了再看看这个断言本身正不正确。“在设计初期生态完备”?那C++从C98一直到C26,标准化工作里都在做些什么?不就是让那些互不兼容、各有所短的实现最终共识于一个由众多人力物力确保安全稳定高效的实现?带着“成品软件”的眼光去看编程语言的发展本身就是一个错误的观点。
“编译器和语言的设计者站在设计模式的对立面”,那么为什么他们要实现自己心目中的语言,用自己期望的“设计模式”去自缚手脚?既然他们讨厌设计模式,那就不设计设计模式,直接写字节码不好吗?你没有发现你的很多论点自相矛盾吗?
3. “多少是‘余荫’,多少是‘毒’”,Blender和Shadertoy的例子我觉得不用我辩驳。一边是在泛用型工程上做的规范化可维护实现,一边是避而不展示背后支撑架构的堆砌魔法公式的One-off成品。随便打开后者的一个例子,你能一眼解释作者做了什么吗?他们实现的逻辑性不值得工程师反思,因为正如倒数平方根算法一样,那些特定于硬件、特定与底层实现、特定于语言版本甚至特定于编译产物的“奇迹”并不能为后人指导什么。
以上几点所提及正是作者的短视之处:他只看到了过去那些“成品软件”的高效简洁,却没有看到那些老旧技术债之中埋藏了多少匪夷所思的代码炸弹。多少老代码倒在了千禧年之前,就因为节省两位内存用来存储年份?“成品程序”Lotus Spreadsheet一时的求速让Excel埋下了多少年的兼容问题?
你举了两个反例,一个Electron、一个Docker,我不否认这两个工程所代表的“沙盒化”、“容器化”本身的思想是懒惰的产物,是一味的Panacea,但是原作者的意见大有把现代操作系统数十年以来为了让规范的抽象设计推广到工程实践中所做的努力都贬为“懒惰的产物”的意思。我强烈反对这种倾向,因为软件工程如今已经不仅仅是象牙塔里的玩具,实验室里的襁褓,而是关乎无数行业生产力的行业基石,是“安全”“效率”“体积”“开发速度”“维护难度”等等因素无限交叠的维恩图。一味追求“快”“小”的产物所做出来的东西应用在生产中只会是灾难。
最后,我同意你的说法,“人类不配写代码”。也正因如此,你我现在用于写下这段文字的产物,不过是电子之神的庇护罢了,是祂启示了人类写下那些“代码本天成,妙手偶得之”的神奇产物,是祂拯救人类于原子时代的水火,让信息时代惠泽万物,机门。
duangsuse, [2024/3/23 12:42]
1.那些魔法不重要, g.drawText(s,xy) 渲染的实现并不是核心开销,无论是什么编码、ttf ligature 它都不是Atom这种(功能严重冗余的、滚动时修改每个 div.view-line 的)代码编辑器比notepad++更慢的理由
而且我也没有批评Linux多进程调度器分配器,我是说app层总有种自己比WebKit快-因为算法更长 的幻觉,请不要扯到汇编上
2.VC_Redist是一个<10M 的dll,这是win32自己的生态问题。 至少只用下.NET 这样的运行时,也比逐个依赖每次去make install 好的多了(Arch的PKGBUILD 基于fakeroot基本就是照抄,apt系我不知道,显然apt的繁杂更“工程化”)
“标准库几乎不改变”,你可以把rust这些和libc,py 2/3 的导出表更新频率来比, 然而,即便是更新最快的stdlib,想删既有API也是不可能的,更是严重的工程错误
一门语言能做最错的决定,就是像Perl那样挤压社区库的空间、即不直观又浪费语法的扩展性,什么都似是其非地管起来
3.你对创作式编程批评其移植性完全搞错了方向,因为WebGL,WASM 这些技术都是有标准的,其文档不和JVM或ES6 spec 一样大几百页都是废话,而全都是能看能动的demo
如果64k-intro这样对大道至简、精益求精 的追求都不叫工程, 那些连自己写过什么函数都不记得的,到处
public final HashMap(硬编码实现而非接口) mXXX
的工程师懂得他们想表达什么吗?形式高于内涵。一些人觉得JS没有class,做不了“大型软件”,那么 https://hello.andremichelle.io/#AUTOMATOR 呢?
4. >多少老代码倒在了千禧年之前,就因为节省两位内存用来存储年份?“成品程序”Lotus Spreadsheet一时的求速让Excel埋下了多少年的兼容问题?