对我来说,编程的乐趣有三层。
第一,边思考边写程序极易让人陷入心流。而生活中高比例的心流体验是让人产生「有意义的快乐」的关键。
这是因为程序本就是为了更有效地解决实际而具体的问题而存在的;尤其在工作中,没人会扔给程序员一个假设性命题。相比于编程,研究数学更难让人沉浸的原因之一就是,数学要么在解决假设性命题,要么在解决高度抽象的理论问题;前者难让人产生现实连接感,后者对人的智力、天赋要求极高,我达不到。在数学中,我相对最喜欢的是概率论的部分,因为概率这个课题来自现实世界,同时还有点反直觉,随便研究一下都会给人一种探索的乐趣。
第二层可能因人而异。编程总会给人自由创造的空间,这一点也会让我快乐。我不能忍受一定要按别人的规定一步一步地去做一件事。就像西式烘焙的菜谱,所有用料、用量、时间、步骤都清清楚楚地标出来了。在生活中,我不讨厌按别人的菜谱一步步做出好看的菜品,但这要是搬到工作上,我是断然忍受不了没有一点点自己发挥创造的自由度。
而编程就不一样了,面对一个问题,你常常可以选择用哪种语言来编程,进而选择一种算法,进而选择合适的数据结构,最后还可以自己给所有变量命名!因此,当你最后面对一个程序时,不管简单还是复杂,你都很清楚这是你与自己大脑合作创造出来的作品。既结果导向,又存在自由的空间和创造的快乐,这可不是所有工作都能赋予的。
最后一点乐趣和第二点有关,我把这层称之为「成长的快乐」。
正是因为面对同样的问题,会有很多不同的思考方式和解决方案,于是在衡量每种方法的优劣时,也就成了你技术进步的绝好契机。一个新手要用十几行几层循环实现的功能,熟手可能随手调个库或用个巧妙的高级方法,一行代码就实现了。只要勤写勤思考,一步步地迈向熟手甚至高手,也并非特别艰难。
你的工作会入侵改变你的思维方式,这一点我非常相信。对于编程来说尤是如此,因为编程本质上就是一种解决问题的思维方式。当你慢慢地在编程在工作上获得成长时,你的思维方式必然也得到了成长。只要你想,每天都可以通过解决一个以前解决不了的小小技术问题来获得个人成长,这种强大的 incremental progress 像复利一样日积月累,最终会承载着你去往从未到达过的高度,看到从未想象过的风景。
你能为你的工作找到三个绝不容自己质疑的乐趣吗?如果能,那你的生活一定不会太糟糕。