作者:Vladimir Sedach
签名:Have Emacs, Will Hack
标签:CEO at Gigantic Software (2006-present)and Kiran Kannar, CS grad student, University of California San Diego
首先我很赞同 Michael O. Church对优秀的程序员的准确定义,而且我认为这可能会变成HR选人的参照工具(我猜他会讨厌我这么说)
编程像其他人类活动,总会有天才或神童在正态分布的右边,大部分人都是在中间,也有一些人在最左边。我相信他们学不会编程的只有那些有智力障碍的人,同样他们也不能参与人类其他的智力活动
所以,假设你是在正态分布的中间,你能变成一个卓越的程序员吗?想在一件事上做的好你首先需要一些基本能力。
Jeff Schaffzin对拥有一个良好的逻辑性的重要性有很好的分析,编程的核心活动包括你所用的程序语言的思维模式和你要解决的问题的思维模式。这就是为什么运用Piaget的构造主义理论去教学生去学编程的Seymour Papert会这么成功,它通过让学生自己去设计程序和优化程序来构造学生的思维模式
在我看来,这就是为什么许多计算机科学专业教的Java和C++失败的原因。这些编程语言对构造和拓展思维模式没有一点作用,那些没有挂科的学生通常都是已经拥有编程思维模式的人,其他学生没有机会去开发他们的思维模式然后跟告诉他们不会编程
构造主义编程学习营的另外俩个重要的突出的项目是一个由 Alan Kay,运营的和 PLT TeachScheme! 项目(就是现在大家所知的ProgramByDesign)
我第一次真正接触编程是我在高中时期(撇开小时候完全不知道在输入什么的几个BASIC程序),当时我上过的一个介绍计算机科学的课程也是TeachScheme!的一部分(在Stuyvesant里Mike Zamansky上的课),上完课后我能写程序来解决一些基本问题了,然而当时我没有对编程产生兴趣,几年来都没产生兴趣。
我编程之旅的一个重要开始:一个动机。我的动机是当我发现SICP这本书,才知道程序可以这么的美和逻辑简单
我不是声称自己是一个优秀的程序员或甚至一个卓越的程序员,但是我将会说明一些我用在我走向着优秀程序员这条路的技巧
当我们讨论如何做一件事,这里有个可以帮助你的东西,我推荐你去阅读George Leonard的《掌控》,我提炼出这书的几个重要的点
- 如果你想成为一件事的专家你需要不断的练习
- 有规律和持续性的练习是最有效的
- 原理是全部,最伟大的成功者会花大量精力去完善基础
- 一个好的计算机从业者不会停止学习,只要你开始自满于自己的技术,你就开始滑向平庸
在我开始计划我走向优秀的程序员路上之前,我是没有进步的动力,我当时认为我已经够好了,所以我没有去尝试提升自己,我当时还找到了其他的兴趣点,商业和心理学,我甚至尝试去把职业方向转向商业方面,当时我都注册了MBA项目,也就是那个时候我发现了George Leonard的书,才知道我错了。
所以在今年六月从商业学校退学,复兴我的成为好的程序员计划,不同于之前,我评估了为了到达我的目标,目前我做对了什么做错了什么:
我以前做错的事情:
- 没有有规律和持续性的练习
- 认为我对基础很了解
- 没有竞争意识
- 没有学好数学
为了解决第一点,我采用“Seinfeld技巧”,我尝试每天我完成一个任务在我参与的开源软件项目,同时我发现最好的方法去做一件事情是采用“Hemingway技巧”,每次把一个任务或者子任务留个尾到第二天做,这样会很更容易做出贡献。
第二点,我决定回炉重新学数据结构原理和算法,花时间去阅读那些对我来说过于“基础”的原理,去重新学习计算机科学领域中我没有涉及到的地方
我还去简化我的编程风格,每个人都同意以简为美,但是现在每当我遇到需要我做出决定去设计我的程序,我都会告诉自己(《掌握》里面的一个技巧):最蠢的实现方法是什么?我发现每当我尝试简化的时候是最聪明的,所以我强制自己去写最蠢的实现所以当我去简化时都能想出最好的方案
假装变笨的练习可以让我舍弃了任何编程范式或者编程禁忌。现在的我写的代码不是那些游行的"聪明“的或教条式的写法而是特别糟糕的写法,但是到编码结束的时候都变成简单和易理解,以前的我认为函数式编程好过面向对象式编程,现在我觉得都很糟糕
第3点对我来说是新鲜事,但应该是显而易见的。毕竟优秀的程序员是相对的,只有跟别人比你才知道你是在正态分布的哪一端,我以前从来没有对编程比赛感兴趣过(我只有去过俩次,最后一次是2007年的国际Lisp会议)现在我计划开始准备参加一次TopCoder比赛,我已经推掉了一些其他的计划,我不知道这会多久才让我变的更好,但是我想我会的(我的ILC07项目统治了最高分和最快运行速度)
第四点应该很明显,我的一个学士学位就是基础数学,我认为在大学我没有做干好的事就俩:性和数学
我做对的事
从最好的人中学习
从所有人中学
花时间做有野心的项目
Niels Abel说过他学习的关键是从导师那学而不是从学生中学
我是MIT的计算机科学课程死忠粉,我认为三本最好的计算机科学书籍是 Abelson and Sussman and Sussman的《计算机程序的构造和解释》,Cormen, Leiserson, Rivest and Stein的《算法概论》,Saltzer and Kaashoek的《计算机设计原理》
一份好的1950年代,60年代,70年代和80年代的计算机科学书籍,论文和专题论文都是充满了深刻理解的是永远不会过时的,在大学期间,我得出了个结论是计算机科学的书籍都是在1990之前出版的,最近的一个计划是阅读《计算机程序设计艺术》四章的全部内容
二这一点貌似跟上一点相悖,但是一旦你知道什么对你重要什么对你不重要,你就可以从评估其他人的思想,从而舍弃或者学习他们的思想,但不幸的是不是每次讨论都会包含一个精彩的论述
第三点这是非常重要的,如果你想做一个项目但是别人告诉你这很难的,你需要去做这个项目。如果你做了个好的项目,在定义来说你将成为一个优秀的程序员,不要优先去写那些又小又简单的项目,在一个大型项目里你需要解决很多又小又简单的项目。
做一个困难又有野心的项目意味着很有可能失败,一个最常见的失败就是超出时间了,你可以通过投身一个长期免费的项目来避免这一点,我是真的花了一年时间在我的免费项目里,在足够长的时间范围内,主要的生活变化和优先事项的变化不会妨碍,如果我陷入了一个技术问题想不出好的解决方法,我会丢一阵子,直到我相处一个满意的解决方法在回来。这样,抛弃一个项目只有一个理由是这东西没必要我去花时间
开源软件的一个的一个坏处阻碍了你的小的简单的程序进步成为开源软件,但是你去做提交一次贡献可以造福很多人,这些都是在做你喜欢的事情同时也会让你变得更好的程序员
我不能说这么做一定会成功或这是最好的途径,如果你有好的注意,一定要分享出来