黑客与画家读书笔记

HACKERS & PAINTERS,Big Ideas From The Computer Age

Posted by Wanglizhi on June 7, 2016

作者澄清了黑客(hacker)和入侵者(cracker)的区别,只有那些信奉“黑客伦理”而且能力高超的程序员,才能称得上“黑客”。黑客价值观的核心原则可以概括成这样几点:分享、开放、民主、计算机的自由使用、进步。

  • 使用计算机以及所有有助于了解这个世界本质的事物都不应该受到任何限制。任何事情都应该亲手尝试
  • 信息应该全部免费
  • 不信任权威,提倡去中心化
  • 判断一名黑客的水平应该看他的技术能力,而不是他的学历、年龄或地位等标准
  • 你可以用计算机创造美和艺术
  • 计算机使生活更美好

第一章 为什么书呆子不受欢迎

一个问题是,为什么书呆子不受欢迎呢?一个看似简单的问题,却在做着一层层的分析之后让人看到一个从学生圈子直指教育体系存在的大问题。作者在这一部分大致说明了以下的观点:

  • 学生独特的圈子逻辑和社会中的成年人而言是一种完全隔绝开的难以令成年人理解的逻辑。
  • 在学生圈子里最被看重的东西是获得吸引力,表现的受欢迎可以赢得更多人的支持并最终在圈子里成为winner。
  • 书呆子们往往由于无暇顾及这些而失去吸引力,在圈子里渐渐受到孤立,他们的精力会集中在其他东西上。
  • 真实的成年人社会与这个学生圈子执行完全不同的逻辑,它没有古怪的游戏规则,你的能力和聪明将带来价值,和是否获得吸引力无关。
  • 学生时代因为无暇顾及吸引力的书呆子在这个真实的成年人社会里如鱼得水,用自己的能力创造的价值将令他们获得欢迎。
  • 教育制度里存在的问题是成年人们往往不理解学生圈子和成年人社会的逻辑的天然隔绝而放任其自流,最终导致学生圈子里的游戏愈加无法理解,书呆子们因此而苦恼。
  • 解决这个问题的方法也许就是告诉那些所谓的“书呆子”他们兴趣所在的重要性,他们所处的圈子并未真实,像大学一样来培养他们,让他们明白能力创造价值的存在。

这一章作为开篇,“黑客”们的学生时代的成长困惑 是一个关乎学习和智力的问题。

第二章 黑客与画家

作者有着黑客与画家的双重身份,外似没什么特别关系的两个领域在作者的重重分析后却显现出出奇的相似。在这一部分,作者阐述了很多新奇的观点:

  • 黑客既不同于完全痴迷于理论研究的计算机科学家,也不同于只擅长于完成产品经理构想的软件工程师,而是一种极富创造力的存在。
  • 黑客的创作过程不应该是循规蹈矩地纸上谈兵,更应该是在实践中激发想法得出完美的结果,这和从完美成果出发得出原创的科学家相比截然不同,却和涂涂改改的画家相同。
  • 像画家以画肖像画糊口一样,黑客们在白天使用程序工具来糊口,像画家在业余时间创作一样,黑客们在晚上创造自己完美的作品。
  • 像画家临摹名作和改改画画来学习绘画一样,黑客们通过查看优秀作品的源程序并且在创作过程中不断修正自己的代码来学习提升自己的能力。
  • 像画家一丝不苟追求自己作品的全部细节一样,优秀的黑客应该追求自己代码的完美,针对自己的心理预期去调整自己的创作节奏。
  • 画家的合作讲求每个人负责绘制一个相对完整的小部分,而黑客们的合作与此类似的,是各自负责编写一个独立完整的小模块。
  • 像画家的作品和其人流芳百世一样,黑客们的现在正是画家们曾经遇到过的,通过充分探索将编程的价值发挥到极致,成为后辈们敬仰的对象。

第三章 不能说的话

这一部分作者提出了一些关于获得正确思想的方法论,这些方法论对规避道德规范上的被强制输入有很强的实践意义。这些方法论概括起来就是:

  • 我们需要去判断所听到的言论的真伪,那些看起来是真的话是否确实是真的。
  • 关注那些极富争议性的话,那些被贴着标签的话真的符合那些标签吗?
  • 将当代的观点和不同时期的古代的观点或者同一时期的不同地点做个对比,可能就会发现当代的某些观点也许并不是不可接受。
  • 看看对于不可言说的话的捍卫者的动机,他们究竟在捍卫什么,捍卫的目的又是为了什么。
  • 观察一种言语禁忌背后的形成机制,负责言语禁忌的团体究竟是怎样的一种力量。

至于说为什么我们要去寻找这些不能说的话,作者这样认为:

  • 训练我们思考问题的方法,这种看起来没有什么太大意义的思考往往可以训练独特地思维方式。
  • 发现的不能说的话的态度,应该是在没有必要因此而争执的时候就守口如瓶,否则将会陷入不必要的麻烦之中。

第四章 良好的坏习惯

这一部分作者向我们展示了什么是黑客追求的自由精神,自由查看所有能够认清事物运行原理和机制是黑客们发展新技术的基础。然而随着法律和版权保护的转机的出现,这种自由被大大限制,黑客们这种良好的坏习惯难以为继,而这种良好的坏习惯往往也就是美国精神的源泉。

第二部分 成果和影响

黑客怎样做出自己的成果,这些成果又是怎样对全世界产生了影响。

第五章 另一条路

这一部分,作者借自己开发viaweb这一互联网软件服务的经历来阐述了自己对于新一代的软件服务的看法,这些看法总结起来如下:

  • 和桌面软件留给用户的复杂和麻烦相比,互联网软件把这些复杂的管理过程留给了幕后的开发人员,留给用户的只是方便的操作,这会大大减小用户的压力。
  • 对于开发互联网软件的开发人员来说,庞大的软件系统和硬件设施可以按照他们想要的方式灵活地运行。
  • 快速迭代的互联网软件可以更快发现更早解决各种bug,而且会大大减少bug出现的可能性,和桌面软件相比在bug的处理方面更具优势。
  • 客户使用互联网软件的过程其实也就是为这个系统作出测试和找到bug的过程,这个过程还能够大大促进客户、客服和开发人员之间的合作交流,往往这些爆出的bug也能够及早地解决掉。
  • 全身心投入开发的开发人员们会不由自主地把自己的想法快速实现,长远的计划会在一次次的迭代后成为功能。
  • 小而美的团队是互联网软件团队的最佳搭配,快速响应的团队能够最大限度地减小复杂会议带来的沟通弊端。
  • 用户的行为产生的价值远远好过模拟的测试结果,关注用户的行为能够产生更符合他们心里预期的产品。
  • 好的互联网软件服务的策略应该是订阅模式而不应该是一次性的授权,这种模式将会带来一个持续的现金流。
  • 互联网软件服务提供公司应该比接受他们服务的公司本身更注重安全和服务的质量,只有这样才能让后者能够放心地接受这样的服务。
  • 围绕桌面电脑,早起的黑客自此发展起自己的软件,而现在的黑客则可以围绕家家户户的个人电脑和网络搭建起他们的互联网软件服务,而且这个过程和操作系统本身无关。
  • 微软和创业公司,对于前者,互联网软件可能会是对它的一个重大挑战,这将大大地挑战它的商业模式和技术基础,而对于后者,这将是一个大大的机会,他们将有机会以更小的力量创造更伟大的产品。
  • 互联网软件构建技术本身有着重重的问题,和功能更为强大的桌面软件工具相比有很大劣势,但这恰恰是一个提供给创业公司的一个机遇。
  • 运作一家创业公司没有黑客们想象的那们困难,保证营收的收支平衡,技术和产品最终带来的用户产生的价值将会使产品走向正轨。大公司和创业公司相比,也许会更有资产,但是缺乏新技术本身带给产品的开发效率和灵活过程。

第六章 如何创造财富

作者所说的财富并不简单的是指金钱,对于一个公司而言,财富是他们所创造的那些能够满足他们的用户的需要的产品所蕴含的价值,这种价值一旦被创造,传统意义上的财富就会随之而来。关于财富的创造,作者提出了这些观点:

  • 创业公司高速创造财富的背后是所有员工能够高效率辛苦的长期工作,巨大的压力和高强度的工作使员工能够获得高额的报酬。
  • 财富的总价值并不是一成不变的,为社会创造出的价值将会变成公司的财富来源,公司里的员工们通过辛苦的工作创造的财富将会为社会带来总价值的增加。
  • 工作的本质和目的就是在一个组织中和人合作创造财富的过程,重点在于做出人们需要的东西而非简单的劳动。
  • 作者提及了两个非常重要的公司运行过程中的特征:可测量性和可放大性:一个小的团体更能对团体中每个个体的可测量性作出评估,因为每个人的行为对整个团队的影响都会清晰地显现;可放大性体现在采用高技术方法产生的产品将会带动整个行业,同时高技术将会拉开与竞争对手的距离。然而创业公司正好符合这两个特征,一个小而精 的团队最终将灵活高效地运作,同时能够通过高技术使得迟缓行动的大公司难以追击。
  • 创业背后的潜规则就是:真正成功地运作一个创业公司困难重重,能够存活下来的创业公司少之又少,如果想要保险,那么做法可能就是卖掉它。
  • 用户的态度和使用习惯事最重要的,解决他们的问题是公司创造财富的最终目的。
  • 高回报的激励最终会使得创业公司去解决过去看起来困难重重的问题,而技术革新带来的财富是致富的范例。最终,黑客们通过自己的努力获得了财富的积累,良性的循环将产生更大的财富造福社会。

第七章 关注贫富分化

这一部分作者讨论了社会整体出现贫富分化差异的原因和可能会产生的意义,以及贫富分化将给社会发展注入的动力。下面是这一部分作者的一些观点:

  • 父辈们理解的财富应该是一成不变的总量不会变化的东西,所以他们会很容易认为财富分配出现不均,然而事实上财富是不同人根据不同能力创造出来的,因此它就天生具有不公平性。
  • 偷窃在财富转移上是个广义的概念,通过非创造的、不义的形式达到财富转移的过程都该算是偷窃,然而随着财富创造的人们的出现,偷窃没有真正创造财富的过程富有竞争力,所以社会向着正义和有价值的方向发展。
  • 通过技术的进步和掌握技术,创造财富带来的价值和为社会带来的影响更大,同时技术在大多数方面能够使得贫富分化和社会地位看起来变得不那么严重。
  • 贫富分化和收入差异带来的社会问题并不全都是坏事,因为创造财富的人收获的巨大收入将吸引他们继续完成更伟大的创造,同时使得整个社会快速发展。

第八章 防止垃圾邮件的一种方法

这一部分作者提到了自己通过技术思维解决垃圾邮件的过滤问题。这里作者提供了几个很有意思的办法,后面的比要比前面的更具技术思维:

  • 恶意关键字过滤器:通过扫描邮件里出现的是否频繁一些看起来像是具有垃圾邮件特征的标记来对邮件作出判断 。
  • 统计学过滤器:通过大样本来让系统学习什么样的标志符意味着着邮件是垃圾邮件的高概率,通过大样本的分析,系统最终会动态修正以完成判断。
  • 贝叶斯方法:对邮件进行分析,所有的线索都有对应的得分,分析结束后获得的总分将会说明它是垃圾邮件的肯能性高低。同时,加入邮件头和主动关键字省略,将会使这种方法的可靠性大大增加。

最后,作者提到了垃圾邮件过滤的目的:过滤的最终目的就是让发送这些邮件的商家意识到效果并不好以最终放弃。

第九章 设计者的品味

这一部分作者谈了谈一个很学术的问题,好设计是什么?好设计的特征是什么?好的设计是美,是有品味的,公认的好设计应该有这些特征:

  • 简单。当设计只直视本质、忽略无关的时候,设计者会加倍认真地进行创作。
  • 永不过时。无论过去、现在还是未来的人们都认同的设计能够避开风潮、充满永恒的吸引力。
  • 解决主要问题。这是设计的主要目的。
  • 启发性。使用者可以在设计的原基础上充分拓展实现他们自己的想法。
  • 些许趣味。幽默的设计反映了一种特别的力量。
  • 艰苦和看似容易。经过努力艰苦的层层磨难得到的结论拥有简洁和看似容易的结果,而这样的结果往往具有难以被打破的完美。
  • 对称。这往往意味着结构的简洁和美妙。
  • 对大自然的模仿。大自然的演化趋向于成就完美的设计,追随大自然的设计无疑就是找到完美设计的一个途径。
  • 再设计。在原有不好的设计上重新设计,把这些问题解决使之成为好设计的一部分。
  • 能够被复制。优秀的部分具有复用的价值。
  • 奇特。奇特往往意味着聪明、思维和风格。
  • 成批出现。优秀的人们会聚在一起形成好设计的形成中心并形成好设计的新趋势。
  • 大胆。今天看似大胆甚至错误的结论很有可能是明天的新理论。

第三部分 工具和方法

解释了黑客的工具(编程语言)和工作方法,这是黑客文化的基础和核心。

第十章 编程语言解析

这一章作者开始介绍黑客们手中的利剑--编程语言。从编程语言从底层到应用分别介绍了它的前世今生。

  • 机器语言和汇编语言更像是直接对机器的操纵,程序员们需要从很机器的层面编写程序。
  • 高级语言是对机器语言的高度封装,通过编译器或者解释器这一将高级语言翻译成机器语言的助手,程序员的工作难度大大降低,他们只需要关注功能而非复杂的指令本身。
  • 开放源码的措施能够让所有有能力编程的用户及早发现解决问题,提升软件的可靠性。
  • 编程语言孰优孰劣的问题本身就像一场战争,语言之间巨大的差异注定很难去判断谁是最好的语言。
  • 底层的语言能够最大限度地直接和机器交流,因此可以获得最大的效率,同时,封装后对于程序员友好的高级语言的效率就低得多了。
  • 静态语言能够有效地解决类型错误带来的bug,让绝大多数的程序员避免这种问题,而动态语言自由的特性决定了使用者需要更强的掌控能力。
  • 面向对象编程改变了以往过程化语言的程序结构组织,这种风格一方面可以使得程序的结构性更易读,同时也限制了编程的风格。
  • 现在的时代就像是编程语言的文艺复兴,大批的编程语言冒了出来,很多语言的内核设计也许并不完善,但是在社区力量的驱动下有足够有效的第三方库的支持使得这些语言在解决问题时变的有效。

第十一章 一百年后的编程语言

一个有趣的设想是编程语言进化到一百年后会是什么样子?抓到编程语言的发展主干是预测的基础。作者看来,具有最干净内核的语言最终将有更强的生命力。

  • 未来计算机本身具有的更强大计算能力将为编程语言带来更多的机会。
  • 更高的速度带来的优势很有可能会被更消耗硬件资源的编程语言所“浪费”,因为语言实现的效率往往是对计算资源的消耗,看似友好的背后往往意味着更多的处理。
  • 设计编程语言应该尝试对实现少做限制加大灵活性,虽然这样做可能具有很低的效率,但是对于语言内核简洁的实现大有好处。
  • 采用多层设计会影响这种语言的性能,但是会很利于修改。应用程序的多层开发也是一种很常见的技巧,会给系统带来可重用性,对于企业软件来说,加上面向对象编程,多层设计非常有利于软件的迭代和持续性。
  • 关于并行计算,作者认为在大多数领域并不会成为主流,因为如果过早使用并行计算很有可能产生过早优化的问题。
  • 新语言将会更多地以开源项目的形式出现,而且作者们可能只是这些语言的使用者而非这些语言的编译器的作者。
  • 如果想要创造出属于未来的更好的编程语言,我们应该摒弃那些旧有语言带来的定势,突破这些去创造全新的习惯,在今天就可以在不考虑编译器的情况下创造新的编程语言。

第十二章 拒绝平庸

这一章作者用自己的经历讲述了在技术领域使用不平常的工具和编程语言将带来什么样的意义。作者的创业项目使用了普通开发者并不会常使用的Lisp,这一技术方案最终能够使作者的项目能够快速开发以打倒竞争助手的新功能最终制胜。

  • Blub困境,一般的程序员很容易满足自己长期使用的编程语言,因此会陷入不再了解新技术、新语言的困境。
  • 使用功能强大的语言能够出其不意地削弱竞争对手的优势,因为他们深陷于Blub困境中不思进取。

第十三章 书呆子的复仇

这一部分作者向我们展示了使用高级而且出色的工具将为黑客在工程上带来如何优秀的表现。以Lisp为例,作者表达了这一先进的语言在当今软件行业的竞争中制胜的奥秘:

  • 和其他编程语言以机器发展相关的特性,Lisp是一个数学模型转变来的语言,优秀的理论特性最终使得Lisp在发展中从理论上的完美变成实践中的完美。
  • 先进而古怪的Lisp特性是与生俱来的,和其他语言在发展中才逐渐加入新的特性相比,Lisp诞生之初就具有理论和数学上的完备。
  • Lisp在互联网应用程序的服务器上的表现更能体现它的优越之处,这就是在苛刻条件下利用高级工具的结果。
  • Lisp可能会带来很多问题,当Lisp可以跑在你能够控制的服务器上时协同就不是问题;当函数库不如构建规模庞大的系统重要时就不必去理会现成的函数库;小而美的团队可以解决很大的问题,因此并不需要找到很多精通Lisp的黑客。
  • 随大流的公司们最终会因为选择了大流的工具而陷入困境,选择了更想的工具的他们的竞争对手会用更小的代价获得更好的效果并最终打败他们。
  • 远离所谓的“业界最佳实践”实际上是让你远离平庸技术的诀窍,因为顶尖的技术往往就是最小众的。

第十四章 梦寐以求的编程语言

这一章作者向我们描述了成就一门优秀的编程语言的特性,结合这些特性作者向我们展示了可能会是梦寐以求的编程语言的存在条件。

  • 成就编程语言流行程度的秘诀包括专业黑客们的看法、达到“临界数量”的使用人数,把握了最初的高级黑客、塑造了成功的产品,最终将推动这门编程语言的发展。
  • 能够依附在一个优秀的平台上同时拥有一个好的实现是编程语言取得成功的外部条件。
    • 保持编程语言语法和表达上的简洁将会使得追求简洁表达的黑客们喜欢上这门语言。
  • 向黑客们敞开胸怀让他们能够充分理解和改造的编程语言将使其更便于应用,这个特性将使这门编程语言解决问题的能力充分体现。
  • 具有良好互动性的“一次性”语言容易装备且同时很易于完成任务,久而久之,大规模的使用将很容易使得这种语言成为主流。
  • 优秀的语言如果配上众多经过认真设计的函数库将给使用者带来实际使用上的巨大便利。
  • 好的性能分析器将会使得使用者非常容易注意到代码运行的瓶颈处,甚至和编译器的作用不相上下,同时使用者创造出的代码和应用最终将会获得很高的效率。
  • 经受时间考验的编程语言往往是默默自然成长起来的,新事物获得认可所需的一个长时间段同样适用于编程语言。
  • 能够让使用者再设计是好的编程语言变得更好的一个绝佳方法,语言的推动者们如果能够在小而精的范围内提出再设计的反馈将使得语言良性地发展。

第十五章 设计与研究

这一章作者为我们阐释了软件设计的细节,某些软件工程中真正起作用的东西就是软件设计的技巧。

  • 设计和研究相比,前者求好,后者求新,作者向我们提出了设计好的编程语言而非研究新的编程语言更为重要。
  • 软件设计的起点应该是抓对使用最终产品的人,找准他们需要的而非要求的需求。
  • 编程语言的设计要注重的不仅是程序的表达方式,更应该把它看成是能够促进使用者思考过程的媒介,因此恰到好处的设计尤为重要。这里作者再度提到了动态语言的优点,加入了“交互式顶层解释器”的帮助,变量的类型声明得以解放出来,为使用者的思考过程带来更多便利。
  • 贴近用户就是尽快给用户一个产品的模型,一个整体的模型建立出来后再添砖加瓦、逐代更替,最终会使一个完整的形象始终呈现在设计者面前,这样不仅能够获得用户评估的支持,同时也会使得设计者因逐步变化带来的进步而获得鼓励。