book, 黑客与画家
保罗.格雷厄姆认为黑客与画家有很多共同之处:
1、他们都是创作者,对于黑客来说,计算机只是一种表达的媒介,就像画家手里的颜料。黑客真正想做的是设计优美的软件,但创造优美事物的方式往往不是从头做起,而是在现有成果的基础上做一些小小的调整,或者将已有的观点用比较新的方式组合起来(创作没有想象中那么复杂);
2、他们创作的过程主要是动手去做,而不是先在书本上把理论知识搞清楚,然后想清楚整个程序再动手,所以黑客是通过实践学习编程的;
3、他们都是通过模仿优秀的范例来学习的,学习编程最快速的方式就是模仿优秀程序的源代码;
4、还有一个可以借鉴绘画的地方:一幅画是逐步完成的。通常一开始是一张草图,然后再逐步填入细节。但是有时原先的构想是错的,就必须动手修改。黑客一开始也不能盼望先有一个完美的规格设计,然后再动手编程,如果预先承认规格设计是不完美的,在编程的时候就可以根据需要,当场修改规格,最终会有一个更好的结果。简而言之不要太早决定一个程序应该怎么做,而选择好的编程语言可以让我们避免这种风险(动态语言)。
5、协作创造作品的模式是类似的,正确的合作方法是将项目分割成严格定义的模块,每一个模块由一个人明确负责。模块与模块之间的借口精心设计,并将文档说明写得规范和清晰。
6、黑客必须像画家一样,时刻考虑用户的人性需求,做到这点就必须学会“换位思考”。这并不意味着要做自我牺牲,事实证明,从他人的角度思考问题正是成功的奥秘所在,比如最伟大的绘画作品都是画人的,因为人类总是对自身最感兴趣。”换位思考“是识别优秀黑客的重要因素,而判断一个人是否具备”换位思考“的能力,那就是看他怎样向没有技术背景的人解释技术问题。
优美的软件并不总是论文的合适题材。科学研究必须具有原创性。确保自己正在开垦新领地的方法,就是去找那些没人要的土地。而那些不成熟的、障碍重重的领域最容易写出许多论文。没有什么比一个错误的前提更容易产生大量待解决的问题了。
论文之所以作为考核标准,只是因为这样比较容易实施。
优秀的软件设计师,与其说是工程师,不如说是建筑师。
你把整个程序想清楚的时间点,应该是在编写代码的同时,而不是编写代码之前。
编程语言的首要特性是允许动态扩展dynamic typing。语言是用来帮助思考程序的,而不是用来表达你已经想好的程序。应该是一支铅笔,允许涂涂改改,而不是一支钢笔。
一页写满数学公式的纸真是令人印象深刻啊。因此,你就受到巨大的诱惑,去解决那些能够用数学公式处理的问题, 而不是去解决真正重要的问题。
真正竞争软件设计的战场是新兴领域的市场。这里没有人建立防御工事,只要你能做出大胆的设计,由一个团队同时负责设计和实现产品,你就能在这里战胜大公司。
自己创业的两个问题:
-
必须处理许许多多与开放软件完全无关的事情。能有1/4的时间可以用于开放,就感到很幸运了。
-
赚钱的软件往往不是好玩的软件。好玩的软件的需求量,比不上解决客户麻烦问题的软件的需求量。小剧场演出的酬劳比不上穿着卡通大猩猩在展会站台,写小说比不上写广告文案。开发新语言,比不上把某些公司老掉牙的数据库连上服务器。
黑客如何才能做自己喜欢的事情?找一份养家糊口的『白天工作』
我们面试程序员时,主要关注的就是业余时间他们写了什么软件。因为如果你不爱一件事情,你不可能把它做得真正优秀。要是你很热爱编程, 你就不可避免地会开放你自己的项目。
黑客更像创作者,所以不应该在科学家身上寻找启示。
有些客户很聪明,但是完全以自我为中心,根本不会设身处地为用户考虑。这样的人很难设计出优秀软件。
你要明白,用户第一次使用你的软件,不会预先做好功课,他们没有任何准备就开始用了,所以软件的使用凡事最好能符合用户的直觉,别指望用户去读使用手册。
好的源代码是写出来让人看得懂的,附带能在机器上运行。
什么不能说
智力越高的人,越愿意去思考那些惊世骇俗的思想观点。这不仅仅因为聪明人本身很积极地寻找传统观念的漏洞,还因为传统观念对他们的束缚力很小,很容易摆脱。从衣着行就可以看出,不受传统观念束缚的人,往往也不会穿流行的衣服。
与笨蛋辩论,你也会变成笨蛋。你要明白,自由思考比畅所欲言更重要。如果你感到一定要跟那些人辩个明白,绝不咽下这口气,一定要把话说清楚,结果很可能是从此你再也无法自由理性地思考了。在心里无所不想,但是不一定要说出来。
守口如瓶,笑脸相迎。
讨论的好处是是一个观点会产生更多观点。如果可能,找信得过的知己,畅所欲言。这样不仅可以获得新观点,还可以用来选择朋友。
miachael Rabin 遇到难题时,会把问题重新定义成一个较简单的形式,同时一定会假想一个对手正在与他比赛谁能更快地解决问题。
另一条路
互联网软件的优势:细微渐进,bug更容易复盘和消灭。
人月神话。软件项目是交互关系复杂的工作,需要大量的沟通成本。人力的增加会使沟通成本指数上升,无法缩短工期,反而会拖慢进度。
如果你是黑客且梦想自己创业,却担心两件事: 不懂管理企业,害怕竞争。其实这两件事都是没有通电的电篱笆。其实管理企业很简单:做出用户喜欢的产品,保证开支小余收入。只要做到这两点,你就会超过大多数创业公司。
如何做出用户喜欢的产品。从制造简洁的产品入手,首先保证自己愿意使用,然后迅速做出1.0版,并且不断加以改进。倾听用户的反馈。用户总是对的,但是不同用户的要求不一样。低端用户要求简化操作和清晰易懂。高端用户要求增加新功能。正确设置默认值,不是限制用户的选择。
如果你不打算自己动手设计和开放,那就不要创业。
竞争中,你害怕那些像模像样,有着办公室、商业计划、销售员的公司。实际上,他们更害怕你。然而,它的生产效率仅仅相当于小型创业公司的十分之一。
不要被微软吓到。它能做到你做不到的事情,你更能做到它做不到的事情。
how to make money
优秀黑客的年薪大约8万美元。然而你的真正工作时间是公司上班时间的2倍。全神贯注,每小时产出可以提高3倍。除掉中间管理层,你的效率再提高2倍。没有杂事,工作效率再增加3倍。因此总共是36倍,创造的价值可以达300万美元。这当然是极限情况。
黑客要求不受干扰的时间是非常长的。有时花了一个小时才刚刚把一个问题理清,人事部突然打电话咬你去填一张表格,就会造成巨大的成本浪费。所以黑客无法在小隔间里写出优秀的软件。黑客往往在深夜工作。
创业公司不是变魔术,它们无法改变创造财富的法则。创业公司把所有压力压缩到三四年。你无法逃避基本的定律。如果创业那么轻松,那么所有人都去创业了。
金钱只是一种中介。本质是创造价值。
无论上学还是上班,都是按部就班地做你正常情况下没兴趣做的事情。只不过上学你要付钱,上班有人付钱给你。上学当然更有趣,因为你是顾客。
但是,公司一切行为的目的都是盈利,从而生存下去。由于业务高度专业化,你对顾客需求的贡献也许不是直接性的,但是公司作为一个整体必须提供某种人们需要的东西,否则不可能盈利。
你不需要一份工作,你需要的是去做一些人们需要的东西。
大公司会使每个人的贡献平均化。大公司最大的困扰是无法准确测量每个员工的贡献。只有销售员和高管的贡献比较容易测量。
收入和风险是对称的。如果你有一个令你感到安全的工作,你是不会致富的。因为没有危险,就几乎等于没有放大性。
创业的成败取决于最早加入公司的那10个人,甚至只是前5个人。小团队的优势不在于它本身的小,而在于你可以选择成员,全明星阵容的那种小。
技术就是我们做事的方式。如果你发现一种做事的新方式,你解决了一个热门的技术难题,别人都会使用你的解决方案,这就是可放大性。
选择公司要解决什么问题应该以问题的难度作为指引,这样才能甩开那些又大又慢的竞争对手。
进入壁垒。其他人复制你的模式是否苦难,你为竞争对手设置的壁垒有多高。
如果你知道某种东西的发明人(电话、流水线、飞机、电灯、晶体管),那是因为他的公司用这种发明赚到了钱,而公司的公关人员尽力散布发明人的故事。如果你不知道谁发明了某种东西(汽车,电视,计算机,飞机引擎,激光),那是因为其他人的公司从这种发明中赚到了钱。
最好的防御是进攻。一开始就选择较难的问题,以后的各种决策都选择较难的那个选项。这也是很好的处事原则。如果你有两个选项,就选较难的那个。坐在家看电视,还是外出跑步,那就出去跑步。因为懒惰会让你选择较易的那个选项。
创业是有一些潜规则的,其中一条就是很多事情由不得你。真正创业以后,你的竞争对手决定了你到底要有多辛苦,因为他们做出的决定都是一样的。
大多数创业者都以失败告终,所以中位数是0.
促成买方掏钱的最好办法不是让买家看到有获利的可能,而是让他们感到失去机会的恐惧,比如看到竞争对手可能收购你,或者未来的收购耗资巨大。
归根结底都是用户数量。你开班 创业公司不是单纯地为了解决有趣的技术问题,而是为了解决那些用户关心的问题。
开发某种产品的时间过长是一个陷阱。尽快拿出1.0版,然后根据用户的反映而不是自己的猜测进行软件优化,
创业公司是可以让人更快速工作的地方。你不是缓慢积累50年的普通工资,而是尽快地将这笔钱赚到手。
没有财富的激励,技术革新就会逐渐停顿。为什么欧洲在历史上变得如此强大?也许是因为: 允许赚到大钱的人保住自己的财富。
关注贫富分化
没有能力创造财富的人,享有的一切都来自别人无偿的给予,得到财富却没有对应对应的付出,会比较理所当然地认为财富应该平均分配。
富人和普通人过的生活是差不多的,衣食住行在工业制品下相差无几。富人还在工作,是因为无所事事使人感到孤独和消沉。
现代社会的收入差距扩大是一种健康的信号,技术使得生产率的差异加速扩大。
即使是最先进的高科技公司,也至少有90%的工作没有乐趣,令人生厌。在一个剥夺个人财产的社会,财富创造中所有那些没有乐趣的事情都会急剧地放慢。最后就是社会整体变穷了。
如果可以选择,是生活在一个整体上非常富裕但是我个人相对贫穷的社会,还是相反? 前者。你要避免的是绝对贫穷,而不是相对贫穷。
防止垃圾邮件
发现垃圾邮件特征 vs 统计学方法
好的设计:
-
简单
-
永不过时
-
解决主要问题
-
启发性,不是描述性
-
有点趣味性。幽默是一种力量,代表你对厄运一笑了之。
-
艰苦的。野生动物非常优美,是因为他们的生活非常艰苦,在外形不可能有多余的部分了。
-
看似容易。背后需要大量练习,把刻意为之的事情变成一种自觉。
-
递归性对称。
-
模仿大自然。写实不是为了给生活留下一模一样的记录,而是为你的思想提供一个咀嚼点。
-
再设计
-
奇特
-
成批出现。相互激励
拒绝平庸
想当黑客,建议从Python 和Java入手
想当高级一点的黑客,还应该学习C和Perl
严肃的黑客,应该考虑学习Lisp
大公司每件事做到平均水平,就能得到平均水准,就能生存。小公司就会关门。
Lisp适合快速开发软件,运行在服务器端。抽象层次非常高,不需要非常庞大的开放团队,因而降低成本。我们使用一种奇特的人工智能的语言开发软件,语法非常古怪,大量使用括号。在竞争中,你的对手无法理解你的技术优势,这再宝贵不过了。在viaweb创业期间,我们对新闻媒体闭口不谈Lisp。
如果有一些功能在一种语言是内置的,但是在另一种豫园中需要修改解释器才能做到,那么前者就比后者更强大。
由于Blub困境的存在,你无法信任其他人的意见。他们都满足于自己碰巧用熟了的那种语言,他们的编程事项都被那种语言主宰了。
最不用担心的竞争对手就是要求应聘者具有Oracle数据库经验的公司,你永远不必担心他们。如果招聘C++或Java程序员的公司,对你也不会构成威胁。如果他们招聘Perl或Python,就稍微有点威胁了,至少听起来像一家技术公司,并且由黑客控制。如果有家招聘Lisp的公司,那就会感到如临大敌。
1992年流行C++。 2000年流行Java。现在流行Python。
Lisp和Fortran代表了编程语言发展的两大方向。前者的基础是数学,后者的基础是硬件架构。这两大方向一直在相互靠拢。
这种语言本质上不是一种技术,而是数学。数学是不会过时的。
网络订票市场很难进入,两大巨头(travelocity和Expedia)牢牢控制,而ITA软件公司为Orbitz开放的机票搜索程序中, 有20万行的common lisp程序,使得其搜索能力比竞争对手高出许多个数量级。(2011, ITA software LLC 被google收购。)
语言的编程能力越强大,写出来的程序就越短。
1 行Lisp代码相当于20行C代码。在一个高度竞争的市场中,即使开放速度只相差两三倍,也足以使得你永远处在落后的位置
hierarchy of disagreement
image梦寐以求的编程语言
C.S Lewis
一心让臣民行善的暴君可能是最专制的暴君。
编程语言不是存在于真空之中,必须为它找到一个依附的系统。
如果一个编程语言只有语法规则,而没有一个好的implementaton,那就不能算完整的编程语言。
https://www.amazon.com/Programming-Language-2nd-Brian-Kernighan/dp/0131103628 是一个好的典范。
简洁性是静态语言的短板。没人愿意在程序的头部写上一大堆的声明语句。只要计算机可以自己推断,就应该让计算机自己去推断。
对于制造工具的人来说,总是会有用户以违背你本意的方式使用你的工具。
外科医生:那些内科医生真是令人讨厌,总是喜欢谈论一辈子只能遇到一次的病例。这就是他们的问题,只喜欢古怪的东西,讨厌普通的常见病例。
黑客觉得某个bug非常诱人,一定要追踪下去。
优秀函数库的重要性将超过语言本身。
为了提高运行速度,并非精心选择一种静态类型的语言,没必要每个函数的每个参数类型都声明清楚,你只需要在瓶颈处声明清楚参数就行了。所以,更重要的是你需要能够找出瓶颈在什么地方。
我有一个朋友,他的客户第一次提出某种需求时,他很少理会。因为他知道人们有时候会想要自己并不真正需要的东西。为了避免浪费时间,只有当客户第三次或第四次提出同样的需求时,他才认真对待。
大多数人接触新事物时都学会了使用类似的过滤机制。甚至别人提到十遍以上才会留意。这样做完全合理。因为大多数热门新商品事后被证明是浪费时间的噱头,没多久就消失得无影无踪。
发明新事物的人必须有耐心,要长年累月不断做市场推广。人们注意到你的时候,不是第一眼看到你站在那里,而是发现过了这么久你居然还在那里。
自然成长式的创业者坐在自家车库里,觉得自己又穷又可怜。但是我想他们不必难过。最终看来,自然成长回避大爆炸式产生更好的技术,能为创始人带来更多的财富。
你必须对解决难题的可能性保持乐观,同时对当前解法的合理性保持怀疑。