你是程序员吗?
我的地理老师曾讲过她第一次在大学上课时的故事。作为开场介绍,她的教授要求全班同学在不借助任何帮助的情况下,尽可能准确地画出一幅德国地图。令她惊讶的是,她没能在地图上填入多少细节。甚至连这个国家的轮廓都画得有些模糊。
她见过成千上万张德国的图片(德国是她的祖国),却无法凭模糊的记忆将它复现出来。她得查资料才行。
这听起来是不是很熟悉?我们依靠机器来管理自己很大一部分的知识。要把某样东西背下来,需要付出艰苦的努力。
这里有一个针对程序员的类似测试:
选择你喜欢的编程语言,在一张纸上写出一个正确的排序算法( sorting algorithm) ,其平均运行时间复杂度为 O(n*log n)(Heapsort、Quicksort、Bucketsort,随你选择),且不得借助任何外部工具。
我所说的“正确”,是指你把它输入进去后,无需任何修改就必须没有错误。
你会惊讶于有如此高比例的专业软件工程师做不到这一点。
有些人可能会认为,了解编程语言语法的细节并不重要:“既然知道如何使用搜索引擎,为什么还要记住那些细枝末节?既然可以轻松地从教程中复制、粘贴并修改示例,为什么还要从一张白纸开始?反正每隔几年或几个月,我就得为了另一门语言彻底重新学习一遍语法。”
但那是个迷思。如果你只把一门编程语言学得非常透彻——即使它是 Fortran 或 COBOL 这样的过时语言——你也能凭借这项知识轻松赚得一大笔钱。假设你在 1975 年从 C 开始学习。近四十年后的今天,你仍然可以使用同样的语法。文本编辑器也是如此。Emacs 和 Vim 都有几十年的历史。它们经过了实战的充分检验。我不在乎你更喜欢哪一个,但你会用这些工具度过人生中很大一部分时间,所以应该投入时间掌握它们。
顺带一提,似乎很少有人力求把自己做的任何事情做到完美。他们心满意足地接受“够好就行”。这可能有很多不同的原因;我并不是在责怪任何没有认真做功课的人,但也许不只有我观察到了这一点。
如果你不会在不看手册的情况下使用自己的工具,那你就是个糟糕的工匠。如果你写一封简单的信都需要查字典,那么你很难成为一名作家,因为仅仅是写出优雅流畅的句子,对你来说就已经很有挑战了——更不用说写出引人入胜且富有原创性的故事。我不想读这样的书。
什么才算程序员?
- 她至少有一门自己了如指掌的编程语言。
- 她能够随手实现标准算法(例如排序、搜索)和数据结构(data-structures),使其健壮且速度合理。
- 她至少基本理解复杂度理论(complexity theory),以及递归、指针等编程概念。
但是,要成为一名优秀的程序员,你还应该:
- 至少能够使用两种本质不同的编程范式(programming paradigms) 编写代码(例如声明式、函数式范式)。
- 拥有大型软件架构方面的经验。
- 熟悉自己的编程环境,例如操作系统和你选择的一款高级文本编辑器。最好是易于扩展的编辑器。
而这还只是冰山一角。“要学的东西太多了!”我听见你们中的一些人这样说。慢慢开始。使用 Vim 只需要先掌握三个命令:i、ESC、:wq。第一天这样就够了。
我知道,这些基本功大多不会在课堂上教授。很大一部分内容必须靠你自己学习。但面对现实吧:如果你不知道这些东西,你不是程序员,而是个新生。
随机一篇博客