返回
Featured image of post 《黑客与画家》读书笔记

《黑客与画家》读书笔记

并不直接教导技术,而是讨论开发前的思考和外界的影响

《黑客与画家》读书笔记


一、黑客与画家(程序)

创造与迭代

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

我的想法:MuseDash 就是基于音游的基础上简化了操作,添加了美术修饰。

编程是"打草稿"

对于编程,我一直都想写什么就写什么。书上说"先设计好再实践",那种方法对我来说完全无法理解,这导致我很长一段时间都有一种"总是学不会"的感觉。后来我才发现,我的这种行为是有名字的:打草稿。只有在你实际编写的时候,你才知道整个程序需要什么。

公司里的黑客

公司的普遍情况:将黑客当作技工,所需要完成的是将产品经理的构想翻译为代码。

管理层甚至很难正确识别应该将软件设计的任务交给谁,大部分公司会将其交给一个委员会。

设计、大公司与创业

如果有一天你想赚大钱就记住上面这一点。创业公司能成功的原因之一,就是因为大公司会选择避免设计上的灾难,从而降低了设计结果的标准差。但当你排斥差异的时候,你不仅将失败的可能排除在外,其中也排除了成功的可能。而大公司只要结果不是特别烂,都能赢。

但是你很难单靠软件设计就跟大公司拼,比如你能写出比 Microsoft 更好用的 Word 工具,但别人对操作系统的市场是完全垄断的,甚至注意不到你的存在。

真正竞争软件设计的战场是新兴领域的市场,这里没人建立过防御工事,只要你够大胆地设计,你就能在这里战胜大公司。

做自己喜欢的事

黑客如何才能做自己喜欢的事情呢?这个问题的解决方案几乎所有创作者都知道:找一份养家糊口的"白天工作"。这几乎是所有创作者都会使用的方法,它经过了验证。

作者的公司比较关注你会不会做开源项目,主要关注的是你在业余时间做了什么。如果你不爱一件事,就不能将它做得真正优秀;如果你很热爱编程,那你就不可避免地会去开发自己的项目。

向画家学习

创作者可以参考一下画家的做法:画家保留每一幅作品,你几乎能对比看到某些技术的雏形。对于黑客也是,应该定期从头开始,不要长年累月地在一个项目上不断工作。

程序员也可以通过观看优秀的程序学会编程——不是看执行结果,而是看源代码。

边做边改,不必过早优化

绘画的过程是逐步完成的,你可能会先从一个草图入手,再逐步填充细节。这个过程会发现某些地方原本的预想是错的,这个时候你就要去更改。编程也一样,你不能期望有一个完美的规格设计再动手编程。边做边改,才是正确的思路。不必过早优化。

细节与坚持

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

工作的心理周期

工作是有心理周期的:有时候你愿意为一个新项目工作 16 个小时,过一阵你又觉得百无聊赖。你必须将这种心理周期考虑在内,才能根据不同的事情找到不同的应对方式。在你厌倦的时候,再去做那些比较容易的工作,是一个不错的主意。

对于编程而言,这可以意味着你暂时把 Bug 留到后面再解决——只有这个时候,编程才会变得接近机械。

多人合作的正确模式

当多个画家同时创作一幅作品的时候,你往往找不到某一部分是两个人一起画的。所以我认为:多人合作是软件的正确模式,但不要"合"过头。如果每个人都往同一个代码块开发,它就会变得像公用杂物间,没人管理。

正确的合作方法是将代码分割成严格定义的模块,每个模块由一个人明确负责。模块与模块之间的接口经过精心设计,如果可能的话,最好把文档说明写得像编程语言规范那样清晰。

换位思考

从他人的角度思考问题看上去似乎对自己不利,但这正是成功的奥秘所在。这并不意味着你要做自我牺牲,实际上这完全是两码事。了解他人对事情的看法,并不意味着你要为他的利益服务。

判断一个人是否具备"换位思考"能力有个好方法:看他如何向没有技术背景的人解释技术问题。某个角度而言,你得预想你的用户用你的软件时完全是一无所知的,你必须让软件的使用符合用户直觉。

程序的核心原则

如果我只能让别人记住一句关于编程的名言,那就是《计算机程序的构造和解释》:

程序必须写得能够供人们阅读,偶尔供计算机执行。

这不仅仅为了用户,也为了你的读者,或者有时候你就是那个读者。只有在那些不太成熟、容易出问题的地方才需要加上注释,让读者注意——就好像只有在急转弯处才需要警示标志一样。


二、不能说的话(真话)

祸从口出

本书本节的主题:找出自己错误的方法。

要是能坐上时间机器回到过去,不管什么年代,都有一件事情不会改变:祸从口出。

你一定要注意自己说的话,自以为无害的言论会给你惹来大麻烦。就像如果你在 17 世纪说地球是圆的——伽利略就是这样被宗教法庭审判了。

社会压力的荒谬

有时候会有人跟你说:“根据社会需要,改造自己思想。“如果你不认同社会,那就是你的问题。这根本毫无道理,甚至"只要不符合社会就是错的"还会造成历史倒退。如果你连想都不想,那才会出现真问题。

找出"不能说的话"的方法

我们可以观察周围的人因为说了什么而陷入麻烦,当然要符合两个条件:

  1. 这些话是不能说出口的;
  2. 它们是正确的,或者看起来正确、需要讨论。

如果不满足第二点,你倒是会很顺利,因为你说"2 + 2 等于 5"是不会有事的。最令人暴跳如雷的言论,就是那些说出来的真相。比如伽利略说地球围绕太阳转,这个性质就很特殊了,因为教廷知道这会引发人们的思考。

为了找出那些"不能说出口的话”,我们可以问自己:它是不是真的?如果你发现某些言论很可疑,你可以试着考虑一下真伪。

方法一:观察"不赞成但又不算错"的贬义标签

观察人们怎么称呼自己不赞成但是又不算错的观点,就可以找到另一种"不能说的话”。比如当代的"有伤风化";一战停战时德国将军称所有政治对手都是"失败主义者"来攻击对手;比如现在不分对错就说对方"种族问题不敏感"。

实际上,最先从你脑海里冒出来的问题,往往是最困扰你的、很可能为真的想法。你注意到了,但是没有认真思考过。

方法二:对比古代观念与其他文化

我们甚至可以找古代观念对比一下。很多你以为古人不懂,其实不是——只是因为你们的世代不一样。他们跟我们一样也是有情有理,并不只是野蛮。我们可以对比一下差异:古人觉得可以说,你觉得不可以说,你就能断定你比较聪明吗?

甚至不需要参照历史,看看不同文化也可以做到。比如哈佛曾在政治正确潮流中鼓励人们不要去表扬其他人的衣着,但这整个历史都没有。我们便可以认为这个"禁忌"只存在于那个世代的哈佛,这就是他们那里不能说的话。

方法三:观察卫道者

还有一个寻找"不能说的话"的方法:尝试去找那些一本正经的卫道者,看看他们到底在捍卫什么。

方法四:研究禁忌的产生机制

我们还可以观察禁忌是怎么产生的。如果我们能够理解它的产生机制,可能就能应用于我们自己的时代。一般而言,流行观念跟潮流不一样,它们往往是人造的、被刻意使用的。如果有些观点我们不能说出口,很有可能就是某些团体不允许我们说。

一般而言你会发现,这些团体不会太强大(比如美国就完全不管舆论怎么说的),同时又不会太弱以至于无法推行。它们会略强大于对手,同时需要"禁忌"来保护自己的利益。

你可以试着预测:哪个团体势力大,却又精神紧张?它们喜欢压制怎样的观点?近来有没有社会斗争?但是这样找"不能说的话"会不全面,因为有些禁忌不是社会斗争形成的。

找"不能说的话"的意义

找这种话只是为了避错,同时也锻炼自己去寻找真正的问题。达尔文也不得不小心翼翼,因为他只想当生物学家。

做异端是有回报的,不仅科学领域,所有领域都是。看别人看不到的、或者不敢看的,你就有很大优势。

有些优秀的公司往往不会因为别人赞扬而觉得自己很好。我们也可以通过"对负面评价的容忍"来判断——一般优秀的企业会认为不是自己做得好,而是别人做得太差了。

守口如瓶

然后怎么做呢?发现了这些"不能说的话"之后,就是别说!

自由思考比畅所欲言更重要,毕竟你没有必要跟傻瓜辩论——你也会变成傻瓜的。你可以在心里无限制地想,但是要将其与现实划下界限。守口如瓶确实看上去有点"懦夫",但是如果你口无遮拦,那么你根本没有心思或者时间去做正事了,全浪费在与人论战上了。

但这也不是毫无缺点:你失去了讨论带来的好处。所以你最好找一些信得过的知己——一个让你畅谈"异端邪说"并且不会因此气急败坏的人,这才是你最该认识的朋友。

应对策略

别被拖着走

你的策略应该是不赞同任何一种歇斯底里的行为,但又不明确告诉别人你不赞同哪一种。

有些狂热分子会尝试引诱你说出真心话,但你可以不回答。非要抓着你就"既不赞成也不反对"。不过更好的回答是"我还没想好"。一般而言,问题很复杂的时候,马上说出你的想法没有任何好处。

[!ad-info] 别这样做 比如你对目前的管理不满意,你不要指出确切存在的事物,比如谁谁谁被管得很严、谁谁谁被针对。这样很容易让对手抓住把柄,声称你并不是想要反对管理,你只是支持你说到的谁谁谁。 你反对审查制度,就不要提到具体的某个游戏名字,不然对方就会声称你支持的不是自由,而是那些被审查的内容。

你不要直接攻击某个具体标签,要去攻击"元标签",即那个标签的抽象描述。(此处不理解,或许需要讨论。)

隐喻

最直观的理解就是目前微博的有些漫画:全程一个目标人物都没提到,但所有看的人都知道说的是谁。这就是隐喻,对方基本无法直接根据你表达的内容攻击你。

幽默:最好的反击

狂热分子基本都有一个特点:缺乏幽默。比如某个时刻,大家都在笑话"怎么有人这样做",某些人就真的觉得他们被笑话了。“你怎么那么蠢啊?“某些人就真认为别人是真的在笑他蠢——因为他太看重这些了,为之狂热。

永远质疑

不管问谁,大家都会说:“我们心态很开放的,我们愿意接受新思想。“但实际上,脑子里早就有一条线认为什么是对的、什么是错的。换而言之,除了错的都可以讨论。

这是很难的:你考试不会就是不会,但你观念保守,你意识不到的。只有保持一定的距离(时间也是距离),才能观测到人们的观念变化,发现流行的是什么(也就是人们自认为正确的是什么)。

想要摆脱流行,就必须有自觉,要尽可能远离人群,观察正在发生的事情。

通过标签发现

各种各样的标签可能是外部线索的最大来源,帮助你发现这个时代流行的是什么。

如果一个观点是错的,就不需要其他标签也足以有足够的理由批判它。但是,如果一个命题不是错的,却被人加上各种标签进行压制和批判,那就很能说明问题了。

比如:有些话说出来后,会被认为是"XX 分子”、“XX 主义”,那就是明确的信号,表明背后有问题。

自查

如果你发现你自己也在用这些标签,就更要问问为什么了。你不仅要远距离观察人群,也要远距离观察你自己。

这不是很激进的想法,成年人和小孩子的差别就在这里:成年人能自审,而不是像小孩子一样不知道为什么就情绪大变。

但是越清晰思考,就必须越远离人群,而远离人群你就会受阻——因为你没有迎合社会习惯,而是背道而驰。如果自己就是潮水的一部分,怎么能看见潮流的方向呢?

所以,保持质疑。


三、良好的坏习惯

不服从管教,其实是黑客成为优秀程序员的原因之一。这是因为黑客需要不同寻常的角度和手段去发现、解决问题。但总有人假装自己是黑客,这种"装"实际上会延缓创新。

不按部就班,去寻找新的角度、优雅地解决问题,才是正确的黑客。

对适当的不服从管教保持宽容,这不会有太大的坏处,反而有利于造就优势。

黑客通常很自负,而很自负的人必须培养出敏锐的感觉,及时发现周围情势的变化,才能知道如何脱身。

为什么黑客比其他人还在乎公民自由?

公民自由不仅是社会制度的装饰品,它能让国家富强。

为什么?如果你将 GDP 和公民自由度联系在一起就知道了。在我看来,一个人如果拥有言论自由和行动自由,往往最有可能采取最优的方案,而不是权势提出的方案。专制国家会变成腐败国家,再变成贫穷国家,再变成弱小国家。

可以参考一下拉弗曲线(一个半圆,x 轴为税率,y 轴为税收):随着税率上升,税收会先增加后减少。我认为政府的力量也是如此。但是税率虽然可以后来下调,一旦酿成大错、形成了极权主义就完蛋了——这跟毒瘾一样,难以拔除。

黑客似乎远远地察觉到了这一点:美国因为自由而壮大,却很有可能因为限制自由而自断后路。黑客就好像动物,远远察觉到了可能来临的暴风雨。

可以想象美国为什么强大:开国元勋说要保持"反抗政府的精神”。他们的直率,让不自信的继承者感到惭愧。


四、另一条路(开发方向)

找到下一个潮流

我们会为以前的人忍受的困难而感到惊叹。比如以前汽车出现没多久,你想成为车主就得成为汽车专家。而现在,计算机也是。

就好像有些人就是用电脑来收发邮件和做其他小事情,他们根本不需要了解什么计算机系统版本、什么新系统之类的。但在以前乃至今日,这样的情况依然存在。

现在则诞生出一个解决方案:互联网软件——软件跑在服务器上,浏览器做操作界面。那么上述那些人实际上不需要电脑,他们或许只需要一个设备去跑浏览器。

大部分人总是会选择最省事的做法,就像现在小程序比 APP 好,一定是因为赢在方便上:这无论是对用户还是开发者。

还是以小程序为例:小程序修 Bug 快,数据都存云端,升级简单,不用安装,这就是优势。只是开发这边要承担的压力和责任会更大一些,比如数据存储安全、服务是否正常等。而且即使病毒也更难直接伤害到互联网软件——可以参考一些全部逻辑都跑在服务器上的游戏,它们的外挂也更难开发。

别被常规观念牵制住。比如国内很多公司用 Java 写后端之类的,但实际上现在的硬件非常厉害,你想用什么语言就用什么语言。你应该根据实际需求去做,毕竟各类语言各有其优势和劣势,你要占据优势去击败你的对手。

互联网软件甚至没有版本号,有什么问题就当场维修。你有问题跑不了,就发布不了新版本,但不存在桌面软件那种"版本"的约束。媒体倒是很喜欢盯着版本号宣传,所以这时候用版本号做宣发倒是不错,虽然实际上你的互联网应用根本不需要。(作者以公司为单位干过 4 次,都有成效。)

全身心投入

通常而言,如果你能集中注意力写好一个功能,那么在写的时候你也会想到更多好的构思。但是这种全神贯注很难在大公司出现,一般是小型优秀的团队才有。

向一个项目中增添人手不一定能提高效率,很有可能还加大了沟通成本,导致进度延后,无法预见的影响愈发增大。不过人不够的时候,就需要每个人都要承担一点系统管理的责任——可以理解为每个人都需要有个全局观。

不要在半夜发布代码。

由于个人偏见、过时的事实(书或者老师的教授)、挑选过的新闻,我们很容易失去对现实的认知而变得无知。

纯线上 App 很容易就可以迭代,更应该关注用户本身。

有两件事可能会让你创业途中望而却步:管理企业和与其他企业竞争。

但其实这两个都是"带电"的篱笆,只是听到觉得害怕而已。

管理企业其实很简单:做出用户喜欢的产品,保证开支小于收入。做到这两点就超过大部分创业公司了,随后你能自己发掘其他诀窍。

用户喜欢的产品则有一些通用规则:从制造简洁的产品着手,保证自己愿意用;随后迅速做出 1.0,不断听取用户反馈并加以改进;正确设置默认值。不要因为对方是什么市场专家之类的就盲目听从。如果不打算自己动手设计和开发,就别创业。

竞争上,其实那些大公司也怕你,因为实际上创业公司的能力太强了——没有太多约束,有着极强的生产效率。

如果你想致富,最好的办法就是创业或者加入创业公司,几百年来这一直是可靠途径。

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

由于程序对专注时长特别有要求,很多时候一些好的构想是不能被打断的,这也就是为什么黑客喜欢在夜晚工作。


五、财富

创造财富的本质

致富的方法有很多种,但是通过制造别人需要的东西、有价值的东西来致富,不仅合法,从流程上也更为简单。

财富包含金钱,但是是金钱能用到的时候。你需要的是财富本身,而不是在南极的时候都花不出去的金钱。

交换媒介的优点是,它使得交易可以进行下去;缺点是,它往往模糊了交易的实质。人们觉得做生意就是为了挣钱,但是金钱其实只是一种媒介,让大家可以更方便地获得自己想要的东西。大多数生意的目的是创造财富,做出人们真正需要的东西。

要清楚,实际上世界总体的财富是在增加或者毁灭的(总体是增加)。这里说的是财富,而不是金钱,金钱反而容易把这两者混淆。

这不是零和游戏:就算你修理烂东西,你修好了,这东西卖出去也更值钱。

可测量性与可放大性

成立公司的目的不是奖励那些全身心投入工作的员工。你不能对老板说"我十倍努力工作,所以薪资乘十”。公司默认你全力工作,只是无法测量你的实际贡献。

岗位的可放大性也可以通过看失败的可能性来分析,因为风险和收益总是对称的。

小团队 = 可测量性,可以减少被平均的优势。比如你在 100 个人中看不出你努力与否的差别,但是 5 人一组你就能看到。

高科技 = 可放大性,技术就是钓鱼的鱼竿。

财富与技术

每一笔巨大的财富背后,如果没有明显来源,则可能来自精心安排的犯罪活动,只是掩盖得太好了。

技术虽然拉大了赚钱能力的差距,但是随着技术增长,似乎能缩小其他差距。比如现在汽车谁都能开,富人开手工车反而可能会遇到零件不齐等问题。

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

品味与幽默

品味比学识要更重要一些。

幽默感是一种强壮的表现:持续的幽默感使你对厄运一笑了之,缺失幽默感则表示你被厄运深深伤到。

有有益的痛苦,也有无用的痛苦。咬牙坚持解决问题的痛苦是我们所需,而不是面对刁钻的客人或者低劣的材料。

编程语言与效率

编程语言中,一个操作需要的代码越多,就越难免出 Bug,也越难发现它们。

计算机的性能会越来越快,但并不意味着你必须净化代码里所有浪费性能的地方,有时候可以考虑为便利性服务。

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

设计的时候,要好像开车一样看着远方,这样才能确保不走错路。

程序员非常容易被编程语言思维同化:向上看,只会觉得那些更优秀的语言是多了些奇奇怪怪的功能,拒绝去尝试,觉得够用即可。


六、评估竞争对手与设计之道

评估竞争对手

可以关注对方的招聘岗位,这样就知道他们要做什么、想要做什么。

你不能让不懂技术的商务类人士替你做技术决策。如果你要创业的话,千万不要为了取悦风险投资商和潜在并购方而设计你的产品。让用户感到满意才是你的设计方向——只要赢得用户,其他事情就会接踵而来;如果没有用户,也就没人关心你选择的"正统"技术多让人放心。

在大型组织内部,有一个术语专门描述跟随大多数人的选择的做法,叫做”业界最佳实践"。这个词可以让你的经理推卸责任:既然是业界最佳实践,那如果失败了肯定不是我的错,因为这个实践是业界做出来的。

作者认为软件赚钱的技巧:用你知道的最强大的语言,用它解决你知道的最难的问题,然后等待竞争对手的经理做出自甘平庸的选择。

编程语言的思考

闭包 { 一个函数,通过它可以引用由包含这个函数的代码所定义的变量 }

优秀的语言不一定会被市场接受,可能无人使用。语言的流行不取决于它本身。(我认为游戏也一样,产品类型的产出都适用。)

编程语言本来就是为黑客设计的,只有黑客喜欢使用一种语言的时候,这种语言才能成为合格的编程语言。(游戏之于玩家也一样。)

设计之道

设计与研究的区别在于,前者追求"好",后者追求"新"。

优秀的设计师不会先设计再强迫用户接收,而是先研究最终用户的需求,然后做出用户需要的设计。注意,这里说的是用户需要的设计,而不是用户要求的设计。让用户满意并不等于迎合用户的一切要求。就跟医生一样,不能病患说啥就治啥,而是应该找到病因进行治疗。大多数优秀的设计也是这样产生的:它们关注用户,以用户为中心。

作者认为,目标用户需要细心定义,必须选择出某些人,否则设计的好坏无从谈起。一般来说,如果设计师本人也是目标用户,则大概率能做出优秀的产品;如果差别很大,可能就无法准确地评估用户需求,还可能低估用户需求。

如果你觉得你在为傻瓜设计产品,那么可能不仅设计得不好,连傻瓜也不会喜欢你的设计。

评价一种语言的优劣,不能只看最后的程序是否表达漂亮,而是看程序从无到有的那条完成路径是否漂亮。

为了做出优秀的设计,你必须贴近用户,始终寸步不离,永远站在用户的角度调整自己的构想。如果你正在设计某种新东西,就应该尽快拿出原型,听取用户的意见。

开发中或者设计中,士气很重要,士气是设计的关键因素,大家很少提到这点。先做出原型,再逐步加工做出成品,这种方式有利于鼓舞士气。所以我们开发软件有一条规则:任何时候,代码都必须能够运行。

士气也可以解释为什么很难为低端用户设计出优秀产品,因为优秀设计的前提是你自己必须喜欢这种产品。

comments powered by Disqus
由 Hugo 构建
主题 Stack 由 Jimmy 设计
© Licensed Under CC BY-NC-SA 4.0