作者是写Sikuli的主要开发这张琮翔,下面是他从接触电脑到现在的心路历程,经历了从dos->linux->windows->linux->mac os的过程,很不错,和大家分享.

顺便分享一下我的经验,但那时忙着Sikuli实在没法静下心来写文章,直到最近稍微闲下来了才又想起这件事。

我从2005升上研究所前买了{dy}台Mac mini到现在已经五年了,说起来其实没有很长,但自从2005年起,我就成了非Mac不用一族。但用Mac是一回事,我要先澄清我不算是狂热的Apple粉丝,我除了Apple的电脑外,只有跟朋友以超低友情价买过一台开学优惠送的ipod touch来玩,除此之外,我没有iphone、没有ipad、也没有Apple键盘滑鼠以外的周边产品。在2005年以前,我高中和大学约6年都是用Linux作为主要工作环境。我一路从Slackware、RedHat、Mandrake(后来改名Mandriva)、玩到Debian、Ubuntu,那段时期我有数台24hr online的Linux server,还换过3台laptop,但都是装Linux。在更之前呢,从国小的386 PC算到高一将近10年就是用DOS和Windows了。

这篇文章主要想分享的是作为一个programmer使用各种作业系统开发的经验,不是想要说服大家全改用Mac。虽然从时间上看起来我用DOS和Windows最久,但我真正开始大量写程式是国中开始用Visual Basic的事,所以我在DOS和Windows平台的开发经验其实算是最少的。而大学阶段是我最密集写程式的时候,所以我的经验和使用的工具也都是以UNIX派的为主,不见得适用所有人。

我在DOS+Windows、Linux、Mac这三大主流平台上都混过一段时间,这个迁徙的歷史其实也代表了我个人心态上的转换。

在刚开始学电脑的时候,我是纯粹的使用者。我用电脑玩游戏,国中帮老师用excel做全班的成绩单,闲来无事就随手玩玩photoshop、3D studio等软体自娱娱人。我记得在386的DOS时代要玩个游戏还挺不简单,虽然很多游戏都说只要打play.bat就可以玩了,但事实上总要修改config.sys和autoexec.bat里的一些记忆体或音效卡的设定才能玩。所以那个时代的使用者其实大都是玩家级的人物,多少都对Adlib、EMS、XMS、可恨的640K限制有些了解才有办法「玩」电脑。

国中开始写程式之后,我的心态就不太一样了。像一般玩家般玩电脑已经不能满足我,我开始热切的想了解电脑内部运作的一切原理,想了解每个程式是怎么写出来的,每个零件是怎么运作的,每一个细节我都想知道。而我刚好就在这段时间接触到Slackware Linux。

Slackware Linux其实是一个不太好用的Linux distribution,可能很多人也没听过它。现在的Ubuntu和Windows没两样,一直按「next」就能装完整个系统并开始使用。但那时的Linux装完后可是「什 么 都 没 有」。没有X11,更别提其上的GNOME或KDE;文字编辑器只有vi(不是vim)和joe;没有make、没有gcc、…,总之,真的什么都没有。那个时候装Linux其实是为了自己架MUD server,但当时Linux的安装教学都说装完的一件事就是自己重新compile kernel。(因为预设的kernel很阳春,几乎什么driver都没有,不自己compile的话很多硬体都动不了。)其实当时我觉得这还蛮酷的,make config打完出现数百个选项可以慢慢勾选,让我这种想要一窥作业系统里面在搞什么鬼的人非常过瘾。(一开始我还不知道有make menuconfig可以用,所以其中一个选项不小心选错就会非常痛苦要整个重来……)但过了一段时间我就发现,MUD server没架起来,但倒是很会重编Linux kernel和设定xf86config。

国中我还在用Visual Basic写程式时,其实没有注意到「平台」不同的影响,因为当时我只用Windows和VB写程式,也不会其他语言,更不用提在不同平台写程式。一直到上高中学了C,开始写比赛的程式时,才让我注意到Turbo C和gcc虽然都可以compile C的程式,但有某些header档(像是conio.h)是只有Turbo C中才能用的。发现这件事后,我才突然搞懂library是什么,还有Linux下有一堆libxxxx及libxxxx-dev的套件是在做什么的。

Windows和Linux的关键差异 – 资讯透明度 – 也就在这里显现出来。在我学VB的时候,我把当时一本VB5的经典书籍从头到尾全读过了,但我竟然对library一点概念都没有。我以为我能用的东西就是VB提供的那些元件,后来我多学了一点后发现我还能唿叫Windows API做一些VB办不到的低阶功能,我从来没想过要去利用别人已经写好的程式和函式来节省自己的开发时间。简单说,我以为要造一辆车子,就是要从轮子甚至是螺丝钉自己做起。

某方面来说这是个好事,因为我的{dy}个VB游戏「黑白棋」,就是这样一个个pixel从无到有自己画出的。但如果要写更大的程式,每次都从轮子做起就不是个好主意了。接触到Linux后,我也学了很多open source界的「哲学」,其中最重要的就是重用别人的轮子。

记得很久以前在Redhat和Mandrake上装软体非常痛苦,虽然每个程式都被包装成一个RPM档,但RPM之间的相依性常会让人发疯。每装一个软体都有可能会跳出数个相依的library或套件需要安装,然后使用者必须自己去找这些相依的RPM,更糟的是这些相依套件可能会没完没了的依赖更多其他的套件…。(还好后来改用Debian就不用再被这个RPM地狱折磨了。)

这个过程让我深刻的体会到,软体应该是像金字塔一样一层叠着一层往上盖的,Linux套件的包装方式清楚的让使用者能够看出来一个软体是利用了哪些library建构起来的,如果自己想写有类似功能的程式,很容易就可以找到相关的library来用。但在Windows下就不是这么一回事了。Windows的软体是为end-user设计的,目标使用者很可能什么都不懂,所以发佈软体时应该要把所需要的library或套件全部包进去变成一个庞大的自动安装程式,使用者只要一直按下一步就可以装完了。这让使用者变得比较轻松,但同时也一些对开发者有益的细节也隐藏起来了。

Windows的软体大多是xx不透明的,安装时你不知道它装了什么,也不知道它写了什么到registry,更别提要知道他的某某功能是怎么做的。但Linux是在另一个极端,每个程式的一切都是透明易懂的,RPM或DEB套件里有什么东西一个指令就一清二处,每个套件需要用到哪些相依套件也是明明白白。此外,Linux下的设定档都是纯文字,只要文字编辑器就可以修改,不但方便编辑,也方便写自动化的script或是备份系统。当然,更不用提Linux下几乎所有程式都是open source的,只要有兴趣,随时可以打开每天在用的软体的source研究它是怎么做的。这些事情在Windows底下则是天方夜谭,所有的细节都被自然的包装和隐藏起来了。这种透明度的差异对于充满好奇心的程式设计师会产生南辕北辙的影响,当你接触的东西越开放,就能自然而然接触和学习电脑从里而外的各种知识;但当你接触的东西越封闭,就只能受限于黑盒子的限制而当个单纯无知的使用者。

高中时转到Linux作为工作环境还有另一个很大的原因:「效率」。Linux的世界是架构在文字设定档和command line工具上的,整个OS的操作都可以用command line解决。更方便的是搭配shell script或是Perl、Python这种script language,可以轻易把系统里各种小工具结合起来完成复杂的工作。command line有个很大的好处,你每天用的操作介面,和写自动化script的介面是xx一样的。也就是说,你只要把每天打的指令串起来放进一个档案,就自然变成了shell script,而日后只要执行这个script就能自动完成需要一连串指令的工作。这种工作方式满足了我身为一个「懒人」的慾望,因为我懒得每天用手亲自重复做同样的事情,所以我写script将这些事自动化。当script写的越多,就会面临越复杂的工作,这时就会想要学更多”UNIX power tools”的用法(这是O’REILLY的一本好书)或是更强大的「黏合」语言(像是Perl)来组合不同工具。透过这种正向循环,可以不断刺激自己提昇工作效率:事情做得越快,就可以想得更多,解决更复杂的问题,进而就能学得更多,做得更快。

大学那几年我成了虔诚的Linux command line信徒,不管是什么样的事情我都可以用各种小工具加上Perl或shell script来解决,而Windows在这方面就xx比不上Linux。Windows的哲学是一套软体可以做N种事情,但如果你想做的事情不在它原本设计的功能里,只能两手一摊什么事也做不了。

资讯的透明度和command line带来的高效率让我非常享受在Linux上工作的乐趣,然而Linux也不是没有缺点。当我学得越多,对系统底层的好奇心渐渐被满足后,Linux的缺点就渐渐暴露出来,其中最让我受不了的是残破不全的driver支援。让我印象最深刻的是在802.11b无线网路刚开始流行时,我花了很多时间在找driver和当白老鼠compile{zx1}的driver,重编kernel几乎是每日例行公事。除了无线网卡外,就算是有线网卡Linux都不见得支援,最恶名昭彰的莫过于Dlink系列的卡,他们的530TX甚至还被暱称为恶魔卡。(这张便宜的卡在当时非常流行,但偏偏在Linux上就是不能用…)

虽然我是个programmer,但我同时也是一般user。在我想要快乐用电脑看电影或上网时,还要不时的处理系统内部的问题其实有点恼人,更别提当我只想写一般的桌面程式或是Web app时,为什么我还得跟Linux kernel奋战呢?

除了硬体相容性外,Linux这种过于开放的平台还有个大问题是缺乏统一且一致的user experience design,导致usability常常奇差xx,而这也是很多open source软体普遍共有的问题。程式设计师在乎的是功能面的设计,每个人做自己想要或喜欢的功能,虽然看起来和乐融融,但很少project有专门的团队负责思考user是谁,他们想要什么,以及他们会怎么用这个软体。同样的功能但由不同的介面呈现,带给使用者的感觉也会有天南地北的差异,而由千百个open source软体拼凑起来的Linux系统带给使用者的就是千百种不同的设计和使用方式。(后来Ubuntu的出现大大的改善了这个问题,但那时我早已跳到Mac上了…。)

就在Linux的缺点慢慢浮现后,我同时也注意到身边很多FreeBSD/Linux hacker们开始改用Mac OS X。深入了解后,我很快发现Mac是一个xx解合Linux的效率和开放,同时又兼顾了精心设计过的user experience design的平台。Mac作业系统核心是BSD的近亲Darwin,上层有跟Linux相同的command line shell,所以我以往在Linux惯用的设定档和程式(bash、screen、vim…)全都可以直接带到Mac上使用。(更棒的是还能像在Debian下一样用apt-get install或是port install一个指令就自动装完所有相依套件)

而在command line的上面则是Apple设计的GUI系统,美观、一致、充分为使用者「设计」过的介面,轻易的就打败我在Linux上较调半天的FVWM设定。(我换过和较调过无数的window manager,从enlightenment、GNOME、KDE、Window Maker、FVWM…)除此之外,我也不用再自己重编kernel和找driver,每一台Mac都是买来后一打开就能用了。

后来Mac用久了,渐渐发现更多Mac的好处,尤其是对于programmer而言。

每一台Mac都有附Mac OS X的安装光碟,里面同时附带Xcode。而只要把Xcode装上去后,我整台Mac就已经准备好可以让我工作了。Xcode是Apple开发的IDE,可以开发各种常见的程式语言,但其实我不用这个。我都用Xcode底层的command line工具,像是gcc、make、svn,加上OS X内建的screen、vim、perl、python、apache(只用这些的话其实连Xcode都不用装,每一个OS X都内建),我就有了完整的程式开发环境,而且我甚至还不需要连上网路就可以有这些。除此之外,Xcode里还附带很多好用的开发、除错工具,像是我{za}的(非常好用的profiling和memory debug工具)、或是Malloc Debug(找memory leak的好东西)、BigTop(监看每一个process耗用的资源记录)。

自从我转到Mac后,后来因为需要写跨平台程式而切到Windows时,都觉得极端痛苦。因为Windows是给一般使用者的系统,而且所有程式都是独立分开的,每次光要把开发环境准备好就要先耗上一整天在下载和安装。后来我学乖了直接装cygwin弄一个假的UNIX环境出来,但cygwin毕竟还是跑在Windows上,系统设计的哲学不同让cygwin还是格格不入。(像是Windows就是没有用文字档存放系统设定,所以也没办法用一般的文字工具自动操作;Windows也没有提供够多的command line工具可以控制系统;Windows也没有符号连结(symbolic link),我之前想用Bazaar check out一个有符号连结的repository就爆炸了…)

从Linux转到Mac,让我可以花更多时间专注在我想写的程式上,而不是拿去研究driver的相容问题,或是Linux kernel新增的设定选项。对于一个应用程式或网页程式的开发人员来说,这些底层的细节都是不重要的。虽然说Windows也把系统底层的细节藏起来了,但它实在藏的太彻底了。万一偶尔需要看系统底层的讯息来debug,在Mac上还是跟Linux一样直接到/var/log下grep一下就有了,但在Windows上除了「回报给微软」外,也没太多办法可以自力救济。

Mac上很多设计也改变了我使用电脑的方式。例如说QuickSilver让我可以用键盘快速启动任何程式,甚至是做更复杂的操作。Spotlight让我不再需要思考怎么把档案文件分类整理到不同folder里,需要什么就像用google一样只要直接用spotlight找就好了。Mac上的绘图、设计软体都有很贴心的设计,例如OmniGraffle的自动对齐线,可以帮忙使用者轻易设计出平衡、一致、美观的图像、网页、或是图形介面。Mac上几乎什么都可以自然地用drag and drop操作(例如Safari很早以前就可以把档案拖到网页里上传),但很奇怪Windows上就是有些地方可以有些不行。

整体来说,Mac是一个融合Windows和Linux双方优点的平衡点,我可以像一般使用者一样不费心力的操作电脑,也可以用高效率的command line处理复杂的任务,甚至是在需要的时候扮演hacker挖掘底层的错误讯息,或是利用Darwin Ports安装和修改我需要的open source软体。但除了Mac外,其实我还是有在用Linux,只是都跑在远端的server上而已。主要原因是在没有图形介面时,Mac就没有什么优势了。所以到现在即使我的laptop都改用Mac,我也还是会有一个terminal连到我的Linux server上。(虽然说主要是拿来挂IRC和BBS的…)

原帖地址 http://blog.vgod.tw/

Popularity: 1% []

|带我飞|猜你可能还对以下内容感兴趣:

  1. 这周,接近最终版的windows phone 7Rom镜像在网上流出,让我们能看到Windows的下一代智能手机的操作系统长啥样,那先一睹为快吧。说句实话,这个无边框界面比以前的windows ce好看多了。...