关于本书
书名 | 《黑客与画家》 | 作者 | Paul Graham美国 |
---|---|---|---|
译者 | 阮一峰 | 出版社 | 人民邮电出版社 |
阅读日期 | 2021.02.06 | 我的评分 | ☆☆☆☆☆ |
内容简介
《黑客与画家》是阮一峰翻译的一本书。总的来说这本书写的非常的好而且翻译的也很好,值得反复阅读,文中的很多观点都值得反复品味。这本书涉及的东西很多,有关于创业的、设计的、编程的、财富的、写作的以及对社会的一些思考等等,我也是前后花了两次才把这本书读完,第一次读,读到一半就不知怎么就戛然而止了,第二次读我选择了最感兴趣的一章(如何创造财富)开始阅读,一读起来就一发不可收拾,一直读到了结尾。然后又从头开始阅读。这本书断断续续读了两个周才读完,其中有些观点总是需要停下来反复阅读才能,品味出作者的思想。 保罗·格雷厄姆本称为硅谷创业之父,文章中非常多的东西都和他本身创业的经历有关,而他关于创业的观点很值的学习和借鉴。
书摘
创业创业
- 运营创业公司,每天都像在战斗;而为大公司工作,就像在窒息中挣扎。
- 我们生活中的一切,都正在成为计算机。所以,如果你想理解我们目前的世界以及它的未来动向,那么多了解一些黑客的想法会对你有帮助。
- 在科技快速发展、资本不断涌入的大背景下,它使得创业公司规模更小、成本更低、行动更快。
- 创业公式是:
(1)搭建原型 (2)上线运营(别管bug) (3)收集反馈 (4)调整产品 (5)成长壮大
- 首先,他鼓励创业公司快速发布产品,因为这样可以尽早知道一个创意是否可行。其次,他认为一定要特别关注用户需要什么,这样才有办法将一个坏项目转变成好项目。
- “Make something people want”(制造用户需要的东西)。
- 一方面,创业是最有效的创造财富的方法,对创始人、对投资者、对社会都是如此。另一方面,创业越来越简单了,成本也越来越低。
- 太麻烦,不如死”(death before inconvenience)。
- “你的电脑”这个概念正慢慢成为过去时,取而代之的是“你的数据”。你应该可以从任何电脑上获取你的数据。或者更准确地说,在任何终端设备上获取你的数据,终端设备不一定是电脑。
- 一般情况是,创业公司要么赢得一切,要么彻底失败。你要么成为富翁,要么一无所获。创业的时候,如果你选择了错误的技术,竞争对手就会一举打败你。
- 如果你掌管创业公司,最好做一些独特的事情,否则就会有麻烦。
- 我首先会看他们的产品有没有一个试用版,然后就去找他们的招聘职位。
- 让用户感到满意才是你的设计方向。只要赢得用户,其他事情就会接踵而来。如果没有用户,谁会关心你选择的“正统”技术是多么令人放心。
- 我有一个朋友,他的客户第一次提出某种需求时,他很少理会。因为他知道人们有时候会想要自己并不真正需要的东西。为了避免浪费时间,只有当客户第三次或第四次提出同样的需求时,他才认真对待。这个时候客户可能已经很不高兴了,但是这至少保证他们提出的需求应该就是他们真正需要的东西。
- 简单重复同一个信息就能解决这个问题。你只需要不停地重复同一句话,最终人们将会开始倾听。人们真正注意到你的时候,不是第一眼看到你站在那里,而是发现过了这么久你居然还在那里。简单重复同一个信息就能解决这个问题。你只需要不停地重复同一句话,最终人们将会开始倾听。人们真正注意到你的时候,不是第一眼看到你站在那里,而是发现过了这么久你居然还在那里。
- 自然成长式会比大爆炸式产生更好的技术,能为创始人带来更多的财富。
生活
- 当工作的专业程度越来越高时,我们就必须接受更长时间的训练。(如今,只要一个青少年读大学,他就要等到21岁或22岁才开始全职工作。)
- 回顾过去,将当代观念与不同时期的古代观念diff一下,你也可以将我们的观念与其他文化的观念diff一下。
- 想要做出优秀作品,你需要一个什么问题都能思考的大脑。尤其是那些似乎不应该思考的问题,你的大脑也要养成思考它们的习惯。
- 一个好的科学家,并不仅仅是避开传统观点,还要努力打破传统观点。
- 智力越高的人,越愿意去思考那些惊世骇俗的思想观点。这不仅仅因为聪明人本身很积极地寻找传统观念的漏洞,还因为传统观念对他们的束缚力很小,很容易摆脱。从他们的衣着上你就可以看出这一点:不受传统观念束缚的人,往往也不会穿流行的衣服。
- 在任何有竞争的地方,只要你能看到别人看不到或不敢看的东西,你就有很大的优势。
- 训练自己去想那些不能想的事情,你获得的好处会超过所得到的想法本身。
- 如果你能“远远地”跳出传统思维,提出让别人一听就脑袋轰一声炸开的惊人观点,那么你就在“小小地”跳出传统思维方面不会有任何困难。
- 在心里无所不想,但是不一定要说出来。
- 守口如瓶,笑脸相迎。
- 如果口无遮拦,你就没时间做正事了。为了与他人论战,你不得不变成一个语言学家,比如诺姆·乔姆斯基。
- 讨论一个观点会产生更多的观点,不讨论就什么观点也没有。
- 时间就是一种产生距离的简单方法。你不仅要远距离观察人群,更要远距离观察你自己。如果你想要清晰地思考,就必须远离人群。但是走得越远,你的处境就会越困难,受到的阻力也会越大,因为你没有迎合社会习俗,而是一步步地与它背道而驰。
- 经济学里有一条拉弗曲线(Laffer curve),认为随着税率的上升,税收收入会先增加后减少。我认为政府的力量也是如此,随着对公民自由的限制不断上升,政府的力量会先增加后减小。
- 统计学过滤器。
- 很难预测一百年后的人类生活,只有少数几件事是可以确定的。那时,汽车将具备低空飞行能力,城市规划的法规将放宽,大楼可以造到几百层,大街上一天到晚看不见太阳,女性个个都学过防身术。
- 父亲教给我什么是怀疑主义,母亲教给我如何发挥想象力。有了这样的母亲,我眼前的世界就从黑白变成了彩色。
设计
- 喜欢一件东西,却不知道为什么自己喜欢它,原因可能是这件东西是美的,
- 好设计是简单的设计。
简短的证明往往是更好的证明。 当你被迫把东西做得很简单时,你就被迫直接面对真正的问题。
- 好设计是永不过时的设计。
如果解决方法是丑陋的,那就肯定还有更好的解决方法,只是还没有发现而已。 以永不过时作为目标是一种帮助自己找到最佳答案的方法:如果你不愿别人的答案取代你的答案,你就只好自己做出最佳答案。 如果你希望自己的作品对未来的人们有吸引力,方法之一就是让你的作品对上几代人有吸引力。
- 好设计是解决主要问题的设计。
- 好设计是启发性的设计。
在建筑学和设计学中,这条原则意味着,一幢建筑或一个物品应该允许你按照自己的愿望来使用。举例来说,一幢好的建筑物应该可以充当平台,让你想怎么布置就可以怎么布置,过上自己想过的家庭生活,而不是使得你像执行程序一样只能过上建筑师为你安排的生活。在软件业中,这条原则意味着,你应该为用户提供一些基本模块,使得他们可以随心所欲自由组合,就像玩乐高积木那样。在数学中,这条原则意味着,一个可以成为许多新工作基础的证明要优于一个难度很高、但无助于未来学科发展的证明。在科学领域中,总体上可以把引用次数看作对他人启发性大小的粗略指标。
- 好设计通常是有点趣味性的设计。
幽默感是强壮的一种表现,始终拥有幽默感就代表你对厄运一笑了之,而丧失幽默感则表示你被厄运深深伤到。 强壮的标志(或者至少是特点)就是轻松面对自己的人生。充满自信的人常常像燕子一样,以一种居高临下的姿态轻盈地看待周围的一切。
- 好设计是艰苦的设计。
如果你工作得不艰苦,你可能正在浪费时间。 困难的问题需要艰巨的付出才能解决,高难度的数学证明需要结构非常精细的解决方法(它们往往做起来很有趣),工程学也是如此。 并非所有的痛苦都是有益的。世界上有有益的痛苦,也有无益的痛苦。你需要的是咬牙向前冲刺的痛苦,而不是脚被钉子扎破的痛苦。 在困难地点或预算不足的条件下,建筑师就只能做出很简练的设计。 如果开发“功能”非常艰难,那么“形式”将不得不全部都由“功能”决定,因为没有多余的精力再来单独开发“形式”了。人们常常觉得野生动物非常优美,原因就是它们的生活非常艰苦,在外形上不可能有多余的部分了。
- 好设计是看似容易的设计。
作家的文章读起来流畅自如,但是背后其实经过了反复修改。 科学和工程学的一些最重大的发现在形式上往往很简单,会科学和工程学的一些最重大的发现在形式上往往很简单,会使得你觉得自己也想到过。可是,如果它真的那么简单,为什么发现人不是你呢?使得你觉得自己也想到过。可是,如果它真的那么简单,为什么发现人不是你呢? 在大多数领域,看上去容易的事情,背后都需要大量的练习。练习的作用也许是训练你把刻意为之的事情变成一种自觉的行为。
- 好设计是对称的设计。
对称也许只是简洁性的一种表现。 对称有两种:重复性对称和递归性对称。递归性对称就是指子元素的重复,比如树叶上叶脉的纹路。 在写作中,你会发现对称无处不在,短语、句子、小说的情节都是如此。音乐和美术也大量使用对称。拼接式的美术作品(还有塞尚的一部分作品)有非常强烈的视觉感染力,原因就是整幅作品由相同的作图元素构成,这也属于对称。在数学和工程学中,递归尤其有用。归纳式证明方法既简洁又美妙。在软件中,能用递归解决的问题通常代表已经找到了最佳解法。巴黎的埃菲尔铁塔如此引人注目,部分原因就是它的外形是递归的,大塔上面还有小塔。 对称的危险在于它可以用来取代思考,在大量使用重复的时候这种危险性更大。
- 好设计是模仿大自然的设计。
如果你的设计与大自然很接近,那么它基本上不会很差。 模仿大自然也是工程学的有效方法。
- 好设计是一种再设计。
专家的做法是先完成一个早期原型,然后提出修改计划,最后把早期原型扔掉。 你应该培养对自己的不满。 做修改的时候,有一个合适的工具会使得改动更容易。犯错误是很正常的事情。你不要把犯错看成灾难,要勇于承认、勇于改正。
- 好设计是能够复制的设计。
最后他会意识到,把事情做对比原创更重要。 如果你不知道自己的想法从何而来,那么你可能就是在模仿另一个模仿者。 等到你逐渐对一件事产生热情的时候,就不会满足于模仿了。你的品味就进入了第二阶段,开始自觉地进行原创。
- 好设计常常是奇特的设计。
爱因斯坦并不想让相对论变得很奇特,他只想找出真理,是真理本身显得很奇特。 如果你想做出好作品,不可避免地会采用一种独特的方式,就好像每个人走路的姿势其实都不尽相同。 唯一达到“奇特”的方法,就是追求做出好作品,完成之后再回过头看。
- 好设计是成批出现的。
推动人才成批涌现的最大因素就是,让有天赋的人聚在一起,共同解决某个难题。互相激励比天赋更重要,达·芬奇之所以成为达·芬奇,主要原因不仅仅是他的天赋,更重要的是他生活在当时的佛罗伦萨,而不是米兰。 在历史的任何时刻都有一些热点项目,一些团体在这些项目上做出伟大的成绩。如果你远离这些中心,几乎不可能单靠自己就取得伟大成果。某种程度上,你个人最多可以对趋势产生一定的影响,但是你不可能决定趋势,实际上是趋势决定了你。
- 好设计常常是大胆的设计。
如果你想做出伟大的新成果,那就不能对常识与真理不相吻合之处视而不见,反而应该特别注意才对。 哥白尼对地心说无法解释的事情深感困扰,他的同时代人都觉得这可以忍受,他却认为一定能找到一种更好的解释。 单单是无法容忍丑陋的东西还不够,只有对这个领域非常熟悉,你才可能发现哪些地方可以动手改进。 只有在成为某个领域的专家之后,你才会听到心里有一个细微的声音说:“这样解决太糟糕了!一定有更好的选择。” 优秀作品的秘诀就是:非常严格的品味,再加上实现这种品味的能力。
- 设计与研究
设计与研究的区别看来就在于,前者追求“好”(good),后者追求“新”(new)。优秀的设计不一定很“新”,但必须是“好”的;优秀的研究不一定很“好”,但必须是“新”的。我认为这两条道路最后会发生交叉:只有应用“新”的创意和理论,才会诞生超越前人的最佳设计;只有解决那些值得解决的难题(也就是“好”的难题),才会诞生最佳研究。所以,最终来说,设计和研究都通向同一个地方,只是前进的路线不同罢了。 优秀的建筑师不会先设计,然后强迫用户接受,而是先研究最终用户的需求,然后做出用户需要的设计。 我觉得任何一个领域的最佳作品都不可能由对用户言听计从的人做出来。 让用户满意并不等于迎合用户的一切要求。用户不了解所有可能的选择,也经常弄错自己真正想要的东西。 做一个好的设计师就像做一个好医生一样。你不能头痛医头,脚痛医脚。病人告诉你症状,你必须找出他生病的真正原因,然后针对病因进行治疗。大多数优秀设计都是这样产生的,它们关注用户,并且以用户为中心。 我觉得,除非设定目标用户,否则一种设计的好坏根本无从谈起。
财富
- 允许赚到大钱的人保住自己的财富。只要懂得藏富于民,国家就会变得强大。让书呆子保住他们的血汗钱,你就会无敌于天下。
- 我们大多数人都在为其他人创造财富,然后用创造出来的财富交换金钱,再用金钱交换我们需要的另一种财富。
- 如果你需要什么东西,要么你自己做出来,要么做其他东西与需要的人交换金钱,再用金钱去买你想要的东西。
- 每个人的技能不同,导致收入不同,这才是贫富分化的主要原因,正如逻辑学的“奥卡姆剃刀”原则所说,简单的解释就是最好的解释。
- 一个人的工作具有多少价值不是由政府决定的,而是由市场决定的。
- 人与人之间的差别并不是那么稳定的线性关系。
- 中产阶级的出现使得财富总量不再是一个固定不变的值,财富的分配也不再是一种零和游戏。
- 技术应该会引起收入差距的扩大,但是似乎能缩小其他差距。一百年前,富人过着与普通人截然不同的生活。他们住在大房子里,有许多仆人服侍,穿着华丽但是不舒适的服装,乘着马车旅行(因此还有马厩和马夫)。现在,由于技术的发展,富人的生活与普通人的差距缩小了。
- 技术无法使其变得更便宜的唯一东西,就是品牌。
- 今天的人们多多少少还是有一些互相隔离的趋势,但主要是因为教育层次的差别,而不是财富的差别。
- 你要避免的是绝对贫穷,而不是相对贫穷。
编程
- 任何一种艺术,不管是否重要,如果你想要在该领域出类拔萃,就必须全身心投入。
- 创造优美事物的方式往往不是从头做起,而是在现有成果的基础上做一些小小的调整,或者将已有的观点用比较新的方式组合起来。
- 你把整个程序想清楚的时间点,应该是在编写代码的同时,而不是在编写代码之前,这与作家、画家和建筑师的做法完全一样。
- 编程语言是用来帮助思考程序的,而不是用来表达你已经想好的程序。它应该是一支铅笔,而不是一支钢笔。
- 大学和实验室强迫黑客成为科学家,企业强迫黑客成为工程师。
- 真正竞争软件设计的战场是新兴领域的市场,这里还没有人建立过防御工事。只要你能做出大胆的设计,由一个人或一批人同时负责设计和实现产品,你就能在这里战胜大公司。
- 如果你想赚钱,你可能不得不去干那些很麻烦很讨厌的事情,因为这些事情没人愿意义务来干。价格是由供给和需求共同决定的。好玩的软件的需求量,比不上解决客户麻烦问题的软件的需求量。
- 黑客可以通过观看优秀的程序学会编程,不是看它们的执行结果,而是看它们的源代码。
- 一幅画是逐步完成的。通常一开始是一张草图,然后再逐步填入细节。你不能盼望先有一个完美的规格设计,然后再动手编程,这样想是不现实的。
- 过早优化(premature optimization)是一件危险的事情。我认为,我们应该对“过早设计”(premature design)也抱有同样的担忧,不要太早决定一个程序应该怎么做。
- 最容易修改的语言就是简短的语言。
- 坚持一丝不苟,就能取得优秀的成果。
- 我对待代码的认真程度远远超过我对待其他事情。
- 为了做出优秀的工作,你必须把这种心理周期考虑在内。
- 正确的合作方法是将项目分割成严格定义的模块,每一个模块由一个人明确负责。模块与模块之间的接口经过精心设计,如果可能的话,最好把文档说明写得像编程语言规范那样清晰。
- 现实中,这必然意味着你要做其他人需要的事情,而不是你自己想做的事情。
- 为了吸引用户,你必须理解用户需要什么。
- 判断一个人是否具备“换位思考”的能力有一个好方法,那就是看他怎样向没有技术背景的人解释技术问题。
- 源代码也应该可以自己解释自己。
- 程序写出来是给人看的,附带能在机器上运行。
- “换位思考”不仅是为了你的用户,也是为了你的读者。这对你是有利的,因为你也会读自己写的东西。
- 一种新的媒介刚刚诞生的时候,人们热情高涨、兴奋不已,短短几代人就探索清楚了这种媒介的大部分可能性,把它的能量发挥到极致。
- 不同的语言适合不同的任务,你应该根据不同场合,挑选最合适的工具。
- 软件的发布过程可以分解为一系列的渐进式修改,而不是猛地推出一个大幅变动的版本。
- 在发布之前,你应该对修改之处进行测试,避免出现重大的bug。
- 解决新代码的bug要比解决历史遗留代码的bug容易。
- 有一种编程方法叫做“函数式编程”(functional programming),它对你会有帮助,可以避免一些副作用。
- Viaweb的开发人员总是与客服人员保持密切联系。客服人员坐在距离程序员只有9米的地方,知道自己可以随时打断程序员的工作,提交新证实的bug的报告。遇到重大bug,我们就算在开董事会,也会马上回来修改程序。
- 我们的这种方法让所有人都感到满意。客户很高兴,拨打厂商服务热线是免费的,而且还被当作通风报信的人,受到郑重对待。客服人员也喜欢这样,因为这使得他们可以帮助用户,而不是对着用户读操作手册;程序员喜欢这样,因为他们能够再现bug,而不是通过模糊不清的二手报告了解bug。
- 通过归纳法我们就会知道,唯一洞悉所有语言优劣的人必然是懂得最强大的那种语言的人。
- 一个技巧就是(在语言允许的前提下)使用“自下而上”(bottom-up)的编程方法。
- 你不是用基础语言(base language)开发应用程序,而是在基础语言之上先构建一种你自己的语言,然后再用后者开发应用程序。
- “自下而上”的编程往往也便于修改,因为许多时候你自己添加的中间层根本不需要变化,你只需要修改前端逻辑就可以了。
- 编程语言的所谓“业界最佳实践”,实际上不会让你变成最佳,只会让你变得很平常。
- 设计一样东西,最重要的一点就是要经常“再设计”,编程尤其如此,再多的修改都不过分。
为了写出优秀软件,你必须同时具备两种互相冲突的信念。一方面,你要像初生牛犊一样,对自己的能力信心万丈;另一方面,你又要像历经沧桑的老人一样,对自己的能力抱着怀疑态度。 在你的大脑中,有一个声音说“千难万险只等闲”,还有一个声音却说“早岁哪知世事艰”。 你的乐观主义和怀疑倾向分别针对两个不同的对象。你必须对解决难题的可能性保持乐观,同时对当前解法的合理性保持怀疑。 在创新活动的第一阶段,你不知疲倦地猛攻某个难题,自信一定能够解决它。到了第二阶段,你在清晨的寒风中看到自己已经完成的部分,清楚地意识到存在各种各样的缺陷。 只要你对自己的怀疑没有超过你对自己的信心,就能够坦然接受这个半成品,心想不管多难我还是可以把剩下的部分做完。 任何措施,只要能让“再设计”周而复始地进行下去,就都是可取的。文章可以修改到你满意为止,但是软件的修改通常来说可以无休止地进行下去。 用户是一把双刃剑。他们推动语言的发展,但也使得你不敢对语言进行大规模改造。 一开始的时候要精心选择用户,避免使用者过快增长。发展用户就像一种优化过程,明智的做法就是放慢速度。 如果用户数量庞大,修改语言带来的痛苦就将持续很长时间。 将软件内部的接口设计成垂直接口而不是水平接口。 软件内部的模块是一个个垂直堆积起来的抽象层,层与层之间的接口完全由其中的一层控制。如果较高的一层使用了较低的一层定义的语言,那么接口就由较低的一层控制;如果较低的一层从属于较高的一层,那么接口就由较高的一层控制。 为了做出优秀的设计,你必须贴近用户,始终寸步不离,永远站在用户的角度调整自己的构想。 软件领域,贴近用户的设计思想被归纳为“弱即是强”(Worse is Better)模式。其中有一点是正确的,那就是如果你正在设计某种新东西,就应该尽快拿出原型,听取用户的意见。还有另一种软件设计思想,也许可以被称为“万福玛丽亚”模式。它不要求尽快拿出原型,然后再逐步优化,它的观点是你应该等到完整的成品出来以后再一下子隆重地推向市场,就像圣母玛丽亚降临一样,哪怕整个过程漫长得像橄榄球运动员长途奔袭、达阵得分也没有关系。 你真正应该采用的方法是快速地用几根线画出一个大致准确的轮廓,然后再逐步地加工草稿。在大多数艺术领域,原型使用的材料与成品的材料一般来说是不一样的。印刷活字先画在纸上,然后才做成铅字。雕塑先用石蜡创作,然后才用青铜浇铸。地毯图案先用墨水画出纸型,然后才织成地毯。建筑物先做出木模型,然后才做成石头建筑。 软件开发也可以这样做。原型(prototype)并不只是模型(model),不等于将来一定要另起炉灶,你完全能够在原型的基础上直接做出最后的成品。我认为,只要有可能,你就应该这样做。这样的方式使得你可以利用在开发过程中一路产生的新想法。不过更重要的是,这样做有助于鼓舞士气。 如果你觉得画某样东西很乏味,那么你画出来的东西就会真的很乏味。 大多数画家都是先画一个草图,然后再逐步加工。 你每天收工的时候都可以看到整体的效果,不会对最后的成品一点感觉都没有。 画作永远没有完工的一天,你只是不再画下去而已。 优秀设计的前提是你自己必须喜欢这种产品,否则你不可能对设计有兴趣,更不要说士气高昂了。
编程语言
- 一个操作所需的代码越多,就越难避免bug,也越难发现它们。
- 程序员的时间要比计算机的时间昂贵得多,后者已经变得很便宜了。
- 你用什么语言并不重要,重要的是你对问题是否有正确的理解。代码以外的东西才是关键。
- 你应该使用允许你面向对象编程的语言。
- 冗余的代码会导致更多冗余的代码。一件垃圾会产生更多的垃圾。
- 内核最小、最干净的编程语言才会存在于进化的主干上。一种语言的内核设计得越小、越干净,它的生命力就越顽强。
- 语言只是一种书写法,而程序则是一种严格符合规则的描述,以书面形式记录计算机应该如何解决你的问题。
- 随着技术的发展,每一代人都在做上一代人觉得很浪费的事情。
- 浪费可以分成好的浪费和坏的浪费。我感兴趣的是好的浪费,即用更多的钱得到更简单的设计。
- 一百年后的程序员最需要的编程语言就是可以让你毫不费力地写出程序第一版的编程语言,哪怕它的效率低下得惊人(至少按我们今天的眼光来看是如此)。
- 一种让程序员做无用功的语言才真正称得上很烂。浪费程序员的时间而不是浪费机器的时间才是真正的无效率。
- 一种效率低得不可想象的语言遇到了性能强大得不可想象的硬件,会发生什么事。
- 根据经验判断,每增加一个解释层,软件的运行速度就会慢一个数量级。但是,多余的软件层可以让编程灵活起来。
- 自下而上的编程方法意味着要把软件分成好几层,每一层都可以充当它上面那一层的开发语言。
- 这种方法往往会产生更小、更灵活的程序。它也是通往软件圣杯——可重用性(reusability)——的最佳路线。
- 面向对象编程使得你有办法对面条式代码进行可持续性开发。通过不断地打补丁,它让你将软件一步步做大。
- 程序运行速度提升的关键在于开发出能够生成更快速代码的编译器。
- 新语言更多地以开源项目的形式出现,而不是以研究性项目的形式出现。
- 也许不能说最短的程序就是写起来最省力的程序,但是当你一心想把程序写得简洁而不是松松垮垮时,你就更接近省力这个目标,你的日子也会变得好过得多。
- 当你设计语言的时候,心里牢牢记住这个目标是有好处的。学习开车的时候,一个需要记住的原则就是要把车开直,不是通过将车身对齐画在地上的分隔线,而是通过瞄准远处的某个点。即使你的目标只在几米开外,这样做也是正确的。我认为,设计编程语言时,我们也应该这样做。
- 为什么Lisp语言很特别
- 条件结构
- 函数也是一种数据类型。数与整数或字符串一样,也属于数据类型的一种
- 递归
- 变量的动态类型
- 垃圾回收机制
- 程序由表达式组成
- 符号类型
- 代码使用符号和常量组成的树形表示法
- 无论什么时候,整个语言都是可用的
用一门语言自己的数据结构来表达该语言是非常强大的功能 思想(8)和思想(9),意味着你可以写出一种能够自己编程的程序。
- 所有这些语言都是图灵等价的,这意味着严格地说,你能使用它们之中的任何一种语言写出任何一个程序。
- “格林斯潘第十定律”(Greenspun’s Tenth Rule):
任何C或Fortran程序复杂到一定程度之后,都会包含一个临时开发的、只有一半功能的、不完全符合规格的、到处都是bug的、运行速度很慢的Common Lisp实现。
当我在自己的程序中发现用到了模式,我觉得这就表明某个地方出错了。程序的形式应该仅仅反映它所要解决的问题。代码中其他任何外加的形式都是一个信号,(至少对我来说)表明我对问题的抽象还不够深,也经常提醒我,自己正在手工完成的事情,本应该写代码通过宏的扩展自动实现。
- 一种语言必须是某一个流行的计算机系统的脚本语言(scripting language),才会变得流行。
Fortran和Cobol是早期IBM大型机的脚本语言。C是Unix的脚本语言,后来的Perl和Python也是如此。Tcl是Tk的脚本语言,Visual Basic是Windows的脚本语言,(某种形式的)Lisp是Emacs的脚本语言,PHP是网络服务器的脚本语言,Java和JavaScript是浏览器的脚本语言。 “编程”其实是及物动词,黑客一般都是为某个系统编程,在现实中,编程语言总是与它们依附的系统联系在一起的。 编程语言还应该有在线文档。事实上,在线文档可以当作一本书来写,但是目前它还无法取代实体书。实体书并没有过时,它们读起来很方便,而且出版社对书籍内容的审核是一种很有用的质量保证机制(虽然做得很不完美)。 黑客欣赏的一个特点就是简洁。黑客都是懒人,他们同数学家和现代主义建筑师一样,痛恨任何冗余的东西或事情。 只要计算机可以自己推断出来的事情,都应该让计算机自己去推断。编程语言的进步很大一部分与函数库有关。函数库的使用应该符合程序员的直觉,让他可以猜得出哪个函数能满足自己的需要。
- 我们在Viaweb搞了一块很大的面板,上面有各种各样的仪表盘,用来显示服务器的状况。
- 怎么理解编程语言?你不要把它看成那些已完成的程序的表达方式,而应该把它理解成促进程序从无到有的一种媒介。某种设计使得最后的程序非常漂亮,但是不一定同时具备漂亮的编程过程。
梦寐以求的编程语言
- 这种语言有大量优秀的范例可供学习,而且非常符合直觉,你只需花几分钟阅读范例就能领会应该如何使用此种语言。
- 这种语言的内核很小,但很强大。各个函数库高度独立,而且和内核一样经过精心设计,它们都能很好地协同工作。语言的每个部分就像精密照相机的各种零件一样完美契合,不需要为了兼容性问题放弃或者保留某些功能。
- 这种语言以层的方式构建。较高的抽象层透明地构建在较低的抽象层之上。如果需要的话,你可以直接使用较低的抽象层。
- 除了一些绝对必要隐藏的东西,这种语言的所有细节对使用者都是透明的。它提供的抽象能力只是为了方便你的开发,而不是为了强迫你按照它的方式行事。
写作
- 构思这种东西有一个特点,那就是它会导致更多的构思。你有没有注意过,坐下来写东西的时候,一半的构思是写作时产生的?软件也是这样。写作
- 拉丁语无助于你找工作(也许古典文学教授的工作除外),但是它可以训练你的思维,帮助你更好地运用母语(比如英语)进行写作。
- 最好的文字来自不停的修改。
读后感
我还没想好。 永远保持质疑。 打草稿,使用好 Git。 按模块划分任务,然后每个模块直接通过接口交互。 内卷化,限制增长、只能内部竞争。 分层、分模块、分组件⇒重用。 经常“再设计”