自学编程,十年磨一剑

原创
2017/12/12 23:34
阅读数 1.4K

原文链接 Teach Yourself Programming in Ten Years 作者 Peter Norvig

原文几经修改,已有的翻译 惨不忍睹,多处翻译得背道相驰,怒而重新翻译,是为此文。2017.11.5

为什么每个人都如此急于求成?

在任何书店里你都能看到类似于《24 小时 Java 无师自通》这样的书,以及旁边无穷无尽的变种,试图教你在短时间内学会 C、SQL、Ruby、算法等等技能。

我在亚马逊在线书店搜索“自学”“小时”“2000年以后出版”等关键字,找到了 512 本类似书籍。前十名有九个都是编程书。

似乎一切都昭示着,要么当下人们迫切地想学会编程,要么学会编程是相当容易的一件事。在其他领域里,你很难找到诸如此类的书,甚至是《狗狗喂养指南》都鲜有“几日速成”这种说法。你不奇怪吗?

是的,Felleisen 等人也注意到了,他们的著作《如何设计程序》里提到了这种速成书泛滥的趋势,并给出评论“拙劣的编程水平确实相当容易达成。傻子都能在 21 天里学会,哪怕他们天生就是个白痴。”。Abtruse Goose 的漫画《如何自学编程》也有类似的表达。

让我们试着分析一下,一本《24 小时 C++ 无师自通》意味着什么:

1.24 小时: 有限的时间,意味着精简过的内容。

2.C++: 如果你学过其他编程语言,那么你可能会学到一门新语言的语法。然而你仍然无法学到怎么去原汁原味地使用它。简言之,你可能能够以 Basic 语言的风格来使用 C++ 的语法,但无法发挥出 C++ 本身的优势(甚至其缺点你都不知道)。这意味着什么?Alan Perlis 说过,“如果一门语言不能影响你的编程思维,那么不学也罢。” 当然,你也可能学会用这一点点 C++ 来完成特定的接口编码任务,但这只是完成了任务,你并没有学会怎么用 C++ 去编程。试着理解这种区别。

3.无师自通: 你不会有什么时间写几个有意义的程序,也没法从中吸取什么成功或者失败的经验。你也不可能有时间和老练的程序员一起工作和交流,没法去理解真正的 C++ 工程的工作环境是什么样子。简言之,你学不到什么。你能从这类书中得到的只有粗浅的印象。就像是英国诗人亚历山大所说:“浅尝辄止,甚是危险。”

用十年时间自学编程

大量的研究者发现,在很多领域里达到专业级别的水平,大概需要十年时间。研究对象涉及下棋、作曲、发报、绘画、钢琴演奏、游泳、网球,还有神经心理学和拓扑学。

关键在于“刻意练习”:不要机械地重复一件事,而是发起挑战,试图超越已有的能力范围,不断尝试,不断分析、总结、纠正错误。

捷径是不存在的。即使天才如莫扎特,4 岁开始作曲,也是在 13 年以后才创作出世界级的音乐巨作。

Malcolm Gladwell 提出了著名的一万小时定律

Henri Cartier-Bresson (1908-2004) 曾说过:“你摄影生涯中的前一万张,都是垃圾。” 当然,他没能预料到的是,随着数码相机的普及,人们甚至可以在一周内达成这项成就。

Samuel Johnson (1709-1784) 也说过:“在任何一个领域里想要做到极好,势必要穷尽一生的努力,没有代价更低的办法了。”

Chaucer (1340-1400) 也发出过“生命如此短暂,技艺却如此高深”的感叹。这句话来自更古老的一条格言:“生命短暂,技艺高深,机遇易逝,探索难得,抉择困难重重。”

当然,学会一项技术需要多久,没有绝对的终极答案,不同的技能也各有不同。但有一件事应当成为共识:掌握一门技能,不是短短的十几二十小时的事,而是要下每周十几二十小时的功夫。

你想成为真正的编程专家吗?

下面是我给出的成功“指南”:

对编程感兴趣。出于兴趣地去做点什么。保持这种感兴趣的状态,这是确保你能够持续投入时间的绝佳保障。

动手写程序。最好的学习方式是“在实践中学习”。更专业的说法是“一个人在一个领域内的最高水平,并不是随着经验增长而自动获得的,而是为了进步而刻意努力产生的结果。”。《实践中的认知:日常生活中的思维、数学和文化》一书说:“最有效的学习需要满足这么几点:明确且对学习者来说难度适当的任务,及时的信息反馈,重新开始和改正错误的机会”(p.20-21)。

与他人交流,读他人的程序。相信我,交流远比看书和上培训班重要。

如果你愿意,读个计算机学位。这将给你机会去接触那些需要专业认证的工作,也会给你提供本行业更深的理解。当然这不是必须的,你也可以通过工作来积累经验。无论通过哪种方式,你要明白,书本学习很重要,但是只有书本学习是远远不够的。Eric Raymond 说过:“如果说仅仅靠学习油画和调色技术无法成为出顶尖的画家的话,那么光靠学习计算机科学课程也不能造就顶尖的编程专家。”。举个例子,有一个人,他是我所雇用过的最好的程序员之一,他只有高中学历,但他写了很多伟大的软件,他有他自己的新闻组,并且通过股权赚够了钱,还开了家属于自己的夜店。(译注:这个人是 Jamie Zawinski,Netscape 的早期开发者,Mozilla 和 XEmacs 的主要贡献者)

与其他人一起做项目。俗话说鸡头凤尾。在一些项目里争取成为鸡头,也要加入一些你会是凤尾的项目。成为鸡头,你会有机会锻炼自己的领导能力,也可以激发远见;成为凤尾,你会跟随大师学习如何行事,也会接触到项目中大师们不会亲自处理的琐事杂事。

加入他人的项目。试着理解别人写的代码,尝试在找不到原作者的情况下修复代码中的问题,从中体会这需要多大的代价。试着思考如何让自己的程序更容易被他人理解和维护。

学会多门编程语言。不同的编程语言有不同的抽象模型、不同的侧重点和优势。如经典的命令式编程语言、广泛使用的面向对象编程语言、声明式编程语言、函数式编程语言等等,都值得一学。

理解计算机。计算机科学这个概念,可是有“计算机”三个字的。比如:了解计算机执行指令需要花多久,从内存中获取一个字(word)会遇到什么、花多久,从硬盘里读取连续的字(word)会花多久,以及在硬盘上重新定位到一个新的位置要花多久。这很重要。

参与语言的标准化过程。虽然很难加入 ANSI 委员会,但你能够使自己的编程风格、编码规范得到统一。比如缩进用 Tab 还是空格,几个空格宽。无论如何,你都能够了解那些被大家所接受的“事实标准”的语言偏好,试着体会他们从中感悟到了什么,试着思考他们为什么接受这个标准。

保持敏锐,尽快适应语言的标准化,形成习惯。不要忘记,你要与他人协作,要产生他人能读的懂的程序。

要做到上面所说的这些,光靠读书应该是不够的。在我的第一个孩子出生前,我读遍了所有的《如何……》类书籍,然而还是感觉自己是个菜鸟。30 个月后,我的第二个孩子快出生了,我还要回去读书吗?当然不,这次我会更多地依赖于我的个人经验,这远比专家写的上千页纸更有用和令人安心。

Fred Brooks 在他的著作《没有银弹》 里揭示了发现优秀软件设计师的三步计划:

  1. 尽早地系统地辨认出顶级的设计师
  2. 指派一名职业导师为其指点迷津,并谨慎留存他的职业档案
  3. 为成长中的设计师提供互动的机会,使其互相促进

即使有一部分人已经具有了成为优秀设计师的素质,但仍然需要正确的引导。Alan Perlis 说的更直接:“任何人都能被教会如何雕塑,但米开朗琪罗必须被教会怎样才能不被他人教导。这道理对编程专家同样有用。” 他的意思是伟大的人有其特质,但这些特质从哪来?与生俱来的还是后天可培养的?《料理鼠王》里的 Auguste Gusteau 说:“任何人都会做饭,但只有无所畏惧者(the fearless)才能成为大厨。” 无所畏惧是天生的吗?我很愿意投入生命中的一大部分精力用于刻意练习,但可能“无所畏惧”的精神才是量变到质变的关键所在。《料理鼠王》里与 Gusteau 作对的美食评论家 Anton Ego 说:“不是任何人都能成为伟大的艺术家,但伟大的艺术家在成名前可能是任何人。” 或许这家伙的话才是对的。

所以,尽管去书店买那些速成书籍吧,你也许发现他们真的挺管用。但这不会改变你的人生,也不会让你的编程水平有什么本质的提高。当你开始思考“要不要试着通过 24 个月的不懈努力来持续提高自己?”的时候,那么恭喜你,你上道了。

附录A 哪一个编程语言是我要先学习的?

总有人问这种问题,虽然没有标准答案,但还是说了几句。

这里不通篇翻译了,取其精髓。作者的意思是选择那些“你朋友们都在用的,简单的,可以轻松运行的”,比如 Python 或 Scheme。当然那也不强求你追随别人的脚步。

附录B 哪里能找到真正的学习书籍或相关资源?

总有人问这种问题,虽然很难回答,而且也肯定学的不够全面,但还是推荐一些。

展开阅读全文
打赏
2
14 收藏
分享
加载中
看了这个文章,我才明白,为啥我写的代码,别人都说是垃圾了。原来我还没有从事这行到十年!
2017/12/14 16:22
回复
举报
整篇文章篇幅虽少,但是整体结构给人一种井井有条的感觉,第一映象感觉很好。
读后感:读完之后,我会去思考自己,是否跟文章中描述的一样,我需要是否开始做。现在眼前的”雾霾“明显减少。

谢谢。
2017/12/14 14:32
回复
举报
不错,读完了.
2017/12/14 11:52
回复
举报
不错哦~~👍👍
2017/12/13 19:32
回复
举报
更多评论
打赏
4 评论
14 收藏
2
分享
返回顶部
顶部