"[i]I will learn it when I need it[/i]"! I've heard that phrase a lot over the years; it seems like a highly pragmatic attitude to foster when you're in an industry as fast-paced as software development. On some level it actually IS quite pragmatic, but on another level I am annoyed by the phrase. It has become a mantra for our whole industry which hasn't changed said industry for the better. The problem is this, [b]in the guise of sounding like a wise and practical developer, people use it as an excuse to coast.[/b] There is too much stuff to know, it is necessary to be able to pick certain things up as you go along – part of the job. But, there is a difference between having to "pick up" some knowledge as you go along and doing absolutely everything just-in-time.

The whole industry has become a bunch of generalists, maybe it has always been this way, I just wasn't around to see it, either way I don't like it. Noone wants to invest the time to learn anything really deeply, not computer science fundamentals, not the latest tech you're working with, not even the language you've been coding in every day, for the last few years. Why bother, it will be replaced, superseded, marginalised and out of fashion before you're half way done. I've discussed this with various people many times, but noone seems to really see it as a problem. "Just being pragmatic dude". In the meantime we've all become clones of each other. You want a Java developer, I am a Java developer, you're a Java developer, my neighbour is a Java developer. What differentiates us from each other – not much! Well, I've got some jQuery experience. That's great, so you know how to build accordion menu then? Sure, I Google it and steal the best code I find. In the meantime, if you need to hire a REAL expert (in anything, maybe you're writing a fancy parser or need to visualise some big data), I hope you've stocked up on beer and sandwiches cause you're gonna be here a while.

Ok, there are ways to differentiate yourself, I have better communication skills, which is why I do better. That's important too, but, [b]developers differentiating themselves based on soft skills rather than developer skills – seems a bit twisted.[/b] We all communicate really well but the code is a mess. Hell, I shouldn't really talk, I am a bit of a generalist too. Of course I'd like to think of myself as a T-shaped individual, but if we're completely honest, it's more of a dash-shaped or underscore-shaped with maybe a few bumps. To the uninitiated those bumps might look like big giant stalactites – T-shaped indeed. You seem like an expert without ever being an expert, just one advantage of being in a sea of generalists.

[b]Investing In Your Future[/b]

I don't want to preach about how we should all be investing in our professional future, everybody knows we should be. Most people probably think they are infact investing, they rock up to work, write a lot of code maybe even do some reading on the side, surely that must make them an expert in about 10 years, and a senior expert in 20 (I keep meaning to write more about this, one day I'll get around to it)? But, if that was the way, every old person would be an expert in a whole bunch of stuff and that is emphatically not the case. Maybe it is just that people don't know how to build expertise (there is an element of truth to this), but I have a sneaking suspicion that it's more about lack of desire rather than lack of knowledge. What was that saying about the will and the way – totally applicable in this case?

I've gone completely off-track. "Investing in professional future" is just one of those buzzword things, the mantra is "I will learn it when I need it". It was good enough for my daddy and it has served me well so far. Let's apply this thinking to finance, "I will invest my money when I think I need the money". Somehow it doesn't quite have the same kind of pragmatic ring to it.

[b]You Don't Know What You Don't Know[/b]

We've all had those moments where you're going through major pain trying to solve a problem until someone comes along and tells you about algorithm X or technology Y and it makes everything fast and simple. It was lucky that person just happened to be there to show you the "easy" way, otherwise you would have spent days/weeks trying to figure it out and it would have been a mess. You can't be blamed for this though, you don't know what you don't know. For me, this is where the "I will learn it when I need it" mentality falls over. You can't learn something if you don't know it exists. Google goes a long way towards mitigating this problem, but not all the way. There are plenty of problems you will encounter in the wild where you can beat your head against the wall ad infinitum unless you know what class of problem you're looking at (e.g. if you know a bit about searching and constraint propagation, solving sudoku is easy, otherwise it's really quite hard). You can't learn about an algorithm if you're not aware of it or its applicability. You can't utilise a technology to solve a problem if you don't even realise it has that capability. You're not going to always have someone there to point you in the right direction. I am willing to bet there is a billion lines of code out there right now which can be replaced with a million lines of faster, cleaner, better code simply because whoever wrote it didn't know what they didn't know.

I seem to be making a case for the opposite side here, if knowing what you don't know is the ticket then surely we should be focusing on breadth of knowledge. Superficial awareness of as much stuff as possible should see us through, we'll be able to recognise the problems when we see them and then learn what we need more deeply. Except it doesn't work like that, skimming subjects doesn't allow you to retain anything, our brain doesn't work that way. If we don't reinforce and dig deeper into the concepts we quickly page that information out as unimportant, it is a waste of time (think back to cramming for exams, how much do you remember the next day?). However if you focus on building deeper understanding of a subject – in an interesting twist – you will gain broad knowledge as well (which you will actually be able to retain). My grandad is a nuclear physicist, several decades of working to gain deeper knowledge of the subject has made him an expert, but it has also made him an excellent mathematician, a decent chemist, a pretty good geologist, a fair biologist etc. Just some empirical evidence that seeking depth leads to breadth as a side-effect.

[b]Can You Learn It Fast Enough[/b]

Some stuff just takes a long time to learn. I am confident I can pick up an ORM framework I haven't seen before without even breaking stride, I've used them before, the concepts are the same. But what if you need to do some speech to text conversion, not quite as simple, not enough background. Hopefully Google will have something for us to copy/paste. That was a bad example, only research boffins at universities need to do that crap. How about building a website then, we all know how to do that, but what if you need to do it for 10 million users a day. We just need to learn everything about scaling, I am sure the users will wait a month or two for us to get up to speed. Yeah, I am just being stupid, all we need to do is hire an expert and … errr … oh wait, we're all out of beer and sandwiches.

[b]Why Should I Care[/b]

Working with experts is freaking awesome. You may have experienced it before, everything they say is something new and interesting, you learn new tricks with every line of code, you can almost feel your brain expanding. You want to learn from the experts, so it's really sad when you can't find any. Since everyone is only learning when they "need it", noone can teach anything to anyone. The chunk of wisdom here is this, you want to work with experts, but the experts also want to work with experts, so what are you doing to make sure the experts want to work with you? Being able to learn something when you need it is a good skill to have, but you can not let it be your philosophy as a developer. Yes it is a big industry you can't learn everything, so pick something and make sure you know it backwards, if you're curious enough to follow up on the interesting bits, you'll find you have a decent grasp of a lot of other stuff at the end. And if you do a good enough job, other super-awesome-smart people are going to want to come and hang around you cause they'll be able to learn something from you and you'll be able to learn much from them. Everybody will be a winner.

“当我需要用到它时我就去学它!”

过去这些年里这句话我听到无数次;对于处在一个像软件开发这样的快速发展变化的行业里,这听起来像是一种十分适用主义的态度。从某些层面上说,它确 实十分适用,但从另一个层面来看,我很受这句话困扰。它似乎成了我们这个行业的福音,但却从来没有把这个行业变的更好。问题就在于,这句话表面上借明智的有经验的开发者之言,其实是幌子,实为人们随波逐流的借口。实在是有太多的东西需要我们在工作之中“发现学习”,但对于这种对新知的“发现学习”,你是工作学习齐头并进,还是单纯的遇到了什么问题,就学习处理这问题的知识?这两者之间有很大的区别。

整个行业里到处都是通才、全才,也许向来如此,只是我太闭塞,没有认识到这些,而且我也不愿意看到这种情况。没有人再愿意踏踏实实的深入研究一个东 西,包括计算机科学基本原理、你正在使用的最新技术、甚至是你最近几年一直使用的语言。何必自寻烦恼,也许当你学在半途中时就会发现,这些技术知识已经被 更新升级,被废弃,被边缘化,被过时、不再流行。我曾和很多人讨论过这个现象,没有一个人认为这是一个问题。“做个实用主义的人吧。”

与此同时,我们大家都在相互模仿克隆。现在需要一个Java程序员,我是一个Java程序员,你也是Java程序员,我邻居也是个Java程序员。 我们大家之间有什么区别?——没什么区别!还有,我学会一些jQuery知识。这不错,这样我就知道如何做一个可折叠的菜单了。而且,我可以使用 Google在网上搜一下,到处都是,我能搜到最好的代码,剽窃它。而同时,如果你想招募一个Perl专家(也许你想要一个神奇的解释器或将大量数据进行 可视化),那你可要准备好足够的干粮和水了,因为你根本找不到。

不错,是有很多地方能看出你我的区别,我有更好的沟通技巧,所以我做的更好。这当然很重要,但是,开发人员通过软实力,而不是开发技术能力来区分 —— 感觉有些扭曲。我们大家的沟通技巧都很好,可写出的代码是一团糟 。该死,我本不该说这些,因为我也算得上是一个通才。当然,我更愿意把自己看作一个既有广度又有深度(T型)的人,但是,如果你愿意说真正的实话,你会说,大部分的人都只有广度,没有深度,更像横线型(破折号型) 。在这些破折号中你就像是个巨大的石钟乳 —— 你是T型的。你看上去就像个专家,即使你从来不是专家,这就是在到处都是通才的时候做为专才的优势。

[b]投资你的未来[/b]

我不想传道似的告诉大家我们应该对未来的职业生涯进行投资,因为这是每个人都知道的。大多数人认为自己正在投资,他们努力的工作,写大量的程序,甚 至边工作边学习,诚然,这10年下去肯定会成为一个专家,20年下去成为一个资深专家。但是,如果事情果真是这样,那每个年纪大的人都会成为各个方面的专 家,事实断然不会是这样。也许原因是人们不知道如何在某个方向去发展他们的特长(这是实际存在的),但我私下里更怀疑是,人们更多的是缺乏热情,而不是缺乏这方面的指点。上面所说的各种问题都基本上可归于这种情况。

我完全说跑题了。“对未来进行投资”只是我们讨论的问题之一,而主要问题是”我需要用到它时就会去学它“这句箴言。这句话给我老爸很合适,而且它也为我所用这么多年。让我们把这句话的思想应用到金融上吧,“当我需要钱时我会去进行投资的”。你会发现有些时候这句话并不是那么适用。

[b]你不知道你缺少哪些知识[/b]

我们都经历过这样的时刻:你痛苦被折磨于要解决一个问题,最终是有人过来告诉关于X算法或Y技术,这让所有问题变得又快又简单。你很幸运能碰到这样 一个能告诉你“简单”方法的人,否则的话你可能要用去数天、数周去把问题弄明白,而且事情会变的乱糟糟。你不会因为此而受到责备,因为你不可能提前知道你 会缺少什么样的知识。我想,这就是“当我需要它时我就会学它”的思想方法失败的地方。你不可能去学你从未听说过的技术知识。 Google做出了很大的成就来缓解这个问题,但这不能解决所有问题。在茫茫的未知领域你会遭遇到大量的未知难题,它们会让你撞的头破血流,要多惨有多 惨,除非你能明白你所面对的是什么类型的问题(例如,如果你知道一些搜索算法和约束传播问题,你可以去解决数独难题,否则,你就陷入困境了)。你不可能去 学习一种你不知道的或不知道用在哪里的算法。你不可能去利用一个你根本不知道能做什么的技术去解决一个问题。不可能一直有人在旁边指点你正确的方向。我敢 打赌这世界上有数百万的代码可以被替换成更高效、更整洁、更有效的代码,只是因为写这些代码的人不知道自己欠缺某方面的知识。

我想反向说明一下这个问题,假使能提前知道我们缺少什么知识,那么,诚然,我需要关注大量的知识。粗浅的大范围的尽可能多的涉猎各种知识对我们有很大帮助。当问题发生时,我就能看出问题是什么领域的,然后针对这种知识深入的研究。可是,事情并不会这样发生,浮光掠影的通览各种知识最终并不会在我们的脑海里留下任何痕迹,我们的大脑不是这样工作的。如果我不去强化和深入挖掘某个知识概念,我们的大脑会很快就会把它标记为不重要信息,完全是一种浪费时间(回想一下你为了考试而死记硬背的东西在第二天还能记住多少?)。然而,如果你能集中精力对某一主题进行深入研究——并伴随着兴趣——你会收获颇丰(这将是你不会忘记的)。我爷爷是一个核物理学家,数十年如一日的收集研究这个领域里的知识使他成为了一个专家,但这也同时使他成为了一个出色的数学家,一个不错的化学家,一个非常棒的地质学家,一个合格的生物学家,等等。这只是因为深入研究而获得的广泛的副产品。

[b]你能以足够快的速度学会它们吗[/b]

有些东西需要你花很长时间才能学会。我有信心在不皱眉头的情况下学会一个以前从未见过的ORM框架,因为类似的东西我以前见过,它们概念是相同的。 但如果你需要做一些把演说转换成文字的东西,这可不会这么简单,你没有足够的背景知识。把希望寄托在Google上,搜出一些东西我们可以去粘贴拷贝。这 是一个很坏的做法,只有大学里的研究人员才会去做这种烂事。如果是开发一个网站呢?我们都知道该怎么做,但如果需要能支持每天1千万的用户访问量呢?我需 要知道如何去升级,我相信不花一两个月的研究你是不可能把速度提上去的 。是呀,我太蠢了,我应该做的是雇一个专家,然后 … 哦 … 慢,等等,我们的干粮和水都不够了。

[b]为什么我在乎这些[/b]

跟专家一起工作实在是太爽了。也许你以前有过这样的经历,他们说的那些东西都是那么新颖和有趣,他们的每行代码都能让你受益匪浅,你几乎都能感到你的脑容量在膨胀 。你希望能跟专家学习,可当你找不到这样的专家时,那就太不幸了。因为每个人都是在“需要”的时候才去学习,没有人可以教别人什么东西。而这其中最大的教训是,专家同样也想和专家一起工作,所以,你的问题在于,要能清楚专家是否愿意和你一起工作?如 果能做到在需要的时候就去学习,这是个不错的做法,但你不能把它当作一个软件开发者的至理名言。不错,这个行业很宽广,你不可能样样都学,所以要选择一 些,学精,如果你很好奇而做了深入研究,你会发现最终你在很多其他知识上都会有一个相当的掌握。而且如果你能做出一份出色的工作,其他精英贤达都会希望和 你左右同行,因为他们这样可以从你身上学到知识,而你也能从他们身上学到更多的东西。这对每个人都是再好不过。