《黑客与画家》读书笔记
来源:互联网 发布:免费淘宝全套模板下载 编辑:程序博客网 时间:2024/05/29 05:09
译者序
通过这本书让普通读者理解我们所处的这个计算机时代。
想要把握这个时代,就必须理解计算机。理解计算机的关键,则是要理解计算机背后的人。
黑客伦理:
(1) 使用计算机以及所有有助于了解这个世界本质的事物都不应受到任何限制。任何事情都应该亲手尝试。
(2) 信息应该全部免费。
(3) 不信任权威,提倡去中心化。
(4) 判断一名黑客的水平应该看他的技术能力,而不是看他的学历、年龄或地位等其他标准。
(5) 你可以用计算机创造美和艺术。
(6) 计算机使生活更美好。
黑客价值观的核心原则可以概括成这样几点:分享、开放、民主、计算机的自由使用、进步。
黑客这个词的原始含义就是指那些信奉黑客伦理而且能力高超的程序员。
黑客伦理的一个必然推论就是,黑客不服从管教,具有叛逆精神。
和画家一样,黑客只是怀有一门特殊手艺、有创造天赋的普通人。
编程是一种艺术创作,黑客就是艺术家,开发软件与画家作画、雕塑家雕刻、建筑师设计房屋并没有本质不同。
1. 为什么书呆子不受欢迎
答案就是他们真的不想让自己受欢迎。
书呆子不受欢迎的真正原因,是他们脑子里想着别的事情。
所谓书呆子,其实只是指这个人的社交技能不够强。
真实世界的关键在于它的庞大规模使得你做的每件事都能产生真正意义上的效果。
校园生活的真正问题是空虚。除非成年人意识到这一点,否则无法解决这个问题。
2. 黑客与画家
黑客与画家的共同之处,在于他们都是创作者。
黑客的最髙境界是创造规格。
优美的软件并不总是论文的合适题材。
你把整个程序想清楚的时间点,应该是在编写代码的同时,而不是在编写代码之前。
编程语言首要的特性应该是允许动态扩展。
大学和实验室强迫黑客成为科学家,企业强迫黑客成为工程师。
真正竞争软件设计的战场是新兴领域的市场。
开发优秀软件的方法之一就是自己创业。问题:
一个是自己开公司的话,必须处理许许多多与开发软件完全无关的事情。
另一个问题是赚钱的软件往往不是好玩的软件,两者的重叠度不髙。
黑客如何才能做自己喜欢的事情?找一份养家糊口的白天工作。
我们面试程序员的时候,主要关注的事情就是业余时间他们写了什么软件。
画家学习绘画的方法主要是动手去画,黑客学习编程的方法也理应如此。
黑客可以通过观看优秀的程序学会编程,不是看它们的执行结果,而是看它们的源代码。
不要太早决定一个程序应该怎么做。
程序写出来是给人看的,附带能在机器上运行。
3. 不能说的话
你是一个随大流的人吗
如果别人告诉你应该相信什么,你就真的相信了,那么你就会和别人一样犯下同样的错误。
真话
第一个条件是,这些话不能说出口;第二个条件是,它们是正确的,或者看起来很可能正确,值得进一步讨论。
最令人暴跳如雷的言论,就是被认为说出了真相的言论。
异端邪说
有些想法,纯粹因为非常特别,而不能说出口。
时空差异
将当代观念与不同时期的古代观念diff^一下。diff得到的结果,有一些用当代标准衡量是很令人震惊的。
道貌岸然
寻找那些一本正经的卫道者,看看他们到底在捍卫着什么。
机制
去观察禁忌是如何产生的。
斗争总是会以思想斗争的形式表现出来。
禁忌不是由于社会斗争而产生的,它们深深植根于过去的历史之中。
为什么这样做
纯粹的好奇心。
因为我不喜欢犯错。
因为这是很好的脑力训练。
智力越高的人,越愿意去思考那些惊世骇俗的思想观点。
训练自己去想那些不能想的事情,你获得的好处会超过所得到的想法本身。
守口如瓶
自由思考比畅所欲言更重要。
守口如瓶的真正缺点在于,你从此无法享受讨论带来的好处了。
你最好找一些信得过的知己,只与他们畅所欲言、无所不谈。
笑脸相迎?
不赞同这个时代的任何一种歇斯底里,但是又不明确告诉别人到底不赞同哪一种歇斯底里。
一种方法就是逐步把辩论提升到一个抽象的层次。
另一种反击的方法就是使用隐喻。
最好的一种可能就是幽默。
永远质疑
你不仅要远距离观察人群,更要远距离观察你自己。
4. 良好的坏习惯
在大众眼里,黑客(hacker)就是入侵计算机的人。可是,在程序员眼里,黑客指的是优秀程序员。
总体来看,黑客是不服从管教的,这往往会激怒管理当局。但是,不服从管教,其实是黑客之所以成为优秀程序员的原因之一。
一个人们拥有言论自由和行动自由的社会,往往最有可能采纳最优方案,而不是采纳最有权势的人提出的方案。
5. 另一条路
下一个潮流
使用互联网软件,除了软件本身,大多数用户不需要知道别的事情。
用户的胜利
在大多数时候,总是选择最省事的做法。如果互联网软件能够击败桌面软件,一定是赢在更方便这一优势上。
你的电脑这个概念正慢慢成为过去时,取而代之的是你的数据。
有了互联网软件,你的数据和软件本身都不保存在终端设备上,不用安装就能使用。既然不用安装,也就不用担心安装出错了,再也不会有应用软件与操作系统不兼容的问题了。
由于没有安装这一步,所以在购买之前试用互联网软件将变得非常普遍、非常容易。
所有用户都使用同样版本的互联网软件,bug一发现就会立刻得到纠正。所以,它的bug应该比桌面软件少得多。
互联网应用程序能够同时被多人使用,所以非常适合团队协作性的工作。
如果使用互联网软件,数据会更安全。
代码之城
对于开发者来说,互联网软件与桌面软件最显著的区别就是,前者不是一个单独的代码块。
光有软件还不够,我们还花了许多时间琢磨服务器应该如何配置。
硬件需要考虑的地方,不仅仅在于怎么才能避免出问题,还在于怎样才能最大地发挥它们的作用。
对于互联网软件,你可以使用任何你想用的语言。
软件的发布
对于互联网软件来说,大部分的变化都是细微和渐进的,所以引入bug的机会比较小。
互联网软件的发布规则是:它运行不了,你就无法发布;一且它能运行了,你就可以立刻发布。
软件bug
互联网软件的另一个技术优势在于,你能再现大部分的bug。
解决新代码的bug要比解决历史遗留代码的bug容易。
在软件中,复合式bug是最难发现的bug,往往也会导致最大的损失。
客户支持
大多数软件公司将客户支持看作提高客户满意度的一种方式。
全身心投入
能够即时发布软件,对开发者是一个巨大的激励。
将一个构思束之高阁,不仅意味着延迟它的实现,还意味着延迟所有在实现过程中激发的构思。
它适用于小型的、由优秀可靠程序员组成的开发团队,不适用于大型的、充斥大量平庸之辈的软件公司。
逆向的《人月神话》
在本质上,软件项目的人力与工期是无法互换的,当项目进度落后时,光靠增加人力到该项目中,并不会加快进度,反而有可能使进度更加延后。(该书英文版已由人民邮电出版社出版。
由于开发人员比较少,每个程序员都必须承担一点儿系统管理的责任。
第一年之后就不必每分钟都盯着服务器了,但是对新变动的部分一定要密切关注。不要在半夜里发布代码,然后回家睡觉。
关注用户
如果你亲眼见到某人第一次使用你的软件,你就会知道软件的哪个地方最打动他。
软件应该做到用户认为它可以做到的事情。
关注用户不仅有助于优化程序,还有助于指导你的设计。
通过关注用户,你可以知道他们在使用软件的过程中什么时候遇到了麻烦。
金钱问题
软件开发不是静态的,而是一个持续不断的动态过程。
盗版实质上是一种价格歧视,只不过针对的是最底层的消费者。
互联网软件提供的服务可能是世界上购买起来最方便的东西
通过ISP分销互联网软件,就好比让自动售货机出售寿司。
目标客户
互联网软件往往也是大公司的最佳选择。
公司内部所有不直接感受到竞争压力的部门都应该外包出去。
桌面电脑
创业公司有更多的理由选择互联网软件创业,因为开发桌面软件越来越乏味了。
如果某家公司想要开发一个平台,吸引他人在此之上创业,这家公司必须使得黑客本人愿意使用这个平台。这意味着它必须是便宜的,而且有着良好的设计。
微软公司
创业公司
桌面软件迫使用户变成系统管理员,互联网软件则是迫使程序员变成系统管理员:用户的压力变小了,程序员的压力变大了。
勉强够用的网页
你能写出一个可以供多人在不同地点、不同终端设备上同时使用的电子表格,而且不用安装任何软件,只要有浏览器就可以。你还可以写出数据实时更新,或者一且满足某些条件就会自动发出传呼信号的电子表格。
你能用它创造出各种各样甚至还没有名字也没有人想到过的新东西。
互联网软件不需要做任何关于安装的假设,只要能上网的地方,它就能运行。
互联网软件的开发成本低,即使是最小型的公司,也可以很容易地制作和发布。
互联网软件做起来很辛苦,还有许多特别大的压力,但是这样只会使得创业公司成功的机会变大。
为什么不尝试一下
管理企业其实很简单,只要记住两点就可以了:做出用户喜欢的产品,保证开支小于收入。
编写一个互联网软件是非常便宜的。
从制造简洁的产品开始着手,首先要保证你自己愿意使用。然后,迅速地做出1.0版,并且不断以改进,整个过程中密切倾听用户的反馈。
大公司的生产效率仅仅相当于小型创业公司的十分之一。没有任何一家大公司能做得更好。
6. 如何创造财富
几百年来,创业一直是致富的可靠途径。
一个命题
你不再是低强度地工作四十年,而是以极限强度工作四年。在高技术领域,这种压缩的回报尤其丰厚,工作效率越高,额外报酬就越高。
运气的成分
通过创造有价值的东西在市场上得到回报,从而致富。
这种方法的优势不仅仅在于它是合法的,还在于它更简单。
金钱不等于财富
创造有价值的东西就是创造财富。
财富存在的时间与人类历史一样长久,甚至更长久,事实上蚂蚁也拥有财富。金钱是一种历史相对较短的发明。
大饼谬论
世界上可供交换的财富不是一个恒定不变的量。
手工艺人
程序员坐在电脑前就能创造财富。
最顶尖的5%的程序员写出了全世界99%的优秀软件。
创造出来的财富不一定非要通过出售实现价值。
工作是什么
公司一切行为的目的都是盈利,从而生存下去。创造财富是大多数公司盈利的手段。
更努力地工作
大公司最大的困扰就是无法准确测量每个员工的贡献。
可测量性和放大性
你的职位产生的业绩,应该是可测量的,否则你做得再多,也不会得到更多的报酬。
你还必须有可放大性,也就是说你做出的决定能够产生巨大的效应。
小团体=可测量性
就算你无法测量每个员工的贡献,但是你可以得到近似值,那就是测量小团队的贡献。
理想情况下,你与其他愿意更努力工作的人一起组成一个团队,共同谋取更高的回报。
创业的成败取决于最早加入公司的那十个人。
高科技=可放大性
因为创业公司通过发明新技术盈利,所以具备可放大性。
大多数因为创造财富而发财的人都是通过开发新技术而实现的。
如果你开发出来的技术是竞争对手难于复制的,那就够了。
潜规则
创业是有一些潜规则的,其中一条就是很多事情由不得你。
另一条潜规则是,创业的付出与回报虽然总体上是成比例的,但是在个体上是不成比例的。
创业公司如同蚊子,往往只有两种结局,要么赢得一切,要么彻底消失。
保险的做法就是在早期卖掉自己的创业公司,放弃未来发展壮大(但风险也随之增大)的机会,只求数量较少但是更有把握的回报。
用户数量
大多数时候,促成买方掏钱的最好办法不是让买家看到有获利的可能,而是让他们感到失去机会的恐惧。
用户数量就是判断公司表现好坏的指标。
财富和权力
缓慢工作的后果并不仅仅是延迟了技术革新,而且很可能会扼杀技术革新。
一旦自己的财产有了保证,那些想致富的人就会愿意去创造财富,而不是去偷窃。
7. 关注贫富分化
财富的老爹模式
财富与金钱是两个概念。金钱只是用来交易财富的一种手段,财富才是有价值的东西,我们购买的商品和服务都属于财富。
你做别人需要的东西或事情,然后得到报酬。
一个人的工作具有多少价值不是由政府决定的,而是由市场决定的。
不公平这三个字就是老爹模式的独门标志。
偷窃
如果巨大财富没有明显的来源,那可能就来源于精心安排的犯罪活动,由于掩盖得太好,使得罪行被人遗忘了。
技术的杠杆效应
技术肯定加剧了有技术者与无技术者之间的生产效率差异,毕竟这就是技术进步的目的。
由于技术的发展,富人的生活与普通人的差距缩小了。
技术无法使其变得更便宜的唯一东西,就是品牌。
只要存在对某种商品的需求,技术就会发挥作用,将这种商品的价格变得很低,从而可以大量销售^。
确实有很多人非常有钱,完全不必再去工作,他们之所以还在工作,不是因为感到社会压力,而是因为无所事事使人感到孤独和消沉。
技术在加大收入差距的同时,缩小了大部分的其他差距。
公理的不同意见
现代社会的收入差距扩大是一种健康的信号。
技术使得生产率的差异加速扩大,如果这种扩大没有反映在收入上面,只有三种可能的解释:(a)技术革新停顿了;(b)那些创造大部分财富的人停止工作了;(c)创造财富的人没有获得报酬。
一个社会需要有富人,这主要不是因为你需要富人的支出创造就业机会,而是因为他们在致富过程做出的事情。
8. 防止垃圾邮件的一种方法
统计学方法的一大优点就是,你不需要一封封去看垃圾邮件。
贝叶斯方法的真正优点在于你知道你正在计算的是什么东西。
得分方法的缺点在于没人知道这个分数到底是什么意思,用户不知道,更糟的是,就连过滤器的开发者也不知道。
如果发送销售类垃圾邮件受到限制,那么整个行业将不可避免地受到重创。
垃圾邮件使用了那么多推销语言就是为了增加回应率。
过滤器的差异越大,垃圾邮件想要逃过拦截就越不可能。
9. 设计者的品味
把品味说成个人的偏好可以有效地杜绝争论,防止人们争执哪一种品味更好。但是问题是,这种说法是不正确的。
好设计是简单的设计。
好设计是永不过时的设计。
好设计是解决主要问题的设计。
好设计是启发性的设计。
好设计通常是有点趣味性的设计。
好设计是艰苦的设计。
好设计是看似容易的设计。
好设计是对称的设计。
好设计是模仿大自然的设计。
好设计是一种再设计。
好设计是能够复制的设计。
好设计常常是奇特的设计。
好设计是成批出现的。
好设计常常是大胆的设计。
10. 编程语言解析
机器语言
机器语言和汇编语言的共同问题就是,只能让大多数计算机做一些很简单的事情。
编程语言的一个重要特点:一个操作所需的代码越多,就越难避免bug,也越难发现它们。
高级语言
所谓编译器,本身就是一个程序,作用是将简便方式书写的程序转变为硬件可以理解的语言。
高级语言还有一个优点,它使得程序更具有可移植性。
解释器的作用是实时地将代码解释为相应的机器语言,然后一行行运行。相比之下,编译器则是先将整个程序全部翻译成机器语言,然后再运行。
开放源码
开放源码使你对软件有更大的控制权,
开放源码的优势还不仅局限于可以自己动手解决bug。这里的关键是所有人都可以参与。
语言的战争
语言之间确实有差别,但是很难确定地说明哪—种语言是最好的。
抽象性
编程语言可以变得很抽象,完全脱离硬件
如果你非常关注运行速度,那么最好使用接近机器的语言。
安全带还是手铐?
在静态类型语言中,写代码时必须知道每个变量的类型。而在动态类型语言中,随便什么时候,你都可以把变量设为任意类型的值。
静态类型语言的拥护者认为这样可以防止bug,并且帮助编译器生成更快的代码。
静态类型对程序构成了限制
面向对象编程
你应该使用允许你面向对象编程的语言。
文艺复兴
最近出现了很多新的编程语言。
结果就是产生了一些也许可以称为头重脚轻的语言:它们的内核设计得并非很好,但是却有着无数强大的函数库,可以用来解决特定的问题。
另一个结果就是语言的多样化。
11. 百年后的编程语言
编程语言存在一个进化的脉络。
选择那些靠近主干的语言,这样对当前的编程最有利。
基本运算符是一种语言能否长期存在的最重要因素。其他因素都不是决定性的。
那些内核最小、最干净的编程语言才会存在于进化的主干上。
编程语言进化缓慢的原因在于它们并不是真正的技术。
什么时候可以放弃一些性能,换来一点点便利性的提高。
正确做法应该是将语言的语义与语言的实现予以分离。
作者真正开始动手写这些软件的时候,他们其实不知道最后会写出什么结果。
浪费程序员的时间而不是浪费机器的时间才是真正的无效率。
除了某些特定的应用软件,一百年后,并行计算不会很流行。如果应用软件真的大量使用并行计算,这就属于过早优化了。
那么一百年后强大的硬件只会使得语言数目变得更多。
另一方面,一百年后的常用语言可能只有很少几种。
这些嵌入式语言的想法很不错,一定会蓬勃发展。
新语言更多地以开源项目的形式出现,而不是以研究性项目的形式出现。这是语言的一种发展趋势。另一种发展趋势是,新语言的设计者更多的是本身就需要使用它们的应用软件作者,而不是编译器作者。
一百年后的编程语言在理论上今天就能设计出来。
如果今天真能设计出这样一种语言,很可能现在就适合编程,并且能够产生更好的结果。
12.拒绝平庸
秘密武器
如果你掌管创业公司,最好做一些独特的事情,否则就会有麻烦。
如果开发只在自己服务器上运行的软件,这意味着你想用什么语言就能用什么语言。
在竞争中,你的对手无法理解你的技术优势,这可是再宝贵不过了。
Blub困境
在高级语言与机器语言之间并不存在一条明确的分界线。语言的抽象性是一条连续曲线,从最强大的语言一直到最底层的机器语言,每一种语言的能力都有差异。
到了一定年龄之后,程序员极少主动更换自己的编程语言。
我们代码中的每一个宏都有充分的使用理由。这意味着这个程序至少20%~25%代码的功能无法轻易地用其他语言实现。
创业公司的合气道
编程语言的特点之一就是它会使得大多数使用它的人满足于现状,不想改用其他语言。
13.书呆子的复仇
那些经理奇迹般地同时具备了两种很常见但很难结合在一起的特点:(a)对技术一无所知;(b)对技术有强烈的个人观点。
朝着数学的方法发展
20世纪50年代的编程语言到现在还没有过时的原因。简单说,因为这种语言本质上不是一种技术,而是数学。数学是不会过时的。
为什么Lisp语言很特别
(1) 条件结构(即if-then-else结构)。
(2) 函数也是一种数据类型。
(3) 递归。
(4) 变量的动态类型。
(5) 垃圾回收机制。
(6) 程序由表达式组成。
(7) 符号类型。
(8) 代码使用符号和常量组成的树形表示法。
(9) 无论什么时候,整个语言都是可用的。
语言优势真正体现的地方
一般来说,条件越苛刻的项目,强大的编程语言就越能发挥作用。但是,无数的项目根本没有苛刻条件的限制。
Lisp的最大优势体现在编程任务的另一端,就是在激烈竞争的条件下开发那些解决困难问题的复杂程序。
向心力
使用一种不常见的语言会出现的问题我想到了三个:你的程序可能无法很好地与使用其他语言写的程序协同工作;你可能找不到很多函数库;你可能不容易雇到程序员。
第一个问题取决于你是否控制整个系统。
第二个问题,函数库的重要性也取决于你的应用程序。
第三个问题是你的经理担忧雇不到程序员,我认为这根本就是混淆视听。大家公认少于10个人的团队最适合开发软件。
随大流的代价
强大的编程语言如何让你写出更短的程序?一个技巧就是使用自下而上的编程方法。
代码的数量很重要,因为开发一个程序所耗费的时间主要取决于程序的长度。
一个诀窍
在大型组织内部,有一个专门的术语描述这种跟随大多数人的选择的做法,叫做业界最佳实践。
不同语言的编程能力不一样。
大多数经理故意忽视第一点。
14.梦寐以求的编程语言
流行的秘诀
黑客的看法其实比语言设计者的更重要。
专家级黑客的看法是最重要的因素。
只要有了达到临界数量(critical mass)的最初用户和足够长的时间,一种语言可能就会达到应有的流行程度。而流行本身又会使得这种优秀的语言更加优秀,进一步拉大它与平庸语言之间的好坏差异,因为使用者的反馈总是会导致语言的改进。
外部因素
一种语言必须是某一个流行的计算机系统的脚本语言,才会变得流行。
无法以一种语言本身的优缺点评判这种语言。
只有当一种语言是某个系统的脚本语言时,它才能真正成为编程语言。
编程语言本来就需要一个好的实现,而且这个实现必须是免费的。
编程语言还应该有在线文档。
简洁
黑客欣赏的一个特点就是简洁。
简洁性最重要的方面就是要使得语言更抽象。
简洁性是静态类型语言的力所不及之处。
可编程性
对黑客来说,选择编程语言的时候,还有一个因素比简洁更重要,那就是这种语言必须能够帮助自己做到想做的事。
优秀程序员经常想做一些既危险又令人恼火的事情。所谓令人恼火,我指的是他们会突破设计者提供给用户的外部语义层,试着控制某些高级抽象的语言内部接口。
一种真正优秀的编程语言应该既整洁又混乱。整洁的意思是设计得很清楚,内核由数量不多的运算符构成,这些运算符易于理解,每一个都有很完整的独立用途。混乱的意思是它允许黑客以自己的方式使用。
一次性程序
为了吸引黑客,一种编程语言必须善于完成黑客想要完成的各种任务。这意味着它必须很适合开发一次性程序。
它必须很容易装备。
很容易装备不仅仅指很容易安装或者已经安装,还指很容易与使用者互动。
一次性程序的另一个特点就是简洁。
函数库
简洁性的最高形式当然是有人已经帮你把程序写好,你只要运行就可以了。函数库就是别人帮你写好的程序,所以它是编程语言的另一个重要特点,并且我认为正在变得越来越重要。
优秀函数库的重要性将超过语言本身。
效率
运行速度只取决于一些关键的瓶颈。
编程时提高代码运行速度的关键是使用好的性能分析器(profiler)
让性能分析器自动运行可能是一个好主意。
性能分析器甚至有可能自动找出不合理的算法。
随着互联网软件的兴起,越来越多的程序主要不是受限于计算机的运算速度,而是受限于I/O的速度。
用户关心的是反应时间,但是软件的另一种效率正在变得越来越重要,那就是每个处理器能够同时支持的用户数量。
在一些应用程序中,处理器的运算能力是瓶颈,那么最重要的优化对象就是软件的运行速度。但是,一般情况下内存才是瓶颈,你能够同时支持的用户数量取决于用户数据所消耗的内存。
时间
新技术被市场接纳的方式有两种,一种是自然成长式,另一种是大爆炸式。
自然成长式的一个例子就是在车库里白手起家、自力更生的创业者。
大爆炸式的例子是有风险资本支持、在市场上大张旗鼓宣传的创业公司。
再设计
在创新活动的第一阶段,你不知疲倦地猛攻某个难题,自信一定能够解决它。
到了第二阶段,你在清晨的寒风中看到自己已经完成的部分,清楚地意识到存在各种各样的缺陷。
一开始的时候要精心选择用户,避免使用者过快增长。发展用户就像一种优化过程,明智的做法就是放慢速度。
委员会最大的问题在于他们妨碍了再设计。
将软件内部的接口设计成垂直接口而不是水平接口。
梦寐以求的编程语言
这种语言干净简练,具有最高层次的抽象和互动性,而且很容易装备,可以只用很少的代码就解决常见的问题。不管是什么程序,你真正要写的代码几乎都与你自己的特定设置有关,其他具有普遍性的问题都有现成的函数库可以调用。
这种语言的句法短到令人生疑。
这种语言的抽象程度很高,使得你可以快速写出一个程序的原型。然后,等到你开始优化的时候,它还提供一个真正出色的性能分析器,告诉你应该重点关注什么地方。你能让多重循环快得难以置信,并且在需要的地方还能直接嵌入字节码。
这种语言有大量优秀的范例可供学习,而且非常符合直觉,你只需花几分钟阅读范例就能领会应该如何使用此种语言。
这种语言以层的方式构建。
除了一些绝对必要隐藏的东西,这种语言的所有细节对使用者都是透明的。
15.设计与研究
设计与研究的区别看来就在于,前者追求好(good),后者追求新(new)。
如果把创造一种编程语言看成是设计问题,而不是科研方向,那么有何不同?
最大的不同在于你会更多地考虑用户。
用户需要的设计,而不是用户要求的设计。
大多数优秀设计都是这样产生的,它们关注用户,并且以用户为中心。
我们常常采用错误的方法评价编程语言,只看一眼最后完成的程序就做出判断。
为了做出优秀的设计,你必须贴近用户,始终寸步不离,永远站在用户的角度调整自己的构想。
在软件领域,贴近用户的设计思想被归纳为弱即是强(Worse is Better)模式^。
与之对照,还有另一种软件设计思想,也许可以被称为万福玛丽亚模式。它不要求尽快拿出原型,然后再逐步优化,它的观点是你应该等到完整的成品出来以后再一下子隆重地推向市场,我还没听说过有人采用这种模式而获得成功。
原型(prototype)并不只是模型(model),不等于将来一定要另起炉灶,你完全能够在原型的基础上直接做出最后的成品。
先做出原型,再逐步加工做出成品,这种方式有利于鼓舞士气,因为它使得你随时都可以看到工作的成效。
任何时候,代码都必须能够运行。
优秀设计的前提是你自己必须喜欢这种产品
- 《黑客与画家》读书笔记
- 《黑客与画家》读书笔记
- 《黑客与画家》读书笔记
- 《黑客与画家》读书笔记
- 《黑客与画家》读书笔记
- 《黑客与画家》读书笔记
- 黑客与画家[读书笔记]
- 《黑客与画家》读书笔记
- 《黑客与画家》读书笔记
- 黑客与画家读书笔记
- 黑客与画家 读书笔记
- 《黑客与画家》读书笔记
- 黑客与画家 读书笔记
- 《黑客与画家》读书笔记
- 《黑客与画家》读书笔记
- 《黑客与画家》读书笔记
- 黑客与画家 读书笔记
- 《黑客与画家》读书笔记
- YUV420P转RGB32
- java以及javaweb开发组件,开发环境和开发工具安装配置(二:解压版mysql和tomcat安装配置)
- Rwordseg安装
- linux命令--groupadd groupmod groupdel
- 删除链表的中间结点
- 《黑客与画家》读书笔记
- 【动态规划】字符串编辑距离(Levenshtein距离)算法
- 采集屏幕编码H264
- LintCode1:位运算实现A+B
- linux进程
- POJ 3321 Apple Tree【dfs序+线段树】
- FFMPEG录屏软件开发之音频采集
- ffmpeg 的时间
- Leetcode#49. Group Anagrams