从下棋想到的, 怎样成为一名大师级软件开发者

编程入门 行业动态 更新时间:2024-10-10 04:28:14

从下棋想到的, 怎样成为一名大师级软件<a href=https://www.elefans.com/category/jswz/34/1769871.html style=开发者"/>

从下棋想到的, 怎样成为一名大师级软件开发者

 怎样成为大师级软件开发者  --Jeff Moser

以下的字母和数字中多少个你可以在20秒以内记住:

  • T, E, X, A, S, O, H, I, O, V, E, R, M, O, N, T, R, H, O, D, E, I, S, L, A, N, D
  • 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41

如果要求你20秒以后把这些字母和数字按顺序叙述给别人听, 你能记住多少个? 以下是被调查的人的数据, 你应该是属于其中的一类:

 

 

如图所示, 第一组的人不需要太多的努力就能记住全部, 而第6组需要很多努力才能记住20%。 而有趣的是, 大部分人可能都属于第2到第5组, 也就是说, 记忆那些字母和数字不是靠纯粹的天赋,而是当时的记忆。

 

为什么会有这样的现象产生?

 

第一组的人并没有一个一个的去记那些字母, 因为如果把那些字母和起来, 刚好是 “TEXAS", "OHIO", "VERMONT" 和 “RHODE ISLAND"(都是美国几个州的名字),而这些州刚好是从大到小的循序排列的。可能有些人更加可以将这几个州和美国总统主要竞选州联系在一起。

 

而那几个数字,细心的人可以看出来,那是从2 到41 中所有的质数。 但第一组的人记忆这些字母的时候, 他们可以这样来储存信息: 

 

"select [letterInWord] From [StateInUpcomingPrimary] order by [StateSize]" 这样的话就有3组信息要记忆。

 

数字的话可以理解成为:"select [Number] from [PrimeNumber] where [Number] <=41", 这样也是三组信息需要记忆, 这样的话第一组的人只有6组信息要记忆,信息量实际上要少于一个电话号码。 所以很容易全部都记住。

 

而第6组的人很可能把那些字母和数字看成随机抽取的信息,或者他们不知道美国有这么几个州, 那么对他们来说,每一个字母和数字就是一组信息,所以当他们记忆这些信息的时候,一般能记住7到8个。从数字上来比较,实际上第6组比第1组的做的好。 因为他们记住的信息实际比第1组得多。只是第1组用了更高效的分组的记忆方式。

 

信息分组

但我们说到那些棋类竞技的大师们, Philp Ross 在他的书中这样写道:

 

"当下一步要走的棋位置很难决定的时候, 一个一般的棋手可能要想半个小时, 试试各种可能的走法在脑子里,这样实际上错过了对后续棋的布局。 然而,大师们一般都是不加思索的走棋。 通过对时间和练习的统计,一个一般的棋手要达到大师的水平, 需要储存大约50000 到100000棋局的信息在大脑中。 一个大师级的棋手,通过观察棋局可以轻易的获取这些信息, 就好象中国人都知道 “床前明月光” 以及接下来的几句诗。有一个理论是所有其他领域的专家水平的人的共识, 那就是10年定律, 这个定律说明,通过10年的在一个特定领域的努力, 才算达到了大师的水平。即便像数学家高斯, 音乐家莫扎特, 都是通过的同等努力, 只是他们起步的较早。

 

评级系统

一般其他领域来说,都有一定的评级系统,像运动和棋类都有世界排名:

 

高尔夫世界排名:

 

 

 

那么软件开发呢? 什么输入到一个评级的系统里而产生程序员的级别? 在软件开发里面这样比较很难, 特别是很多人把失败的开发经验都隐藏了起来。但是还是有一些标准是可以衡量的:

 

1) 需求分析和设计

 

一个一般的情况就是当分离设计的过程(模块化)是通过对系统的文字表述来引导的,这一点实际上是通过设计者或专家们长期的实践经验来实现, 但这种文字表述没有的时候, 设计者们就会从底层开始往上来设计一个系统。 还有一个体现就是, 当要一个设计者向另一个水平一般的程序员推荐一个方法来解决一些设计的问题, 一个水平很高的设计者可能有很多种选择给这位程序员, 然后可能让他选那个最有弹性的设计。而一个一般的设计人员可能会推荐一个很直线的解决方式。

 

2) 编程和程序的理解

 

一般的程序员只是注重一个程序或是一个问题领域中一小块的工作情况而忽视了系统中各部分的联系。 当解决一个系统的错误或问题时,对系统的整体把握显得尤为重要。

 

3) 测试和除错

 

通过数据表明高端的程序设计者们,在除错上花的时间较少,他们的程序错误也较少,相反,他们会花更多的时间去寻找错误,而且,高端程序设计者们都有一个共同的特点,就是对整个系统的理解很透彻, 这样为他们分析和寻找问题提供必要的信息。

 

4) 对知识掌握

 

相对于学生来讲,专业的程序员对知识的理解更加深入和细节化, 比如说一段专业程序员对程序的注解:“这个系统的主要程序没有被很好的分解,逻辑分散在各个角落,更新的方法包含太多的逻辑,控制的方法应该被分解成几个其他的方法。现在的程序让人很难理解”, 如果是学生的注解,可能就没有这么多细节。

 

5) 沟通与合作

 

好的软件设计者往往都体现出非常好的沟通能力, 实际上,很多设计的工作他们都是通过和其他人的沟通来完成。 高端程序员会花很多时间来教其他的组员怎样把领域的问题和需求转换成计算机的程序。 通过数据统计表明, 单个程序员的表现很大程度上和他能不能在15分钟向有经验的程序员讲解他要完成的任务有关。无论是简单还是复杂的任务, 复杂的任务需要的沟通更加频繁。

 

以上的5点我不知道怎样可以把它们变成一个数学公式,然后通过输入一个量而得到程序员的级别。 但是应该没什么关系了, 因为提高其中的任何一项都有一段长路要走。

 

信息分组记忆对编程的影响

对信息的分组到底对我们写程序有多大的影响。我认为是大有好处的, 都看你怎样用高效逻辑来完成。

 

Joel Spolsky 有提到:

 

"一个原来在微软的高端程序员,后来到google去了, 他告诉我, Google在工作和解决问题的时候,都站在了比微软更抽象的水平上来考虑问题, 他们用Bayesian filtering(一种对可能性的计算)就像微软用 if statement."

 

对这段话一种很书面的理解方式就是你只要知道高端的程序,而可以不用管低端的工作情况。信息组应该是像金字塔样的阶级储存状态。一组信息应该是在另一组的基础上来建立。我基本可以保证, Google里面有经验的程序员他们肯定对"if" statement 以及任何低于这个抽象层的知识都理解的很好。在一个“遗漏的抽象世界”里面, 你一般来说是没有选择的,就像 Anders Hejlsberg 所说:“加一个抽象层”,以此来分离问题产生的根源, 开始我也是这样认为的,但后来认识到这种看法是错误的, 合理的抽象分层对信息的分组非常重要, 但是这一点要求程序员们有很坚实的对低端抽象层的理解。分析问题和除错的时候这个显得尤为重要。

 

另一个有效的技巧就是用一些便于理解的名字来帮助解释有用的信息,以下的代码用两种方式来做一个数列的和,但第二种方式明显的更加浅显易懂, 第一种传统的方式:

 

 

第二种方式 "Array Sum Using LINQ":

 

 

第二种方式据说是C#的语言改革的方向, 让程序员更多的专注于什么数据要被处理,而不是怎样去处理这些数据, 从理解上来说,理解第二种方式花的时间可能只有第一种的半还不到。

 

我举以上的这些例子的主要目的就是要说明, 当阅读者阅读代码的时候, 阅读的人能很快抓住作者的代码逻辑的核心, 而不是花很多时间去理解代码的语法, 这样的话阅读者可以快速地在脑中重构作者的逻辑。 我想这种效果就好象学下棋的学生刚开始学那些有名字的开局一样, 当老师提到名字,学生就知道开局的布局了, 而不用一步一步的解释。

 

对雇人的一些想法

我认为当面试新的开发人员的时候, 对一些基础的问题,像 conditional statement, loops, pointers 和 recursion, 开发人员应该很自然的回答, 就像Joel Spolsky 所讲:

 

“如果说基本概念不能不假思索的回答,那么对于大的,复杂的东西就更难抓住了。。。”

 

现在一个一般的商用计算机程序都是相对来说都是比较复杂的, 如果说一般人的大脑每次最多只能应对 "7+2 or 7-2"(From "Code Complete 2") 的不同抽象层, 那么对信息合理的分组和抽象化就是必须的。

 

4个信息理解记忆的能力

如果说要至少记住50000个信息来达到大师的水平,那么这条路要经历四个阶段。 以下更具体的说明这是个阶段:

 

 1. 信息没有理解和储存在大脑中 -- 10年以前, 我完全不知道软件的运行情况, 只是知道鼠标点了会有反应。

 2. 有意识的反应,但没办法做适当的决定。 -- 5 年以前, 我终于知道有关Unicode 和 国际化的概念, 意识到我过去的代码没有考虑到这些问题。但还是不知道应该怎样来处理。

 3. 有意识有能力的反应。 --- 两年以前, 通过FxCop, 我明白在.NET里面怎样来实现正确的字符比较。 但直到最近才知道怎样分解和处理跟本地化相关的字符信息。

 4. 无意识但有能力的反应。 --- 我还没到这一步, 但当我看到代码中出现方法 ".ToLower()" 有一个零的参数在里面, 我会下意识的觉得这样的代码有问题, 但是是基于对过去编码的经验上。

 

信息的获取和记忆是一个长时间的过程, 下面这张图可以大概说明这样一个过程, 纵轴是有意识的努力, 横轴是竞争能力获取:

 

 

从这张图上可以看出如果开始能很专注的学习一样技术和领域的知识,比较容易能得到快速提高。 然而要精通的话,还是需要长时间的努力,而且还有一点就是如果一直在自己知道的领域里面的话,这个过程会更长。

 

读好的书,部落格,或者其他杂志,报纸等,可以帮助提高, 但真正最快的方式是在工作的环境中,从同事身上学习,通过讨论和问问题。 这就是为什么我对同事们对我的代码的评论和复查很重视,因为他们的批评和指正可以让我加速这样一个学习的过程。

 

有希望成为大师吗?

成为一个大师实际上是并不是一个不可能的任务, 但是你要知道如果要50000组信息来达到这个目标, 那么这是需要时间的,很多人有了10年的工作经验,但是还是觉得自己没办法达到大师的水平。 就像你们很多人一样, 我开始玩弄电脑还是在小孩的时候,如果从我编第一个程序开始算的话,我有17年的经验了,还是觉得长路漫漫. 但是不要错解我的话, 我觉得单凭多少年来评论确实是值得商榷的。

 

我自己的问题是我没有像以前一样专注的去学习,但我刚刚才意识到这一点。 John Cloud 总结得很好:

 

“埃利克森主要的发现就是对专家们的成长历程,与其说是天赋不如理解成连续不断的用领域内新的问题来挑战自己, 就好象数学家不断的解答错综复杂的数学问题。 运动员们不断的对新的纪录挑战。 所以说问题永远不会变的容易,如果是变的容易,说明在下滑, 而不是提高。埃利克森叫它“深思熟虑的练习”, 意思就是那种令人感到疲倦的,讨厌的,容易让人退缩的练习”

 

以上可能是最准确的对于“提高”这个词的定义了, 就是一件事情必须明白, 那就是提高不是处在一个容易的环境,还是在一个困难的环境。

 

一条有可能的路

有没有一条路可以不用一周工作80个小时? 有时间给家人和朋友?

 

这是可能的, 但事实是需要专注, 而且必须要意识到可能要25 到30年的时间, 特别是像我一样,没有经历那么多“深思熟虑练习”的人。任何事情要做好需要练习和毅力。 这让我想起在新奥尔良一家餐厅中所看到的:

 

“好的食物是需要时间来准备的。 如果你能等的话, 你才能体会到它的美味。”

 

一本好的书可能有6到7组最好的信息需要知道。 跟周围有着共同兴趣的朋友搞好关系, 如果他们读了一本书, 问问他们读的书的哪些地方他们觉得值得学习,他们期待的哪些东西在书中可以找到。这样方式能促使提高学习的效率。

 

找一些不同兴趣的朋友, 假如说你做的是delphi, 问问那些做python, Ruby 或者Scala的人, 哪些东西他们觉得那些语言很头疼, 然后试着去理解它们, 可能你会发现新的东西。 同样的原因, 用你最喜欢的语言来解决一些问题,并且让你写的代码专业化。

 

不要不耐烦当一个初级的程序员问你什么是“用防御的方式来编码” (Code defensively), 如果说你用了15年来真正理解这个词的意思,很可能其他的人最少也要5年。 通过帮助他们, 你也可以来回味你学到的东西。

 

当你看到一个好的设计或者编码, 问一问作者花了多长时间写的,你可能会觉得惊讶他们告诉你是通过数次的重写和重构。 当初级的程序员问你用了多久写那个代码, 不要隐藏你重写了几次才有现在的设计。因为这样可以让你更加清楚你自己的编码, 很可能对你的未来有好处。

 

如果每天能花15分钟去了解一些你不是很熟悉的领域, 你会提高的更快, 当你决定要不要投入时间去学一些东西, 不要忽视了那些让你很烦,容易掉头发的问题, 因为很可能那些是让你提高更快的方式。

 

一旦你做了决定,让你的学习过程“深思熟虑” 和 “持之以恒”, Philp Ross 扩展了埃里克森的发现:

 

“埃里克森讨论了提高不是单单经验的积累,而是持之以恒的努力学习。 这就包括了不断的解决一些学习者们还解决不了的问题。 这可能就是运动或是音乐的爱好者们花了上千个小时在下棋或是高尔夫或者是一种乐器,但他们的水平并没有很大提高的原因。 而一个受了适当训练的人能在一个相对短的时间里超越他们。 在棋类运动里, 运动员们花的时间并不和他们的进步成正比, 训练主要成果是找出他们的弱点。

 

很多初学者们通过努力的学习,经常能提高到一个不错的水平,就像通过驾照的考试, 大部分的人,一旦通过考试,就放松了,也就是说他们的表现不会再提高了。而领域里的专家们总是试着在提高自己。”

 

好的软件需要10年的时间来开发, 因为一个好的程序员要真正掌握一个领域的知识需要10年。但是不要忘记在学习和开发的过程中享受它的乐趣, 如果你不在乎的话,可能你也不会介意自己是提高还是下降了。

 

以上我所说的只是想读者明白, 真正的大师是需要10年的时间来造就的。而且这十年是专注和“深思熟虑的学习”。所以要不要成为大师, 取决于你自己。

 

(第一次翻译文章,不妥的地方请读者们原谅)

 

备注:

 

Philp Ross: "The Expert mind" 作者, "The Expert mind" 解释了国际象棋大师的思维的成长历程。并解释人们怎样成为一个领域的专家。

 

Joel Spolsky: , 软件工程师,"Joel on software"书的作者, 1991-1994 微软Excel开发组的经理。

 

Anders Hejlsberg: 丹麦籍软件工程师, Turbo Pascal 的发明者, Delphi的主要发明者之一。现在是微软C#的主要开发者。

 

遗漏的抽象世界:Joel Spolsky 有关对抽象层的论述,他指出,伴随着很多高级编程语言的涌现, 抽象层也在不断增加, 以此来减少开发的时间和难度, 但Joel Spolsky 认为, 这样并没有达到预期的效果, 当一个抽象的层不是可以忽略的时候,它就是一个可以产生问题的层。具体可见:

.html

 

John Cloud: Times(时代周刊)的记者。

 

Ericsson(埃里克森) : 60岁的教授, 在佛罗里达州Human Performance Laborary 从事研究工作。 1976年和Simon一起写了有关通过下棋研究怎样做决定(decision making)的报告, Simon继续了他的研究,并获得了诺贝尔经济学奖。

 

FxCop:

 

 

 

 

 

 

 

 

更多推荐

从下棋想到的, 怎样成为一名大师级软件开发者

本文发布于:2024-03-10 19:18:52,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1728823.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:开发者   成为一名   软件

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!