读《黑客与画家》
作者Paul Graham算是个奇人,主要倒不是他作为硅谷创业教父的身份,毕竟,当一个人成功了,之后再做些成功事儿也相对容易很多,关键这人上学时对本专业的研究很不顺利(当时研究人工智能),然后就跑去学画画了,还梦想着成为画家。结果折腾了一年,钱花完了,没办法,又得回来写程序赚面包。之后就是屌丝逆袭之路了,创个公司被雅虎收购,套现一大笔钱,从此走上了指导别人创业之路。
书中写的东西也蛮有意思,各个篇章不太搭,不过都是针对“黑客”的。有的告诉小黑客(书呆子)为什么在上初中的阶段会受欺负,有的教黑客应该怎样说话,估计都是亲身经历,还有就是大篇章的鼓吹lisp,搞得我都有点想去学学看了。
黑客与画家的比较
Paul是个黑客,同时也算个不成功的画家,这哥们将两者做出的比较还是有点道理的。
第一,他们都是创作者。虽说是理工科,但黑客所做的事情,与计算机系的教授有着本质的不同,教授们需要的是研究成果,将计算机弄得谁也看不懂,弄得越来越像数学,而黑客却跟画家一样,只是想写出有趣的软件,而计算机只是他们实现想法的工具,就好像画家手中的画笔一样。
第二,做事方式的对比。其实这点跟我以前读过的一些计算机方法论的书是有点分歧的,让我也是大毁三观。之前读过的书都强调软件工程的重要性,强调要做好需求分析、概要设计、详细设计等等,编写代码只是工作中很小的个比重,这样可以减少后期的错误,更加节约时间。而作者却认为“把整个程序想清楚的时间点应该是在编写代码的同时,而不是在编写代码之前”。作者很推崇这种修修补补的方式,就好像画家作画一样,即使历史上的名画,放到现代的仪器下分析,也发现是不断涂改的结果(作者当然说的是西方的油画,中国的水墨画就要写意的多了)。究竟哪种方法是正确的,我觉得也得分场合。如果要弄个卫星上天的项目,还是得严格按照软件工程的做法来,而像作者那样,三个人创业,要的就是速度,当然还是速出功能,然后慢慢完善的方式才更有竞争力。
第三,对待新项目的观点。画家不可能一辈子只画一幅画,他们都是不停地尝试画新的作品。黑客也一样,应该定期的从头开始,而不要长年累月的在一个项目上不停工作。
第四,心理周期。这个东西搞艺术的应该会很有感触,有时兴致来了,挥毫泼墨,昼夜不停地进行创作,但有时也会陷入没有灵感的窘境。其实黑客也是一样,当有一个令人兴奋的项目时,他会愿意一天工作16个小时,但过了一段时间,有会觉得百无聊赖,对所有事情都提不起兴趣。善用心里周期是做出成功作品的关键。
第五,关于合作。小幅的作品当然大多是一个人完成的,但很多大型的作品却需要分工合作,比如教堂的穹顶,大型的壁画(很少有人像米开朗基罗一样,一个人画完了罗马西斯廷大教堂的天顶壁画中的所有人物)。当多个画家共同创作一幅作品时,每个人画的部分都是不一样的。通常来说,大师主要负责画主要人物,助手们负责画次要人物和背景。但是,你肯定找不到某个部分是两个人一起画的。合作开发软件其实也是一样,需要合作,但不能“合”得过头 ,如果一个代码块由三四个人共同开发,就没有人真正“拥有”这块代码。最终,他会变得像一个公用杂物间,没人管理,又脏又乱,到处堆满了冗余代码。正确的合作方式是将项目分割成严格定义的模块,每一个模块由一个人明确负责。模块与模块之间的接口经过精心设计,如果可能的话,最好把文档说明写得像编程语言规范那样清晰。相信几个人共同画一个人物必然画的口歪眼斜(即使几个人都是大师),同样的,几个人共同写一段代码也必然驴唇不对马嘴。
软件其实是艺术品,拥有美感的软件才是成功的软件。
关于财富分配
首先说明,如果按照作者的观点,“财富分配”这个词本身就是个伪命题,因为社会财富不是一张大小固定的饼,你多分一些我就得少分一些,财富是被创造出来的,那么为什么现在仍然有很多人多少有一些仇富心理呢,作者将其总结出三个原因:第一,我们从小被误导了对财富的看法;第二,历史上积累财富的方式大多名声不好;第三,担心收入差距拉大将对社会产生不利影响。第三点其实是很笼统的一种说法了,前两点倒是蛮有意思。
作者将我们小时候理解的并一直影响我们的财富观称为“财富的老爹模式”,因为我们小时候钱是从父母的口袋里得到的,让我们以为财富是某个权威负责分配的,而没有意识到财富是创造出来的。其实财富与金钱是两个概念,现代社会中,我们已经很少在为自己创造财富了,我们都是为别人创造财富,然后换的金钱,再用金钱换取我们需要的财富,金钱只是财富的一个流通手段,而财富的总和不是固定不变的,当我们能够创造更多财富的时候,往往也能换取更多用于流通的金钱。这里的财富有时不仅仅指的是看得见摸得着的东西,任何别人需要的服务也都可以成为财富,比如快递员送货,相声演员的演出,其实都是在创造财富。
第二个让金钱名声不佳的原因是,在人类历史的绝大部分时间里,人类积累财富的方式都是偷窃(作者使用的“偷窃”一词实际上包含了任何强制手段获取他人财富的方式,包括收税、战争掠夺、强迫农奴生产等),这也难怪让人产生仇富心态,再加上历史上小说、戏剧等艺术作品对商人的丑化,使得仇富心态在人们心中更加根深蒂固。当然,现如今仍然有贪污受贿等“偷窃”式的财富聚集方式,但已经不是主流方式了,如今的社会提供了大量的创造财富的方式。
至于如何工作才能得到更多的财富,作者提出了两点原则,就是可测量性和可放大性。
可测量性就是你的业绩能够得到很好的度量,比如销售人员的测量标准就是他们的销售业绩,公司CEO的测量标准就是整个公司的业绩。但程序猿却有点麻烦,他们都的工作缺乏一个准确的度量标准,谁能说谁写的代码就比其他人的作用更大呢。当然,光有可测量性并不能保证好的收入,血汗工厂中工人的劳动具有很好的可测量性,但仍然收入低微,于是有了第二个原则,可放大性。也就是说你的劳动可以通过一定的杠杆使得创造的财富放大,比如CEO、电影明星、基金经理、运动员,他们的工作都有着很好的可放大性,但其实他们的工作也有着很大的风险。作者的说法是:如果你有一个令你感到安全的工作,你是不会致富的,因为没有危险,就几乎等于没有可放大性。
如何获取可测量性和可放大性,作者的说法是:小团体=可测量性,高科技=可放大性。
的确,在一个大的团队中,一个人的努力很容易就被淹没了,于是大家也就都没有了出力的欲望。而小团体因为人少,每个人都不得不拿出绝对的努力,然后这份努力却也是立竿见影的。在古罗马,风帆还没有普及的时代,巨型战舰是靠着上千名划船手共同划桨来推动的,但是速度并不快,因为每个人都看不到自己努不努力划船有什么不同,但如果在这上千人中选10个人去划龙舟,保证划得飞快,因为首先你的努力是可以看到的,其次,如果你不努力划船,其他的伙伴要用什么眼光看你,这种胡萝卜与大棒并存的状态,也就促使了小公司往往效率比大公司要高。
至于说高科技带来了可放大性,这个毋庸置疑。在餐馆或理发馆,每次只能为一个顾客提供服务,但是如果你解决了一个热门的技术难题,别人都会使用你的解决方案,这就是可放大性。而这种可放大性又恰恰是小团体可以与大公司有的一拼的地方,尤其在生物科技和软件类领域,因为这些领域与资金关系不大,但杠杆作用却非常明显。
所以,程序猿,知道该怎么做了吗。
编程语言之战
网上永远充斥着编程语言优劣的套路,甚至形成了一条鄙视链,然后还有诸如“PHP是最好的语言”这样的梗。当然,基本上谁也不会把这种鄙视链当真,主流的声音基本上是,编程语言属于身外之物,实现手段,思想、算法才是核心。不过作者对此又持有不同观点,认为一门好的语言可能决定了一个项目甚至一个公司的成败。作为Lisp的鼓吹者,作者甚至认为他的Viaweb的创业成功,就是因为使用了Lisp,因为Lisp简洁、易于修改(以及一些我不能理解的有点,比如Lisp的宏),使得他们能够最快速度的做出新功能,始终领先竞争对手。
其实我也觉得选择好的编程语言并非那么无关紧要,尤其是最近学了Python后,更是觉得C++实在是太复杂了,用个三五年时间还不一定能够专精,的确有点不值。当然,别人会有很多理由告诉你用C/C++的好处,比如这是嵌入式的首选呀,比如效率高呀之类,第一个理由其实也是我开始跳出嵌入式的理由,编译、烧写、调试、修改、再编译、再烧写……总觉得有点浪费生命。后一个理由其实是不成立的,首先,效率其实不应该是软件的首要考虑的问题,首要考虑的问题应该是实现功能,过早优化是万恶之源;其次,也不是说使用了C/C++就获得了高效率,它仅仅是为最大限度的提高效率提供了可能,而不是决定了效率,汇编效率高吧,机器码效率高吧,但我绝对有信心用机器码写出效率比Python还低的程序。所有,关于运行效率,更好的方法其实是有一种效率的检测机制,找到运行的瓶颈,让后再针对性的优化。