惜文读书笔记 人工智能 黑客与画家 读书笔记 摘抄 阅读摘录 豆瓣评分 8.7

黑客与画家 读书笔记 摘抄 阅读摘录 豆瓣评分 8.7

内容提要 本书是硅谷创业之父Paul Graham的文集,主要介绍黑客即优秀程序员的爱好和动机,讨论黑客成长、…

内容提要


本书是硅谷创业之父Paul Graham的文集,主要介绍黑客即优秀程序员的爱好和动机,讨论黑客成长、黑客对世界的贡献以及编程语言和黑客工作方法等所有对计算机时代感兴趣的人的一些话题。书中的内容不但有助于了解计算机编程的本质、互联网行业的规则,还会帮助读者了解我们这个时代,迫使读者独立思考。本书适合所有程序员和互联网创业者,也适合一切对计算机行业感兴趣的读者。

保罗·格雷厄姆其人其事


1964年,保罗·格雷厄姆(Paul Graham)出生于匹兹堡郊区的一个中产阶级家庭。

1995年的初夏,他找到了读书时认识的朋友罗伯特·莫里斯(Robert Morris),希望合作编写一个软件来赚钱。

1996年夏天,Viaweb得到了第二轮天使投资80万美元。

1998年,收购终于成功。雅虎以4900万美元的价格兼并了Viaweb,将其改名为Yahoo!Store。

离开了雅虎,他的生活顿时就空闲了。他开始将自己对于技术和创业的观点写成一系列文章,发表在个人网站上。

2005年的暑假,他重新找到了罗伯特·莫里斯(他现在是麻省理工学院计算机系的教师),两人一起举办了一个夏令营,旨在帮助那些有创业念头的大学生成立自己的公司。

Y Combinator(Y运算子,简称YC)。根据格雷厄姆的设想,它既是一个创业公司的孵化器,也是一个教导员,还是一个与投资人联系的中介。

每个项目将得到1.1万美元的启动资金,外加每个项目成员3000美元的生活津贴,交换条件是YC将拿走该项目5%的股份。

YC的合伙人对每个项目都进行个别辅导,不仅提供项目建议,还灌输方法论和价值观。

YC到时会举行“展示日”,让风险投资商与创业者直接见面。

YC已经改写了创业家和硅谷投资者之间的旧秩序,塑造了创建技术公司的新范式。

保罗·格雷厄姆有一套完整的创业哲学,他的创业公式是:

(1)搭建原型

(2)上线运营(别管bug)

(3)收集反馈

(4)调整产品

(5)成长壮大

Make something people want

I made something people want

比起那些令人叫好的创意,格雷厄姆更看重创始人的素质。

1 为什么书呆子不受欢迎


“书呆子”的目标具有两重性。他们毫无疑问想让自己受欢迎,但是他们更愿意让自己聪明。

我在这里真正想要表达的是,青少年每时每刻都想融入群体之中。

书呆子不受欢迎的真正原因,是他们脑子里想着别的事情。他们的注意力都放在读书或者观察世界上面,而不是放在穿衣打扮、开晚会上面。

这都是受父母的影响,书呆子被教导追求正确答案,而受欢迎的小孩被教导讨人喜欢。

在一个人产生良知之前,折磨就是一种娱乐。

不受欢迎是一种传染病,虽然善良的孩子不会去欺负书呆子,但是为了保护自己,也依然会与书呆子保持距离。

当你所做的事情能产生真实的效果,那就不仅仅是好玩而已了,发现正确的答案就开始变得重要了,这正是书呆子的优势所在。

如果能回到过去,我会向13岁的我提供一些建议,主要告诉他要昂起头看世界。

就我所知,青少年因为激素而行为失常的理论与美国中产阶级迁至郊区的进程是同步出现的。我认为这不是巧合,青少年是被迫去过这种生活的,他们是被逼疯的。文艺复兴时期的学徒是整天劳碌的牧羊狗,而今天的青少年则是神经兮兮、供人玩耍的哈巴狗。他们的疯狂源于到处都是一片可怕的无聊。

几乎在任何团体中都存在等级关系。成年人在真实世界中形成的团体,一般来说,都存在某个共同目标,团体的领导者往往由最善于实现目标的人担任。学校就不一样,大多数情况下,学生内部形成的团体没有一个共同目标。但是,等级关系却不会缺席,所以孩子们的等级是凭空创造出来的。

校园生活的真正问题是空虚。除非成年人意识到这一点,否则无法解决这个问题。

2 黑客与画家


黑客与画家的共同之处,在于他们都是创作者。

与其说优秀的软件设计师是工程师,还不如说是建筑师。建筑师决定做什么,工程师想出怎么做。

黑客的最高境界是创造规格。虽然看起来,做到这一点的最好方法就是先做出一个样品把规格实现了。

创造优美事物的方式往往不是从头做起,而是在现有成果的基础上做一些小小的调整,或者将已有的观点用比较新的方式组合起来。

我发现,黑客新想法的最佳来源,并非那些名字里有“计算机”三个字的理论领域,而是来自于其他创作领域。

大学和实验室强迫黑客成为科学家,企业强迫黑客成为工程师。

大部分公司不把设计软件的职责交给一个优秀的黑客,而是交给一个委员会,黑客的作用仅仅是实现那个委员会的设计。

大公司为了避免设计上的灾难,选择了减少设计结果的标准差。

大公司只要做到不太烂,就能赢。

你很难单单依靠软件设计就与大公司展开竞争。

真正竞争软件设计的战场是新兴领域的市场,这里还没有人建立过防御工事。只要你能做出大胆的设计,由一个人或一批人同时负责设计和实现产品,你就能在这里战胜大公司。

画家学习绘画的方法主要是动手去画,黑客学习编程的方法也理应如此。

即使上了大学,黑客学习编程依然主要通过自己写程序。

科学家就不会通过干活来学习科学,而是通过做实验和解题来学习。

有一件事情是可以借鉴的(至少可以确认),那就是应该如何学习编程。

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

创作者另一个学习的途径是通过范例。

达·芬奇就像篮球巨星迈克尔·乔丹(Michael Jordan),每一球都一丝不苟,绝不降低对自己的要求。

坚持一丝不苟,就能取得优秀的成果。因为那些看不见的细节累加起来,就变得可见了。

正确的合作方法是将项目分割成严格定义的模块,每一个模块由一个人明确负责。

“换位思考”并不就意味着你要做自我牺牲。实际上,这是完全不同的两回事。了解别人对于事情的看法,并不代表你为他的利益服务。

判断一个人是否具备“换位思考”的能力有一个好方法,那就是看他怎样向没有技术背景的人解释技术问题。

在达·芬奇的年代,绘画并不是一件很酷的事情,达·芬奇用自己的工作推动绘画成为一种伟大的表达方式。同样,编程到底能够有多酷,取决于我们能够用这种新媒介做出怎样的工作。

3 不能说的话


所谓“时尚”,本质上就是自己看不见自己的样子。

历史的常态似乎就是,任何一个年代的人们,都会对一些荒谬的东西深信不疑。

你是一个随大流的人吗

如果别人告诉你应该相信什么,你就真的相信了,那么你就会和别人一样犯下同样的错误。

真话

回顾历史,我们会发现很多这样的例子。人们因为说真话而给自己惹来麻烦。

为了找出那些“不能说的话”,让我们问自己,它们会不会是真的?

异端邪说

我认为,类似的思维机制存在于每个人的头脑中,很多看似叛逆的“异端邪说”,早就“潜伏”在我们的思维深处。如果我们暂时关闭自我审查意识,它们就会第一个浮现出来。

时空差异

所以,我们就有了找出“不能说的话”的第三种方法:将当代观念与不同时期的古代观念diff 一下。

道貌岸然

第四种寻找“不能说的话”的方法:寻找那些一本正经的卫道者,看看他们到底在捍卫着什么。

机制

我还想到了第五种方法,可以找出“不能说的话”,那就是去观察禁忌是如何产生的。

我猜想,道德禁忌的最大制造者是那些权力斗争中略占上风的一方。你会发现,这一方有实力推行禁忌,同时又软弱到需要禁忌保护自己的利益。

为什么这样做

为什么要去找出“不能说的话”?

  • 纯粹的好奇心
  • 我不喜欢犯错
  • 是因为这是很好的脑力训练

优秀作品往往来自于其他人忽视的想法,而最被忽视的想法就是那些被禁止的思想观点。

训练自己去想那些不能想的事情,你获得的好处会超过所得到的想法本身。

守口如瓶

自由思考比畅所欲言更重要。

你的思想是一个地下组织,绝不要把那里发生的事情一股脑说给外人听。“搏击俱乐部”的第一条规则,就是不要提到搏击俱乐部。

你要对每一个人微笑,但是不要说出自己的真实想法。

笑脸相迎?

如果他们不放手,一定要你回答“到底是赞成还是反对我们”,你不妨以不变应万变:“我既不反对也不赞成。

所有反击方法之中,最好的一种可能就是幽默。狂热分子都有一个共同点:缺乏幽默感。

永远质疑

你不要让自己成为人群的一分子,而要尽可能地远离人群,观察正在发生的事情,特别注意那些被压制的思想观点。

4 良好的坏习惯


在程序员眼里,“黑客”指的是优秀程序员。

黑客是不服从管教的,这就是他们的本性。这也是美国人的本性。硅谷出现在美国,而不是出现在法国、德国、英国、日本,这绝非偶然。后面那些国家的人们总是按部就班地行事。

5 另一条路


下一个潮流?

互联网软件运行在服务器上,用户界面就是网页。对于普通用户来说,这种新型软件将更容易、更便宜、更机动、更可靠,通常也比桌面软件更强大。

用户的胜利

大多数人,在大多数时候,总是选择最省事的做法。如果互联网软件能够击败桌面软件,一定是赢在更方便这一优势上。

“你的电脑”这个概念正慢慢成为过去时,取而代之的是“你的数据”。你应该可以从任何电脑上获取你的数据。或者更准确地说,在任何终端设备上获取你的数据,终端设备不一定是电脑。

终端设备不应该存储数据,它们应该像电话那样。

代码之城

设计桌面软件就像设计一幢大楼,而设计互联网软件就像设计一座城市:你不仅需要设计建筑物,还要设计道路、路标、公用设施、警察局、消防队,并且制定城市发展规划和紧急事件的应对方案。

对于互联网软件,你可以使用任何你想用的语言。

软件的发布

软件的发布过程可以分解为一系列的渐进式修改,而不是猛地推出一个大幅变动的版本。

桌面软件导致了bug的宿命论。你很清楚,发布出去的软件肯定有bug,你甚至早就准备好了应对机制(比如发布补丁)。

互联网软件的发布规则是:它运行不了,你就无法发布;一旦它能运行了,你就可以立刻发布。

软件bug

互联网软件每时每刻都在被使用。你的代码一上线,就会经历严酷考验。bug很快就会浮出水面。

早一点发现bug就不容易形成复合式bug,也就是互相影响的两个bug。

客户支持

Viaweb的开发人员总是与客服人员保持密切联系。

客户支持实际上就是质量监控,也是某种程度的市场营销。

全身心投入

我经常会想哪些地方还需要变动,然后当天就予以实现。

如果软件的新版本要等到一年后才能发布,我就会把大部分新构思束之高阁,至少过上一段时间再来考虑。

提高软件可靠性的关键在于开发时全神贯注,而不是降低开发速度。

逆向的《人月神话》

向一个项目增加人手,往往会拖慢项目进程。随着参与人数的增加,人与人之间需要的沟通呈现指数式[插图]增长。人数越来越多,开会讨论各个部分如何协同工作所需的时间越来越长,无法预见的互相影响越多越大,产生的bug也越来越多。

关注用户

互联网软件能够让你前所未有地了解用户行为。

如果用户坚持从头到尾成功地完成在线试用,那么表明他们喜欢这个产品。

互联网软件的另一个好处就体现出来了,你做了修改,马上就可以得到反馈。

金钱问题

“订报纸模式”正是互联网软件天然的收费模式。

软件的定价特别适合采用价格歧视,因为软件的边际成本[插图]接近于零。

目标客户

Viaweb一开始就把个人和小企业当作目标客户。我认为这是互联网软件的通行规则。这些客户决策比较灵活,又需要低成本的新技术,所以他们更愿意尝试新事物。

销售员必须面对消费者,程序员必须面对竞争对手的软件,但是内部系统管理员就像老年单身汉,能够激励他的外部压力几乎没有。

最好的安排就是把个人和小企业客户放在第一位。其他的客户该来的时候就会来。

桌面电脑

一旦你写出自己的软件,只要搭建一个网站就能销售。几乎所有我们的用户都是听了他人的推荐或者看了媒体的报道。

有了互联网就可以绕过Windows,直接在Unix系统上发布软件,用户通过浏览器使用。

微软公司

我预计微软会推出某种服务器和桌面电脑的混合产品,让它的桌面操作系统专门与由它控制的服务器协同工作。至少它也会把文件放在服务器上,需要的用户可以自己去下载。我觉得微软不会把运算都放到服务器端,让客户只要有浏览器就行了,它不会走得那么远,除非走投无路了。

创业公司

开发互联网软件的创业公司会把与创业有关的每一件事做到极致。只用更少的人、更少的钱,就可以把软件写出来,并且开始运作。你必须打破常规、快速行动,循规蹈矩不可能成功。

互联网软件永远没有收工的那一天,如果你愿意,可以一直干下去,每天忙上16个小时。

桌面软件迫使用户变成系统管理员,互联网软件则是迫使程序员变成系统管理员:用户的压力变小了,程序员的压力变大了。

勉强够用的网页

互联网也许不是唯一的提供软件的途径,但是它现在就能发挥作用,并还将持续很长一段日子。

为什么不尝试一下?

首先,管理企业其实很简单,只要记住两点就可以了:做出用户喜欢的产品,保证开支小于收入。

低端的用户要求简化操作和清晰易懂,高端的用户要求你增加新功能。

如果你不打算自己动手设计和开发,那就不要创业。

6 如何创造财富


创业公司其实就是解决了某个技术难题的小公司。

一个命题

创业公司将你所有的压力压缩到三四年。承受较大的压力通常会为你带来额外的报酬,但是你还是无法逃避基本的守恒定律。

运气的成分

任何公司的成功历程中,运气都是一个很大的随机因素。

通过创造有价值的东西而致富,你只需要做出别人需要的东西就可以了。

金钱不等于财富

财富是最基本的东西。我们需要的东西就是财富,食品、服装、住房、汽车、生活用品、外出旅行等都是财富。

金钱是财富的一种简便的表达方式:金钱有点像流动的财富,两者往往可以互相转化。

金钱其实只是一种中介,让大家可以更方便地获得自己想要的东西。

大饼谬论

人类历史上的财富一直在不停地增长和毁灭(总体上看是净增长)。

手工艺人

最可能明白财富能被创造出来的人就是那些善于制作东西的人,也就是手工艺人。

目前还存在的最大的手工艺人群体就是程序员。

创造出来的财富不一定非要通过出售实现价值。

工作是什么

公司一切行为的目的都是盈利,从而生存下去。创造财富是大多数公司盈利的手段。

工作就是在一个组织中,与许多人共同合作,做出某种人们需要的东西。

更努力地工作

在大公司中,你只要一般性地努力工作,就能得到意料之中的薪水。

真正的问题实际上在于公司无法测量你的贡献。

如果一家公司真正能够按照贡献付薪,它将取得巨大成功。许多雇员会更努力地工作。

在大公司中,个人的表现无法单独测量,公司里其他人会拖累你。

可测量性和可放大性

要致富,你需要两样东西:可测量性和可放大性。你的职位产生的业绩,应该是可测量的,否则你做得再多,也不会得到更多的报酬。此外,你还必须有可放大性,也就是说你做出的决定能够产生巨大的效应。

CEO也是一种同时具备可测量性和可放大性的工作。

如果你想同时具备可测量性和可放大性,你只需要成为某个攻克难题的小团体的一部分就可以了。

小团体=可测量性

就算你无法测量每个员工的贡献,但是你可以得到近似值,那就是测量小团队的贡献。

公司越小,你就越能准确估计每个人的贡献。

团队越大,每个人的贡献就越接近于整体的平均值。

高科技=可放大性

大公司的规模决定了它们无法快速行动,也无法测量并奖励表现优异的员工。

你最好做出令人信服的解释,阐明你的技术难以复制的原因。

大多数时候,促成买方掏钱的最好办法不是让买家看到有获利的可能,而是让他们感到失去机会的恐惧。对于买家来说,最强的收购动机就是看到竞争对手可能收购你。我们发现这会使得CEO们连夜行动。次强的动机则是让他们担心如果现在不买你,你的高速成长将使得未来的收购耗资巨大,甚至你本身可能变成一个他们的竞争对手。

潜规则

真正创业以后,你的竞争对手决定了你到底要有多辛苦,

我们宁愿以百分之百的把握去赚100万美元,也不愿以20%的把握去赚1000万美元

你开办创业公司不是单纯地为了解决问题,而是为了解决那些用户关心的问题。

用户数量就是判断公司表现好坏的指标。

你要么令大量顾客满意,要么令大量顾客不满。

财富和权力

只有在快速获得巨大利益的激励下,你才会去挑战那些困难的问题,否则你根本不愿意去碰它们。

为什么欧洲在历史上变得如此强大?答案(或者至少是近因)可能就是欧洲人接受了一个威力巨大的新观点:允许赚到大钱的人保住自己的财富。

一旦自己的财产有了保证,那些想致富的人就会愿意去创造财富,而不是去偷窃。

要鼓励大家去创业。只要懂得藏富于民,国家就会变得强大。让书呆子保住他们的血汗钱,你就会无敌于天下。

7 关注贫富分化


当人们非常想把某件事做好的时候,有些人会做得比其他人好得多。

财富的老爹模式

财富与金钱是两个概念。金钱只是用来交易财富的一种手段,财富才是有价值的东西,我们购买的商品和服务都属于财富。

一个人的工作具有多少价值不是由政府决定的,而是由市场决定的。

人与人之间就是存在着重大差别。

偷窃

与农奴不同的是,中产阶级有强烈动机大量创造财富。

一旦通过创造财富而使致富成为可能,社会从整体上就会快速地变得更富有。

技术的杠杆效应

技术应该会引起收入差距的扩大,但是似乎能缩小其他差距。

技术无法使其变得更便宜的唯一东西,就是品牌。

富人与穷人之间生活差异的鸿沟正在缩小,品牌是这种差距的遗留物。

今天的人们多多少少还是有一些互相隔离的趋势,但主要是因为教育层次的差别,而不是财富的差别。

无论在物质上,还是在社会地位上,技术好像都缩小了富人与穷人之间的差距,而不是让这种差距扩大了。

公理的不同意见

在农奴和贵族组成的社会,收入差距的加大肯定是社会问题加剧的信号,收入更多地从农奴流向了贵族。

总的来说,你要避免的是绝对贫穷,而不是相对贫穷。

8 防止垃圾邮件的一种方法


对于大多数用户来说,错过一封正常的邮件后果要比收到垃圾邮件严重得多。

识别垃圾邮件特征的过滤器为每封邮件计算一个“得分”,而贝叶斯方法为每封邮件算出一个概率。

因为贝叶斯方法计算的是概率,所以它必须考虑邮件中所有的线索,不管是肯定性线索还是否定性线索。

理想情况下,每个收信人应该都有自己单独的概率分布表。

到了最后,每个用户应该都分别有自己的概率分布表。

我提倡使用白名单,主要是为了节约计算。

9 设计者的品味


把品味说成个人的偏好可以有效地杜绝争论,防止人们争执哪一种品味更好。但是问题是,这种说法是不正确的。

好设计是简单的设计。

当你被迫把东西做得很简单时,你就被迫直接面对真正的问题。

好设计是永不过时的设计。

以永不过时作为目标也是一种避开时代风潮的影响的方法。

好设计是解决主要问题的设计。

好设计是启发性的设计。

好设计通常是有点趣味性的设计。

好设计是艰苦的设计。

好设计是看似容易的设计。

好设计是对称的设计。

好设计是模仿大自然的设计。

好设计是一种再设计。

好设计是能够复制的设计。

好设计常常是奇特的设计。

好设计是成批出现的。

推动人才成批涌现的最大因素就是,让有天赋的人聚在一起,共同解决某个难题。互相激励比天赋更重要。

好设计常常是大胆的设计。

10 编程语言解析


一个操作所需的代码越多,就越难避免bug,也越难发现它们。

高级语言

程序员的助手不是一个人,而是编译器。所谓“编译器”,本身就是一个程序,作用是将简便方式书写的程序(就像上面这一行命令)转变为硬件可以理解的语言。

编译器不是高级语言唯一的实现方法,另一种方法是使用解释器,它的作用是实时地将代码解释为相应的机器语言,然后一行行运行。相比之下,编译器则是先将整个程序全部翻译成机器语言,然后再运行。

开放源码

编译器处理的高级语言代码又叫做源码。它经过翻译以后产生的机器码就叫做目标码。

开放源码使你对软件有更大的控制权,如果你想理解开源软件如何运行,只要阅读源码就行了。如果愿意,你甚至可以修改软件、重新编译。

开放源码的优势还不仅局限于可以自己动手解决bug。这里的关键是所有人都可以参与。

语言的战争

你用什么语言并不重要,重要的是你对问题是否有正确的理解。代码以外的东西才是关键。

语言之间确实有差别,但是很难确定地说哪一种语言是最好的。这个领域依然还在快速发展。

抽象性

C 语言是一种低层次语言,很接近硬件,几乎堪称可移植的汇编语言,而Lisp语言的层次则是相当高。

如果你非常关注运行速度,那么最好使用接近机器的语言。

硬件的运行速度越来越快了,所以使用C这样的低层次语言开发应用程序的必要性正在不断减少,但是大家似乎还是要求操作系统越快越好。

安全带还是手铐?

目前最活跃的议题之一就是静态类型语言与动态类型语言之争。在静态类型语言中,写代码时必须知道每个变量的类型。而在动态类型语言中,随便什么时候,你都可以把变量设为任意类型的值。

我本人更喜欢动态类型,痛恨那些限制我的自由的语言。

面向对象编程

你应该使用允许你面向对象编程的语言。

文艺复兴

中国古代的封建皇朝禁止民间建造大型的远洋船只,阻止了经济的正常发展。

程序员活在这个文艺复兴时代可能是一件好事。如果我们所有人都使用同一种编程语言,反而有可能是坏事。

11 一百年后的编程语言


我的判断是,那些内核最小、最干净的编程语言才会存在于进化的主干上。一种语言的内核设计得越小、越干净,它的生命力就越顽强。

编程语言进化缓慢的原因在于它们并不是真正的技术。语言只是一种书写法,而程序则是一种严格符合规则的描述,以书面形式记录计算机应该如何解决你的问题。所以,编程语言的进化速度更像数学符号的进化速度,而不像真正的技术(比如交通或通信技术)的进化速度。数学符号的进化是缓慢的渐变式变化,而不是真正技术的那种跳跃式发展。

正确做法应该是将语言的语义与语言的实现予以分离。在语义上不需要同时存在列表和字符串,单单列表就够了。而在实现上做好编译器优化,使它在必要时把字符串作为连续字节的形式处理。

效率低下的软件并不等于很烂的软件。一种让程序员做无用功的语言才真正称得上很烂。浪费程序员的时间而不是浪费机器的时间才是真正的无效率。

一百年后,并行计算不会很流行。如果应用软件真的大量使用并行计算,这就属于过早优化了。

新语言更多地以开源项目的形式出现,而不是以研究性项目的形式出现。这是语言的一种发展趋势。

学习开车的时候,一个需要记住的原则就是要把车开直,不是通过将车身对齐画在地上的分隔线,而是通过瞄准远处的某个点。即使你的目标只在几米开外,这样做也是正确的。

12 拒绝平庸


秘密武器

如果你想当一个黑客,应该学习哪些语言。他建议从Python和Java入手,因为它们比较容易学。想当高级一点的黑客,还应该学习C和Perl。前者用来对付Unix系统,后者用来系统管理和开发CGI脚本。最后,真正非常严肃地把黑客作为人生目标的人,应该考虑学习Lisp:

Lisp很值得学习。你掌握它以后,会感到它给你带来的极大启发。这会大大提高你的编程水平,使你成为一个更好的程序员。尽管在实际工作中极少会用到Lisp。

一般情况是,创业公司要么赢得一切,要么彻底失败。你要么成为富翁,要么一无所获。

如果你掌管创业公司,最好做一些独特的事情,否则就会有麻烦。

在竞争中,你的对手无法理解你的技术优势,这可是再宝贵不过了。商场如战场,对手摸不透你,你的胜算就增加了。

Blub困境

Lisp没有得到广泛使用的原因就是因为编程语言不仅仅是技术,也是一种习惯性思维,非常难于改变。

创业公司的合气道

尽管Lisp语言非常强大,但是我并不期望有谁(超过25岁的人)读完这篇文章就立刻开始学习它。

人类天性变化的速度大大慢于计算机硬件变化的速度,所以编程语言的发展通常比CPU的发展落后一二十年。

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

如果你为创业公司工作,那么这里有一个评估竞争对手的妙招——关注他们的招聘职位。

有些公司的职位描述使用了大量的IT词汇,这样的内容越多,这家公司就越不构成威胁。最不用担心的竞争对手就是那些要求应聘者具有Oracle数据库经验的公司,你永远不必担心他们。如果是招聘C++或Java程序员的公司,对你也不会构成威胁。如果他们招聘Perl或Python程序员,就稍微有点威胁了。至少这听起来像一家技术公司,并且由黑客控制。如果我有幸见到一家招聘Lisp黑客的公司,就会真的感到如临大敌。

13 书呆子的复仇


那些经理奇迹般地同时具备了两种很常见但很难结合在一起的特点:(a)对技术一无所知;(b)对技术有强烈的个人观点。

认为所有语言都一样的看法的缺点是自欺欺人,但是优点是可以使许多事情变得很简单。我想这就是为什么它被广泛接受的主要原因。它是一个令人舒服的想法。

朝着数学的方法发展

1958年,约翰·麦卡锡第一个提出了Lisp语言。我认为,当前最流行的编程语言不过只是实现了他在1958年的想法而已。

简单说,因为这种语言本质上不是一种技术,而是数学。数学是不会过时的。你不应该把Lisp语言与50年代的硬件联系在一起,而是应该把它与快速排序(Quicksort)算法进行类比。这种算法是1960年提出的,至今仍然是最快的通用排序方法。

直到今天,最高级的主流语言也只是刚刚接近Lisp的水平。虽然已经很接近了,但还是没有Lisp那样强大。

为什么Lisp语言很特别

(1) 条件结构(即if-then-else结构)。

(2) 函数也是一种数据类型。

(3) 递归。Lisp是第一种支持递归函数的高级语言。

(4) 变量的动态类型。在Lisp语言中,所有变量实际上都是指针,所指向的值有类型之分,而变量本身没有。复制变量就相当于复制指针,而不是复制它们指向的数据。

(5) 垃圾回收机制。

(6) 程序由表达式组成。Lisp程序是一些表达式树的集合,每个表达式都返回一个值。

(7) 符号类型。符号实际上是一种指针,指向存储在散列表中的字符串。

(8) 代码使用符号和常量组成的树形表示法。

(9) 无论什么时候,整个语言都是可用的。Lisp并不真正区分读取期、编译期和运行期。

语言优势真正体现的地方

Lisp的最大优势体现在编程任务的另一端,就是在激烈竞争的条件下开发那些解决困难问题的复杂程序。

向心力

使用一种不常见的语言会出现的问题我想到了三个:你的程序可能无法很好地与使用其他语言写的程序协同工作;你可能找不到很多函数库;你可能不容易雇到程序员。

到目前为止,大家公认少于10个人的团队最适合开发软件。雇用这样规模的开发团队,只要使用的不是无人知道的语言,应该都不会遇到很大麻烦。

如果你创业的话,千万不要为了取悦风险投资商或潜在并购方而设计你的产品。让用户感到满意才是你的设计方向。只要赢得用户,其他事情就会接踵而来。如果没有用户,谁会关心你选择的“正统”技术是多么令人放心。

随大流的代价

衡量语言的编程能力的最简单方法可能就是看代码数量。

一个诀窍

总的来说,你的经理其实不关心公司是否真的能获得成功,他真正关心的是不承担决策失败的责任。所以对他个人来说,最安全的做法就是跟随大多数人的选择。

如果你想在软件业获得成功,就使用你知道的最强大的语言,用它解决你知道的最难的问题,并且等待竞争对手的经理做出自甘平庸的选择。

14 梦寐以求的编程语言


优秀的语言不一定会被市场接受,很可能无人使用,因为语言的流行不取决于它本身

流行的秘诀

设计编程语言的时候必须考虑到人类的长处和短处,就像设计鞋子的时候必须符合人类的脚型。

达到这一步并非易事。如果说用户数从0到20比从20到1000更困难,我也不会感到惊讶。发展最早的20个用户的最好方法可能就是使用特洛伊木马:你让人们使用一种他们需要的应用程序,这个程序偏巧就是用某种新语言开发的。

外部因素

一种语言必须是某一个流行的计算机系统的脚本语言(scriptinglanguage),才会变得流行。Fortran和Cobol是早期IBM大型机的脚本语言。C是Unix的脚本语言,后来的Perl和Python也是如此。Tcl是Tk的脚本语言,Visual Basic是Windows的脚本语言,(某种形式的)Lisp是Emacs的脚本语言,PHP是网络服务器的脚本语言,Java和JavaScript是浏览器的脚本语言。

如果你想设计一种流行的编程语言,就不能只是单纯地设计语言本身,还必须为它找到一个依附的系统,而这个系统也必须流行。

简洁

黑客都是懒人,他们同数学家和现代主义建筑师一样,痛恨任何冗余的东西或事情。

不要觉得为用户着想就是让他们使用像英语一样又长又啰嗦的语法。

可编程性(Hackability

对于制造工具的人来说,总是会有用户以违背你本意的方式使用你的工具。

一种真正优秀的编程语言应该既整洁又混乱。“整洁”的意思是设计得很清楚,内核由数量不多的运算符构成,这些运算符易于理解,每一个都有很完整的独立用途。“混乱”的意思是它允许黑客以自己的方式使用。

一次性程序

所谓一次性程序,就是指为了完成某些很简单的临时性任务而在很短时间内写出来的程序。

一下子从无到有做出一个大项目是很恐怖的一件事。

开发大型程序的另一个方法就是从一次性程序开始,然后不断地改进。

函数库

函数库的使用应该符合程序员的直觉,让他可以猜得出哪个函数能满足自己的需要。

效率

编程时提高代码运行速度的关键是使用好的性能分析器(profiler)

随着互联网软件的兴起,越来越多的程序主要不是受限于计算机的运算速度,而是受限于I/O的速度。

每台服务器能够支持的用户数量就成了软件业者的关键问题。互联网软件的成本支出就取决于这个指标。

时间

为了避免浪费时间,只有当客户第三次或第四次提出同样的需求时,他才认真对待。

人们真正注意到你的时候,不是第一眼看到你站在那里,而是发现过了这么久你居然还在那里。

新技术被市场接纳的方式有两种,一种是自然成长式,另一种是大爆炸式。

再设计

著名散文家E.B.怀特说过,“最好的文字来自不停的修改”。

任何措施,只要能让“再设计”周而复始地进行下去,就都是可取的。

一般情况下,用户比较少意味着你任何时候都可以加大修改的力度。

梦寐以求的编程语言

它尽可能让你自己定义的部分与它本身定义的部分处于同等地位。这种梦幻般的编程语言不仅开放源码,更开放自身的设计。

15 设计与研究


设计与研究的区别看来就在于,前者追求“好”(good),后者追求“新”(new)。优秀的设计不一定很“新”,但必须是“好”的;优秀的研究不一定很“好”,但必须是“新”的。

可是,让用户满意并不等于迎合用户的一切要求。用户不了解所有可能的选择,也经常弄错自己真正想要的东西。做一个好的设计师就像做一个好医生一样。你不能头痛医头,脚痛医脚。病人告诉你症状,你必须找出他生病的真正原因,然后针对病因进行治疗。

举例来说,不考虑其他因素时,肖像画就是比风景画更能引发观众的兴趣。文艺复兴时期的经典绘画作品都是画人的,这并非巧合。

最后写出来的程序就像已经完成的数学证明一样,是一棵经过精心修剪的树木,上面杂乱滋生的树杈都已经被剪去了。所以,评价一种语言的优劣不能简单地看最后的程序是否表达得很漂亮,而要看程序从无到有的那条完成路径是否很漂亮。

如果你正在设计某种新东西,就应该尽快拿出原型,听取用户的意见。

我的一位美术启蒙老师告诉我:如果你觉得画某样东西很乏味,那么你画出来的东西就会真的很乏味。

先做出原型,再逐步加工做出成品,这种方式有利于鼓舞士气,因为它使得你随时都可以看到工作的成效。

优秀设计的前提是你自己必须喜欢这种产品,否则你不可能对设计有兴趣,更不要说士气高昂了。

本文来自惜文读书笔记(www.xiwen520.com),转载请注明出处
Jordanmax

作者: Jordanmax

惜文读书笔记是面向职场人员的读书笔记网站。为您提供互联网、经营管理、投资理财、教育书籍原文摘录,并且分享职场基本技能、项目管理和产品经理相关知识和经历。

发表评论

电子邮件地址不会被公开。

返回顶部