在2020年,我在我写的《初级对象》一书中写道:“*Windows不适合程序员。如果你遇到任何告诉你相反的人,你必须知道你正在与一个糟糕的程序员打交道,或者是一个不合格的程序员,这是一回事。你的电脑必须是MacBook。”现在,五年后,我仍然持有相同的观点。这篇博客文章应该少一些主观意见,因此更有说服力。重点仍然是一样的:你要么使用Windows,要么你是一名专业程序员。
首先要明确的是,这是ChatGPT对macOS与Windows的看法(我稍微缓和了一下,并按重要性排序,将最重要的内容放在最前面):
像
grep、awk、sed、ssh和make这样的工具可以原生地运行适当的编译器工具链:Clang,LLVM,make,git
使用HomeBrew安装所有内容,只需一个命令即可。
Node, Python, Ruby, Go, Java—just work without PATH hell
Node, Python, Ruby, Go, Java—只是在没有路径困扰的情况下工作
iTerm2看起来不像是1998年建造的。
Docker 在 Windows 上运行得更快更干净。
SSH keys 与系统钥匙串完美集成
Git 表现得很可预测; 没有 CRLF vs LF nightmares
我听到你在说:为什么我需要它符合POSIX标准,什么是POSIX?为什么我需要grep、sed和awk?我是60岁的Unix管理员吗?为什么我需要在命令行中使用git和make?我根本不使用命令行。我一直在使用像VS Code这样运作良好并帮助我谋生的工具。
现在,请听我说。你不是一个程序员。你看起来像一个。你走起路来像一个。你点击程序员点击的相同按钮。你甚至赚取他们赚的相同薪水。但你还不是他们中的一员。至少现在还不是。继续阅读。
程序员是计算机的主人。他们告诉机器该做什么。为了简化管理复杂硬件的任务,程序员发明了几层抽象。第一层是操作系统。程序员发明了文件和stdout,而不是直接处理硬盘和屏幕上的像素。
这是在上世纪60年代末和70年代初的Bell Labs中完成的。早期的操作系统,如CTSS和OS/360,帮助他们有了一个良好的起点。Unix是第一个声称一切都是文件的操作系统,包括设备、目录、套接字和进程。他们还发明了管道和这样的理念:“编写做好一件事的程序,并协同工作。”他们还发明了进程和它们的分叉机制。
他们的名字是Ken Thompson和Dennis Ritchie。
五年后,又创建了另一个操作系统,具有不同的抽象概念。不是所有的东西都是文件,进程也不是并行的,也没有管道。这个系统的名字是CP/M,发明者的名字是Gary Kildall。然后,五年后,24岁的Tim Paterson复制了CP/M,并将其称为86-DOS。Microsoft购买了一个非独占许可,将其重新命名为MS-DOS,并将其销售给IBM。这就是Windows诞生的过程。
为什么没有适当的文件、进程和管道呢?因为他们并没有试图构建一个“真正”的操作系统。CP/M和MS-DOS是为微型、单用户、单任务的微型计算机设计的,而不是为多用户的小型计算机或大型机设计的。Unix起源于贝尔实验室—研究人员,而不是爱好者。CP/M和MS-DOS是为个人电脑设计的:办公室和家庭用户。换句话说,MS-DOS从来不打算成为一个适当的操作系统。它只是一个可以启动小型机器并运行单个程序的东西。
然后,在1985年,建立了Windows 1.0。这是建立在MS-DOS之上的花哨的GUI,而不是一个新的操作系统。后来,在1995年,微软引入了32位API(Win32)和抢占式多任务处理。然而,DOS子系统仍然潜伏在下面。Windows 95看起来很现代,但仍然是一个半DOS僵尸。
与此同时,在1993年,Dave Cutler的团队建立了基于DOS的Windows NT。最新版本的Windows是NT的后代,而不是MS-DOS。在技术上,它更接近Unix而不是CP/M。它具有诸如受保护的内存、内核/用户分离和文件句柄等功能。但是,它仍然不是Unix。
1984年,Apple发布了他们第一台带有“System 1”操作系统的Macintosh。它并不比MS-DOS更好:没有多任务处理,没有内存保护,还有原始的文件系统。毫不奇怪,它并没有大获成功。
1997年,苹果收购了NeXT,并采用了NeXTSTEP操作系统。他们将其作为新Mac OS的基础—代号为Rhapsody,后来改名为“Mac OS X”。
2001年,他们发布了Mac OS X 10.0(“Cheetah”)。五年后,我扔掉了装有Windows的ThinkPad,并购买了我的第一台带有Mac OS X Leopard的MacBook。
现代macOS(Catalina,Ventura,Sequoia等)仍然建立在那个NeXT的基础上。它符合POSIX标准,当然,它有进程和管道。换句话说,它是带有漂亮图形界面的Unix。
无论是Windows还是macOS,在它们当前的版本中,都是稳定的操作系统。区别在于它们内部的抽象:文件、套接字、进程、内存块、用户、权限等等。在Unix(macOS)中,一切皆为文件,而在Windows中,一切都是对象。Unix中的文件是统一的抽象,这就是为什么它们可以通过管道连接。在Windows中,对象在实践中并不统一,它们有不同的接口。
这就是为什么Unix shells和小型的可组合工具变得如此强大。”一切都是文件”的统一性使得组合自然而然。你可以从简单的程序构建复杂的工作流程。
另一方面,Windows围绕GUI应用程序和消息循环发展,而不是shell管道。
Unix是建立在管道模型之上的。在Unix中,一切都是通过读取标准输入和写入标准输出的小工具。同时,一切都是文件,包括套接字、设备和进程。在Unix中,程序员将每个进程视为由通过管道粘合在一起的较小进程组成的。自1970年代以来,这种思维方式已被证明是有效的,受到几代软件工程精英的青睐。
比如,你想知道代码库中哪些部分变化最大—也许是为了重构、测试重点或热点bug分析。这就是你按照Unix风格进行的方式:
这个语法对你来说有意义吗?如果有的话,我敢打赌你使用WSL。大多数认真的Windows开发者最终都会这样做。
命令行是Unix的裸机接口。命令行的核心是管道。由于管道,命令行工具本质上是可组合的。你可以链接它们并在几秒钟内自动化任务,这样做手动可能需要几个小时。没有IDE插件能取代这种力量。
现在,你知道Windows和macOS之间的区别是什么了。在这两个操作系统中,你可以编码、浏览互联网和观看电影。然而,在macOS中,你通过Unix抽象在shell中与计算机交互。你不仅仅是使用macOS—你继承了五十年的纪律抽象。
在Windows中,你通过可拖动的图形用户界面元素与计算机交互。图形用户界面使你成为一个消费者;命令行界面使你成为一个创造者。图形用户界面隐藏了手势和图标背后的逻辑;命令行界面将其呈现为你可以进行推理、自动化和组合的文本。你无法将按钮点击传送到另一个程序,无法grep进度条,也无法对鼠标移动进行版本控制。你做出的每次点击都会在你做出它的那一刻消失;而你写的每个命令都可以永远存在。
哦,等等。在macOS中你真的不能玩游戏。糟糕…也许你不应该,因为你是一个程序员?
Translated by ChatGPT gpt-3.5-turbo/42 on 2025-10-26 at 14:22
