代码改变世界

我们到底该怎么学技术?如何成为一个优秀的技术人员?

2007-10-29 18:47  Jeffrey Zhao  阅读(29406)  评论(132编辑  收藏  举报

看了不要迷失在技术的海洋中,深表同意。在后来的评论中大家也表达了自己的看法。让我觉得很有意思的是,大家的观点惊人地一致——几乎没有反对的声音。

不过从经验上来看,意见太统一也不一定是一件好事。我有时也会小人之心地想,表示赞同的朋友们是真与LoveCherry的想法一致,还是仅仅因为自己以前对待技术随波逐流不堪所累,现在把这篇文章作为救命稻草看待,追求自身的心理平衡呢?LoveCherry写这篇文章,是基于他对于技术和思想的深度。如果我们没有达到这样的程度,是否会误解他的意思,得到的仅仅是一种心理安慰,却失去了更多东西呢?

我们到底该如何学习技术?或者说,如何成为一个优秀的技术人员?

扎实的基础

如果要成为一个优秀的技术人员——我并没有说是“开发人员”,比如也包括“测试人员”吧——一定需要扎实的基础。什么叫做扎实的基础呢?其实就是我们大学所学的课程——离散数学、算法与数据结构、操作系统、计算机体系结构、网络、编译原理等等。现在它们经常被视为“没有用”,但是我认为这些都是一个优秀技术人员成长和前进的基础。不知道大家有没有过这样的感觉:某天早上一醒来,发现对于最近接触的事物有了新一层的认识,似乎什么都不会了,却好像什么都理解了——就像张无忌练太极剑,不求剑招,只求剑意。我曾经有过两次这样的感觉,真可谓豁然开朗。其实我想,这就是所谓的“突破瓶颈”。而引起“量变到质变”的关键,可能就是您忽视的那些课程,那些一进大学就被“灌输”的知识。

在面试时我经常听到这样的话:“我的理论和基础不行,但是我让我写代码是没有问题的。”这样看来,基础真的没有用吗?我并不这样认为,因为……

  • 如果您不了算法和数据结构,又如何从.NET Framework(甚至包括Power Collections,在这里我强烈推荐这个组件)琳琅满目的数据结构中做出最适合目前需求的选择呢?
  • 如果您不了解操作系统,又如何能深入Windows系统,写好.NET Framework程序,或者在postmortem环境中做调试呢?
  • 如果您不了解计算机体系结构,又如何能在Multi-CPU(Multi-Core)时代写出真正高效的应用程序呢?
  • 如果……

因为我们不光要写代码,而且要写好的代码,因此我们必须强调基础。很多时候技术人员之间能力的高低,很可能就会取决于这写基础。有朋友告诉我,这些计算机科学的基础的意义不仅仅在于知识本身,它们还能够让人的思维更符合计算机科学的发展和变革——这可能说的有点远大,但是我基本上同意这个看法。如果说得简单一些,它们让您的思维方式更适合这个行业——试想,如果您知道了计算机/程序/框架/系统是怎么想的,他们还能够为难你吗?

举一个例子,微软有着大量高素质的技术人员,他们是微软惊人生产力的源泉。因此微软能够在Vista和Office开发完成之后将大量牛人派去作Windows Live产品研发。在我们很多技术人员看来,Vista是操作系统,Windows Live是Web,两者大相径庭。但是微软就是能够有大量的技术人员作此类迁移。再举一个例子,当年Google挖角Microsoft许多技术人员,难道他们跳槽去Google继续作微软产品的研发吗?正是因为那些技术人员有着扎实的基础能力,因此就能够在各种类型的技术之间游刃有余,即使它们“表面”上看来差距有多大。

表面?这两个字放在这里是什么意思?因为这就是我想说的就是……

技术之间的关系

其实《不》一文的中心思想,就是不要随波逐流,不要迷失在技术的汪洋之中。我很同意,但是我也想补充一点我的看法。

在《不》文的评论中,我看到了一段话,其主要意思就是:“如果一个技术不会用到,就不要去学它。当要用的时候再去学”。首先表明我的观点:我不同意。这里我想举一个例子:

我是今年1月份加入目前的公司的,公司的技术团队当时使用.NET Framework 1.1进行应用开发。是时由于业务的原因需要开发一个平台以及其他一些应用,我在时在技术部门内部强烈建议将新系统使用.NET Framework 2.0 + 3.0的方式进行构建。我的理由是:“使用.NET Framework 2.0构建新平台在基础设施上不会增加任何成本,但是在功能和性能上都会有提高。而.NET Framework 3.0,尤其是WCF,是微软提供的新组件,也即将成为微软平台上通信的标准。”领导同意了我的建议,并希望我带领新的团队进行新平台的开发。过程中的细节就不一一道来了,现在回头看来过程虽有波折,但是倒也收到了较好的效果。我们经常会发现有技术人员会抱怨技术发展地太快,但是就拿我之前的例子来说,在2007年还在使用2001年出现的东西,却忽视2004年就已经成熟的技术,这究竟是技术发展的太快,还是我们没有根本没有去跟进技术呢?

我想答案很明显是后者,这其实就是“如果一个技术不会用到,就不要去学它。当要用的时候再去学”。我们不会(或者很难)因为不断钻研老技术而领会新技术,掌握新技术是需要我们主动去追求的。如果一个人不追求,他就难以发展。如果人人不追求,那么整个技术团队就难以发展。不过我认为,其实只要怀着“把项目做的更好”的想法,追求新的技术和实践(例如重构、TDD)是自然而然的事情。

不论您是普通开发人员、技术经理抑或是架构师,我想您都不能止步不前。有人说,领导不愿意使用新技术,我们没有办法——那么设法说服他们。如果他们不能给出让您满意的理由,如果您觉得他们妨碍了您的发展,那么可以选择离开。我想有追求的您一定不会在找工作的问题上遇到太多麻烦。:)

似乎话题有些偏了,我们回到正体。新技术那么多,我们到底该怎么学呢?我这里想说的就是,新技术并非洪水猛兽。在一定程度上,我们完全可以驾驭它们。

我们来想一下,新技术是怎么来的?新技术并不是某些公司的牛人们拍脑袋出来的,新技术也是发展过来的。发展需要时间,发展是一个过程。例如C# 3.0由2.0发展而来,CLR 2由CLR 1发展而来。根据我的经验,如果一个技术人员能够较好地掌握.NET Framework 1.1,他几乎能够轻而易举地过渡到.NET Framework 2.0。他之需要了解一下新特性,找一些资料比较一下前后两者的改变即可。我们并没有创造技术,我们只是在跟进。为什么总有人能够在技术出现不久就写出大量文章或书籍来进行推广呢?这就是值得我们思考的地方。

举个例子,如果要从.NET 2.0升级到3.5(我不懂VB,用VB的朋友抱歉了),其实您只需要了解……

  • ListView控件:一个控件而已。
  • 集成了ASP.NET AJAX:不是新东西了。
  • Linq To XML:一套新的语法用于解析和构建XML。
  • Linq To Object:枚举,只是枚举。
  • Linq To Sql:可以视作简单的一套ORM,动态生成SQL语句。
  • Lambda Expression:即使没有接触过LISP(很幸运,我大学课程中有Functional Programming这门课:)),我想如果您了解编译原理的话,对此也应该不陌生了。
  • ……

真的不多。其实我觉得,跟进每个人各自领域的技术并非不可能的事情。我一再提到这么一句话:一个优秀的技术人员,他的知识架构应该成倒T字形,有着扎实的底盘,并且成为某个领域的专家。

我们究竟该如何学习基础呢?

扎实。我认为,这是关键。

  • 您有扎实的基础吗?这是成为优秀技术人员知识储备。
  • 您对于每项掌握的知识或技能都学的扎实吗?这是您前进过程中的助手。
  • 您有扎实的学习目标和计划吗?这是您在技术汪洋中的指南针。

我的文章写完了。

我很理想,我也在努力。:)