Teach Yourself Programming in Ten Years

原文地址 (中文) :D

我对作者给出的学习编程建议非常感兴趣. 除了几点显而易见, 另外一些建议对于像我这样以程序设计作为职业的人, 仍然有益.

对于我来说, 178显而易见, 对23456则是在平时工作中隐隐地有感觉. 想过但是却不清晰. 不知道10是不是开9的玩笑. 感觉9有点在开玩笑但是后半句却很严肃. 我觉得作者着重地强调了, 共享和协作对于程序开发的重要性, 其实这也是许多程序员包括我的一个槛. 从学习程序设计初期到现在就被灌输软件行业英雄主义, 从业之后身边的人谈论以及各种IT媒体报道软件英雄以及明星程序员都强化了这种思想, 却掩盖了这群开发者除去软件开发技能之外的过硬的软素质, 其中就包括共享和协作能力. 这让我想起了一句评论说, Linus最厉害的地方并不是编码能力, 比他编码能力强的人有许多, 而他最成功的地方就是能够管理这些比他能力强的人开发内核, 让整个项目有条不紊地进行30年但是依旧充满活力.

  1. 设法对编程感兴趣, 并且因为它有趣而编一些程序. 确保编程一直充满足够乐趣, 这样你才愿意投入十年宝贵时间.
  2. 与其他程序员交流: 阅读其它程序. 这比任何书本或训练课程都重要.
  3. 写程序. 最好的学习方式是 从实践中学习. 用更技术性的话说, "在一个给定的领域内, 个人的最大能力不是自动地由扩展了的经验取得的, 但即使是高度有经验的人也可以通过有意识的努力来提高自己的能力" (p. 366) 和 "最有效的学习需要因人而异的适当难度, 目标明确的任务, 丰富的信息反馈, 以及重复的机会和错误修正." (p. 20-21) 此书 Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life 是阐明此观点的令人感兴趣的参考文献.
  4. 如果愿意, 在大学里呆上4年或更长(在研究生院里). 你会接触到一些需要学历证明的工作, 你会对此领域有更深的理解. 如果你不喜欢学校, 你可以(通过一些贡献)在工作中获得相似的经验. 在任何情况下, 光啃书本是不够的. Eric Raymond, The New Hacker's Dictionary一书的作者, 说过, "计算机科学不能把任何人变成编程专家, 就象光研究刷子和颜料不会使人变成画家一样." 我雇佣过的最好的程序员之一仅有高中程度: 他做出了许多 优秀的软件 , 有他自己的 新闻组, 而且通过股票期权, 他无疑比我富有的多. (注: Coders At Work里面有jwz的一章. 他曾经为Peter Norvig工作过一段时间但是不久便离开了)
  5. 和其他程序员一起做项目 .在其中的一些项目中作为最好的程序员, 而在另一些项目中是最差的. 当你是最好的, 你能测试领导项目的能力, 用你的观点激发别人. 当你是最差的, 你学习杰出者是怎么做的, 了解他们不喜欢做什么(因为他们吩咐你做事).
  6. 在其他程序员之后接手项目. 使自己理解别人写的程序. 当程序的原作者不在的时候, 研究什么需要理解并且修改它. 思考如何设计你的程序以便后来者的维护.
  7. 学习至少半打的编程语言.包括一种支持类抽象的语言(象Java或C++), 一种支持函数化抽象的语言(象Lisp或ML), 一种支持语法抽象的语言(象Lisp), 一种支持声明规格说明的语言(象Prolog或C++的模板), 一种支持共行程序(coroutine)的语言(象Icon或Scheme), 一种支持并行的语言(象Sisal).
  8. 请记住"计算机科学"中有"计算机"一词. 了解你的计算机要花多长时间执行一条指令, 从内存中取一个字(有cache), 从磁盘中读取连续的字, 和在磁盘中找到新的位置.(答案)
  9. 参与一种语言标准化的工作. 它可以是ANSI C++委员会, 也可以是决定你周围小范围内的编程风格是应该两个还是四个空格缩进. 通过任何一种方式, 你了解到其他人在某种语言中的想法, 他们的理解深度, 甚至一些他们这样想的原因.
  10. 找适当的理由尽快地从语言标准化的努力中脱身.