读书 [黑客与画家]
本文最后更新于:2021年6月21日 中午
简介
黑客新想法的最佳来源,并非那些名字里有[计算机]三个字的理论领域,而是来自于其他创作领域。
这是一篇读书感悟的文章,来源于最近阅读的书籍 黑客与画家。
摘抄自豆瓣
书籍简介:
本书是硅谷创业之父 Paul Graham 的文集,主要介绍黑客即优秀程序员的爱好和动机,讨论黑客成长、黑客对世界的贡献以及编程语言和黑客工作方法等所有对计算机时代感兴趣的人的一些话题。书中的内容不但有助于了解计算机编程的本质、互联网行业的规则,还会帮助读者了解我们这个时代,迫使读者独立思考。
本书适合所有程序员和互联网创业者,也适合一切对计算机行业感兴趣的读者。
作者简介:
保罗・格雷厄姆,《黑客与画家》一书的作者,硅谷创业之父。1964 年,出生于匹兹堡郊区的一个中产阶级家庭。父亲是设计核反应堆的物理学家,母亲在家照看他和他的妹妹。青少年时代,格雷厄姆就开始编程。但是,他还喜欢许多与计算机无关的东西,这在编程高手之中是很少见的。
保罗・格雷厄姆在康奈尔大学读完本科,然后在哈佛大学获得计算机科学博士学位。1995 年,他创办了 Viaweb,帮助个人用户在网上开店,这是世界上第一个互联网应用程序。1998 年夏天,Yahoo! 公司收购了 Viaweb,收购价约为 5000 万美元。
此后,他架起了个人网站 paulgraham.com,在上面撰写了许许多多关于软件和创业的文章,以深刻的见解和清晰的表达而著称,迅速引起了轰动。2005 年,他身体力行,创建了风险投资公司 Y Combinator,将自己的理论转化为实践,目前已经资助了 80 多家创业公司。现在,他是公认的互联网创业权威。
起因
之前吾辈也曾经坚信电子书籍(Epub/PDF)要比纸质书籍更好,方便携带,随时都能阅读。直到遇到了一位 dalao 的指点 – 只要买了书,放在那里,总有机会去看看的。 之后,吾辈便尝试买了一些实体书,晚上回来闲暇片刻便会看看。
最近一周,吾辈便把黑客与画家看完了。当然,之前已经看过电子版的了。作者真的很厉害,既是第一个互联网程序的开发者,也是一个画家,更是一个顶级黑客(非骇客)。然后,他写完这本书之后,还变成了作者。当然,译者也同样是位知名人物 – 阮一峰。
感想
读这本书的时候,才发现真-大佬的想法真的很厉害,尤其是关于创造财富那一章,有许多思想值得吾辈深思。
下面摘抄一些内容并谈谈吾辈的想法
书呆子不受欢迎的真正原因,是他们脑子里都在想着别的事情,他们的注意力都放在读书或者观察世界上面,而不是穿衣打扮、开晚会上面。
嗯,吾辈想这大抵是作者的亲身体会:作为一个聪明人却不受欢迎 #笑 不过就吾辈经历而言,读书好的人一般也不会太受排挤,或许这是因为国情不同的原因吧 – 国内不论如何都把成绩作为第一位,而据作者所说美国的中学生并不会特别对待学习,至少,不会拼命去学,也不会因此自杀。
黑客与画家的共同之处,在于他们都是创作者。与作曲家、建筑师、作家一样,黑客和画家都是试图创作出优秀的作品。他们本质上都不是在做研究,虽然在创作过程中,他们可能会发现一些新技术(那样当然更好)。
想想国内的大环境,吾辈瞬间心酸得落下了眼泪。说是创作者,但实际上,开发者被称为码农不是没有道理的 – 只是实现经理所要求的功能,而不是决定功能应该如何设计 – 这被交给了其他人!当然,拥有/参与开源项目可以减少这个问题,因为可以决定功能如何设计而非实现。但本质上还是在代码的圈子里打转,并没有创造出人们真正需要用到的东西。
程序写出来是给人看的,附带能在机器上运行。
这不是吾辈第一次看见这句话了,但在工作过程中,吾辈发现实际上这句话并没有多少开发者真的在意过 – 包括一些 dalao。为了性能死扣算法,没错吾辈就是在吐槽一些公司任何职位都要面试算法,简直成 leetcode 算法面试公司了。大部分场景实际上并不需要开发者手写算法进行优化,因为现在的计算机已经足够快了。手写算法再加上耦合业务,只会让代码变得无比丑陋,难以维护 – 仅仅是为了在某个地方稍微快一点。
在某些地方,自行其道,完全不替读者着想,被看成是高水平、高智商的表现,甚至都发展成了一种风尚。
是的,有些人就是为了炫技而写出来各种奇葩的代码,导致其他人再看代码时,纷纷惊呼:“这是什么神仙代码?!”。在他们看来,写出来的代码让别人看不懂,自己说的话让别人听不懂,是一种高水准的表现,甚至于说:“这降低了 SB 来烦我的概率”。甚至于刻意不写注释,然后辩解说:“类型系统就是最好的注释”
关于这点,作者也在后面进一步评论了。
但是,我不觉得 “换位思考” 与智商之间存在任何联系。在数学和自然科学领域,你用学习怎么向别人表达自己,也能却得很好的成就。而那些领域的人普遍很聪明,所以人们很自然地就把 “聪明” 与 “不懂得换位思考” 联系了起来。但是,世界上还有许许多多很笨的人,也同样不懂得 “换位思考”。
最后一句真是说出了大实话 – 伪-大佬。
我家附近,一辆汽车的保险杠贴着一张粘纸,上面写着 “太麻烦,不如死”(death before inconvenience)。大多数人,在大多数时候,总是选择最省事的做法。如果互联网软件能够击败桌面软件,一定是赢在更方便这一优势上。无论从用户的角度还是从开发者的角度来看都是如此。
是的,现在浏览器已经击败了客户端软件,甚至在原本必须要使用客户端的地方使用 Web 技术进行了入侵(Electron,React Native)。但这并不意味人们知道这件事就会真的对用户更友好,尤其是对于免费的开源程序而言。用户不再是首位要素,动辄要求使用者去看源码,吐槽就会被说 “爱用用不用滚,You can you do?”。你敢相信?但这就是国内开源现状。
开发软件需要的程序员人数减少,不仅意味着省下更多的钱。正如《人月神话》一书中所指出的,向一个项目增加人手,往往会拖慢项目进程。随着参与人数的增加,人与人之间需要的沟通呈现指数式增长。人数越来越多,开会讨论各个部分如何协同工作所需要的时间越来越长,无法预见的互相影响越多越大,产生的 bug 也越来越多。幸运的是,这个过程的逆向也成立:人数越来越少,软件开发的效率将指数式增长。
所以说这就是小公司能生存下来的原因么?#笑 想到之前项目实际上只有 3 个人全职开发就发现,其实也不是那么奇怪呢
桌面软甲迫使用户变成系统管理员,互联网软件则是迫使程序员变成系统管理员:用户的压力变小了,程序员的压力变大了。
唉,小公司别说系统管理员了,就连前端,后端,运维,测试都要会一点才行,必须是 多面手/万金油 才能生存下去。
许多人从小就认定世界上的财富总额是固定不变的,这样想的人数多的惊人。
小时候我就对这一点深信不疑:如果夫人拿走了所有的钱,那么其他人就变得更穷了。许多成年人至今都是类似看法的信徒。每当有人提到 x% 的人口占有了 y% 的财富,他的言下之意往往就包含了这种错误的观点。
嘛,吾辈也曾经是这样想的人之一(一个普通的不能再普通的人)。但这个观点在看完本书后刷新了,财富在净增长 – 代价是地球本身。
确实有一些 CEO 的收入太高,不合理,但是有没有 CEO 的收入不足以体现他所创造的财富的呢?乔布斯就是这样的例子。他拯救了濒临崩溃的苹果公司,扭转了危机,削减了成本,成功决策了下一代产品。他的收入就低于他的工作所创造的价值。
是的,这点确实很厉害,尤其是吾辈正在看的 浪潮之巅 一书也谈及了他,确实是个 真-大佬。
在垃圾邮件业中,如果发送销售类垃圾邮件受到限制,那么整个行业将不可避免地受到重创。“行业”这个词是很准确的,发送垃圾邮件的人其实都是商人,他们这么做只是因为这招很有效。虽然垃圾邮件的回应率低到不能再低了(不超过百万分之 15,相比之下,传统的邮寄商品目录的回应率是百万分之 3000),但是发送垃圾邮件的成本实际上为零,所以它还是有效的。但是对于收到垃圾邮件的人来说,成本却很高昂,假定有 100 万人分别收到一封垃圾邮件,每人花一秒钟删除,累计起来就相当于一个人 5 个星期的工作量,而发送人连一分钱也不用付出。
不过,虽然接近于零,发送垃圾邮件还是有成本的^。所以,只要我们把垃圾邮件的回应率降得很低(不管手段是直接过滤,还是让垃圾邮件被迫掩盖它们的销售意图),商家就会发现,发送垃圾邮件是一件经济上不值得的事情。
这让吾辈想到了现在的广告过滤行业,嗯,没错是行业 – Adblock Plus 把这事做成了生意。广告屏蔽插件流行了起来之后,广告受益者就会烦恼,会提示让用户关闭广告过滤以支持网站,或者,直接关闭页面拒绝使用 – 直到关闭了广告过滤为止。后来,开始出现了屏蔽那些网页上检测广告的脚本 – 反屏蔽广告脚本。这个斗争其实可以一直进行下去,终究是收益与代价的权衡罢了。
好设计是简单的设计。从数学领域到绘画领域,你都可以听到这种说法。在数学中,它表示简短的证明往往是更好的证明。特别是对于数学公理来说,少即是多。在编程中,这种说法也基本适用。
少即是多,能满足这一点的库/框架并不多,Lodash 是一个正例,React 某种程度上来说是个反例。不管是程序(三国杀),还是库(rx-util),开发者总是喜欢增加功能,逐渐提高复杂度,最后让人难以接受。这里吐槽一下国产程序,只会逐渐增加功能,永远学不会什么叫减法。
高级语言比汇编语言更接近人类语言,而某些高级语言又比其他语言更进一步。举例来说,C 语言是一种低层次语言,很接近硬件,几乎堪称可移植的汇编语言,而 Lisp 语言的层次则是相当高。
Lisp
之前一直有听闻过,但吾辈还从未真正使用过。在编程语言领域,吾辈接触过 Java
, JavaScript
, Scala
, C#
,然而他们都不能支持 Lisp
中一些非常高级的功能(宏)。
下面作者列出了 Lisp 的创新功能
- 条件结构(即 if-then-else 结构)。现在大家都觉得这是理所当然的,但是 FortranI 就没有这个结构,它只有基于底层机器指令的 goto 结构。
- 函数也是一种数据类型。在 Lisp 语言中,函数与整数或字符串一样,也属于数据类型的一种。它有自己的字面表示形式(literal representation),能够存储在变量中,也能当作参数传递。一种数据类型应该有的功能,它都有。
- 递归。Lisp 是第一种支持递归函数的高级语言^。
^「Lisp 语言的许多特性(比如,把程序写成列表形式以及实现某种形式的递归)都在 20 世纪 50 年代的 IPL-V 语言中出现过。但是,IPL-V 更像是汇编语言,它的程序中充满了操作码/地址对。参见 Alien Newell 等人编著的《IPL-V 语言操作手册》(Information Processing Language-V Manual),Prentice-Hail,1961 年出版。」 - 变量的动态类型。在 Lisp 语言中,所有变量实际上都是指针,所指向的值有类
型之分,而变量本身没有。复制变量就相当于复制指针,而不是复制它们指向的数据。 - 垃圾回收机制。
- 程序由表达式组成。Lisp 程序是一些表达式树的集合,每个表达式都返回一个值。这与 Fortran 和大多数后来的语言都截然不同,它们的程序由表达式和语句组成。区分表达式和语句在 Fortran I 中是很自然的,因为它不支持语句嵌套。所以,如果你需要用数学式子计算一个值,那就只有用表达式返回这个值,没有其他语法结构可用,否则就无法处理这个值。
后来,新的编程语言支持块结构,这种限制当然也就不存在了。但是为时已晚,表达式和语句的区分已经根深蒂固。它从 Fortran 扩散到 Algol 语言,接着又扩散到它们两者的后继语言。 - 符号类型。符号实际上是一种指针,指向存储在散列表中的字符串。所以,比较
两个符号是否相等,只要看它们的指针是否一样就行了,不用逐个字符地比较。 - 代码使用符号和常量组成的树形表示法。
- 无论什么时候,整个语言都是可用的。Lisp 并不真正区分读取期、编译期和运行期。你可以在读取期编译或运行代码,也可以在编译期读取或运行代码,还可以在运行期读取或者编译代码。
Lisp 确实开创了许多功能,成功引起了吾辈的兴趣,以后有机会会去看一下作者写的 Lisp 的书籍吧
大多数程序员也许无法分辨语言的好坏。但是,这不代表优秀的编程语言会被埋没,专家级黑客一眼就能认出它们,并且会拿来使用。虽然他们人数很少,但就是这样一小群人写出了人类所有优秀软件。他们有着巨大的影响力,他们使用什么语言,其他程序员往往就会跟着使用。老实说,很多时候这种影响力更像是一种命令,对于其他程序员来说,专家级黑客就像自己的老板或导师,他们说哪种语言好用,自己就会乖乖地跟进。
编程语言的最高境界一直在发展之中。虽然语言的核心功能就像大海的深处,很少有变化,但是函数库和开发环境之类的东西就像大海的表面,一直在汹涌澎湃。
是啊,所以现在流行 react,流行 webpack,流行 typescript,甚至曾经有人吐槽 2016 年里做前端是怎样一种体验。各种各样的框架和库,说不定过不了一段时间就死掉了(前车之鉴),这些都是浪潮的表面。不过总有人喜欢折腾代码,而不是完成一个真正可以给其他人用的东西。疯狂造一堆没人用的轮子,美其名曰不做调参工程师。当然,尝试实现便于了解深层原理,然而如果不加节制什么东西都觉得自己造才好就是典型的浪费时间。
先做出原型,再逐步加工做出成品,这种方式有利于鼓舞士气,因为它使得你随时都可以看到工作的成效。开发软件的时候,我有一条规则:任何时候,代码都必须能够运行。如果你正在写的代码一个小时之后就可以看到运行结果,这好比让你看到不远处就是唾手可得的奖励,你因此会受到激励和鼓舞。
跟你说实话吧,画家之间甚至流传着一句谚语:“画作永远没有完工的一天,你只是不再画下去而已。”这种情况对于第一线的程序员真是再熟悉不过了。
是啊,能看到效果的原型很重要,看不到效果的开发是艰苦而烦躁的。而且出现错误了都无法进行调试,实在是不能更糟糕了。有些开源项目目标很大,花费的时间过长,长期做不出来一个可用版本,久而久之,就半路放弃了。
总结
总而言之,上面是一些看书的想法以及吐槽,这本书籍吾辈强烈推荐 – 即便不是 IT 行业。