随着软件技术不断发展,从事软件行业的人员日渐增多。你发现身边多了这么一群人,他们有的西装革履,有的穿着随意,有的不苟言笑,有的风趣幽默,有的博学多才,有的质朴木讷,唯一的共同点是,他们的名片上都印着“程序员”这样的字。

现在大街上所谓的“程序员”是如此之多,他们中有真正的高手,也有只会写几行蹩脚代码的滥竽充数者。在这里我无意贬低程序员同僚,只是想通过我的经验说明什么样的人才是真正的程序员。

程序员是怎样炼成的?

一些人认为,掌握一门计算机语言,会编写几行代码并且能够让这些代码在计算机上运行起来的人,就可以称为程序员。事实上,软件行业里,要成为真正意义上的程序员,对得起programmer这个称号,还是要花费一番功夫的。

在成为程序员的道路上,要经历四个坎坷,让我们用四个境界来标明他们。

第一境界,就是前面所说的,掌握一门或者几门编程语言,会模仿例子来实现程序代码,并且让代码在计算机系统中运行起来。达到这个境界人,还不能算是真正意义上的程序员,而仅仅是掌握了一种或者几种工具的工匠,他们中的熟练者能够快速模仿现成的例子,以实现自己或者用户需要的软件模块。

非常遗憾,许多 “程序员”仅仅达到第一个境界,他们根据手中的文档和参考资料,通过“模仿”来完成工作,他们实现的程序只是无数个前人已经实现过的代码的翻版组合,虽然其中的熟练者以快速高效率完成任务著称,然而他们的作品中毫无新意,日复一日地重复代码,罕有任何可以称之为“创新”的东西。

第一境界的特质是对语言工具的掌握,在这个境界的高手,会强调自己对语言如何如何熟练,因此这个境界可以用“知器”来表示。

第二境界里,我们要学习的是分解问题和推理的技巧,学会用逻辑的语言来精确地表达一个命题。在这个境界里,软件工作者掌握的是一种分析具体事物的方法,他们不再一味地模仿,而是开始对一个又一个具体问题思考并尝试用自己的方法来更好地解决。

在这个层次里的“程序员”开始关注解决问题的思路,并且关注分析和推理的数学技巧,他们中的优秀者熟知各种算法善用各种各样的命题推理来分析并解决问题。他们同样善于借鉴前人的例子,但是往往能够根据问题的特点进行有效的改进,并且能够在尝试改进的过程中得到创新的成就感和新的经验。在这个层次里的人,对语言工具的认识比第一境界更加深刻,他们是真正知道如何利用手中语言工具的特点更好地解决问题的人。但是他们并不会强调自己对于语言如何熟悉,也不再热衷于宣扬掌握如何如何多的语言,在他们眼里,语言仅仅是一种工具而已,真正重要的是分析问题的方法。

第二境界的特质是对具体问题的分析,在这个境界的高手,往往善于从具体问题中分析出合理有效的解决方法。因此这个境界用“格物”来表示。

第二境界里有真正对如何用程序来解决问题经验丰富的人,这些人能够出色地胜任编码工作,因此我们称他们为Coder,或者初级程序员。

第三境界里,我们要学习的是抽象思维和找出事物表象后面的规律。在这个境界里,软件工作者不再针对一件一件具体的事物来分析,而是尝试理解事物表象下的本质。在这个层次里的人,开始关注事物的共性,并且逐渐掌握归纳和总结的方法。“模式”开始出现在他们的头脑里。

“设计模式”是软件领域的“三十六计”,是经过抽象总结而归纳出来的真正的思想精华。第三个境界的软件工作者开始接触并且理解“模式”,学会灵活运用模式和抽象思维来解决“某一类”问题。与表象相比,他们更关注的事物的本质,他们的代码里充满思想和对事物规律的深刻认识,他们熟知各种类型问题的特点和解决技巧。对事物本质规律的认识使他们不再依赖于语言工具,任何一种熟悉或者陌生的程序设计语言在他们的手中都能够发挥到极致,完美地解决问题。

第三境界的特质是对事物本质规律的认识,在这个境界的高手,往往能够快速地抽象出问题的本质,从而用最合适的方法来解决问题。这个境界我用“明理”来表示。

达到第三境界的程序员,是天生的设计师,他们对问题本质的领悟能力帮助他们用优美简洁代码来解决问题,他们的代码中充满设计思想。他们是真正能够享受到程序设计的艺术魅力并且充满成就感的一群人。

第三境界里的程序员真正当得起Programmer称号,他们在外人眼里看起来是天生的设计师、艺术家和技术牛人,他们是为软件创作而生的。

前面说到了三个境界,层层深入,并且第三个境界的程序员已经当之无愧地成为软件领域的专家领袖,然而,“程序员”是否只有以上三个境界了呢?答案是否定的。在这三个境界之上,依然存在有——

第四个境界

第三境界程序员中的极优秀者,并不满足于专家的地位和高薪,他们开始向第四境界艰难地前进。第四境界是程序设计领域的最高境界,要达到这个境界,只需要掌握一样东西,然而这个东西并不是寻常之物,而是许多人穷尽一生也无法得到的,这个世界最为深邃的秘密。

自古以来,有这样一群僧人,他们遵守戒律,不吃肉,不喝酒,整日诵经念佛,而与其他和尚不同的是,他们往往几十年坐着不动,甚至有的鞭打折磨自己的身体,痛苦不堪却依然故我。

有这样一群习武者,经过多年磨练,武艺已十分高强,但他们却更为努力地练习,坚持不辍。

有这样一群读书人,他们有的已经学富五车,甚至功成名就,却依然日夜苦读,不论寒暑。

他们并不是精神错乱,平白无故给自己找麻烦的白痴,如此苦心苦行,只是为了寻找一样东西。

传说这个世界上存在着一种神奇的东西,它无影无形,却又无处不在,轻若无物,却又重如泰山,如果能够获知这样东西,就能够了解这个世界上的所有的奥秘,看透所有伪装,通晓所有知识,天下万物皆可归于掌握!

这并不是传说,而是客观存在的事实,这样的东西,叫做“道”。

静寂虚无中有奥秘,不静不动,乃程序之源,无以名之,故曰:程序设计之道。若道至大,则操作系统至大;若操作系统至大,编译程序亦然;若编译程序至大,应用程序亦复如是。是以用者大悦,世之和谐存焉。 ——杰弗瑞.詹姆士

所谓道,是天下所有规律的总和,是最根本的法则,只要能够了解道,就可以明了世间所有的一切。

掌握了“道”的程序员,才是真正的程序设计大师,能够创作出流芳百世的作品。

然而怎样才能“悟道”,我并不知道,也无法描述,因为“道”实在不是一个能够轻易得到和理解的东西。

对第四境界的程序员来说,“思想”已经不再是很重要的东西,因为他们对程序本质的理解已经超越了问题本身,在他们的代码里,有的只是自然,现实和虚幻的边界都已经模糊,一个完美自治的系统在刹那间诞生,却仿佛从亘古时刻起便存在着、运动着,从简单而质朴的规律中涵盖着世间万物的本质。因此,这个境界,我称之为“成道”。

学习JavaScript不应该游离于程序员之外,JavaScript程序员也是真正的程序员,因此摆在我们面前的道路也是从“知器”、“格物”、“明理”到“成道”的艰难过程,像程序员一样地思考,扎扎实实地向着更高的层次迈进,才是正确的学习方法。只要坚持不懈,迟早有一天,JavaScript会在你的手中大放异彩。

吝惜你的代码
代码对于程序员来说就像剑客手中的剑。对于高手来说,剑的长短不是决定因素,剑招的犀利才是胜负的关键。相对来说越短的剑,破绽反而越少。

要知道,你写的每段代码,在将来都有可能需要花费精力去维护,代码越多,将来需要维护的工作量就会越大。

程序大师如是说:“虽然程序只有三行,但总有需要维护的一天。”聪明的程序员总是用简洁的代码来证明自己的才华,通常情况下,优秀的代码总是比较短的那一段。

吝惜代码的另一个含义是“不要轻易动手编写代码”。真正优秀的程序员永远在深思熟虑之后才动手写代码,因为他们知道,要在实际动手之前避开可能的陷阱,尽量让自己的代码不要有破绽。

“入界宜缓”,不仅仅是正确的棋理,也是程序设计中的真理,甚至是充满人生智慧的格言,它是“道”的一部分。

程序大师深思一天,只写三行代码,而一年积累下来的千行代码却成为整个软件时代的灵魂。一个百万行代码的大型程序将因为它而成为不朽的经典。

本书中的例子秉承这样的原则——用最少的代码做最多的事情。相信在阅读本书后续章节的过程中你将渐渐理解和领悟其中的奥妙。

学会在环境中调试
虽然大师可以不依赖于环境让思维自由飞翔,可是在“求道”的路上,调试环境却能为你扫除许多障碍。

除非你确信自己可以一遍写出正确无误的代码来,否则你就需要一个强大调试工作的帮助。

我的一些同事曾经因为缺乏对运行环境和调试工具的认识,而在一些小障碍面前显得束手无策,这对于项目组来说实在不是一个好消息。在软件领域,你可以犯错误,但是你不能在错误面前不知所措,或者选择逃避。如果你自身的能力有限,请用好的调试工具来武装自己,它们的的确确可以迅速地帮助你定位问题的所在。

Ø 在本书的第3章里,将详细地讨论JavaScript调试技巧与调试工具。

警惕小缺陷
许多人知道JavaScript能做什么,却对它的缺点视而不见。相信通过前面章节的叙述,已经给大家暗示了一个道理,那就是——JavaScript不是万能的,它有很多缺陷,一定要谨慎地使用它。

用JavaScript进行浮点数计算很容易造成精度问题;用JavaScript操作DOM,内存泄露永远存在;各个版本的浏览器下,总有一些JavaScript代码行为诡异;而某些场合下JavaScript性能慢到无法忍受……即使抛却这些缺陷,JavaScript的大量使用如果不够谨慎,失控的代码依然很容易使你泥足深陷无法自拔。

我和我的一些同事经历过那样刻骨铭心的痛,系统的问题诡异得无法捉摸,大量随机出现的问题像张牙舞爪的魔鬼,恶作剧般的手法折腾得你筋疲力尽,你却依然对摆在面前一团乱麻似的脚本无可奈何。最终你或许赌气地说,我这辈子再也不用JavaScript了,可是客户还等着你实现他们的需求,于是你摇摇头强打精神去重新一遍一遍地梳理那些凌乱的代码。

小心你手中的魔鬼,学会正确地控制它们,切记不要放任任何一个哪怕是无伤大雅的小缺陷在你一段代码中,否则你总有一天将会受到惩罚。

思考先于实践
前面已经说过,在经过充分思考之前,不要轻易动手写代码。不管是学习还是工作,一味模仿他人的作品或者书中的例子,都算不上是一个好习惯。

即使本书是面向实战的,要透彻理解JavaScript的本质,还是要建立在深入理解和分析的基础上。在每一个章节里,概览范例,重视细节,深入领悟精髓,才会得到最大的收获。

真正掌握JavaScript的标志是要能够写出属于自己的代码,而这,显然是要先思考而后动手才能做到的。

急于动手,是许多投身程序设计领域的爱好者们的一个通病,也往往是职业和业余的分别。也许一个效果的实现能够带给你惊喜和成就感,然而你必须知道,你在这里,绝对不是为了仅仅实现这一个小小的效果,你必须确保你的代码现在不会出问题,将来也不会出问题,在你手里不会出问题,在别人手里也不会出问题。而这一切,都要求你经过充分的思考。

软件过程包括分析、设计、实现和验证等若干个阶段,动手去写,仅仅是其中很小的一部分工作,而为了保证这部分工作的出色品质,往往要在之前投入大量精力去思考。就像要创作一件优秀的艺术品,必须要经过严谨的构思一样。

在用你的键盘敲出每一行代码前,请三思。优秀的代码是思想的结晶,蹩脚的代码才是呆板的模仿和毫无章法的拼凑。

时刻回头
即使是伟大的贤哲,也无法完全预知未来。

就算你确信目前的代码无懈可击,你也不可能保证它们在将来永远能够不加改变地正常工作。在软件实现的过程中,要习惯时刻回头完善你之前所创作的代码。如果你觉得一个接口将来有可能变化,你就去完善它,不要吝惜走回头路,这一小段回头路将令你避免将来走入一条歧路。

许多开发人员忽视维护系统原有结构的重要性,他们在实现新功能时,宁愿自己编写一个模块而不愿意去了解和完善原有的模块,这样做的结果使得每个开发人员的成果彼此孤立,而且系统出现大量功能相近的冗余模块,严重地影响了系统的完整性和可重用性。

不愿意回头看的人永远也不会真正掌握未来。

任何一个努力的过程总是循序渐进的,发现过去的不完善是好事情,这意味着进步。这个时候,学会回过头去,稍微回顾和改变一下过去的成果,你会有许多新的收获。

本文转自:http://www.cnblogs.com/nianshi/archive/2008/11/28/1343219.html

优秀程序员是怎样炼成的?相关推荐

  1. 伟大的程序员是怎样炼成的?

    自己保存起来FROM :http://news.cnblogs.com/n/64712/ 近几周,一份反映 Netflix 公司企业文化的报告在网上广为流传.这份报告里列举了很多Netflix公司里令 ...

  2. 蓝筹程序员是如何炼成的?

    "蓝筹"一词恐怕很多人还不知道它的含义,我先来和大家普及一下知识,它最重要的概念指的是"长远来看越来越值钱"的意思.作为一名程序员,我想你们都想通过实际行动让自 ...

  3. 程序员是这样炼成的(2)-选择成熟的柿子还是生柿子

    今天做项目加班到了10点,下班后在office里面编码的效率要比平日高很 多. 昨天我们说了要把职业当做生意和投资, 今天就跟大家分享投资的方向性问题,前几天我们组一个新来的同事问我:"你觉 ...

  4. 盲人程序员是怎样炼成的

    摘要: 一个星期前,本网站根据劳工部残疾人就业政策办公室(Office of Disability Employment Policy)的报道,编发了一篇文章"通讯手段为所有人提供机会&qu ...

  5. 优秀程序员都会关注的公众号

    程序员的价值绝对不在于技术本身,而在于做出好用且好看程序的能力. 程序员常有,优秀程序员不常有. 成为优秀的程序员是极其困难的,并且这个过程不可能一蹴而就. 你是不是也立志做一名优秀的程序员呢? 据说 ...

  6. 优秀程序员和一般程序员差别在哪?

    摘要:在这个世界上有两种程序员:Day Programmers(白班程序员)和Night Programmers(夜猫子程序员),你知道优秀程序员和一般程序员有哪些差别吗?你又是哪一类型的呢?俗话说不 ...

  7. 如何在面试中发现优秀程序员

    英文原文:Finding awesome developers in programming interviews 我曾在一次面试中要求一个很有经验的嵌入式软件开发人员写出一个反转一段字符串并输出到屏 ...

  8. 丁威: 优秀程序员必备技能之如何高效阅读源码(二更)

    @[toc](丁威: 优秀程序员必备技能之如何高效阅读源码(二更)) 消息中间件 我能熟练使用这个框架/软件/技术就行了, 为什么要看源码?" "平时不用看源码, 看源码太费时间, ...

  9. 03 _ 优秀程序员的六个关键特质

    什么样的程序员才是优秀的程序员呢? 如果去问一个程序员,得到的答案有可能是,"写的一手好代码,做过几个大项目,设计.编程样样不在话下".如果去问程序员的同学,得到的答案有可能是,& ...

最新文章

  1. 游戏AI之初步介绍(0)
  2. 阿里智能对话交互实践与创新
  3. Zuul spring cloud zuul com.netflix.zuul.exception.ZuulException GENERAL解决方案
  4. MSSQL SELECT(刚刚)新插入到表中的那条记录
  5. palm基础----7 获取系统信息
  6. Incorrect column count: expected 1, actual 5,JdbcTemplate queryForList 出错
  7. Sharepoint带自定义属性的FieldType
  8. 磁盘阵列简介---图片说明
  9. 在Facebook做产品是一种什么样的体验?
  10. C语言小游戏——三子棋
  11. html+form+multipartform-data,表单 – 如何处理node.js中的multipart / form-data
  12. 安全终止MFC线程全
  13. 要成为一个 Java 架构师得学习哪些知识以及方法?
  14. ubuntu18.04安装mysql8.0中遇到的问题及解决方法
  15. 大连IT产业解析(1布局篇)
  16. 计算机网络学习笔记一
  17. ​EMNLP 2022 | 预训练语言模型的时空效率优化
  18. Spring:applicationContext.xml的头文件信息
  19. VoiceChatter在VS2005上编译方法
  20. Wait延时及定时查询

热门文章

  1. 基SpringBoot的智能社区警务管理平台
  2. 美团笔试题——淘汰分数
  3. LeetCode1036. 逃离大迷宫(BFS)
  4. 精确的小数类(totally by wzq, after the java class of zjh, nuc)
  5. 在CRM系统中如何获取联系人的信息?
  6. 计算机二级c语言.考试题库及答案,计算机等级考试题库,二级C语言试题及答案...
  7. 利用广播星历计算卫星在ECEF下的坐标
  8. WakeLock finalized while still held:
  9. 知海匠库与学员温馨共度冬至迎平安夜
  10. 数据库SQL入门,这一篇就够了(全文内容两万字)