原文链接:http://gogojimmy.net/2012/04/07/why-programmer-should-use-mac/
序
一个竞争的市场,就会有对立的产生,这世界存在着很多不同的领域,领域好比是个江湖的缩影,因此就有许多门派的纷争,例如说浏览器领域有着最大宗的IE 派,门派成长速度飞快,武功版号跳的跟台湾物价指数一样快的Chrome 门,不断被模仿,一直被超越的Opera 派;韧性极强,一直对抗几大势力的Firefox 派等等,程式语言也有自己的领域纷争,社群网站也有社群网站领域的战争,这根本就是一个战火永不停止的战国时代,但是其中持续最久,冲突最大最激烈,当然以作业系统这块领域为最,因此,让我们来谈谈这个江湖。
首先我想讲讲这个武林的历史,不想看的人可以直接跳到最下面我的看法。
作业系统的上古时代
在很久以前,这块江湖的地位是局限在于少数被选上的人才可以踏入的,这些人就是工程师,因为要掌握这个领域的武功不是一件容易的事情,因为在这个领域的武功基本心法就是学习一堆复杂的武功招式(文字介面的程式指令),这些被选上的人必须学习很多很多的招式,然后搭配使用这些招式进而来操作作业系统,因此这门领域的武功学习曲线是很高的,不是随便阿猫阿狗可以学习的,在这段时间中,掌握了这些招式你就能去使用作业系统中的各式各样的武器(软体),在这段时间内,你可以透过作业系统本身提供的基本招式来控制作业系统,你可以透过武器提供的招式来使用武器,你甚至可以自己发明招式(自己写script)来控制作业系统和武器,因此当时所有的工程师都有自己打造的一套最适合自己的武功,没有了他们武功会大打折扣,但是在他们使用自己打造的武功时能发挥出他们最强大的威力。
百家争鸣
但是这世界后来起了变化,当时某人将一个『连猴子也能学会用电脑』的概念带进了这个领域,让这个领域不再被少数人寡占,这个概念就是GUI (图形化介面) ,GUI 的产生让作业系统看起来更容易理解,大幅降低了这个领域武功的学习曲线,将这个概念发扬光大的有几个大门派,一个是目前最大的微软派,这个门派非常可怕,势力非常之庞大,他们以作业系统这个领域起家,不单单如此还将触角伸向非常多不同的领域,几乎是跟电脑有关的领域都参一脚,不难理解是一个以征服世界为终极目标的门派,掌门人是Bill Gates,据说他靠着卖出这些武功所赚的钱蝉联了13 年的世界首富,是个极为可怕的角色,所有能力值大概都是?????,微软派的武功非常多,但都是以Windows NT 这个核心心法所延伸出来的,像是大家熟知的Windows XP,Windows 7 等等。
另外一个是由Steve Jobs建立的苹果教,教主Steve Jobs是一代传奇人物,苹果教早期曾经发生过一次内乱,这次内乱迫使当时教主Steve Jobs远走他乡,但是强者天生就是不平凡,在教主离开苹果教的这段期间,教主看出了当时武功心法的一些通病,为了矫正这些错误他穷尽心力费尽苦思的想出一套旷世奇功– NeXTStep,而反观在这期间苹果教在新教主阿猫一号的带领下反而流失越来越多的教徒,整个苹果教呈现一个日暮西山的状况,因此在其他长老的强烈要求下他们将Steve Jobs迎回了苹果教继续担任教主,当然教主也带回了他所创的那套旷世奇功NeXTStep作为日后苹果横行天下的武功Mac OS的基础,如果你有研究过Mac的心法你不难发现在他们的招式中常常会有NS的prefix像是NSString
,这个NS所指的就是继承于NeXTStep,在教主回归苹果教后,经过了几年的发展再次将苹果教推向了新的高峰,推出的许多划时代的神兵利器像是iPod、iPhone、 iPad,苹果教利用这些神兵利器打下了一片大大的江山,成为微软派最大的劲敌,但在作业系统领域上的唯一一套武功就是Mac OS,也就是这个门派最基本的心法武功。
其他门派像是Linux 门也是一股势力,这个门派的武功与苹果教的Mac OS 同样都是由一个上古时代就存在的门派Unix 演变而来,这个上古时代也就是本文一开始提到在还没有『连猴子也能学会用电脑』这个概念出现前,那个被少数人所寡占的世界,这个门派心法的特性就像是我们前面提到的工程师可以利用各种由作业系统本身或是应用程式本身所提供的招式,加上自己的想法组合出最适合自己的武器,因此Linux 及Mac OS 皆继承了这个传统,但是Linux 门情况比较特殊的是,虽然他是一个门派但是本身有非常多不同的势力,这些势力自己每天互相打来打去不亦乐乎,造成无法将枪口一致对外,大家自己闭门造车一直重复打造别人已经有的武功,因此发展始终无法达到一个高峰,但是一直以来他在伺服器领域的令人惊艳,也让Linux 在这块领域有着他不可取代的地位。
回到武功心法
前面说到,这个世界的改变是由于『连猴子也能学会用电脑』这个概念的带入,但是这个概念在每个门派的实作方式是不一样的,例如说微软派为了将这个心法发挥到极致,将自己的心法改造的与上古时代完全不同,抛弃了那些使用指令操纵一切的心法,取而代之的是使用许多不同的武器(软体)来应付不同的对象(档案),因此基本心法(作业系统)不再是重点,而是一个随时可以替换掉的东西(随时可以重灌),你只要保留你的档案,重灌你的作业系统后再把这些武器装上去就可以用了,这个过程不知葬送了多少宅男的青春,但也让他们有当好人帮正妹修电脑的机会,但是因为如此,微软派的心法失去了原本上古流传下来的传统,你无法使用招式(指令)来操作各种不同的武器(软体、程序),因为这些武器现在开始彼此是不相往来,GUI 上的所有程序无法互相沟通。
你可能会问这有什么影响?我告诉你影响可大了,人使用电脑的目的就是提高工作效率,在程式无法互相沟通的情况下,程式必须仰赖人的操作才有办法工作,因为你无法写一些综合巨集来完成复杂大量的工作,以微软的例子来说,会使用VBA 脚本的人工作效率会是一般人的n 倍,因为你可以完全的操控你的作业系统,就像你使用VBA 可以完全的自动化Excel 一样,但是作业系统想要做到这个层次,必须仰赖着一个统一的执行环境来管理这些程式,这个目标也是之前程式语言领域的Sun 想要在他们的工作站做到的事情,也就是Java,但是那是另一段故事我们先暂且不谈,这样的影响对工程师来说,就是“什么都看不到”,现在微软派武功心法全部都蒙上了一层马赛克,因为所有的东西都是被包装过的,相对的工程师们无法去真正的了解这套武功心法,你想要做的事情如果超出了武器(软体)能应付的范围,你只能放弃,也是因为包装的太好,在发生问题想要Debug的时候你根本看不到作业系统层面的问题,只能按下那个回报给微软的按钮,因此在微软派以这样的概念全力发展GUI 的历史后,取而代之所舍弃的就是这个“问题”,我把问题用双引号包起来的原因是因为,对一般使用者来说这并不算是个问题,因为他们感受不到,我相信这或许也是微软的成功原因之一。
Linux 门则是把原先上古时代的传统发挥的淋漓尽致,但就像我前面提到的,Linux 门自己的内战打的不亦乐乎,当你踏入了Linux 门之后,你会发现常常当你想使用Linux 上面所需要的武器A 的时,他会告诉你你必须先有武器B 的1.13 版,然后武器B 的1.13 版必须先有装备C 的2.01 版,然后装备C 的2.01 版需要Linux 心法的1.03 版,然后结果你发现你在用的是Linux 心法2.0 版,因此虽然Linux 门继承了上古Unix 门的良好传统,让你可以像高手般的打造自己的武功,也可以完全的掌控整个作业系统,但是常会因为这些武器的相依性给搞疯,还没用到武器,就先被武器给弄死了。
再谈GUI
所以你大概可以体会,GUI 开始算是一个作业系统的分水岭,他让每个门派的心法看起来变得很不一样,微软派的设计让你看不到作业系统层面的东西,因为东西几乎都是被包装好的,但是你可以在微软派的windows 系列武功上使用相对良好的GUI,但是由于微软派的GUI 设计是跟底层绑在一起的,因此有时候GUI 的崩溃也让系统一起崩溃了,就出现了传说中的蓝白画面,Linux 门的设计非常开放,你可以随时取用串接你想用的心法,但是在GUI 方面就差强人意,大部分是一些看起来就像是山寨微软派或苹果教的产物,当然现在来说有些表现较为优异的像是Ubuntu 之类的,但用过就知道还是有差,而苹果教正好是取其两家之长,一个拥有高度usability 的GUI介面加上可以自行设计的武器系统,Mac OS 感觉就像是上古流传下来的神器再用对武器施法的卷轴冲到+10 那样强大,在Mac OS 上使用继承于教主所开发的心法NeXTStep 的进化版本Cocoa,这套心法提供了一个统一的作业系统执行环境,所有基于Cocoa 心法所研发出来的新武器都有了统一的介面,这个统一的介面让你可以100% 的控制所有的程序,而且Mac OS 本身就已经提供了完整的开发环境给所有的工程师,反观在Linux 门缺乏这个在GUI 上统一的介面,因此他们的GUI 看起来就挺杯具,而微软派的Windows 系列在从Vista 以后希望打造出一个完全建构于新心法.NET 框架的环境来达成像是统一介面的环境,但是由于其设计哲学上的差异他们还是有差异,而且.NET 心法的一个致命伤就是仰赖着使用者必须自行去更新.NET 版本,如果他没有更新成适合的版本那你所开发的武器可能他就没有办法使用。
后记
其实是简短的故事整理,对于使用Mac 或是PC 的来写程式比较好,其实两派各有说法,个人浅见只是文化上的差异,一个最简单考虑的重点就是你想开发哪个平台上面的软体,那么你最好就使用该平台来开发,你想开发Windows 上面的应用程式,那么赶快安装Visual Studio.NET,你想开发Mac 上面的程式那就赶快买台Mac 安装好你的XCode,当然,你也可以考虑Java 来开发跨平台的程式,但是用过都知道在GUI 的显示在不同平台上还是会有差异的,那如果是开发Web 的程式来说,个人浅见如果你是使用PHP、Ruby 、Python 等程式语言,那么Unix-base 的环境还是比较适合你,因为你必须常常去追踪你的Application 在系统的运行状况来做效能的调教或是Debug,而这是在Windows 平台上的相对弱项。
已经看过太多的战文在讨论unix 好还是windows 好,其实就像我说的是文化上的差异,微软的文化是以一般使用者为出发点而设计的平台,如果是由一个Unix 的工程师来设计一个软体,他可能会开始先设计一个文字介面的核心,然后才加上一层GUI 的皮,这样这支程式才可以为其他程式设计师来自动化操作,因为Unix 的哲学是以程式设计师为出发点,反观Windows 工程师会倾向于先做出一个使用者操作的画面,然后才去写核心部分,对于99.999999999% 的使用者不写程式的Windows 这是很正常的事。另外Windows 跟Unix 最大的差异还是在资讯透明度,Windows 上核心底层的东西必须仰赖微软更新后才会修复,因为你很难去看到底层的原始码,而Unix 由于开放的关系你可以随时进入底层去找出错误来修正他,但这也不算是Unix 就比较好的观点,因为这单纯是设计理念的不同,Windows 倾向于我帮你处理所有底层的问题,你专心写你的程式就好,而Unix 则是我让你看光光,你不开心就改没关系,因此两派信徒互相嘲笑对方,其实只是设计理念上的差异罢了。
虽然我用Mac,但我相信比尔盖兹在Windows 上写程式还是会把我电假的,所以我从不嘲笑Windows 的工程师,所以请依照你的需求挑选你的平台就好,如果要开发微软的程式,那么用微软的环境还是最无痛的!
-*-python之禅-*-
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.