掐指一算,我学编程 13 年了!
共 4266字,需浏览 9分钟
·
2021-09-07 14:25
周末好呀,我是二哥。
刚认识了一个朋友 HexUp,他是浙大的博士生,俩人简单地聊了聊,还互吹了一番,哈哈哈。
「Teach yourself programming in 10 years」是谷歌研究院院长 Peter Norvig 的经典好文,我很早之前就看了,确实讲得非常深刻,对我有很大的启发。刚好 HexUp 翻译了一下,我就转过来分享给大家读一读,应该会很有收获。
掐指一算,我学编程也 13 年了,时间过得可真快。我上大学的那会,图书馆里好多书都是《21 天教会你 XXX》,真的——没少看啊😂。
大家可以回想一下,你们学校的图书馆是不是也有不少这样的书?更过分的是,还有《24 小时学会 Java》这样的书,旁边还会有各种变种,教你怎么在几个小时或者几天内学会 C、SQL、Ruby、算法等等。
用亚马逊的高级搜索[标题:teach, yourself, hours, since:2000]可以找到 512 本这样的书,其中排名前 10 的有 9 本都是编程的书籍(另外一本是关于记账的)。你用 learn 替代 teach yourself,或者用 days 替代 hours 可以得到相同的结果。
这么看来,要么就是人们学习编程非常地匆忙,要么就是编程学起来比其他东西简单多了。Felleisen 等人在他们《如何设计程序》一书中承认了这个潮流。他们说:“坏的编程是容易的,就算是白痴也能在 21 天里面学会坏编程。”
Abstruse Goose 网站也有一个这样的漫画来讽刺这种现象。
我们来分析一下,一个像《24 小时内教会你自己 C++》这样的标题意味着什么:
自学:在 24 小时内,你并没有时间去写几个有意义的程序,并且从中总结成功的经验和吸取教训。你没有时间去跟一个经验丰富的程序员合作,然后理解在真正的 c++环境里面工作是什么样的。简单来说,你没有时间来学太多东西。所以这本书只能谈论一些肤浅的认知,而不是深入的理解。Alexander Pope(诗人、讽刺作家)说过,只知皮毛是一件危险的事情(A little knowledge is a dangerous thing) C++:在 24 小时内,你也许能够学会 C++的一些语法(如果你已经知道其他编程语言),但是你并不能学会如何使用这门语言。简单来说,假如你是一个 Basic 程序员,你可以学会如何用 C++的语法按照 Basic 的风格写程序,但是你无法学习到 C++语法真正的优势(和劣势)。那这又有什么意义呢?Alan Perils 曾经说过:“一门无法影响你对编程看法的语言是不值得学习的。”有一种可能是,你需要学习一点点 C++(也有可能是一些类似 JavaScript 或者 Processing 的东西)来跟某个现存的工具交互,以完成某个特定的任务。但这其实不是在学习如何编程,而是在学习如何完成那项任务。 在 24 小时内:不幸的是,这不够,下一节会说明。
用十年时间自学编程
研究者已经证明了,在众多的领域中,任何一个都需要 10 年左右的时间来培养一个专家,包括下棋、作曲、电报操作、绘画、弹钢琴、游泳、网球、神经心理学和拓扑研究。
关键在于刻意的练习:不仅仅是一遍又一遍的重复,而是用正好超出你能力边界一点点的任务挑战自己。尝试,并在过程中和之后分析自己的表现,并纠正任何错误。然后就是重复,再重复。
看起来并没有一个明显的捷径:即便是 4 岁就已经是音乐神童的莫扎特,也要等到 13 年之后才开始创作出世界级的音乐。Beatles 乐队看起来像是从 1964 年的一场演唱会开始突然火起来,但是他们从 1957 年开始就在利物浦和汉堡的小酒吧里面表演了,而直到 1967 年他们才创作出第一个真正的伟大关键作品,虽然在那之前他们已经挺火的了。
Malcolm Galdwell 推广了这个概念,不过他更强调的是 10000 个小时而不是 10 年。Henri Cartier-Bresson(1908-2004)有另一个标准:“你的头 10000 张照片是你最差的作品。”(他没预料到的是,用数码相机,有些人一周内就能拍出这么多照片)真正的专家级精通可能需要一生的时间:Samuel Johnson(1709-1784)说过:“任何领域的精通只能用一生的努力去获取;不能用更少的代价来获得。”Chaucer(1340-1400)曾经抱怨过“人生太短,技艺却需要这么久去学习”。
Hippocrates(希波克拉底)有句名言:“人生短暂,技艺长久,机会稍纵即逝,经验不可靠,决策困难”。当然,没有一个数字是最终的答案:因为不可能所有的技能(编程,下棋,音乐等等)都会花费相同的时间来获得。
就像 K. Anders Ericsson 教授所说:“在大多数领域内,即便是最天才的人达到最高水平表现所需要的时间也是值得注意的。1 万小时这个数字只是给你一个大致的感觉,我们在谈论每周 10 到 20 个小时的努力,天才也需要多年才能达到的最高水平。”
所以你想成为一个程序员
这里是我的编程成功秘诀:
对编程产生兴趣,然后写一些有趣的程序。确保它始终是有趣的,这样你才能愿意投入 10 年或者 1 万小时 写程序。最好的学习方法是通过实践学习。更技术地讲,“个体的最高水平不是靠经验的积累自动获得的,即便是经验丰富的人仍然能够通过刻意地训练提升自己的表现。”“最有效的学习方法需要一个定义良好的任务,配合合理的难度曲线,富有信息的反馈,重复和纠错的机会。”《实践中的认知:心灵,数学和日常生活中的文化》这本书提供了一个有趣的参考。 跟其他程序员对话交流;读他们的程序。这比任何书籍或者培训课程都重要。 如果你想的话,上四年大学(或者进一步读研)。这会让你获得需要学历证明的敲门砖,而且会让你对这个领域有一个更深的认知,但是如果你不喜欢上学的话,你可以(经过一些投入)靠自己或者在工作中获得类似的经验。在任何一种情况中,只看书都是不够的。Eric Raymond,《新黑客字典》的作者,说过:“研究刷子和颜料不能产生伟大的画家,计算机教育在培养专家程序员上的效果也不比这个好。”我曾经雇佣过的最好的程序员之一只有高中学历,他创作了很多很棒的软件,有自己的新闻群组,并且赚到了足够的股票期权买下了自己的夜店。 跟其他程序员一起合作项目。在某些项目上成为最好的一个,在某些项目中成为最差的一个。当时是最好的那个的时候,检验一下自己领导一个项目的能力,并且用自己的视野来激励其他人。当你是最差的那一个的时候,你学习其他大师的方法,学习他们不喜欢做什么(因为他们会让你帮他们做这种事)。 接手做其他程序员做过的项目。理解其他程序员写的程序。看看理解并修复一个项目(当原始作者不在的时候)需要什么。思考一下如何设计程序,让后来者可以在你之后更轻松地维护。 学习至少半打(6 门)编程语言。包括一门强调类别抽象的语言(比如 Java 或者 C++),一门强调函数式抽象的(比如 Lisp,ML 或者 Haskell),一门强调语法抽象的(比如 Lisp),一门强调声明式的(比如 Prolog 或者 C++模板),一门强调并行的(比如 Clojure 或者 Go)。 记住,计算机科学里面有一个计算机。知道你的计算机执行一条指令需要多久,从内存中取一个字需要多久,从硬盘中连续读取字需要多久,在硬盘上寻找新的地址需要多久(答案在后面)。 参与一个语言标准化的工作。可以是 ANSI C++委员会,或者是参与决策你的本地的代码规范里面缩进是用 2 个空格还是 4 个空格。任何一种方式,你都可以学习到其他人喜欢一个语言的地方,他们的深入感受,以及他们为什么这么想。 有良好的意识可以尽快从语言的标准化努力中脱身。
所有的这些在心中,那就有个问题,仅仅靠看书能走多远呢?我的一个小孩出生之前,我阅读了所有的如何带孩子的书,但我仍然毫无头绪。30 个月之后,我的第二个小孩出生了,我还会去看这些书吗?不会了。相反的,我依靠我的个人经验,实践证明,它们比专家写的书有用靠谱多了。
Fred Brooks 在他的文章《No Silver Bullet》中找到了一个三步计划,用来发掘伟大的程序员:
系统性地发掘顶级设计者,越早越好 分配一个职业导师,为希望之星的发展负责,并谨慎地保持职业生涯 给成长的设计者提供机会,让他们跟其他人交互并互相刺激
这里面假定一些人已经有了成为好的设计者的潜力;所需要的工作只是诱导他们发展。Alan Perils 有一个更简要的说法:“每个人都可以被教会如何雕刻,米开朗基罗只需要被教会怎么别去雕刻。伟大的程序员也一样。”Perils 的意思是伟大的人有超越了训练的内在特质。但这些特质是从哪来的呢?是与生俱来的吗?还是靠勤奋培养的?就像 Auguste Gusteau 说的:“每个人都能烹饪,但只有无所畏惧的人才能伟大。”按照我的理解,关键在于将自己的大部分时间投入到刻意训练的意愿。但也许无所畏惧就是总结它的一种方式。或者像 Gusteau 的评论家 Anton Ego 说的:“不是每个人都能成为伟大的艺术家,但是一个伟大的艺术家可能来自任何地方。”
所以,可以继续,买下那本 Java/Ruby/Javascript/PHP 的书;你很可能会发现还是有点用处。但是它不能在 24 小时或者 21 天内改变你的生命,或者你的真正编程技巧。继续坚持持续提升 24 个月呢?很好,你现在正开始向某个地方前进了……
-----------
分享的最后,简单说两句吧。
13 年前,在图书馆看到 21 天学会 xxx 这些书的时候,确实很激动,以为自己从此就走上了人生巅峰。
13 年后,依然觉得自己是个菜逼,编程这条路上还有太多的未知需要我去学习,去探索,知识的边界随着时间的推移,没变小却变更大了。
大家都学习编程多少时间了呢?可以在评论区 show 一下。觉得这篇内容有帮助的小伙伴,可以把 点赞+在看 顺手安排一下!
推荐阅读: