最近一部名为“学校不会教的东西”的短片甚嚣尘上,引起了大众的关注。短片的中心思想就是“人人都能编程”,而且其中还有几位知名富豪宣传这一论点。(顺便提一句,这些富豪的钱是通过雇佣别人编程而赚取的,并非靠自己编程。)
前几天我弟弟来了,他是一个做梦都想发财的主。他对我说:“我想和你一样,我要编程”。毫无疑问,他看过了那部短片。
我想说的是,这一切根本不靠谱。不是人人都适合编程(简单的入门除外),更重要的是,并非人人都能把编程作为职业。
短片一开头是 Bill Gates 和 Mark Zuckerberg 等知名富豪在宣传“我还是小孩子的时候就开始编程了”,然后显示一下他们最早的启蒙作品,例如小游戏之类的。之后,Dropbox 的创始人 Drew Houston 出现了,称“编程和玩乐器、做运动差不多”,然后大学期间学过编程的 NBA 全明星 Chris Bosh 会介绍他在编程方面遇到的困难和苦恼,但实际上却并没有指出有多困难。
他们说的这些并不假。一个有好奇心的小孩学习编程就像学习其它任何无关紧要的事情一样(例如乐器、运动、杂耍、针线等)。但后面的内容就开始误导了。
Facebook 早期工程师 Makinde Adeagbo 出来说很多编程都是很简单的。从某种意义上说,这是对的。但我同样可以说打篮球时很多动作也是很简单的,比如横穿球场或是投球。横穿球场是打篮球中的基本要素,但并不是会横穿球场就表示篮球打得好。实际上,你可能每次都能漂亮地横穿球场,却根本打不好篮球。
然后我最喜欢的片段来了:Bill Gates 在那说:“加,减,这就是编程”。就是这些,这些就是你学会编程所需的唯一前提。
这话只有一半是对的。你确实无需太多数学知识就可以编程。但问题是,随着你对编程了解得越多,就会发现数学必不可少。我要说,想当一名成功的程序员,必须要有良好的代数基础,若你想达到更高的层次,你还需要学得更多。且不说这条前提,我认为他传达了一个错误的信息,那就是将最低门槛描述为成功的方法。更准确的说法是:“你只需要知道加和减。但你最好多学一点数学,因为除了《7 天学会 Java》之类的入门读物以外,当你阅读更有内容的编程书籍时,就需要用到数学。”
短片的最后开始介绍程序员的生活。奢华的办公室、免费的食物、优美的景色,当然,还有大把的钞票。
我被短片中的一家公司录取了:Facebook。但我代表其他的程序员说,这些看着很难受。
这些条件确实存在,但对于程序员而言,它们是特例,并非常态。大多数办公室仅配备咖啡机和冰箱,供你存放自己的食物,通常都被别人的食物塞得满满的,且一放就是一个星期。程序员们坐在大楼的一个个灰色小隔间里,还要遵守严格的规章制度。
我要做的就是被 Facebook 录取。他们告诉我这很简单。他们录取了成百上千的人,编程很简单。
事实并非如此。Facebook 的面试可不只是“加和减”,他们给你的问题也绝不是有趣的小游戏。其中一道面试题需要了解微积分,另一道题需要说明高度递归函数的时空复杂性,还有一道需要掌握程序员使用的抽象工具,例如正规语言和自动操作。
我弟弟想干我这一行,他认为能比在 FedEx 当个工人赚得钱多得多,过上小奢侈的生活。短片里也是这样宣传的。但我想他并没有看清现实。
这个周末我坐在这里,给一个我完全不了解的代码库写代码。我觉得如果不按时完成,我这份工作就危险了。我编写的不是有趣的游戏或其它具体的东西,实际上,如果一个外行问我在编写什么,我根本没法说清楚。我或许会说:“我在编写一种东西,它能够读取代码,根据代码推导出信息,其他人就可以在他们的工具里使用这些信息”。我想这不是我弟弟或其他任何人预想中要做的事情。
我能够早上 10 点上班,晚上 7 点回家吗?不行。编程不是按时上下班的工作,它总是需要更多的时间来完成任务。而且永无休止,因为任务源源不断。总是有新功能要加,有新 bug 要除。你总是有理由再留下一两个小时。就我个人而言,我感觉时间如此不够用,我必须加班到凌晨 12 点到 1 点才能平衡我的工作和个人生活。这可不仅仅是我的状态,很多程序员都是如此。
我并不想打击刚开始学编程的新人,它确实是一件能增强能力的事情。但对于我而言,编程不是一两个周末或 52 个周末就能搞定的事情,而是我付出了艰辛的努力,且放弃了生活中许多其它的事情才学会的。我很难告诉我弟弟或是其他任何人,学会一点编程的成果(不是名誉和财富)就能改变他们思考的方式,而且我也不认为这件简单的事情对大多数人是一种好的推动。
简而言之,不是人人都适合编程。它不是这部短片或电影“社交网络”里所描述的有趣好玩的工作。它也不是一项令人精神爽朗的社会活动。你要花费大量的时间坐在电脑屏幕前,盯着那些五颜六色的文本文档,思考,思考,打字,生气,并奇怪自己为什么会选择这种死坐着不动的生活。