关于编程,关于语言,关于创业 —— 读《黑客与画家》

7 4 月, 2020 关于编程,关于语言,关于创业 —— 读《黑客与画家》已关闭评论

 

文/梁栋﹝LeungTong﹞
 

一、关于作者,关于黑客

这是一本来自计算机时代的高见。如其副题,《黑客与画家》在某种意义上启发着我们的思考,关于黑客、关于软件、关于编程语言、关于创业、关于设计,等等。本书是硅谷创业之父保罗·格雷厄姆(Paul Graham)的文集,我们亦可以在他的博客paulgraham.com中阅读他的文字。书中,我特别喜欢保罗·格雷厄姆关于财富的论述,这与我一直以来所坚持的观点类似;我也喜欢格雷厄姆关于黑客的描述,这与我的性格相似,我对「搞事情」(hack)特别感兴趣;格雷厄姆对编程语言的深入讲述,让我对「编程」有了更深的理解 … 这是一次很愉快的阅读经验。

保罗·格雷厄姆被《福布斯》杂志喻为「撼动硅谷的人」,他是美国互联网界教父级人物,是互联网软件(Viaweb)的发明者,他对Lisp语言推崇备至。格雷厄姆是程序员、风险投资家、作家,他创办的Y-Combinator(2005)已成为美国最有价值的创业孵化器。然而,很多人不知道的是,格雷厄姆在读完计算机系的研究生之后,曾在艺术学校学习绘画,不过,他似乎不是一名出色的画家。这没有关系,绘画的经验让他对计算机与编程产生了不一样的思考。在很多人看来,计算机与绘画是两个完全不同的事情,前者是冰冷的、精准的、有序的,后者是热情的、感性的、狂放的;在格雷厄姆看来,计算机与绘画有很多共同之处,本质上,黑客与画家都是「创作者」。

很多时候,黑客(hacker)在公众的固有印象中是入侵计算机的人,一个破坏的角色,然而,在程序员眼中,只有那些精通程序,可以随心所欲地支配计算机的程序员才能称为黑客,hack the problem 意味着很漂亮地解决了一道难题。格雷厄姆认为黑客更像建筑师而不是工程师,建筑师决定「做什么」,工程师想出「怎么做」。在英语中,「架构师」与「建筑师」都是同一个词 —— architect,似乎暗示着,出色的黑客(程序员)不仅负责建造,还负责「构架」。书中,格雷厄姆这般写道:黑客不只是单纯地决定如何实现某种规格,黑客的最高境界是创造规格,而做到这一点的最好方法就是先做出一个样品把规格实现了。(p019)

黑客是自负的。黑客不服从管教,也许这令人生厌,但格雷厄姆希望人们能更多地看到黑客这种性格的长处,这是是黑客之所以成为优秀程序员的原因之一。黑客不喜欢版权法,这似乎违背常理,但黑客的确是最热衷分享的一群人,版权和专利制度让黑客深感担忧,他们不希望这些制度束缚自己的思想自由,他们相信开源分享才能永续刺激并触发新一代技术的诞生。

黑客就是这样的一群人。黑客是酷的。
 

二、从绘画学习

在《创意,从无到有》一书,美国广告大师杨杰美这样写道:对广告工作者而言,要培养洞悉问题的心理习惯(创意),最好的方法是研读社会学著作,这些书比大多数的广告学书籍更能教你学会做广告。无独有偶,格雷厄姆也有类似的看法:黑客新想法的最佳来源,并非那些名字里有「计算机」三个字的理论领域,而是来自于其他创作领域,与其到「计算理论」领域寻找创意,还不如在绘画中寻找创意。格雷厄姆相信,黑客更像创作者,而不是科学家,因此,要了解黑客,不应该在科学家身上寻找启示,而是应该观察其他类型的创作者。

那么,在画家身上,我们能得到什么启示呢。摘录如下:

1、从实践中学习
画家学习绘画的方法主要是动手去画,黑客学习编程的方法也理应如此,大多数黑客不是通过大学课程学会编程的,他们从实践中学习。我想大多数创作者都是这样学习和工作的,作家和建筑师似乎都是如此。也许对于黑客来说,采取像画家这样的做法很有好处:应该定期地从头开始,而不要长年累月地在一个项目上不断工作,并且试图把所有的最新想法都以修订版的形式包括进去。(p026)

2、通过范例学习
对画家来说,博物馆就是美术技巧的图书馆。几百年来,临摹大师的作品一直是传统美术教育的一部分,因为临摹迫使你仔细观察一幅画是如何完成的。同样地,黑客可以通过观看优秀的程序学会编程,不是看它们的执行结果,而是看它们的源代码。开源运动最鲜为人知的优点之一,就是使得学习编程变得更容易了。(p027)

3、弱即是强 (Worse is Better)
如何准确地描绘一个事物?美术老师会告诉你,先快速用几根线画出一个大致准确的轮廓,然后加工草稿,逐步完善细节。如果你一开始就沿着轮廓一个部分、一个部分地画,最后很可能画不好,因为各个部分的错误会累积起来,最终导致整幅画失真。如果最后发现最初设计的轮廓是错的也没有关系,重新修改便是。无数古代油画放在X光下检视,都能看出修改痕迹。格雷厄姆相信,黑客也应该这样工作,而且,他就是这样编程的。然而,大学编程课程通常教导学生:在上机编程之前,应该先在纸上把程序搞清楚。格雷厄姆认为,这种编程方法是错的。我们应该在编写代码的同时,而不是在编写代码之前,把整个程序每个细节想清楚。
在软件领域,有两种开发模式,一种是「弱即是强」模式:如果你正在设计某种新东西,就应该尽快拿出原型,听取用户的意见;另一种是「万福玛丽亚」模式:你应该等到完整的成品出来以后再一下子隆重地推向市场,现实是,无数创业公司因为相信了这种模式而被市场淘汰。

4、黑客不是科学家
黑客不同于科学家,是创作者而不是研究者,这很重要,因为,如果你越往自然科学的方向发展,就越是把自己的工作弄得看上去像数学,这会产生一个严重的问题:偏向于解决那些能够用数学公式处理的问题,而不是去解决真正重要的问题。另外,你还可能为了配合论文写作,而把自己的软件写得很丑,但是,黑客的工作重点是编程,而不是写论文。编程,或创造编程语言,是设计问题而不是科研问题,这意味着你需要更多地考虑用户。为谁设计?用户需求是什么?做出用户需要的设计。 但是,用户不了解所有可能的选择,也经常弄错自己真正想要的东西,所以,格雷厄姆特别强调,是「用户需要的设计」,而不是「用户要求的设计」。在格雷厄姆看来,一个好的设计师应当像医生一样,根据病人的症状,找出病因,然后对症下药。
 

三、理想的语言

几个简单的概念。我们要控制机器,必须有一张机器读得懂的操作命令清单。这种操作命令的总和就是计算机的「机器语言」。为了方便,我们把每个命令换成更符合人们习惯的名字,例如,把机器语言的加法命令「11001101」换成接近我们自然语言的「add」,我们得到了一种新的语言,也即「汇编语言」。汇编语言和机器语言一样都是更贴近机器操作的低级语言, 由于语言自身的限制,汇编语言只能让大多数计算机实现一些很简单的事情。但是,如格雷厄姆所言,黑客与画家一样都是「创作者」,创作是需要自由的,不应受限于「语言」,黑客希望可以更自由地编程,更专注地解决问题,而不是花大量的时间来考察机器是否懂自己的程序。于是,黑客需要一个助手,在他和机器之间进行翻译工作,这个助手可以是一个人,但更理想的,是一个程序,我们叫它「编译器」,它将简便灵活的程序转变为硬件可以理解的语言。这种简便灵活的程序所使用的语言就叫做「高级语言」。

有了高级语言,我们终于可以「写我所写」,不再受限于机器本身,也无须考虑不同计算机的机器语言是否相同,比如,你无须考虑你的写作对象是英国人还是日本人,你用母语(自己擅长的语言)表达即可,因为总有助手(编译器)替你翻译。也就是说,高级语言具有更强的「可移植性」。编译器处理的高级语言代码称为「源码」,经过翻译以后产生的机器码叫做「目标码」。一般而言,商业软件提供的往往是目标码,而开源软件提供的是源码,你可以通过源码完全地控制软件。Linux是一种开源的操作系统,聪明的黑客发现并解决了其中大量的bug,而Windows是封闭的,它只能由微软公司的程序员修正自己的bug。

在绝大多数情况下,程序员都会选择高级语言编程,但汇编语言有时也会派上用场,当你需要在微观层面控制计算机硬件的时候,例如游戏软件需要考虑硬件的条件限制(运行速度、散热等),汇编语言这种低层级的语言可以发挥作用。低级语言更接近于机器语言,而高级语言则更接近人类语言。高级语言当中,也有层次的差异,例如,C语言是一种低层次语言(格雷厄姆称之为「可移植的汇编语言」),而Lisp语言是高层次语言。语言层次越高就越抽象,甚至完全脱离硬件,但是,格雷厄姆提醒,一种语言的好坏并不是以抽象程度为标准的,任何语言的最终目的都是解决问题,反例是,Prolog语言非常抽象,但只能解决2%的问题。

使用不同的语言有着不同的考量。大多数程序员选择C语言来编写操作系统,因为C语言更接近硬件,如果你要考虑系统的运行速度,那C语言是更好的选择。不过,计算机硬件正在以摩尔速度更新换代,硬件的运行速度越来越快,也越来越可靠,较低级的语言在这些方面的优势正不断减少。同时,C语言的另一个弊端相对地被放大,它似乎更脆弱一些,恶意的黑客会根据C语言的特点对计算机进行攻击。另外,有趣的是,不同的高级语言的设计意图也是不同的,有些语言关心如何「防止程序员干蠢事」(以Java为代表),而另一些语言则鼓励程序员「用编程语言干一切他们想干的事」(以Perl为代表)。

Perl语言可不简单,1987年,拉里·瓦尔(Larry Wall)为了使管理机房的工作变得方便,在业余时间创造了Perl语言,这直接启发了很多黑客:为什么不动手设计一种自己的语言呢?语言开始变得多样化。有些语言有着极其强大的函数库,而有些则注重于内核设计,有些语言(例如Cobol、Java)曾流行一时,但后续语言却没有继承它的思想,很快便走到尽头。格雷厄姆认为,编程语言也存在一个进化的脉络,事实上,很多语言分支最终都会成为进化的死胡同。但是,最近十几年,诸如Pert、Python、Ruby等开源语言的崛起,带来了一些绝妙的创新,而且新语言更多地以开源项目的形式出现,而不是以研究性项目的形式出现,语言设计开始被黑客接管,新语言的设计者更多的是使用它们的应用软件作者,而不是编译器作者,格雷厄姆认为,这是非常好的趋势。

总的来说,软件发展的历史已经长达50年,但是编程语言的进化却非常缓慢,格雷厄姆解释道,这是因为编程语言并不是真正的「技术」,语言只是一种书写方法,程序则是一种严格符合规则的描述,以书面形式记录计算机应该如何解决你的问题。(p159)然而,尽管缓慢,编程语言还是存在一个进化的脉络,其中,我们可以看到每一种语言的位置,可以看到语言进化的主干,格雷厄姆认为这很重要,它启发我们去选择那些靠近主干的语言。

那么,什么样的语言才会流行,什么样的语言才能成为主干语言呢。首先,一种语言的内核设计得越小、越干净,它的生命力就越顽强,这样的编程语言才会存在于进化的主干。其次,这种语言必须是黑客所喜欢的。格雷厄姆认为黑客的看法比语言设计者的看法更重要,因为语言其实是一种工具,为黑客所用,编程语言的设计必须考虑到使用者的习惯和喜好。进一步,什么样的语言才是黑客梦寐以求的编程语言呢。首先,有三项基本条件:一种免费的实现;一本相关书籍,有大量优秀的范例可供学习,而且非常符合直觉;语言所依附的计算机系统必须也流行。此外,还需满足:

1)干净简练。简洁性最重要的方面就是要使得语言更抽象。
2)允许黑客以自己的方式使用。开放自身的设计,提供与语言创造者平等的权力。
3)善于完成黑客想要完成的各种任务。很适合开发一次性程序。可以快速写出一个程序的原型。
4)函数库。优秀函数库的重要性将超过语言本身。 函数库的使用应该符合程序员的直觉。
5)效率。好的编程语言生成的代码有较快的运行速度。
6)时间。
7)再设计。设计一样东西,最重要的一点就是要经常“再设计”。
(p202 – 211)
 

四、互联网软件

对于一般计算机用户来说,我们不太会留意桌面软件和互联网软件的区别。在1995年以前,我们都在用桌面软件,直到格雷厄姆他们编写了第一个互联网软件Viaweb,这是一个网上商店生成器,后来被雅虎收购,更名为Yahoo Store。不过,当时人们还不懂什么是互联网软件,一年后,Hotmail上线,首创了用户可以在邮件中使用HTML标记语言,人们才开始明白并接受这一概念。什么是互联网软件呢,简单来说,就是运行在云端服务器,而不是你的PC电脑的软件,它以浏览器作为操作界面,并通过网络来实现。

软件从桌面移到服务器,对开发者来说,这带来了一系列根本性变化。首先,互联网软件不只是一个单独的代码块(二进制文件),而是一个程序集合。格雷厄姆这般比喻两者的差异:设计桌面软件就像设计一幢大楼,而设计互联网软件就像设计一座城市:你不仅需要设计建筑物,还要设计道路、路标、公用设施、警察局、消防队,并且制定城市发展规划和紧急事件的应对方案。(p063)其次,由于互联网软件不是一个单独的二进制文件,而且服务器/硬件控制在自己手里,所以,互联网软件可以使用多种编程语言开发,你可以根据不同的场合,挑选最有优势的语言。桌面软件由于受到操作系统的限制而只能采用与之一致的语言(C或C++),也就错过了诸如Perl、Python、Lisp等高级编程语言,失去了编程的更多可能性。

另外,由于软件运行在云端服务器,它的发布方式发生改变,它不必像桌面软件一样,由用户下载、安装、更新,互联网软件可以实时更新。更新桌面软件对开发者来说是一件极其痛苦的事情,因为他需要考察一大块巨型代码,而互联网软件则轻松得多,它可以分解为一系列渐进式修改。所以,只要软件可以运行,它就可以发布。这有个好处,就是避免开发者出现心理惰性,如果一个新版本要等到一年甚至更长时间才能发布,我们往往会将之束之高阁。实际上,创意往往是需要时时刺激的。格雷厄姆发现,实现某个构思,会带来更多的构思,将一个构思束之高阁,不仅意味着延迟它的实现,还意味着延迟所有在实现过程中激发的构思。对于互联网软件来说,只要想到好的构思,开发者就可以立刻着手实现。

互联网软件的一个技术优势是,出现bug时,你不需要用户发送错误报告,苦苦猜测用户PC与软件的错误,因为用户的数据就在服务器上面,你直接处理就可以了。甚至,你不需要客户告知就知道软件运行的异常,并及时修复。因为轻便,互联网软件只需要具备运行条件就可以发布,这非常适合市场竞争异常激烈的今天,创业公司需要迅速推出1.0版本,根据市场需求不断迭代。此外,互联网软件让你前所未有地了解用户行为,用户的每一次点击都可以统计,你几乎可以不花费任何成本,便可得到大量的用户数据,你可以知道用户的使用习惯,用户在使用过程中遇到的麻烦,用户的兴趣 …… 这些会帮助你不断优化程序,比你的竞争对手更快地开发出用户满意和喜爱的软件。

正是互联网软件具备这些得天独厚的优势,开发软件需要的程序员人数越来越少,这有利于初期的创业公司。一间公寓,一台连着ISP的服务器,少数几个人便可把软件写下来,并让产品运营。另外,软件的收费模式也发生变化:无需购买软件的所有权,而是像订阅报纸一样订阅软件的使用权。按传统的桌面软件的销售模式,厂商每推出一个新版本,就会强迫用户重新出钱购买,而如果只是收取用户的订阅费,操作起来便会自然、简便许多。

对于用户来说,软件从桌面移到服务器,这也带来了一系列根本性变化。首先,用户不必了解计算机内部的运作机制,不需要了解何谓操作系统,何谓驱动程序、补丁等等等。互联网软件运行在服务器上,用户界面就是网页,因此,对于普通用户来说,了解软件应用本身就足够了,其他所有那些乱七八糟的东西,交由专业人员来维护。互联网软件没有安装在自己的PC终端,用户不用被迫称为系统管理员,不用担心安装出错,也不用关心软件与操作系统是否兼容,因为软件与你使用的操作系统彻底无关。用户也无需担心数据丢失,互联网软件的运营方会随时备份数据。

此外,互联网软件拥有桌面软件无法匹及的优势,它不受地域限制,任何时间任何地点都可以使用,它的数据存放云端,可以随时共享。因此,格雷厄姆断言,「你的电脑」这个概念正慢慢成为过去时,取而代之的是「你的数据」(p062)。互联网软件让你可以在任何终端设备上获取「你的数据」,这些终端设备不一定是PC电脑,也可以是手机、PAD、手表、耳机等等,它们可以随时地方便地携带身边,人与数据成为一体。有了互联网软件,你的数据和软件本身都不需要保存在终端设备之上,格雷厄姆认为这些终端设备应该像电话那样,它只是一个数据转接的设备而已,我们与云端数据对话。
 

五、何为财富

我们需要的东西就是财富,衣食住行、阅读、旅行等等都是财富。财富与金钱并不是同样的东西,金钱只是财富的一种简便的表达方式。遗憾的是,人们很难觉察到这一差别的微妙之处。其底层逻辑是这样的:在一个高度分工的社会,你需要的大部分产品都无法自己制造,于是,我们需要「交换」,而金钱是一种交换媒介。作为交换媒介,金钱(等价物)提高了交换效率,却也往往模糊了交易的实质。存储黄金并不能让一个国家变得更富有,如果总体财富不变,金钱越多,物价越高,迎来的往往是通货膨胀。同样,我们拼命赚钱,但留住金钱并不会让我们变得「富有」,财富才是你的目标,金钱不是。

关于财富,我们有很多的误解。例如,财富常常被形容为一张大饼,总量是有限的,于是你分到的越多,别人分到的就越少,反之亦然,于是,这是一个零和游戏。格雷厄姆告诉我们,这是一个谬论。在某些特定的情况下,用来交换的金钱数量也许是固定不变的,但是可供交换的财富却不是恒定不变。比如,我们可以通过修葺一辆破旧的车,让自己的财富变得更多一点,而此时,没有任何人的利益受损。再如,财富不一定是有形之物质,抽象的「知识」、「技术」也可以是财富。而且,财富不一定非要通过「出售」来实现价值,科学家分享新知识、黑客分享开源软件,他们都在创造财富,以「共享」的方式。同时,格雷厄姆承认不同的程序员创造财富的速率是有差别的,甚至,一个平庸的程序员可能非但无法创造财富,甚至还可能减少财富,比如引入了bug。

关于财富的公平,我们也有着普遍的误解。格雷厄姆小时候以为插座就是发电的地方,而不知道电力由电厂生产,类似地,很多人认为财富是社会固有的、不变的,只是由某个权威机构来负责分配(理应公平),而没有意识到财富是创造出来的(并不均等)。由于每个人的技能不同,创造的财富不同,因而换取的财富也理应不同。这才是公平所在。显然,我们不愿意承认这种差别,也不相信这种差别会如此巨大,格雷厄姆提醒我们,一支篮球队不会愿意用一个运动员交换100个普通人,苹果公司也不会愿意用乔布斯交换一个100人组成的委员会,这便是个人价值的不对等性,个人价值是以创造财富的能力来衡量的。

基于此,格雷厄姆进一步认为,在现代社会中,「贫富分化」实际上是一种健康的信号。「技术」加剧了有技术者与无技术者之间的生产效率差异,这促使人们不断学习并掌握新技术,提高创造财富的能力。得益于此,整个社会的财富得以极大丰富,反过来,社会整体财富的提高,让每一个社会个体同时受益。虽然每个人所拥有的「交换财富」(金钱)的比额存在差距,但是生活的其他差距其实缩小了,一百年前,普通人与富人的生活境况截然不同,而今,由于技术的发展,普通人享受到了以前富人才可能拥有的生活,汽车、手表、手机等等不再是奢侈品。无论在物质上,还是在社会地位上,不太恰当地借用经济学的概念,普通人与富人的「边际」差距正在缩小。与农奴社会不同的是,如今财富的差异性来自技术革新而不是通过抢夺他人,于是,如果技术变革带来的生产效率的提高,并没有体现在收入层面,可能意味着:1)技术变革的停顿、2)创造大部分财富的人停止工作、3)创造大量财富的人不获取报酬,结果是,社会作为一个整体变得更贫穷。

书中,格雷厄姆提出了一个非常有趣,同时颇具启发性的观点:一个社会需要有富人。富人可以创办企业来创造就业机会,普通人由此得以赚钱养家糊口,这不是主要原因。重要的是,「你让他致富,他就会造出一台拖拉机,你就不再需要使用马匹耕田了」(p122)。「技术」才是最大的潜在财富。
 

六、如何创业

在格雷厄姆看来,致富的最好方式就是创业,或者加入创业公司。创业公司无法改变创造财富的法则,这里也有一个守恒定律:如果你想赚100万美元,就不得不忍受相当于100万美元的痛苦,然而,创业公司可以将你的工作、你的压力压缩到三四年,你不再是低强度地工作四十年,而是以极限的强度工作四年。承受极限的压力通常会为你带来额外的报酬,高新技术领域尤其如此。但是,创业并非易事,书中,格雷厄姆给了几点建议。

1)创业公司要做一些独特的事情和精致的产品。大公司可以互相模仿,只要做到不太烂,就能赢,但是创业公司不行。如果创业公司的每件事情都只是平均水准,那只能得到平均结果,这意味着关门倒闭。

2)从制造简洁的产品开始着手,首先要保证你自己愿意使用。然后,迅速地做出1.0版,并且不断加以改进,整个过程中密切倾听用户的反馈。只有懂得设计的黑客,才能设计软件,你得自己动手设计和开发,否则就不要创业。

3)用户需求才是你设计产品的方向,开创创业公司不仅仅是为了解决问题,而是为了解决那些用户关心的问题。不要为了取悦风险投资商或潜在并购方而设计你的产品,不要让那些「衣冠楚楚、西装革履的家伙」替你做技术决策。只要赢得用户,一切都水到渠成。

4)当你开始做生意时,很容易陷入一种迷思,认为只要把东西做出来就会有人要。在互联网泡沫的那段日子,我遇到一位女士,她喜欢户外运动,所以开办了一个户外运动门户网站。如果你真的喜欢户外运动,你知道自己应该做什么生意吗?其中一种就是从出错的硬盘挽救数据。两者有何关联?没有关联。我只是借此表达我的观点,就是如果你想要创造财富(这里指的是狭义的财富,也就是使你免于饥饿的东西),那么你应该抱着特别怀疑的态度,去思考那些着眼于你自己感兴趣的东西的商业计划。对于自己感兴趣的东西,你会觉得它们很有价值,但是它们恰恰最不可能与他人眼中有价值的东西发生重合。(摘自p094)

5)创业致富,你需要两样东西:可测量性和可放大性。业绩应该是可测量的,同时能够产生巨大的效应,任何一个通过自身努力而致富的个人,在他们身上应该都能同时发现可测量性和可放大性。幸运的是,创业公司为每个人提供了一条途径,同时获得可测量性和可放大性。

6)创业公司与一般餐馆和理发店的区别是,创业公司通过新技术创造盈利的机会。技术就是某种手段,就是我们做事的方式,它的经济价值取决于有多少人使用这种新方式。餐馆煎鸡蛋,理发店剪头发,每次只能为一个顾客提供服务, 但是,如果你能够为大多数人提供解决某一难题的技术手段或方案,也就产生了放大效应。需要注意的是,一些非技术型公司其实也在解决技术问题,格雷厄姆以麦当劳和沃尔玛为例,麦当劳的成功在于设计了一个快餐服务体系,而沃尔玛设计出一种新型商店,这些都可以复制到世界的每一个角落。

7)创业之初,你可能会担心自己不懂得管理,或者你害怕竞争。格雷厄姆把这些忧虑比喻为「没有通电的电篱笆」,实际上,那些像模像样,有着办公室、商业计划、销售员的公司害怕你胜过你害怕他们,只要你掌握着某一领域的核心技术,或独一无二的创意。

8)那么,如何评价你的商业竞争对手呢?格雷厄姆分享了一个妙招:关注他们的招聘职位。(p180)

9)又,如何招聘员工呢?格雷厄姆在面试程序员的时候,最关注的事情就是这些应聘的程序员在业余时间写了什么软件。因为,如果你不爱一件事情,就不可能将它做到极致。

10)选择10个有着共同志向的最优秀的伙伴。创业公司的小团队模式可以让每个人产生最大的能量。显然,每个优秀的人都愿意与其他高手平均工作效能,而不是平庸之辈。这正是创业公司的真正意义。

11)开发竞争对手难于复制的技术。大公司会复制你的技术,利用其品牌、资本、经销的优势迅速将你逐出市场。大公司会绕过你的专利保护,或者直接侵犯你的专利,因为他们并不惧怕官司,官司的成本足以拖垮你。因此,一开始就从最难的问题,最难的技术手段入手,通过「技术」本身设置「进入壁垒」。

12)在合适的时期卖掉自己的创业公司。格雷厄姆认为,管理一家公司与创立一家公司是不同的两件事。当公司的情况趋于稳定,让大公司来接手或许是更明智的选择。格雷厄姆还悄悄告诉我们他的小心思:大多数时候,促成买方掏钱的最好办法不是让买家看到有获利的可能,而是让他们感到失去机会的恐惧。

不过,不是所有人都适合自己创业。创业也会遇到两类问题,也许和自己的预想南辕北辙。(以程序员为例)首先,如果是自己开公司,你必须处理许许多多与开发软件完全无关的事情,这会让你迅速丧失热情。其次,赚钱的软件往往不是好玩的软件,两者的重叠度不高。(p024)那么,黑客如何才能做自己喜欢的事情?有一个好方法,找一份养家糊口的「白天工作」(day job)。你有一份为了赚钱的工作,还有一份为了爱好的工作,如果幸运的话,你能找到一份与「真正工作」高度相关的白天工作。(p025)

无论是创业还是加入创业公司,最重要的是创造财富。格雷厄姆提醒我们:公司的业务高度专业化,掩盖了它们都是在创造财富的相似性,而且,不只是制造业公司在创造财富,许许多多不生产物质商品的公司也在创造财富。只有创造财富才能生存。(p097)另外,公司内部的各种层级使得我们常常会认为自己是为公司的需要而工作,而没有觉察到,其实你为了满足顾客的某种需求而工作。即使不加入公司,你也能做到。所以,在择业之时,重要的不是加入某个公司,而是做出人们需要的东西。(p098)
 

七、摘抄

黑客的出发点是原创,最终得到一个优美的结果;而科学家的出发点是别人优美的结果,最终得到原创性。(p026)

黑客就像画家,工作起来是有心理周期的。有时候,你有了一个令人兴奋的新项目,你会愿意为它一天工作16个小时。等过了这一阵,你又会觉得百无聊赖,对所有事情都提不起兴趣。为了做出优秀的工作,你必须把这种心理周期考虑在内。只有这样,你才能根据不同的事情找出不同的应对方法。对于画家和黑客这样的创作者,有些工作需要投人巨大的热情,另一些工作则是不需要很操心的日常琐事。在你厌倦的时候再去做那些比较容易的工作,这是个不错的主意。对于编程,这实际上意味着你可以把bug留到以后解决。消灭bug对我来说属于轻松的工作,只有在这个时候,编程才变得直接和机械,接近于休闲。消灭bug的过程就像解一道数学题,已知许许多多的约束条件,你只要根据条件对方程求解就可以了。(p029)

程序员的时间要比计算机的时间昂贵得多。一种让程序员做无用功的语言才真正称得上很烂。浪费程序员的时间而不是浪费机器的时间才是真正的无效率。(p152/163)

一种效率低得不可想象的语言遇到了性能强大得不可想象的硬件,会发生什么事呢。(p163)

編程语言首要的特性应该是允许动态扩展:编程语言是用来帮助思考程序的,而不是用来表达你已经想好的程序。它应该是一支铅笔,而不是一支钢笔。我们需要的是一种可以随意涂抹、擦擦改改的语言。(p022)

不要把编程语言看成那些已完成的程序的表达方式,而应该把它理解成促进程序从无到有的一种媒介。这里的意思是说,成品的材料和开发时用的材料其实是不一样的。搞艺术的人都知道,这两个阶段往往需要不同的媒介。

评价一种语言的优劣不能简单地看最后的程序是否表达得很漂亮,而要看程序从无到有的那条完成路径是否很漂亮。某种设计使得最后的程序非常漂亮,但是不一定同时具备漂亮的编程过程。 (p218)

如果目标用户群体涵盖了设计师本人,那么最有可能诞生优秀设计。如果你觉得自己在为傻瓜设计产品,那么很可能不仅无法设计出优秀产品,而且就连儍瓜也不喜欢你的设计。(p216)

设计意味着做出符合人类特点和需要的产品。但是,“人类”不仅包括用户,还包括设计师,所以设计工作本身也必须符合设计师的特点和需要。(p221)

essay(论文)这个词来自法语的动词essayer,意思是“试试看”。从这个原始意义来说,论文就是你写一篇文章,试着搞清楚某件事。软件也是如此。我觉得一些最好的软件就像论文一样,也就是说,当作者真正开始动手写这些软件的时候,他们其实不知道最后会写出什么结果。162

你应该写什么程序?随便什么,只要能让你最省力地写出来就行。但是要注意,这必须是在你的思维没有被当前使用的编程语言影响的情况下。这种影响无处不在,必须很努力才能克服。你也许觉得,对于人类这样懒惰的生物,喜欢用最省力的方式写程序是再自然不过的事情。但是事实上,我们的思想可能往往会受限于某种现存的语言,只采用在这种语言看来更简单的形式,它对我们思想的束缚作用会大得令人震惊。新语言必须靠你自己去发现,不能依靠那些让你自然而然就沉下去的思维定势。 (p167)

当你设计语言的时候,心里牢牢记住这个目标是有好处的。学习开车的是时候,一个需要记住的原则就是要把车开直,不是通过将车身对齐画在地上的分割线,而是通过瞄准远处的某个点。即使你的目标只在几米开外,这样做也是正确的。我认为,设计编程语言时,我们也应该这样做。(p169)

技术的变化速度通常是很快的。但是,编程语言不一样,与其说它是技术,还不如说是程序员的思考模式。编程语言是技术和宗教的混合物。所以,一种很普通的编程语言就是很普通的程序员使用的语言,它的变化就像冰山那样缓慢。(p179)

当人们自己从事创造性工作的时候,好像就会忘了保持简单这个原则。当你被迫把东西做得很简单时,你就被迫直接面对真正的问题。当你不能用表面的装饰交差时,你就不得不做好真正的本质部分。(p135)

一个可以成为许多新工作基础的证明要优于一个难度很高但无助于未来学科发展的证明。(p138)

1958年,约翰·麦卡锡第一个提出了Lisp语言。(p183-186)

埃里克·雷蒙德写过一篇文章《如何成为一名黑客》。文中有一部分专门谈到,在他看来,如果你想当一个黑客,应该学习哪些语言。他建议从Python和Java入手,因为它们比较容易学。想当高级一点的黑客,还应该学习C和Perl,前者用来对付Unix系统,后者用来系统管理和开发CGI脚本。最后,真正非常严肃地把黑客作为人生目标的人,应该考虑学习 Lisp。Lisp很值得学习。你掌握它以后,会感到它给带来的极大启发。这会大大提高你的编程水平,使你成为一个更好的程序员。(p171)

 


……………………………………………………
本文遵循 CC知识共享协议(署名/非商业用途/禁止演绎)

 
 
 
 
 

Tagged , , , ,

Comments are closed.

What's this?

You are currently reading 关于编程,关于语言,关于创业 —— 读《黑客与画家》 at As I am , so I see.

meta


  • Tong LEUNG
    post 80s
    Zhanjiang
    major “aha”

  • 工程师,创意研究,博客写作

    兴趣: 哲学、当代艺术、复杂科学、剧场实验、社会创新。

  •   我的脸书

  • 文章分类 | Categories

  •       荣念曾漫画 – 格物致知

     

     

  • 知识共享许可协议
    本作品由梁栋﹝LeungTong﹞采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。