需要pdf文件的话留邮箱呀~
关于本书:
本书是硅谷创业之父Paul Graham 的文集,主要介绍黑客即优秀程序员的爱好和动机,讨论黑客成长、黑客对世界的贡献以及编程语言和黑客工作方法等所有对计算机时代感兴趣的人的一些话题。
个人推荐:
除了关于编程语言的章节之外,其他章节我都推荐一看。看过书的前言知道,1995年就兴起了网络公司的创业风潮,延续至今,整个互联网时代的发展都对我们的生活产生了越来越深远的影响。随着浙江中小学开设python课程等趋势,让我个人觉得,理解程序与系统其实是一种思考方式,我也认同在了解具体的程序语言之前,了解它的思想。理解这种思维方式之后,在学习具体语言方面事半功倍,也引导我去思考系统产生的本质和他的价值,面对与程序猿们沟通时更能理解双方的思维方式。
书中也有一些冷幽默,读起来不算枯燥。
关于读书笔记:
只是摘录书中句子,则不能带来多大的成长。因此读书笔记会记录思维体系,通常以思维导图的方式呈现;重点内容的记录,便于反复咀嚼;对个人的应用,包括解决的问题与可能要采取的行动。
由于片面读取,很多观点的解释仍推荐看原书。
01书籍起源
作者作为硅谷创业之父,曾有专业学习画画的经历。书名的含义指应该把黑客与画家当做同一种人看待,和画家一样,黑客只是患有一门特殊手艺、有创造天赋的普通人。另一层含义,指编程是一种艺术创作,黑客就是艺术家,开发软件与画家作画、雕刻家雕刻、建筑师设计房屋并没有什么本质不同。
1984年,第一本介绍黑客的著作《黑客:计算机革命中的英雄》,将黑客的价值观总结为“黑客伦理”。
(1)使用计算机一级所有 有助于了解这个世界本质的事物都不应受到任何限制。任何事情都应该亲手尝试;
(2)所有信息都应该是自由的;
(3)不信任权威,提倡去中心化(看到这句话瞬间联想到了区块链)
(4)判断一名黑客的水平应该看他的技术能力,而不是看他的学历、年龄或地位等其他标准;
(5)你可以用计算机创造美和艺术;
(6)计算机使生活更美好。
关于黑客的概念:黑客的原始含义指那些信奉”黑客伦理“而且能力超强的程序员(Unix操作系统创世人、Linux操作系统创世人、开源运动创世人等)。只有传统意义上的黑客才能被成为hacker,恶意入侵计算机系统的人应该被成为cracker。
2.1为什么书呆子不受欢迎
(1)借用书呆子往往本可以更受欢迎,但没有那么做的案例说明,“任何一种艺术,不管是否重要,如果你想要在该领域出类拔萃,就必须全身心投入”(阿尔伯蒂)。
比如青少年往往很关注服饰,目的只是要穿的好看,同伴的意见成为他们判别事物的标准,这种为了把事情“做对”所付出的任何努力,不管有意还是无意,都等同于努力在使自己变得受欢迎。
受欢迎也不是天生的。
“书呆子”的心思往往不在受欢迎上,而是被教导追求正确答案。
(2)孩子们欺负书呆子的其中一个原因是,让自己更受欢迎得方法里,个人魅力只是很小的一方面,秘诀是不停设法是自己与其他受欢迎的人变得关系更密切。没有什么比一个共同的敌人更能使人们团结起来了。
这也是为什么最恶劣的倚强凌弱事件都与团体有关的原因。
(3)真实世界能够保持一定友好,关键并非在于它是由成年人组成的,而是在于它的庞大规模是的你做的每件事都能产生真正意义的效果。学校、监狱、上流社会的女士午餐会,都做不到这一点。这些场合的成员都好像关在封闭的泡沫之中,所作所为只是对泡沫内部有影响,就会产生野蛮的做法。
(4)对于书呆子来说,意识到学校并非全部的人生,也是很重要的事情。学校是一个很奇怪的、认为设计出来的体系。他就像人生一样,里面无所不包,但又不是事物的真实样子。
强烈建议看原书。
2.2黑客与画家
黑客与画家的本质相通之处,在于他们都是创作者。
(1)创造优美事物的方式往往不是从头做起,而是在现有成果 的基础上做一些小小的调整,或者将已有的观点用比较新的方式组合起来。这种类型的工作往往很难用研究性的论文表达;
(2)编程语言是用来帮助思考程序的,而不是用来表达你已经想好的程序。黑客不想为了与一丝不苟的编译器大婶交谈,努力地挑选词语,确保变量类型匹配,好让自己显得礼貌又周到。
(3)大部分公司把设计软件的职责交给一个委员会,黑客的作用是实现这个委员会的设计。
大公司为了避免设计上的灾难,选择了减少设计结果 的标准差。当排斥差异的时候,不仅将失败的可能性排除在外,也将获得高利润的可能性排除在外。
(4)真正竞争软件设计的战场是新兴领域的市场,在这里还没有人建立过防御工事。
(5)通过实践学习编程,定期从头开始,而不要长年累月地在一个项目上不断工作,并且试图把所有的最新想法都以修订版的形式包括进去。
可以通过观看优秀的源代码学会编程。
(6)消灭bug的过程就像解一道数学题,已知许许多多的约束条件,只要根据条件对方程求解就可以了。
(7)多个画家共同创作一幅画时,每个人画的部分是不一样的。正确的合作方法是将项目分割成严格定义的模块,每一个模块由一个人明确负责。模块与模块之间的接口经过精心设计。
(8)判断一个人是否具备“换位思考”能力有一个好方法,那就是看他怎样向没有技术背景的人解释技术问题。
(9)软件的部分功能就是解释自身。必须假定用户对你的软件基本上一无所知,所以软件的使用方式最好能符合用户的直觉,千万别指望用户去读使用手册。
2.3不能说的话
(1)流行一时的不仅有衣服,还有道德观念。
(2)独立思考;
(3)触怒他人的言论是那些可能会有人相信的言论;
(4)当一个政治家说自己的对手是错的,这是直截了当的批评。但是,如果他不谈论对错,却使用“制造分裂”或者“对种族问题不敏感”这样的标签攻击对手,就应该多注意了。
关注标签,问自己那些想法属于这个标签,列出来,问自己,它真的属于这个标签吗?
(5)我们似乎认定,孩子的思想应当是光明纯洁的,为了保证孩子不受外界“不良”思想的影响,我们对那些思想进行消毒和屏蔽,把世界描述成光明的样子,将他们的心灵塑造成我们想象中的样子。比如,不向孩子说脏话。
(6)流行思想与流行服饰的传播途径很相似。第一批接受者总是有很强的抱负心,有自觉地精英意识想把自己与普通人区分开来。流行趋势确立以后,第二批人就进来了,人数比上一批庞大得多。他们接受流行,不是因为想要与众不同,而是因为害怕与众不同。
(7)自由思考。
(8)反击方法:把辩论提升到抽象的程度;隐喻;幽默;
(9)永远质疑。
2.4良好的坏习惯
适当的不服从管教。
2.5另一条路
(1)“你的电脑”这个概念正慢慢成为过去式,取而代之的是“你的数据”。你应该可以从任何终端上获取你的数据,终端设备不一定是电脑。
(想想这本书出版的时间是2004年,到现在云端服务兴起、协同办公包括多人实时在线编辑的石墨文档、office-one drive的资料共享,真的佩服作者的远见)
(2)设计桌面软件就像设计一栋大楼,设计互联网软件就像设计一座城市:不仅需要设计建筑物,还要设计道路、路标、公用设施、警察局、消防队,并且制定城市发展规划和紧急事件的应对方案。
(3)软件的发布过程,可以分解为一系列渐进式的修改,而不是猛地推出一个大幅变动的版本。
(4)《人月神话》,指出向一个项目增加人手,人与人之间需要 的沟通呈现指数式增长;
(5)关注用户。关注用户操作行为。资本支出升本除以服务器所能支持的最大用户数量,就是为每个用户付出的成本。细节设计影响用户行为。
(6)付费模式。应该让用户像定报纸那样按照使用时间长短订购软件的使用权,保障现金流的同时,及时获取用户反馈,停止付费则停止服务。
(想想音乐播放器的包月模式、视频平台的会员模式、office正版按年付费的模式)
软件边际成本接近于0,盗版只是价格歧视的一种形式。
(边际成本,经济学概念,指下一个单位产品的生产成本,软件的边际成本为复制代码等)
互联网软件更容易销售,不建议采用分销模式,因为最好自己控制服务器。
(7)目标客户。其实是关于外包与自建的探讨,作者说如果你想把钱藏在安全的地方,是选择放在家中床垫下面还是银行?
作为软件服务商,包括服务器的管理、带宽、负载管理等是专业的,玩具制造商如何看待对人体不安全的玩具,我们就如何看待有缺陷的服务器管理。
IT部门外包的好处之一在于外包厂商之间的竞争,可以激励产品进步。
大公司付出的高价之中,很大一部分是商家为了让大公司买下而付出的费用,如包装专业的营销团队。
所以,作为创业公司最好的安排就是把个人和小企业客户放在第一位,其他的客户该来的时候会来。
(to c产品与to b产品的差异)
(8)关于苹果公司预言,指出mac电脑出色却销售不佳的原因是同时做硬件和软件,如果把ipod升级成手机,并将网络浏览器包括在内,微软公司就有大麻烦了。
(作者这段话写自2001年,第一代iphone手机于2007年上市)
(9)微软不能控制终端设备,他就只剩下一条路,就是把用户推送它自己的互联网软件。未来会出现无数不同类型的终端设备,那么竞争者可以为其他终端设备提供应用程序,从而获得击败微软的机会。
(所以是大家都在争夺下一个终端入口的原因?)
(10)创业:做出用户喜欢的产品,保证开支小于收入。
如何做出用户喜欢的产品:从制造简洁的产品开始入手,首先保证你自己愿意使用。迅速做出1.0版,并且不断加以改进,整个过程中密切倾听用户的反馈。
比较软件的标准应该是看对手的软件未来有什么产品,而不是现在有什么产品。
2.6如何创造财富
(1)这就是为什么当你打扰黑客让他们从屏幕前扭过头回答问题时,他们会恶狠狠盯着你看得原因。他们大脑内部精心搭建的精巧建筑,瞬间就崩溃了。
(每次打扰程序猿前提心吊胆的重要原因,hiahia)
(2)创造价值,有运气的成分。
(3)金钱不等于财富。金钱只是一种中介,大多数生意的目的是为了创造财富,做出人们真正需要的东西。
(4)需要一份工作并不是最重要的,更直接的表达方式是“你去做些人们需要的东西”。公司不过是一群人在一起共同做出某种人们需要的东西。
(5)可测量性(流水线工人计件)与可放大性(CEO决策对整个公司都有影响)。创业公司更加具有可测量性,高科技=可放大性。发现了新的技术,他的经济价值就取决于多少人使用了你的方案。
(6)攻克难题,即相当于设计壁垒。开发出来的技术是难以复制的,避免陷入大公司的困境。
(7)创业公司如同蚊子,往往只有两种解决,要么赢得一切,要么彻底消失。
(8)被收购时,促成买房掏钱的最好办法不是让买家看到有获利的可能,而是让他们感到失去机会的恐惧。
(9)用户数量是判断公司表现好坏 的一个指标。
创业之后,你的竞争对手决定了你有多辛苦。群体付出与回报成正比,个体不成正比。
2.7关注贫富分化
(1)赚钱看上去与其他技能 并没有本质不同,为什么人们的反映如此强烈?
第一,从小被误导对财富的看法;
第二,历史上积累财富的方式大多数名声不太好;
第三,担心收入差距拉大将对社会产生不利影响。
(2)我们大多数人都在为他人创造财富,然后用创造出的财富交换金钱,再用金钱交换我们需要的另一种财富。
(3)中产阶级的出现使得财富总量不再是一个固定不变的值,财富的分配也不再是一种零和游戏。
(零和博弈,又称零和游戏,与[非零和博弈]相对,是[博弈论]的一个概念,属[非合作博弈]。指参与博弈的各方,在严格竞争下,一方的收益必然意味着另一方的损失,博弈各方的收益和损失相加总和永远为“零”,双方不存在合作的可能。
推荐日剧《诈欺游戏》)
(4)技术加剧了有技术者与无技术者之间的生产效率差异。
技术无法使其变得更便宜的东西是品牌。
(5)衡量收入应使用“真实收入”而不是“名义收入”,“真实收入”指要用消费者物价指数计算得出。
2.8防止垃圾邮件的一种方法
(1)统计学方法,如贝叶斯过滤器。
原因在于仅通过关键词很难把识别精度再提升几个百分点,同时容易产生误判。过滤效果越好的邮件系统越不能误判,因为用户会充分相信系统而不查看被过滤掉的邮件。
2.9设计者的品味
如何才能做出优美的产品?
把品味说成个人的偏好可以有效地杜绝争论,防止人们争执哪一种品味更好。作为设计师,如果你不承认有一种人们共同认可的东西叫做“美”,那么就没有办法做好工作。
好设计是简单的设计,少即是多。
好设计是永不过时的设计。如果解决方法是丑陋的,那就肯定还有更好的解决方法,只是还没有发现。
好设计是解决主要问题的设计。
好设计是有启发性的设计。在软件行业中,意味着为用户提供基本模块,是的他们可以随心所欲自由组合。
好设计是有点趣味性的设计。
好设计是艰苦的设计。你需要的是咬牙向前冲刺的痛苦,而不是脚被钉子扎破的痛苦。
好设计是看似容易的设计。在大多数领域,看上去容易的事情,背后都需要大量练习。
好设计是对称的设计。重复性对称和递归性对称。
好设计是模仿大自然的设计。
好设计是一种再设计。
好设计是能够复制的设计。
好设计常常是奇特的设计。
好设计是成批出现的。
好设计常常是大胆的设计。
2.10编程语言解析
(1)机器语言:操作计算机命令的综合;
(2)高级语言与编译器/解释器。编译器处理的高级语言代码又叫做源码,经过翻译以后产生的机器码叫做目标码。
(3)如果长期使用某种语言,就会慢慢按照这种语言的思维模式进行思考。所以后来遇到其他任何一种有重大差异的语言,会觉得他极其难用。
(4)语言设计者之间的最大分期也许在于,有些人认为编程语言应该防止程序员干蠢事(如java),另一些人则认为程序员应该可以用编程语言干一切他们想干的事。
(5)面向对象编程的逻辑。(理解这种思维方式很重要)
假设要写一个程序计算二维图形的面积。一种解决方案是用一整块的代码判断遇到的是什么图形,然后再用相应的公式计算。面向对象编程的方式,写出两个类,一个是圆形类,一个是方形类,然后每个类里面用一小块代码(方法)计算该类图形的面积。
2.11一百年后的编程语言
对于语言设计者来说,认清编程语言的进化路径特别有用,因为这样就可以照着样子设计语言了。
任何一种编程语言可以分为两大部分:基本运算符的集合以及除运算符以外的其他部分。
基本运算符是一种语言能否长期存在的最重要因素。
内核最小、最干净的编程语言才会存在于进化的主干上。
编程语言进化慢的原因在于它们并不是真正的技术。语言只是一种书写法,而程序是一种严格符合规则的描述,以书面形式记录计算机应该如何解决你的问题。所以编程语言的进化速度更像是数学符号的进化速度,而不是像通信技术的进化速度。
2.12拒绝平庸
尝试新技术;
书中以lisp语言举例说明了寻找合适语言的重要性。
2.13书呆子的复仇
作者推荐使用看起来不那么常用的语言。
可能会出现的问题:1.你的程序无法很好地与使用其他语言写的程序协同工作;你可能找不到很多函数库;你可能不容易雇到程序员。并且提出了对这些问题的质疑。
并且讲了很多我现在并不是很能理解的内容。
2.14梦寐以求的编程语言
语言受欢迎的条件,一种免费的实现,一本相关的书籍,以及语言所依附的计算机系统,简洁,可编程性,适合开发一次性程序(容易装备,很容易与使用者互动),函数库,效率,经受住时间的考验,进行再设计。
2.15设计与研究
设计与研究的区别,前者追求好,后者追求新。
如何理解编程语言?你不要把它看成哪些已完成的程序的表达方式,而应该把它理解成促进程序从无到有的一种媒介。
贴近用户的设计思想被归纳为“弱即是强”。(弱即是强指一种软件传播方式,软件功能的增加并不必然带来质量的提高。
附录
布鲁克斯假说:程序员一天写出的代码行数是一个常量,与他使用什么语言无关。