黑客与画家-读书笔记

Reading time ~6 minutes

此文章为原创文章,引用请标记文章出处: 黑客与画家-读书笔记

前言

hack作为名词有两个意思,既可以指很巧妙或很便捷的解决方法,也可以指比较笨拙、不那么优雅的解决方法。hack还有一个引申义,指对某个程序或设备进行修改,使其完成原来不可用的功能(或者禁止外部使用者接触到的功能)。

黑客价值观的核心原则可以概括成这样几点:分享、开放、民主、计算机的自由使用、进步。

传统意义上的黑客才能被称为hacker,而那些恶意入侵计算机系统的人才应该被称为cracker(入侵者)。

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

没有什么比一个共同的敌人更能使人们团结起来了

第二章 黑客与画家

黑客是创作者,与画家、建筑师、作家一样,以代码为工具,展示他们的才华,在比特世界里“构建”着“建筑”。

“建筑师”(architect)和“架构师”(architect)是同一个词,所以这里用的是双关语,意思是优秀程序员不仅负责建造,还负责架构。

坚持一丝不苟,就能取得优秀的成果,因为那些看不见的细节累加起来,就变得可见了。优秀的软件也要求对美的狂热追求,如果你查看优秀软件的内部,就会发现那些预料中没有人会看见的部分也是优美的。

软件的部分功能就是解释自身。为了写出优秀软件,你必须假定用户对你的软件基本上一无所知,而且设计要从用户的角度考虑。你要明白,用户第一次使用你的软件的时候,不会预先做好功课,他们没有任何准备就开始用了,所以软件的使用方式最好能符合用户的直觉,别指望用户去读使用手册。

创造优美的事物的方式往往不是从投做起,而是在现有成果的基础上做一些小小的调整,将已有的观点用比较新的方式组合起来。这类型的工作很难用研究性的论文来表述。

对于黑客来说,采取像画家这样的做法有好处:应该定期地从头开始,而不要长年累月地在一个项目上不断工作,并且试图把所有的最新想法都以修订版的形式包括进去。

过早优化是一件很危险的事情,我们不要太早决定一个程序应该怎么做,而是根据用户的反应进行软件优化。

对于编程,这实际上意味着你可以把bug留到以后解决,消灭bug对我来说术语轻松的工作,只有在这个时候,编程才变得直接和机械,接近社会大众想象中的编程的样子。

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

编程能有多酷取决于我们能够用追职工新媒介做出怎么样的工作。

第三章 不能说的话

如果别人告诉你应该相信什么,你就真的相信了,那么你就会和别人一样犯下同样的错误。

最先从你头脑中跳出来的想法,往往使最困扰你的、很可能为真的想法,你已经注意到它们,但还没有认真思考过。

智力越高的人,越愿意去思考那些惊世骇俗的思想观点,这不仅因为聪明人本身很积极地寻找传统观念的漏洞,还因为传统观念对他们的束缚力很小,很容易摆脱。

发现了“不能说的话”的建议是别说,至少也要挑选合适的场合再说,只打那些值得打的仗。

一个公司是否健康运作,可以用一个指标来衡量,那就是对负面评价的容忍程度,做出伟大产品的公司,自我评价往往以“批评”和“自嘲”为主,而不是以“肯定”和“表扬”为主。

安全问题的关键是不要有漏洞,而不是任何设计上的决策。服务器软件的性质决定了开发者对漏洞会加倍注意。而且,服务器被入侵会使得运营公司遭受巨大损失,所以它们为了在行业中生存下去,可能也会对安全问题备加关注

所谓“流行”(传统观念也是一种流行),本质上就是自己看不见自己的样子。否则就不会有流行了。对于那些被流行抓住的人,流行就不再是流行,而是应该要做的正确事情。只有保持一定的距离才能观察到人们观念的变化,发现流行(也就是人们自以为正确的事情)到底是什么

第四章 良好的坏习惯

遇到难题的时候,把问题重新定义成一个较简单的形式,同时一定你假想你一个对手正在与他比赛谁能更快地解决问题。

第五章 另一条路

如果你的软件效率高,你就嫩而过比同样硬件配置的竞争对手多发展用户,获得更多的利润

第六章 如何创造财富

我们需要的东西就是财富,金钱不等于财富,金钱只是一种交换媒介,让大家更方便获得自己想要的东西,商品和服务都属于财富。大多数生意的目的是为了创造财富,做出人们真正需要的东西。

创造财富,为自己,也为社会,最好的方式绝对不是在公司里工作,即使这个公司再好,也有其效率低下的问题,肯定会受到组织的局限,所以最好的方式就是创业,今天“全民创业”其根本根源也是如此,只不过这些群体中家夹杂着太多浑水摸鱼之辈,一场狂潮才变成了闹剧和寒冬。

要致富,你需要两样东西:可测量性和可放大性。你的职位产生的业绩,应该是可测量的,否则你做得再多,也不会得到更多的报酬。此外,你还必须有可放大性,也就是说你做出的决定能够产生巨大的效应。

我认为,任何一个通过自身努力而致富的个人,在他们身上应该都能同时发现可测量性和可放大性。我能想到的例子就有CEO、电影明星、基金经理、专业运动员。有一个办法可以发现是否存在可放大性,那就是看失败的可能性。因为收入和风险是对称的,所以如果有巨大的获利可能,就必然存在巨大的失败可能。CEO、电影明星、基金经理、运动员的头顶都悬着一把宝剑,随时可能掉下来。一旦他们搞砸了,他们就完了。如果你有一个令你感到安全的工作,你是不会致富的,因为没有危险,就几乎等于没有可放大性。但也并非一定要当上CEO或电影明星不可,成为某个攻克难题的小团体的一部分就可以了。

如果你发现了一种做事的新方式或者解决了一个热门的技术难题,它的经济价值就取决于多少人使用这种新方式,技术就是钓鱼的鱼竿,而不是那条鱼。

选择公司要解决什么问题应该以问题的难度作为指引,而且此后的各种决策都应该以此为原则。

第七章 关注贫富分化

每个人创造财富的能力和欲望强烈程度都不一样,所以每个人创造财富的数量很不平等。一个人的工作具有多少价值不是由政府决定的,而是由市场决定的。

不要假设你的系统毫无漏洞,而是要高清楚多大程度上漏洞无法被利用。

每个人的技能不同,导致收入不同,这才是贫富分化的主要原因,正如逻辑学的“奥卡姆剃刀”原则所说,简单的解释就是最好的解释。

第九章 什么是好的设计?

  • 好设计是简单的设计。

当你被迫把东西做得很简单时,你就被迫直接面对真正的问题。当你不能用表面的装饰交差时,你就不得不做好真正的本质部分

  • 好设计是永不过时的设计。

只要没有错误,每一个数学证明都是永不过时的。所以,数学家哈代才会说:“丑陋的数学在世界上无法生存。”他的意思与飞机设计师凯利·约翰逊的观点是一样的:如果解决方法是丑陋的,那就肯定还有更好的解决方法,只是还没有发现而已。 如果一件东西长盛不衰,那么它的吸引力一定来自本身的魅力,而不是来自风潮的影响。

  • 好设计是解决主要问题的设计。

软件的难题通常可以被改成等价的较易解决的形式。

  • 好设计是启发性的设计。

在软件行业,这条原则意味着,你应该为用户提供一些基本模块,使得他们可以随心所欲自由组合,就像玩乐高积木那样。

  • 好设计通常是有点趣味性的设计。

  • 好设计是艰苦的设计。

如果观察那些做出伟大作品的人,你会发现他们的共同点就是工作得非常艰苦。如果你工作得不艰苦,你可能正在浪费时间。

  • 好设计是看似容易的设计。

在大多数领域,看上去容易的事情,背后都需要大量的练习。练习的作用也许是训练你把刻意为之的事情变成一种自觉的行为。有时,我们的训练只是为了让身体养成下意识的反应。优秀钢琴家弹奏名曲可以不经过大脑直接完成,艺术家也是这样,熟练以后,脑海中的艺术形象会自动从手上流淌出来,仿佛有人在一旁为他打节奏一样。

  • 好设计是对称的设计。

对称有两种:重复性对称和递归性对称,递归性对称就是指子元素的重复,比如树叶上叶脉的纹路。

  • 好设计是模仿大自然的设计。

  • 好设计是一种再设计。

  • 好设计是能够复制的设计。

  • 好设计常常是奇特的设计。

你最后发展出来的风格是自然而然形成的。“奇特”这个特点尤其如此,除了完成好作品之后回头看之外,没有其他方法了。

  • 好设计是成批出现的。

推动人才成批涌现的最大因素就是,让有天赋的人聚在一起,共同解决某个难题。

  • 好设计常常是大胆的设计。

今天的实验性错误就是明天的新理论。如果你想做出伟大的新成果,那就不能对常识与真理不相吻合之处视而不见,反而应该特别注意才对。只有对这个领域非常熟悉,你才可能发现哪些地方可以手动改进,因此你必须锻炼自己成为某个领域的专家。

第十章 编程语言的战争

“你用什么语言并不重要,重要的是你对问题是否有正确的理解。代码以外的东西才是关键。”

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

效率不是问题(由于计算速度的提升),灵活更重要,相比浪费机器时间,浪费程序猿的时间才是真正的无效率。

第十二章 拒绝平庸

使用哪一种技术的时候,你不能考虑别人的做法,只能考虑什么样的技术能最好地完成工作。

第十三章 书呆子的复仇

条件越苛刻的项目,强大的编程语言就越能发挥作用,但是无数的项目根本没有苛刻条件的限制。另外语言的选择意味着开发的速度,即使开发速度只相差两三倍,也足以使你永远处于落后的位置。

使用一种不常见的语言可能出现的问题及解答:

1.可能无法很好的与使用其他语言写的程序协同工作;

答:软件从桌面端到服务器端迁移,使用某一种语言的限制将越来越少

2.可能找不到很多函数库

答:根据开发的条件限制,决定是选择函数库重要还是语言本身的能力重要

3.可能不容易雇到程序员

答:强大的语言会减少所需要开发人员的数量

第十五章 设计与研究

优秀的设计不一定是“新”的,但一定是“好”的;优秀的研究不一定是“好”的,但一定是“新”的。两者会交叉,只有应用“新”的创意和理论,才会诞生超越前人的最佳设计

“用户需要的设计”而不是“用户要求的设计”,设计师并不像厨师一样,不要对用户言听计从,用户不了解所有可能的选择,也经常弄错自己真正想要的东西,设计师需要像医生一样,找出病因,针对“病因”进行治疗。

贴近用户,永远站在用户的角度调整自己的构想,此设计思想被归纳为“弱即是强”的模式,模式中其中一点是如果你正在设计某种新东西,就应该尽快拿出原型,听取用户的意见,再逐步加工做出成品。

jdk-timer、spring-task、quartz的比较

这篇文章将简单介绍目前常用的定时任务框架! Continue reading

小岛经济学-读书笔记

Published on May 10, 2018

java常见的http请求库

Published on May 05, 2018