漫谈了黑客精神、创业的好处、编程语言的高级和低级
概念
- hack,难题的解决方法
- hacking,解决问题的过程,暗含求解过程中产生的精神愉悦或享受
- 黑客,喜欢解决难题,享受解决问题时的精神愉悦或享受。价值观是好玩、高智商、探索精神,而不是实用性或金钱。“黑客”就是指最优秀的程序员,而不是入侵计算机系统的人。
- 黑客的价值观。概括来说就是,分享、开放、民主、计算机的自由使用、进步:
- 使用计算机以及所有有助于了解这个世界本质的事物都不应受到任何限制。任何事情都应该亲手尝试。
- 信息应该全部免费。
- 不信任权威,提倡去中心化。
- 判断一名黑客的水平应该看他的技术能力而不是其它
- 你可以用计算机创造美和艺术。
- 计算机使生活更美好。
学校的不合理
学校的真正目的是把儿童都关在同一个地方,以便大人们白天可以腾出手来把事情做完。
让学生有东西吃,避免公然的暴力行为,接下来才是尝试教给学生一些东西。除此以外,校方并不愿意在学生身上多费心思。就像监狱的狱卒,老师们很大程度上对学生是放任自流的。结果,学生就像犯人一样,发展出了野蛮的内部文化。公立学校的老师很像监狱的狱卒。看管监狱的人主要关心的是犯人都待在自己应该待的位置。
真实世界的关键并非在于它是由成年人组成的,而在于它的庞大规模使得你做的每件事都能产生真正意义上的效果。真实世界的特点是,它极其庞大。如果总体足够大,即使是人数最少的少数派,只要聚集在一起,也能产生可观的力量。学校、监狱、上流社会的女士午餐会,都做不到这一点。这些场合的成员都好像关在封闭的泡沫之中,所作所为只对泡沫内部有影响,对外部没有影响。那么很自然地,这些场合就会产生野蛮的做法。
如今的成年人根本不接受青少年。一般来说,他们都是在办公室工作,所以就在上班的路上,顺路把孩子送到学校去关着,这有点像他们周末外出度假时,把狗送到寄养的地方。
大多数学校的教学质量都很糟糕,孩子们根本不把学习当回事,就连认真读书的孩子也是如此。许多时候,我们所有人——包括学生和老师——都只是做做样子,走过场而已。
书呆子的处境
我们的感受,有点像一个被重新塞进中学的成年人。他不知道穿什么衣服,听什么音乐,用什么暗语。在别的孩子眼里,他就像一个彻头彻尾的外星人。
作为书呆子,我不适应周围环境,某种程度上正说明我领先了一步。书呆子已经在思考的东西,正是真实世界看重的东西。他们与别人不一样,不把所有时间用来玩一种耗尽全力但又毫无意义的游戏。
计算机科学
- 数学家
- 计算机博物学家,研究各种专门性的题目,比如网络数据的路由算法
- 另一端则是黑客,只想写出有趣的软件。
黑客是创作者
黑客搞懂“计算理论”(theory of computation)的必要性,与画家搞懂颜料化学成分的必要性差不多大。
如果黑客认识到自己与其他创作者——比如作家和画家——是一类人,这种诱惑对他就不起作用。作家和画家没有“对数学的妒忌”,他们认为自己在从事与数学完全不相关的事情。我认为,黑客也是如此。
解决赚钱与有趣的工作的方式:
黑客解决生计问题的方法是找一份“白天工作”,然后在其余时间开发优美的软件(开源软件界的黑客早就这样做了)。几乎所有的创作者在职业生涯的早期都有一份“白天工作”。画家和作家尤其显著。如果幸运的话,你能找到一份与你的“真正工作”非常相关的“白天工作”。
如果黑客只是一个负责实现领导意志的技术工人,职责就是根据规格说明书写出代码,那么他其实与一个挖水沟的工人是一样的,从这头挖到那头,仅此而已。但是,如果黑客是一个创作者,他从事的就不是机械性的工作,他必须具备灵感。
黑客的实践方式
- 应该定期地从头开始,而不要长年累月地在一个项目上不断工作,并且试图把所有的最新想法都以修订版的形式包括进去。
- 黑客可以通过观看优秀的程序学会编程,不是看它们的执行结果,而是看它们的源代码。
- 你不能盼望先有一个完美的规格设计,然后再动手编程,这样想是不现实的。如果你预先承认规格设计是不完美的,在编程的时候,就可以根据需要当场修改规格,最终会有一个更好的结果。
- 坚持一丝不苟,就能取得优秀的成果。因为那些看不见的细节累加起来,就变得可见了。
- 把bug留到以后解决。消灭bug对我来说属于轻松的工作
- 正确的合作方法是将项目分割成严格定义的模块,每一个模块由一个人明确负责。模块与模块之间的接口经过精心设计,如果可能的话,最好把文档说明写得像编程语言规范那样清晰。
- 软件的部分功能就是解释自身。为了写出优秀软件,你必须假定用户对你的软件基本上一无所知。
- 源代码也应该可以自己解释自己。
远离主流
思辩主流:
- 如果一个命题不是错的,却被加上各种标签,进行压制和批判,那就有问题。因为只要不是错的观点,就不应该被压制讨论。所以每当你看到有些话被攻击为出自分子或主义,这就是一个明确的信号,表明背后有问题。
- 有一些行为或观点,比如谋杀,在所有年代、所有地方(东方文化与西方文化)都受到禁止或基本禁止。只有它们才是真正错误的行为或观点。如果某个观点在大部分时空都是不受禁止的,只有我们这个社会才把它当作禁忌,那么很可能是我们出错了。
- 如果你想要清晰地思考,就必须远离人群。观察正在发生的事情,发现流行(也就是人们自以为正确的事情)到底是什么,并注意那些被压制的思想观点。但是走得越远,你的处境就会越困难,受到的阻力也会越大,因为你没有迎合社会习俗,而是一步步地与它背道而驰。
少与人争辩。自由思考比畅所欲言更重要。如果你感到一定要跟那些人辩个明白,绝不咽下这口气,一定要把话说清楚,结果很可能是从此你再也无法自由理性地思考了。
互联网软件
相于传统桌面软件的优势
- 普通用户根本没必要知道“操作系统”这个词,更不要说“驱动程序”和“补丁”了。使用互联网软件,除了软件本身,大多数用户不需要知道别的事情。所有那些乱七八糟、经常变动的东西,都放在服务器端,由精通此道的专业人员维护。
- “你的电脑”这个概念正慢慢成为过去时,取而代之的是“你的数据”。你应该可以从终端设备包括电脑上获取你的数据。
- 平滑升级。使用互联网软件,你不需要为新版本付出额外的费用,或者做额外的准备工作,甚至可能你都不知道软件已经升级了。
- 对于互联网软件来说,大部分的变化都是细微和渐进的,所以引入bug的机会比较小。所有用户都使用同样版本的互联网软件,bug一发现就会立刻得到纠正。所以,它的bug应该比桌面软件少得多。
- 互联网应用程序能够同时被多人使用,所以非常适合团队协作性的工作。
- 如果使用互联网软件,数据会更安全。即使硬盘损坏的风险依然存在,但是与用户没有关系,他们可以从此不关心这件事。
互联网软件进步意义
- 使用互联网软件的大公司就好像把它的IT部门外包出去了。虽然听起来很激进,但是我认为这样做很好。比起自己雇用系统管理员,外包可以让这些公司得到更好的服务。
- “订报纸模式”正是互联网软件天然的收费模式。如果公开收取软件的订阅费,而不是让用户购买软件的所有权,操作起来会更自然、更简便。
- 桌面软件和操作系统的越来越不重要。如果只需要一个带浏览器的终端设备就能完成所有工作,你就不需要微软了。要是微软不能控制终端设备,它就只剩下一条路,就是把用户推向它自己的互联网软件。
上班的效率
你的真正工作时间其实可以是公司上班时间的2倍,如果你全神贯注,每小时的产出可以提高3倍。如果再把大公司里令人讨厌的中间管理层除去(他们经常以主管的身份妨碍你的工作),你的效率可以再提高2倍。还有一个可以提高效率的地方:你不用再完成强行指派给你的工作,尽可以根据自己的愿望,做出最能发挥你聪明才智的成果。
财富
财富是最基本的东西。我们需要的东西就是财富,食品、服装、住房、汽车、生活用品、外出旅行等都是财富。即使你没有钱,你也能拥有财富。
金钱不是财富。金钱是专业化的副产品。在一个高度分工的社会,你需要的大部分产品无法自己制造。你需要土豆、铅笔、住房以及别的东西,你不得不让别人来提供。金钱其实只是一种中介,让大家可以更方便地通过交易获得自己想要的东西。
我们大多数人都在为其他人创造财富,然后用创造出来的财富交换金钱,再用金钱交换我们需要的另一种财富。
如何创造财富
假设你拥有一辆老爷车,你可以不去管它,在家中悠闲度日,也可以自己动手把它修葺一新。这样做的话,你就创造了财富。
孩子在不知不觉中就懂得了这个道理。如果一个小孩想赠送另一个小孩一件礼物,但是又没有钱,他就会自己动手做。
如果富人拿走了所有的钱,那么其他人就变得更穷了。
思考: 如果人人都用自己所占有的知识、技能、物品与他们进行物物交换,那么富人所占用的金钱一下子就没了,也没是说,金钱的价值是政府赋予的,是在军事控制下进行行政手段的结果。如果人民觉得金钱的生产/使用/分配有问题,完全可以回到原始进行反对。如何创造别人无法窃取的财富?
财富不是分配的
由于每个人创造财富的能力和欲望强烈程度都不一样,所以每个人创造财富的数量很不平等。
如果你觉得由于人们的需求不正确,导致某些工作的报酬过低而且不公平,那么这个世界一定会让你感到非常遗憾,人们就是喜欢看电视真人秀,而不是莎士比亚作品,人们就是喜欢吃玉米热狗,而不是水煮蔬菜,这是不是很不公平呀?
当我们讨论“收入分配不公平”时,我们还要问问收入从何而来,收入背后的财富到底是谁生产出来的。如果收入完全根据个人创造的财富数量而分配,那么结果可能是不平均的,但是很难说是不公平的。
现代社会的收入差距扩大是一种健康的信号。技术使得生产率的差异加速扩大,如果这种扩大没有反映在收入上面,只有三种可能的解释:(a)技术革新停顿了;(b)那些创造大部分财富的人停止工作了;(c)创造财富的人没有获得报酬。
工作
员工的贡献
大公司最大的困扰就是无法准确测量每个员工的贡献。
你想更努力地工作,但是你的工作与其他许多人的工作混杂在一起,这样就产生了问题。在大公司中,个人的表现无法单独测量,公司里其他人会拖累你。
你需要去做一些人们需要的东西。即使不加入公司,你也能做到。公司不过是一群人在一起工作,共同做出某种人们需要的东西。真正重要的是做出人们需要的东西,而不是加入某个公司。
如果你有一个令你感到安全的工作,你是不会致富的,因为没有危险,就几乎等于没有可放大性。
团队越大,每个人的贡献就越接近于整体的平均值。所以,在不考虑其他因素的情况下,一个非常能干的人待在大公司里可能对他本人是一件很糟的事情,因为他的表现被其他不能干的人拖累了。
创业公司为每个人提供了一条途径,同时获得可测量性和可放大性。因为创业公司是小团队,所以具备可测量性。因为创业公司通过发明新技术盈利,所以具备可放大性。
创造人们需要的东西,也就是创造财富。如果你想通过创造财富使得自己致富,那么你必须知道人们需要什么。很少有公司真的关注如何使顾客更满意。
编程语言
编程语言的本质
编程语言进化缓慢的原因在于它们并不是真正的技术。语言只是一种书写法,而程序则是一种严格符合规则的描述,以书面形式记录计算机应该如何解决你的问题。所以,编程语言的进化速度更像数学符号的进化速度,而不像真正的技术(比如交通或通信技术)的进化速度。数学符号的进化是缓慢的渐变式变化,而不是真正技术的那种跳跃式发展。
如果我们把一种语言的内核设想为一些基本公理的集合,那么仅仅为了提高效率就往内核添加多余的公理,却没有带来表达能力的提升,这肯定是一件很糟的事。
设计编程语言的时候,我们应该有意识地问自己,什么时候可以放弃一些性能,换来一点点便利性的提高。
效率低下的软件并不等于很烂的软件。一种让程序员做无用功的语言才真正称得上很烂。浪费程序员的时间而不是浪费机器的时间才是真正的无效率。随着计算机速度越来越快,这会变得越来越明显。
计算能力越来越便宜
随着技术的发展,每一代人都在做上一代人觉得很浪费的事情。要是以几十年前的标准衡量,有一些使用新语言开发的热门应用程序对硬件资源的浪费非常惊人。
最强的编程语言
唯一洞悉所有语言优劣的人必然是懂得最强大的那种语言的人。
如果你想在软件业获得成功,就使用你知道的最强大的语言,用它解决你知道的最难的问题,并且等待竞争对手的经理做出自甘平庸的选择。
为什么流行
一种免费的实现,以及语言所依附的计算机系统。
- 文档。这种语言有大量优秀的范例可供学习,而且非常符合直觉,你只需花几分钟阅读范例就能领会应该如何使用此种语言。你偶尔才需要查阅操作手册,它本身很薄,里面关于限定条件和例外情况的警告寥寥无几。
- 具有最高层次的抽象和互动性,而且很容易装备,可以只用很少的代码就解决常见的问题,使得你可以快速写出一个程序的原型。
- 函数库。不管是什么程序,你真正要写的代码几乎都与你自己的特定设置有关,其他具有普遍性的问题都有现成的函数库可以调用。
- 提供一个真正出色的性能分析器。告诉你应该重点关注什么地方。你能让多重循环快得难以置信
- 方便复用和修改语言本身。这种语言以层的方式构建。较高的抽象层透明地构建在较低的抽象层之上。如果需要的话,你可以直接使用较低的抽象层。它鼓励你参与它的设计,给你提供与语言创造者平等的权力。你能够对它的任何部分加以改变,甚至包括它的语法。它尽可能让你自己定义的部分与它本身定义的部分处于同等地位。这种梦幻般的编程语言不仅开放源码,更开放自身的设计。
设计
- 让用户满意并不等于迎合用户的一切要求。用户不了解所有可能的选择,也经常弄错自己真正想要的东西。做一个好的设计师就像做一个好医生一样。你不能头痛医头,脚痛医脚。病人告诉你症状,你必须找出他生病的真正原因,然后针对病因进行治疗。
- 先做出原型,再逐步加工做出成品,这种方式有利于鼓舞士气,因为它使得你随时都可以看到工作的成效。开发软件的时候,我有一条规则:任何时候,代码都必须能够运行。如果你正在写的代码一个小时之后就可以看到运行结果,这好比让你看到不远处就是唾手可得的奖励,你因此会受到激励和鼓舞。