一个优秀的程序员如何能练就成一个卓越的程序员?
先等等,暂时不谈卓越,先谈谈如何成为一个优秀的程序员。
从第一步到第N步并没有明确的路线图。事实上,第N步到底是什么还不确定。就像逻辑型思维的开发者一样,缺乏明确的目标会让从入门到精通的道路变得异常崎岖。
过去的几年中,我花了不少时间来思索这个问题。我该如何从一名能力尚可的程序员修炼成一个真正优秀的程序员呢?
成功是什么?
当我对成功有清晰的目标、量化的标准的时候,我就能发挥我的最大潜力。比如,我想实现5分钟跑完一英里这个目标。好吧。这个路程很容易测量,成功的界限分明。我很容易知道跑一英里需要多久,网上也到处都是提高跑步速度的建议和训练计划。我可以选择一个计划并付诸努力,我深信我最终能够实现目标。这是一个神奇的可量化的计划,因此,每个星期我都可以检测到距离我的终极目标还有多远。
但是如何界定你是否成为了“足够优秀的程序员”呢?一言蔽之,难以界定。这个目标从一开始就太主观,太模糊,太简单,无法量化。那么我们能找到能量化的东西吗?
我们都有过一些提高我们技能的经验。我们可能曾经学过一门开启我们思路的新语言。我们也可能曾经有过一套完美的设计方案,但直到最终投入生产时才发现它漏洞百出,但我们因此而成长。有一些经验增长你的技能,有一些让你遇见反模式(注:反模式是指软件开发中经常被用到的但效率不高的模式。),并让你认知它们为什么是反模式。正是这些经验给你上了课,影响了你的思维模式,改变了你解决问题的方法,最终改善了你的设计。而你是否获得了某种经验,这是显而易见的。把经验当做是我们的收获或许很有趣。
所以,虽然这需要付出时间,但我现在学会了适应成为“一个真正优秀的程序员”这一目标的不可量化性。如果一个程序员依靠经验取得了某些进展,那么我们就能有一个清晰的路线图来实现“成为真正优秀的程序员”这一终极目标。我想这个路线图应该是这样的:
1.确定哪些技能能够帮助程序员进步
2.着重积累某一个技能的经验
3.直到这个技能完全掌握(成功攻关!)
4.反复思考这个技能,直到融会贯通[A]
5.重新回到第二步,选择一项新的技能
如何更好的开始第一步呢?下面列出了一些编程目标,我粗略的分了一下类。[B]我会在本文的结尾和你一起讨论下想法。
编程目标
学习不同的编程语言范例
用汇编语言写一个应用
用函数式语言写一个应用
用面向对象语言写一个应用
用基于原型的语言写一个应用
用逻辑编程语言写一个应用
用Actor模型写一个应用
用Forth语言写一个应用[C]
扩宽对我们开发时使用的基本组件的了解:
写一个网络客户端(如HTTP, FTP客户端)
写一个设备驱动程序
写一个B叉树数据库
改进一个现有的库包,来获得更好的用户体验
写一个提供插件模型的应用或框架
写一个测试框架
写一个程序语言
更上一层楼:不断的练习,积累
完成五个code katas (Kata是来自日本武术的概念,通过不断的重复和练习来提高技艺)
用Koan编程来学习一种你想学的语言
参加编程进修课程
阅读SICP,完成所有的练习
编写程序并开源:
为开源项目贡献力量
让别人接受你的补丁
获得一个重要的开源项目的提交权限
发布一个开源项目
优化一个开源项目的代码,详细记录并分享出来
通过教导别人来提高自己[D]
做一个绘声绘色的演讲
在一个本地用户组面前演讲
在一个会议上演讲
开设一个训练课程
发布一个教程
发布一个开源项目的有建设性代码审核
写一本有关编程的书
关于这些目标
现在让我们来多说一点。注意这些目标都是可量化的。每一个都有个布尔值:你要么完成了,要么没有。例如,虽然很难界定你是否掌握了一门函数式语言,但是非常容易确定你是否用函数式语言写了一个应用。后者是可观测的,可量化的,布尔值。以上所有的目标都具有这一特性──可量化性。
无可否认,这个可量化性并非无懈可击。就拿在一个会议上进行演讲来说,你当然可以做一个很烂的演讲,然后还可以拍拍胸脯说你实现了这个目标。不过既然你是我这篇博客的读者,我假设你想成为一个优秀的程序员,你是一个对自身要求很高的人,不会是仅仅完成了某个任务就沾沾自喜的人。
既然我们在讨论改善,那么你对这份列表有什么改进意见呢?
这个列表作为GitHub的有效依据,你们可以随意fork并添加更多的成绩。(确保它们是可量化的。)
或者fork之后,你可以划分出你已经取得的成绩。你还可以为你正在努力的目标做上标记。(可以参考Justin Blake, Pierre Chapuis, Yann Esposito的分支)
你也可以写评论,什么经验让你变得更为优秀,以及你希望下一步实现什么目标。
注释
[A]不得不强调下第四步。想要更出色的实现目标,你必须在你进行下一步之前停下来回想一下,问问自己到底学到了什么。花些时间写下些想法,更好的做法是,和他人分享,与其他完成同样任务的人作个对比,看看你的学习效果。
[B]在coderwall.com这个网站,你可以更详细了解以目标为驱动的学习方法。
[C]Forth本身就是一个语言范例。
[D]我想起Paulo Freire 的一句名言:“传授知识本身就是在学习传授知识的艺术...”
-------------------------------------------------------------------
译文出处:伯乐在线 - 职场博客 - 程序员
译文链接:http://www.jobbole.com/entry.php/1420
原文:Jason Rudolph 翻译:敏捷翻译 - 唐小娟
分享到:
相关推荐
### 如何提高自己的编程能力 在信息技术飞速发展的今天,编程技能成为了许多职业和个人发展的重要组成部分。对于初学者而言,掌握编程不仅仅是为了找到一份好工作,更是为了打开一扇通往无限可能的大门。本文将围绕...
Java 开发人员:对于希望通过实际项目提升 Java 编程技能,尤其是在企业级应用开发方面有所追求的程序员,本资源是绝佳的实战教材。 - 计算机相关专业学生:可作为课程设计、毕业设计的参考,助力学生巩固理论知识,...
使用场景及目标:适用于工业自动化项目的设计与实施,帮助工程师掌握复杂系统的编程技巧,提高项目开发效率和可靠性。主要目标是通过实际案例的学习,提升工程师解决实际问题的能力。 其他说明:文章不仅提供了详细...
内容概要:本文详细介绍了Altair Compose这款由Altair公司开发的高级工程计算与编程环境。文章首先回顾了Altair Compose的发展历程,从早期的Altair Embed逐步演变为如今集成多种先进技术的工具。其主要功能包括多...
适合人群:具备一定Java编程基础,尤其是对Java 8新特性感兴趣的开发人员,以及希望提高代码可读性和性能的研发人员。 使用场景及目标:①处理集合和数组数据时,简化代码并提高可读性;②利用多核处理器的计算能力...
### IA-32架构软件开发人员手册第3卷:系统编程指南知识点概览 #### 一、手册概览 **标题:** IA-32架构软件开发人员手册第3卷:系统编程指南(中文版) **描述:** 本手册为Intel官方发布的第三版系统编程指南,...
《解析极限编程:拥抱变化(原书第2版)》是软件开发领域的一部经典著作,作者通过深入探讨极限编程(Extreme Programming, XP)这一敏捷开发方法论,为我们揭示了如何在快速变化的需求环境中,有效地管理和开发软件...
适合人群:适用于想要学习Windows应用程序开发的初学者以及希望深入了解Delphi编程特性和技巧的开发人员。 使用场景及目标:读者可以通过跟随本教程逐步实践,学习如何使用Delphi高效地开发Windows应用程序,掌握...
使用场景及目标:适用于希望提升代码质量、增强系统灵活性和可维护性的开发人员。通过学习接口化编程,能够更好地应对大型项目的挑战,实现高效并行开发,降低后期维护成本。 其他说明:文章不仅讲解了理论知识,还...
内容概要:本文介绍了一款面向工业视觉应用的拖拽式编程框架,旨在简化视觉检测系统的开发和部署。该框架将复杂的视觉处理步骤封装为可视化的积木块,用户可以通过简单的拖拽操作完成整个检测流程的搭建。框架不仅...
适合人群:对 Swift 编程语言感兴趣的初学者,以及希望深入了解 iOS 和 macOS 开发的技术人员。; 使用场景及目标:①帮助开发者掌握 Swift 编程语言的核心概念和语法;②为 iOS 和 macOS 开发打下坚实的基础;③通过...
内容概要:本文介绍了一款基于LabVIEW和NI Vision模块的通用免编程视觉框架,旨在提高视觉项目的开发效率。该框架提供了多种便捷的功能,如动态菜单生成、TCP/IP通讯自定义、九点标定、相机管理和可视化流程编排。...
使用场景及目标:适用于嵌入式系统开发的教学和自学场景,主要目标是理解TCP/IP协议栈的工作原理,掌握嵌入式平台上的网络编程技术,提高调试和问题解决能力。 其他说明:实验内容详细记录了每个任务的具体实现步骤...
2. **编程实践**:包含了多种常见的编程题目,覆盖算子开发中的实际应用场景,让学习者通过练习提高编程能力。 3. **调试与优化**:涉及C算子调试技巧及性能优化的相关题目,帮助学习者掌握在实际开发中可能遇到的...
适合人群:PLC程序员、自动化工程师、工业控制系统开发人员。 使用场景及目标:适用于希望提高PLC编程技能的专业人士,特别是在三菱R系列PLC平台上工作的技术人员。目标是掌握ST语言编程技巧,学会使用结构体和函数...
- **跨职能组成**:确保每个小组内包含不同专业背景的人才,比如开发人员、测试人员、UI设计师等。 - **共同目标导向**:明确团队使命和愿景,使每个人都能朝着相同方向努力。 - **开放沟通环境**:鼓励成员之间坦诚...
### 编程修养:软件开发人员的个人修养 在当今高度依赖信息技术的社会中,软件开发已成为推动科技进步的关键力量之一。而作为软件开发的核心——程序员的角色显得尤为重要。一名优秀的程序员不仅需要掌握扎实的技术...
③通过实战演练和进阶学习,提高物联网设备的网络通信能力,如使用SAL及socket编程实现设备与服务器之间的TCP通信。 其他说明:本文不仅提供了理论知识,还结合具体代码示例和实际操作步骤,帮助读者更好地理解和...
在项目实战环节,开发了简易爬虫和数据分析仪表盘,进一步提升了编程思维和解决问题的能力。最后汇总了丰富的Python学习资源,包括学习网站、书籍、在线课程和开源代码托管平台等,为读者提供全面的学习支持。 适合...
使用场景及目标:通过本课程的学习,开发人员能够熟练掌握Linux系统架构的理解,掌握利用系统调用来提高应用程序的功能,学会如何通过创建进程和管理线程的方式构建并发程序,并能进行有效的性能评估和系统调试。...