幸福

编程艺术


李老师您好!我是ECE开学大二的学生。昨天我们成绩登出来了,相比期中我感觉期末有了很大进步,但是我还是很不满意。我上大学前没有接触过编程,随便选了CE,我至今其实很满意,打算以后还是继续向编程方向发展。您有没有什么可以推荐的书或是一些怎样才能学好编程的建议可以和我分享呢?如果您能看到我的私信并回复的话,我在这里提前感谢您!另外祝您暑假愉快!(问题来自微博私信)

我在清华上学那会儿,同学里曾经流行过一本书,叫《面向对象的程序设计》。那一年正好也是大学二年级,和你现在差不多大。

这本书晦涩难懂到什么地步呢?

我中学时代曾经多次参加过北京市和全国计算机竞赛,独立开发的教学辅助软件得过奖,家里甚至给我买了一台国产的苹果II兼容机。

而看完这本书,我觉得我自己不适合搞计算机这行。

这本书其实写得中规中矩,从头介绍了面向对象程序设计的各种基本概念。封装啊、继承啊、多态啊什么的,讲得头头是道。编程语言也非常前卫非常时髦,叫做Eiffel。那个时代它和Lisp一样,大家都觉得是将来编程语言的大势所趋。

可惜我无论如何认真学习,都搞不明白为什么要发明什么「多态」之类的概念。就连「面向对象」这个词儿,都让人不知所云。「找对象」这个词儿我明白什么意思;但是编个程序,为什么要面向什么「对象」?

直到大学三年级时给一个公司打工完成了一个大型项目,我才找回了一点儿自信。

学计算机编程有点儿像学弹钢琴:看书没什么用,需要真正动手去独立完成一些软件项目。刚开始可以从一些简单的项目做起,比如设计一款简单的游戏。就像钢琴曲目一样,任何一个项目都有更复杂的做法,需要循序渐进,一步一步由浅入深。

比如可以给你的游戏设计一种人工智能算法,人可以和计算机玩儿。刚开始设计的算法可以用相对简单的minimax和alpha-beta pruning,进而可以发展到蒙特卡洛树搜索(Monte Carlo Tree Search),甚至采用加强学习算法。

无论是移动应用还是机器学习算法,一个项目要在GitHub这样的开源平台上开始。只有这样,任何一个小改动才有可能完全透明地公开展示在世界面前。

编程是一种艺术。在Github上展示自己的编程作品,就像一个画家在画展里展示自己的画作。更为贴切的比喻是,编程就像在北京798艺术区街边儿的人像速写画家,一笔一画的素描,周围永远有路人和老外在围观。

这才是真正面向「对象」的程序设计。

2018年5月,多伦多