一个优秀的程序员如何能练就成一个卓越的程序员?
先等等,暂时不谈卓越,先谈谈如何成为一个优秀的程序员。
从第一步到第N步并没有明确的路线图。事实上,第N步到底是什么还不确定。就像逻辑型思维的开发者一样,缺乏明确的目标会让从入门到精通的道路变得异常崎岖。
过去的几年中,我花了不少时间来思索这个问题。我该如何从一名能力尚可的程序员修炼成一个真正优秀的程序员呢?
成功是什么?
当我对成功有清晰的目标、量化的标准的时候,我就能发挥我的最大潜力。比如,我想实现5分钟跑完一英里这个目标。好吧。这个路程很容易测量,成功的 界限分明。我很容易知道跑一英里需要多久,网上也到处都是提高跑步速度的建议和训练计划。我可以选择一个计划并付诸努力,我深信我最终能够实现目标。这是 一个神奇的可量化的计划,因此,每个星期我都可以检测到距离我的终极目标还有多远。
但是如何界定你是否成为了“足够优秀的程序员”呢?一言蔽之,难以界定。这个目标从一开始就太主观,太模糊,太简单,无法量化。那么我们能找到能量化的东西吗?
我们都有过一些提高我们技能的经验。我们可能曾经学过一门开启我们思路的新语言。我们也可能曾经有过一套完美的设计方案,但直到最终投入生产时才发 现它漏洞百出,但我们因此而成长。有一些经验增长你的技能,有一些让你遇见反模式(注:反模式是指软件开发中经常被用到的但效率不高的模式。),并让你认 知它们为什么是反模式。正是这些经验给你上了课,影响了你的思维模式,改变了你解决问题的方法,最终改善了你的设计。而你是否获得了某种经验,这是显而易 见的。把经验当做是我们的收获或许很有趣。
所以,虽然这需要付出时间,但我现在学会了适应成为“一个真正优秀的程序员”这一目标的不可量化性。如果一个程序员依靠经验取得了某些进展,那么我们就能有一个清晰的路线图来实现“成为真正优秀的程序员”这一终极目标。我想这个路线图应该是这样的:
1.确定哪些技能能够帮助程序员进步
2.着重积累某一个技能的经验
3.直到这个技能完全掌握(成功攻关!)
4.反复思考这个技能,直到融会贯通[A]
5.重新回到第二步,选择一项新的技能
如何更好的开始第一步呢?下面列出了一些编程目标,我粗略的分了一下类。[B]我会在本文的结尾和你一起讨论下想法。
编程目标
学习不同的编程语言范例
1.用汇编语言写一个应用
2.用函数式语言写一个应用
3.用面向对象语言写一个应用
4.用基于原型的语言写一个应用
5.用逻辑编程语言写一个应用
6.用Actor模型写一个应用
7.用Forth语言写一个应用[C]
扩宽对我们开发时使用的基本组件的了解:
1.写一个网络客户端(如HTTP, FTP客户端)
2.写一个设备驱动程序
3.写一个B叉树数据库
4.改进一个现有的库包,来获得更好的用户体验
5.写一个提供插件模型的应用或框架
6.写一个测试框架
7.写一个程序语言
更上一层楼:不断的练习,积累
1.完成五个code katas (Kata是来自日本武术的概念,通过不断的重复和练习来提高技艺)
2.用Koan编程来学习一种你想学的语言
3.参加编程进修课程
4.阅读SICP,完成所有的练习
编写程序并开源:
1.为开源项目贡献力量
2.让别人接受你的补丁
3.获得一个重要的开源项目的提交权限
4.发布一个开源项目
5.优化一个开源项目的代码,详细记录并分享出来
通过教导别人来提高自己[D]
1.做一个绘声绘色的演讲
2.在一个本地用户组面前演讲
3.在一个会议上演讲
4.开设一个训练课程
5.发布一个教程
6.发布一个开源项目的有建设性代码审核
7.写一本有关编程的书
关于这些目标
现在让我们来多说一点。注意这些目标都是可量化的。每一个都有个布尔值:你要么完成了,要么没有。例如,虽然很难界定你是否掌握了一门函数式语言, 但是非常容易确定你是否用函数式语言写了一个应用。后者是可观测的,可量化的,布尔值。以上所有的目标都具有这一特性──可量化性。
无可否认,这个可量化性并非无懈可击。就拿在一个会议上进行演讲来说,你当然可以做一个很烂的演讲,然后还可以拍拍胸脯说你实现了这个目标。不过既 然你是我这篇博客的读者,我假设你想成为一个优秀的程序员,你是一个对自身要求很高的人,不会是仅仅完成了某个任务就沾沾自喜的人。
既然我们在讨论改善,那么你对这份列表有什么改进意见呢?
这个列表作为GitHub的有效依据,你们可以随意fork并添加更多的成绩。(确保它们是可量化的。)
或者fork之后,你可以划分出你已经取得的成绩。你还可以为你正在努力的目标做上标记。(可以参考Justin Blake, Pierre Chapuis, Yann Esposito的分支)
你也可以写评论,什么经验让你变得更为优秀,以及你希望下一步实现什么目标。
注释
[A]不得不强调下第四步。想要更出色的实现目标,你必须在你进行下一步之前停下来回想一下,问问自己到底学到了什么。花些时间写下些想法,更好的做法是,和他人分享,与其他完成同样任务的人作个对比,看看你的学习效果。
[B]在coderwall.com这个网站,你可以更详细了解以目标为驱动的学习方法。
[C]Forth本身就是一个语言范例。
[D]我想起Paulo Freire 的一句名言:“传授知识本身就是在学习传授知识的艺术。”
发表评论
-
如何保存想要的网页内容
2011-11-18 21:55 1026保存网页,大家的第 ... -
网络编辑:我们不做“无冕贼王”
2011-11-08 19:00 756他们是这样一群人,国家给他们定性为技术工,他们自称为网络新贵; ... -
网站架构(页面静态化,图片服务器分离,负载均衡)方案全解析
2011-10-28 01:22 6381、HTML静态化其实大家都知 道,效率最高、消耗最小的 ... -
我的互联网信仰
2011-10-11 22:46 791【摘要:互联网 ... -
致年轻开发人员的一封信
2011-09-23 01:40 807我收到了很多年轻开发 ... -
更改Apache默认起始(索引)页面:DirectoryIndex
2011-09-17 03:10 2720Apache默认索引页面是index.html,修改成其他文件 ... -
五个月,一万IP的网站是如何炼成的?
2011-09-14 21:43 813题前话:我这个是针对门户资讯网站来讲的,其他企业站之类的可以参 ... -
yGGLE:不用编程就能建立自己的网站
2011-09-14 09:42 823无需编程就能建立自己的网站,这对于很多人来说是难以想象的,然而 ... -
马云:就是要让没有危机感的大企业睡不着
2011-09-10 21:05 677腾讯科技讯(赵楠) ... -
教你快速了解Discuz!程序文件功能,方便修改文件
2011-09-08 16:18 1329相信有不少人热衷于基 ... -
网页设计师的字体替换方法指南
2011-09-06 05:11 896写在这篇文章之前: ... -
IIS绑定域名详细教程(图)
2011-09-05 15:04 1482一、IIS的添加 请进入“控制面板”,依 ... -
中国第一代程序员列传
2011-08-27 05:15 626注:来自《中国经济 ... -
我的稻田
2011-08-25 17:47 648(偶尔有感,赋诗一首) 我的稻田躺在盛夏的腹 ... -
学程序的感受
2011-08-23 22:39 639有时候想想自己学习编程者半年来,倒 ... -
团购运营真谛
2011-08-19 16:20 635日发觉网络团战天下 ... -
老鼠老鼠的二进制编码
2011-08-19 00:20 779有 1000 个一模一样的瓶子,其中有 999 瓶是普通的 ... -
网站百度快照更新
2011-08-19 00:18 929大家都知道做网络推广,特别是企业站推广,如果能在相关的关键字在 ...
相关推荐
"成为优秀程序员的 101 个技巧" 本资源为程序员提供了 101 条实用的技巧,从搜索问题答案到编写有用的注释,从承诺不足到超额交付,从寻找导师到成为导师,从适当命名变量到删除不用的代码,从学习阅读代码到建立...
一个优秀的 Web 程序员还需要考虑用户量、访问速度、内存消耗等问题,以及数据库连接池和事务机制的实现。 再次,让我们来讨论一下组件技术。组件技术是现在的 Web 应用推动了发展的技术之一。从老式的静态库、动态...
描述中提到,当程序员面临困惑时,有两个主要选择:一是成为工作环境中最优秀的人,二是通过跳槽寻求更高的挑战。 在程序员的职业发展中,不断提升个人技能是至关重要的。在小环境中,找到技术顶尖的人物作为榜样,...
如果一个面试者一直在大公司负责一个小模块的开发维护,那么基本可以判断他不具备独立或作为主要开发者承担一个项目的能力,只适合在另一家大公司做类似的事情。对于门槛较高需要长期技术积累的职位,相关经验更显得...
在IT行业中,成为一名优秀的程序员不仅仅是掌握技术那么简单,更重要的是具备一定的基本素质。本文从一名程序员的角度出发,分享了对于“程序员”这一职业的理解和个人感悟,并提出了几个重要的基本素质:认真负责、...
在这个行业中,程序员的梦想各不相同,但许多人内心深处都有一个共同的目标:成为中国的比尔·盖茨。这种梦想不仅仅是对财富和个人成就的追求,更是一种对自己技术能力和社会影响力的渴望。 **理解程序员的角色:**...
Linux不单是一个操作系统,它还是一个程序员的工具箱,里面装满了你可以学习和使用的工具。学习Linux将帮助你更好地理解计算机是如何工作的。 版本控制是你编程生涯中不可或缺的一部分。不要使用复制粘贴来保存你的...
一个小时的时间足以完成这些基础题目,但对候选人来说,充分准备至关重要。 接下来是技术面试,环境可能并不正式,可能在一个堆满杂物的小房间进行。面试官通常由公司的主管或经理组成,他们将轮流对候选人进行提问...
"程序员面试如何介绍自己优缺点" 关于优点 在介绍自己优点时,需要注意...2. 需要把面试想象成为一个正常的聊天。 3. 需要事先花足够的时间思考、计划和准备。 在面试中,需要自信、真实和准备充分,才能取得成功。
本文档是一本关于程序员面试的详细指南,涵盖了从面试准备到面试技巧,从简历制作到面试后注意事项的各个方面。在这里,我们将详细说明各章节的知识点。 一、如何准备面试:强调了面试前的准备工作,包括了解面试...
面试题15:一个参数可以既是const又是volatile吗 面试题16:一个指针可以是volatile吗 第5章 引用和指针 5.1 引用 面试题1:什么是引用 面试题2:常引用有什么作用 面试题3:流操作符重载为什么返回引用 5.2 指针 ...
因此,不断学习和跟进最新技术趋势,是成为一名优秀Java程序员的关键。 总结,Java程序员应熟悉面向对象编程、异常处理、集合框架、IO流、多线程、反射、JVM原理等核心概念。通过学习和实践,结合提供的面试题集,...
综上所述,C++编程规范、经典编程思想和模板是成为优秀C++程序员的基石。通过深入理解和实践这些知识,你可以不断提升编程技巧,写出更高效、优雅的代码。这份"经典老程序员C++心得.pptx"文件,无疑是你进一步学习和...
在IT行业中,成为一名优秀的程序员不仅需要扎实的技术基础,还需要具备良好的职业素养和持续学习的习惯。在《第2章 做好程序员》中,我们深入探讨了如何在编程世界里不断提升自我,成为一名卓越的开发者。 首先,让...
在我上一篇随笔中,发表了一些感慨,放着好好的程序员不做,转行做了销售,没想到,有好几个朋友给我留言,讨论怎么转行做销售。这里还是谈谈我自己的想法,也想向一些做的比较成功的前辈讨教一些经验。 我觉得...
在当今这个技术迅猛发展的时代,IT行业已经成为了一个充满机遇和挑战的领域。无论是应届毕业生还是寻求职位转变的职场人士,都面临着一个共同的考验——面试。在众多面试准备材料中,《程序员面试金典 第5版》...
作为一名JAVA程序员,编程学习之路是充满挑战且...每一个领域都有其深度和广度,持续学习和实践是不断提升自己编程能力的关键。只有深入理解这些基础知识,才能在JAVA的世界里游刃有余,创造出更加优秀和高效的应用。
最后,领导力不仅限于管理层,每一个程序员都可能成为团队的领导者。无论是在小型项目中担任负责人,还是在大型项目中推动某一模块的进展,展现出决策力和影响力都是重要的。通过提升领导力,程序员可以更好地影响...
《高级程序员编译原理》是一本面向有一定编程基础并希望...这本书对于想要提升到高级程序员水平的人来说,无疑是一个“好东东”,它能够帮助你深入理解计算机的工作方式,提升编程技能,让你在解决问题时更加得心应手。