zoukankan      html  css  js  c++  java
  • 转:如何成为一个优秀的程序员

    如何成为一个优秀的程序员

    导读:本文是由作者Jason Rudolph发表的一篇博文《Programming Achievements: How to Level Up as a Developer》翻译而来。

    文章内容如下:

    一个优秀的程序员如何能练就成一个卓越的程序员?

    先等等,暂时不谈卓越,先谈谈如何成为一个优秀的程序员。

    从第一步到第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的一句名言:“传授知识本身就是在学习传授知识的艺术...”

  • 相关阅读:
    面向接口程序设计思想实践
    Block Chain Learning Notes
    ECMAScript 6.0
    Etcd Learning Notes
    Travis CI Build Continuous Integration
    Markdown Learning Notes
    SPRING MICROSERVICES IN ACTION
    Java Interview Questions Summary
    Node.js Learning Notes
    Apache Thrift Learning Notes
  • 原文地址:https://www.cnblogs.com/kira2will/p/4310547.html
Copyright © 2011-2022 走看看