最近重读了Paul Graham的《黑客与画家》,每次读都有新的收获。

这本书不是一本教你怎么编程的技术书,而是一本关于程序员、关于创业、关于创造、关于这个时代的思考文集。Paul Graham用他独特的视角,把程序员和画家联系起来,探讨了黑客文化、创业、财富、技术、设计等很多有意思的话题,文笔犀利,观点独到,读起来很过瘾,也很有启发。

Paul Graham本身就是一个很传奇的人,他是程序员,也是画家,还是创业家和投资人,他创办的Y Combinator,是美国最有名的创业孵化器之一,投出了Airbnb、Dropbox、Reddit等很多知名的公司。他的个人经历,让他对程序员、对创业、对技术,有很独特的理解,这本书就是他这些思考的集合。

今天来聊聊这本书,以及我读完之后关于程序员文化的一些思考,希望能给同行们一些启发。

一、先说说这本书讲了什么

《黑客与画家》这本书,是Paul Graham的文集,收录了他写的很多篇文章,内容很丰富,主要包括这几个方面:

1. 黑客文化

书的前几篇,主要讲黑客文化,什么是黑客,黑客和画家的相似之处,黑客的思维方式,学校教育对黑客的影响等。Paul Graham认为,黑客和画家一样,都是创造者,都是在做创造的工作,而不是单纯的技术工人。黑客写代码,就像画家画画一样,是一种创造,需要审美,需要灵感,需要不断打磨。

2. 创业和财富

书的中间部分,主要讲创业和财富,为什么程序员适合创业,怎么创造财富,财富和金钱的区别,贫富差距等问题。Paul Graham认为,在这个时代,技术是创造财富的最好方式,程序员是最有机会创造财富的群体之一,因为技术可以杠杆化,一个人写的软件,可以被无数人使用,创造巨大的价值。

3. 技术和设计

书的后面部分,主要讲技术和设计,编程语言的设计,软件的设计,好的设计是什么样的,技术的发展趋势等。Paul Graham对编程语言有很深的研究,他自己也设计了编程语言,他对技术和设计的思考,很有深度,也很有前瞻性。

总的来说,这本书内容很丰富,涉及的话题很广,不是那种系统的理论书,而是一本随笔集,每一篇都有一个主题,观点鲜明,思考深刻,读起来很轻松,但又很有启发。

二、黑客和画家:程序员是创造者,不是技术工人

这本书最核心的观点,也是最打动我的,就是把黑客和画家联系起来,认为程序员是创造者,不是技术工人。

在很多人的印象里,程序员就是写代码的,是技术工人,就像工厂里的工人一样,按照需求,把代码写出来就行了,不需要什么创造力,也不需要什么审美。但Paul Graham认为,这种理解是错的,真正的黑客,和画家一样,是创造者,是在做创造的工作。

画家画画,不是按照别人的要求,一笔一笔地画,而是有自己的想法,自己的审美,自己的表达,在画画的过程中,不断地调整,不断地打磨,最终创作出一幅作品。黑客写代码,也是一样的,不是简单地把需求翻译成代码,而是有自己的思考,自己的设计,自己的审美,在写代码的过程中,不断地重构,不断地优化,最终创造出一个优秀的软件。

而且,写代码和画画一样,需要审美。好的代码,不仅要能运行,还要优雅,要简洁,要易读,要易维护,就像好的画,不仅要画得像,还要有美感,有风格。优秀的程序员,会像画家追求画面的美感一样,追求代码的优雅和简洁,他们会为了一段代码写得不够好而难受,会不断地重构,直到满意为止。

这个观点,对我触动很大。以前我也觉得,程序员就是写代码的,把功能实现了就行了,代码能跑就好,不需要太讲究。但读了这本书之后,我才意识到,写代码不只是实现功能,更是一种创造,一种表达,一种艺术。好的代码,是有美感的,是能让人愉悦的,就像好的画、好的音乐一样。

而且,把程序员当成创造者,而不是技术工人,也会改变我们对工作的态度。如果只是把自己当成技术工人,那写代码就是一份工作,就是为了赚钱,完成任务就行,不会有太多的热情和追求。但如果把自己当成创造者,那写代码就是一种创造,是在创造有价值的东西,是在表达自己的想法和审美,这样,工作就会更有意义,也更有热情,会不断地追求更好,更完美。

我觉得,这是程序员文化中很重要的一点,就是要有创造者的心态,要有对代码的审美和追求,不满足于"能跑就行",而是追求优雅、简洁、高质量的代码,把写代码当成一种创造,一种艺术。这样,我们才能写出真正优秀的软件,也才能在工作中获得更多的成就感和快乐。

三、书呆子和学校教育:为什么程序员在学校里往往不是最受欢迎的

书里有一篇,叫《为什么书呆子不受欢迎》,讲的是在学校里,那些聪明的、喜欢读书和学习的孩子,往往不受欢迎,被称为"书呆子",而那些会社交、会运动、会打扮的孩子,更受欢迎。Paul Graham自己就是这样的书呆子,他分析了为什么会这样,以及这种现象对程序员的影响。

他认为,在学校里,受欢迎的关键,不是你有多聪明,学习有多好,而是你有多擅长社交,有多会迎合别人。学校就像一个小社会,有自己的等级和规则,那些想受欢迎的孩子,会把很多时间花在社交、打扮、运动上,而不是学习上。而那些书呆子,对学习和技术更感兴趣,不愿意花时间去迎合别人,所以就不受欢迎。

但这种情况,到了社会上,就反过来了。在社会上,真正有价值的,是你的能力,你的创造,你能为别人提供什么,而不是你有多会社交,有多受欢迎。那些在学校里不受欢迎的书呆子,因为他们把时间花在了学习和技术上,积累了知识和能力,到了社会上,反而更容易成功,更容易创造价值。

这一点,我深有体会。我上学的时候,也是一个书呆子,喜欢看书,喜欢琢磨电脑,不太会社交,也不太受欢迎,那时候也会自卑,觉得自己不如那些会社交的同学。但工作之后,我发现,那些在学校里受欢迎的同学,不一定混得好,而那些踏踏实实学技术、做事情的书呆子,反而在工作中表现得很好,也创造了更多的价值。

这也让我明白,不要太在意别人的眼光,不要为了迎合别人,而放弃自己真正感兴趣的东西。在学校里不受欢迎没关系,只要你在做自己认为有价值的事情,在积累自己的能力,到了社会上,这些都会变成你的优势。

对于程序员来说,更是这样。程序员这个群体,很多都是书呆子,不太会社交,不太会说话,但他们有技术,有能力,能创造价值,这就够了。不需要为了变得"受欢迎",而放弃自己的兴趣和追求,做自己就好,把时间花在提升自己、创造价值上,比花在社交和迎合别人上,更有意义。

四、创业和财富:程序员是这个时代最有机会的群体

书里关于创业和财富的思考,也很有启发。Paul Graham认为,在这个时代,程序员是最有机会创造财富的群体之一,因为技术是这个时代最强大的杠杆。

以前,创造财富,需要很多资源,比如土地、资本、劳动力,普通人很难有机会。但现在,有了计算机和互联网,一个程序员,一台电脑,就能创造出软件,就能为成千上万的人提供服务,就能创造巨大的财富。技术的杠杆效应,让个人的力量被无限放大,一个人写的软件,可以被全世界的人使用,创造的价值,是以前难以想象的。

而且,软件的边际成本几乎为零,写好一个软件,复制一万份,和复制一份,成本几乎一样,这就意味着,一旦你做出了一个好的软件,就能以极低的成本,服务大量的用户,创造巨大的财富。这是传统行业很难做到的,传统行业,你生产一件产品,就需要一份的成本,服务的用户越多,成本越高,而软件不是这样,这就是技术的优势。

所以,Paul Graham鼓励程序员创业,因为程序员有技术,有能力,有最好的杠杆,是最适合创业的群体之一。当然,创业不是容易的事情,需要很多条件,也有很大的风险,但至少,程序员有这个机会,有这个可能性,这是很多其他群体没有的。

这一点,也让我对自己的职业,有了更多的信心和期待。作为一个程序员,我们不只是打工者,我们也有机会创造自己的产品,创造自己的事业,创造巨大的价值。哪怕不创业,在大公司里,做一个好的程序员,也能创造很大的价值,也能获得不错的回报。

当然,财富不是唯一的目标,也不是说所有程序员都应该去创业,每个人的追求不一样,有的人喜欢安稳的工作,有的人喜欢创业的挑战,都没有对错。但至少,我们要知道,我们有这个机会,有这个可能性,不要给自己设限,不要觉得程序员就只能打工,只能写代码,我们也可以创造,可以创业,可以做更多的事情。

五、好的设计:简洁、优雅、可维护

书里关于设计的思考,也很有价值。Paul Graham认为,好的设计,是简洁的,是优雅的,是可维护的,这个原则,不仅适用于绘画、建筑,也适用于软件,适用于代码。

好的代码,应该是简洁的,能用最少的代码,实现最多的功能,不要有多余的东西,不要为了炫技而写复杂的代码。很多新手程序员,喜欢写复杂的代码,觉得复杂就是厉害,其实不是,真正的高手,能把复杂的问题,用简单的代码实现,这才是真的厉害。简洁的代码,更容易读,更容易维护,也更少出bug。

好的代码,也应该是优雅的,有美感的,就像好的设计一样,看起来舒服,用起来顺手。优雅的代码,命名清晰,结构合理,逻辑顺畅,读起来就像读一篇好文章一样,让人愉悦。而糟糕的代码,命名混乱,结构臃肿,逻辑绕来绕去,读起来很痛苦,维护起来也很麻烦。

好的代码,还应该是可维护的,因为软件不是写完就完了,还需要不断地修改,不断地维护,不断地添加新功能。如果代码写得不可维护,那后面的人改起来就很痛苦,成本很高,甚至没法改,只能推倒重来。所以,写代码的时候,要考虑到后面的维护,要写清晰、易读、易改的代码,而不是只图一时的快,写一堆别人看不懂的代码。

这些设计原则,说起来简单,但做起来不容易,需要不断地练习,不断地思考,不断地重构。优秀的程序员,会像设计师一样,不断地打磨自己的代码,追求简洁、优雅、可维护,把代码当成一件作品来做。

我觉得,这也是程序员文化中很重要的一点,就是对代码质量的追求,对好的设计的追求。不要满足于"能跑就行",要追求更好的设计,更好的代码质量,这样,我们的软件才能更稳定,更易维护,也更有价值。

六、关于编程语言:不要局限于一种语言

Paul Graham对编程语言有很深的研究,他自己设计了编程语言Arc,也对各种编程语言有很独到的看法。书里有几篇,讲编程语言的设计,讲不同编程语言的特点,讲为什么要学习多种编程语言。

他认为,不同的编程语言,有不同的设计哲学,有不同的思维方式,学习多种编程语言,能开阔你的视野,改变你的思维方式,让你成为更好的程序员。如果你只会一种编程语言,那你的思维就会被这种语言限制,你会觉得,编程就应该是这个样子的,不知道还有其他的方式,其他的可能。

比如,如果你只会Java这种面向对象的语言,你可能会觉得,所有的问题都应该用对象来建模,都应该用继承、多态来解决。但如果你学了Lisp这种函数式编程语言,你就会发现,原来还可以用函数的方式来思考问题,用递归、高阶函数、不可变数据来解决问题,这会给你全新的视角,让你写出更好的代码。

所以,Paul Graham鼓励程序员,多学习几种不同范式的编程语言,比如面向对象的、函数式的、逻辑式的,不要局限于一种语言。学习新的编程语言,不是为了在工作中用它,而是为了学习它的思维方式,开阔自己的视野,提升自己的编程能力。

这一点,我也很认同。我自己最开始学的是C和Java,后来学了Python,又学了JavaScript,最近在学函数式编程,每学一种新的语言,都会有新的收获,都会改变我对编程的理解,也会让我在写其他语言的时候,写出更好的代码。

而且,现在技术发展很快,新的编程语言层出不穷,今天流行的,明天可能就过时了,如果只会一种语言,很容易被淘汰。多学几种语言,不仅能提升能力,也能让自己更有竞争力,更能适应技术的变化。

当然,不是说要学很多种语言,每种都浅尝辄止,而是要深入学习几种不同范式的语言,理解它们的设计哲学和思维方式,这样才能真正有所收获。

七、程序员文化的思考:我们应该成为什么样的程序员

读完这本书,结合自己的工作经历,我对程序员文化,也有了一些自己的思考,我们应该成为什么样的程序员?

1. 做创造者,不做技术工人

就像Paul Graham说的,我们应该把自己当成创造者,而不是技术工人。写代码不只是完成任务,更是创造,是表达,是艺术。要有对代码的审美和追求,不满足于"能跑就行",追求简洁、优雅、高质量的代码,把每一个项目,都当成一件作品来做。

2. 保持好奇心,不断学习

技术发展很快,新的技术、新的语言、新的框架,层出不穷,我们要保持好奇心,不断学习,不要固步自封。不仅要学习工作中用到的技术,也要学习工作之外的,比如不同的编程语言,不同的编程范式,不同的领域知识,开阔自己的视野,提升自己的能力。

3. 重视设计和代码质量

不要只追求功能实现,要重视设计和代码质量。好的设计,能让软件更稳定,更易维护,更有价值。写代码的时候,要多思考,多重构,追求简洁、优雅、可维护的代码,不要图一时的快,留下一堆技术债务。

4. 不要给自己设限

程序员不只是能打工,能写代码,我们也可以创业,可以做产品,可以做很多事情。不要给自己设限,觉得程序员就只能做技术,就只能打工。我们有技术,有能力,有最好的杠杆,可以创造很多东西,要敢于尝试,敢于追求自己想要的东西。

5. 保持独立思考

不要盲从,不要人云亦云,要有自己的思考和判断。技术圈里,有很多流行的观点和趋势,不一定都是对的,要有自己的判断,不要盲目跟风。要独立思考,深入理解技术的本质,而不是只停留在表面。

6. 重视沟通和协作

虽然程序员很多是书呆子,不太会社交,但在工作中,沟通和协作还是很重要的。一个人再厉害,也做不了所有的事情,需要和别人协作,需要和产品、设计、测试沟通,需要把自己的想法表达清楚。所以,也要重视沟通和协作能力的提升,不要只埋头写代码,也要学会和人打交道,学会表达自己的想法。

这些,就是我对程序员文化的一些思考,也是我自己努力的方向。我觉得,一个好的程序员,不只是技术好,还要有创造力,有学习能力,有设计感,有独立思考,有沟通协作能力,这样,才能在这个快速变化的时代,不断成长,不断创造价值。

八、写在最后

《黑客与画家》这本书,我读了好几遍,每次读都有新的收获。它不只是一本关于编程的书,更是一本关于创造、关于创业、关于这个时代的思考书。Paul Graham用他独特的视角,让我们看到了程序员这个群体的价值和可能性,也让我们对编程、对创造、对财富,有了更深的理解。

作为一个程序员,我很庆幸,能生活在这个时代,能从事编程这个职业。编程是一件很有魔力的事情,你可以用代码,创造出一个全新的世界,创造出能服务无数人的产品,这是很了不起的事情。我们应该珍惜这个机会,做一个创造者,不断学习,不断成长,创造出更多有价值的东西。

最后,推荐每一个程序员,都读一读《黑客与画家》这本书,相信你一定会有收获。也希望我们都能成为优秀的程序员,成为创造者,用代码创造价值,用技术改变世界。