[转载]成为优秀的开发者无需数学技能,但成为卓越的开发者需要

原文:Alan Skorkin: You Don’t Need Math Skills To Be A Good Developer But You Do Need Them To Be A Great One

翻译:Xguru ,bearice:卓越开发者之道–成为优秀的开发者无需数学技能, 但成为卓越的开发者需要

我方才开始关于数学的思考。如你所知,我已经写了好几年的软件了,从实说来。我还没有找到在工作中有关数学方面的需求。有大量的新东西我必须得学习/熟练,比如语言、框架、工具、流程、交流技巧和在库上建立的库做你想到的任何东西。数学没有对其中任何一个起作用。当然这并不奇怪,这绝大多数我都是在一个又一个的模版上做建立,阅读,更新,删除(CRUD)的工作,这也是在我们这个互联网时代,多数的开发者在做的绝大多数的工作。你做的是专职顾问——你一般都在做网站,你在大公司内工作——一般都在做网站,你是自由职业者——你一般都在做网站,我深刻的意识到我逐渐精于此道,但是请忍一忍我,我跑题了。

最后你对此有点厌倦,像我一样。不要误解我的意思,这可以是有趣和富有挑战性的工作,能提供机会去解决问题,能与有趣的人们互动。但是在我私人时间里建立更多的网站的念头已经有点失去其光泽了–你开始寻找一些有趣的、酷的、好玩的事来做,呃–又一次 –像我一样。

比如视觉反馈技术就十分诱人。但我不是其中之一(和别人一样,我也喜欢优秀的前端技术,但是它真的不能使我兴奋),这就是为什么,当面对一些涉及探索的问题 时,我决定更加深入的去挖掘的原因。这把我带回这个故事的开始,因为当我抓住这第一把充满探索、像隐喻般的铲子时,当我恰好需要用到数学时,我方才真切地 了解到我的技能有了多大的退化。数学不像在骑单车那样 –你很久不用自然就会把它给忘了(然而我这几年没有骑车了,所以也许你也忘记了吧☺)

开拓眼界

学着多去探索一点,让我接触到各种有趣的软件和计算机科学相关的事物和问题(机器学习,自然语言处理,算法分析等),现在在任何方面当我正视数学时,我就更加深切地感受到技能的缺乏。我意识到如果你想用计算机做一些酷和有趣的事的话,你需要达到令人满意的数学技能层级。

除了我刚已经提到的,这里还有很多–比如密码学、游戏AI、压缩算法、遗传算法、3D图形等等。如果你想要写刚才我讲这类程序库或工具的话,你需要用到数学去理解这些供你所应用的领域背后的原理—而不仅仅只是使用它们成为一个生产者而非消费者—借用一个操作系统中的隐喻)。即使你不想编写任何库,使用那些你理解其运作原理的事物去构建软件将带來更多满足感,而非只是把他们堆砌起來然后祈祷它们能正常工作。

大多数开发者告诉你,他们在工作中从来不需要数学(就像我前面说的☺),但是经过短暂的沉思之后,我灵光一现:这里就是Maslow锤子理论的体现。你知道这个吧—当 你有个一个锤子,任何事看来都是钉子。这是一个隐喻:我们总是使用喜爱的工具,即使这工具对于手中的工作而言,它也许不是最适合的。数学就是我们的一个截 然相反的锤子。我们知道这个锤子的存在,但是不太知道如何使用它,所以,甚至当我们遇见一个问题,而且我们的锤子可作为解决该问题的完美工具时,我们却从 未认真考虑过它。螺丝刀对于我爷爷来说足够用了,对于我老爹来说、对于我来说,这也足够用了。谁需要锤子啊?数学的把戏在于 — 人们怕他 — 甚至大多数程序员也是。你认为我们不会,但是我们的确是这样的。因此,我们把我们的话转变成自我应验预言。并非我在工作中不需要数学,即使我需要了我也真的不清楚,我不懂如何去运用它。所以我设法不用它,当你足够长时间凑合着不用它的时候,不久你就更察觉不到它的消逝,从而对它的需求更加变少 — 这就是自我应验预言。

这是让我们靠近我们内心去思考的精神食粮——学习新的技术。作为一个协作世界的开发者,你力求成为一个通才型专家(如果你不知道我在说什么,就来看看这本书).你试着成为体面地处理大多数事情,能非常好地处理其中一些事情。但是你所精通的是什么呢?一般人选择优秀的、值得的一两个框架或着一门编程语言,并且与其相伴。但是请考虑这个事实,框架和较小范围的语言也有限定的保质期。如果你打算把职业生涯建立在成为一个Hibernate、 Rails、Struts专家的基础上的话(Struts迷们现在真应该担心一下了☺),当有新框架取代当前特性时,你将不得不在短期几年内将一切冲洗和重复。所以,这应该是你真正最好的投资 –也许吧,但是也有可能不是。另一方面数学它不会很快消逝。我们领域中的所有东西都是建立在坚固的数学基础之上(算法和数据结构可以作为其中一个例子)。所以你在数学上花的时间可以说是从未白费的。再重复一次,结论就是 :与其死记硬背的使用某事,不如真正地去理解它 — 当涉及到计算机时,数学能帮助你更深入地了解你做的任何事。事实上,Steve Yegge说过,我们作为程序员的所做为的很像在做数学,我们甚至都不了解它。

怎样与众不同?

你不相信我?那请想想看:大部分在我们领域受到人人尊崇的卓越的程序员同样也是卓越的数学家。我是在说像Donald Knuth (大牛不解释),Edsger W. Dijkstra大牛不解释), Noam ChomskyMIT教授,理论语言学大牛), Peter NorvigGoogle研究主任,Jscheme创始人)这类人。但是这些家伙并非真正的开发者,他们是计算机科学家,这难道能真正的算数么?我又一次觉得,也许在我们写出的纯代码行数能达到这些人所写的十分之一之前,我们不应该再去讨论这些问题了。当然,你不必成为一个科学家也能获得成功和名誉,每个人都听过Gavin King(Hibernate创始人) 、DHH(Ruby on Rails创始人),这还挺实际的(尽管在其他圈子有没有很多人听说过Gavin 和DHH这是值得辩论的观点),但是听说过和受到人人尊崇这是两码事,就如创建一个框架和为全人类的认知作出深远推进的差别一样(不要误解我,我尊重Gavin 和David,他们比我做了多得多的事,但是这不能影响我所说的事实)。所有的这些有意义么?我不知道,可能没有,但是在反省以后我想无论如何要把它先扔掉。

这个世界正在被数据充满,而且它将日益增长,而在此之前,我们可以享受地为相对少量的数据工作,但目前我们写的软件必须对巨量的数据集进行高效地操作。甚至这在协作世界也是的确在增长的。

其含义就是你可能将越来越少的能够使事物停止运转,去了解其如何运作,除非你足够聪明,你将处理的数据量会慢慢停下来。我的预测就是:算法分析将对于底层程序员越来越重要,这不仅仅在以前,更是在以后也如此。如果要成为一个体面的算法师你需要什么? — 你猜到了,一些数学技能。

那么,我又该如何呢?好吧,我决定逐步地建立/唤醒我的数学能力,这里仍然有丰富的书籍需要阅读、大量代码需要编写,但我会试着时常地投入一些自己的时间,因为就像锻炼一样,时常的一点练习聊胜于无。(再次引用Steve Yegge,墙内看这里)。当然谈到数学,我有一张袖中的王牌,对我而言很好,但很幸运的是,也许通过这个博客我们都会受益(我知道你会好奇,我将马上告诉你☺)

接下来5年内你的人生规划

然后,所有这些所学对任何事都有益么?事先很难说。我十分高兴我当前的处境,你应该也一样,但是一切皆有可能。到最后,如果你是一个协作世界里的开发者,你真的不需要任何数学。如果你乐意也可以这样安排你的整个生涯:在工作时间做企业CRUD应用程序,在业余时间搞搞滑翔飞行或者花样滑水(或者当前任何时髦的geek群体所着迷运动),然后当然可以投入较多的时间在SpringHibernate、Visual Studio或者其它东西上面。其实做这种特定的工作并没有真正限制你的潜力:你也能变得极有价值–甚至可以往更深入去尝试。但是如果你为多样化的职业生涯而奋斗,而且想有能试手于任何牵涉到代码的事情的能力,从信息检索到Linux内核hacking。简而言之,如果你想成为一个由开发者、程序员和计算机科学家完美融合的人的话,你必须保证你的数学技能情况良好(该死,如果你真的喜欢的话,你还是能继续搞滑翔飞行或者花样滑水),长话短说,如果你神入地体验过数学,那么软件开发领域所有大门都会向你敞开,如果你没有如此体验过数学的话 –- 那么你所做一切都将是CRUD的工作(双关语,CRUD也有污垢、杂质之意)。

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.