现在的开发工作要求我们能够快速掌握一门语言。一般来说应对这种挑战有两种态度:其一,粗粗看看语法,就撸起袖子开干,边查Google边学习;其二是花很多时间完整地把整个语言学习一遍,做到胸有成竹,然后再开始做实际工作。然而这两种方法都有弊病。第二种方法的问题当然很明显,不仅浪费了时间,偏离了目标,而且学习效率不高。因为没有实际问题驱动的语言学习通常是不牢固不深入的。有的人学着学着成了语言专家,反而忘了自己原本是要解决问题来的。第一种路子也有问题,在对于这种语言的脾气秉性还没有了解的情况下大刀阔斧地拼凑代码,写出来的东西肯定不入流。说穿新鞋走老路,新瓶装旧酒,那都是小问题,真正严重的是这样的程序员可以在短时间内堆积大量充满缺陷的垃圾代码。由于通常开发阶段的测试完备程度有限,这些垃圾代码往往能通过这个阶段,从而潜伏下来,在后期成为整个项目的毒瘤,反反复复让后来的维护者陷入西西弗斯困境。
虽然技术路线的选择不是核心竞争力,也不应该具有决定性,但对于个人职业路线还是具有比较重要的影响力。但这并不是说,我们应该煞有介事地把自己归于Java或者.NET技术阵营,整天捧本书吭哧吭哧啃。正确的态度应该是着重于你要干的事情,然后认真把这件事情做好,通过必要的学习将所需的知识体系构筑完整,在整个过程中及时更新知识体系。只有心理没谱的人,才会为新技术的推出感到惶恐,因为他不知道自己要干什么,也就不知道自己要学什么,看到什么东西出来了都以为如果不学就会落伍,才会觉得是个压力,日积月累,才会痛苦彷徨嚷嚷怎么办。相反,如果你很清楚地知道自己要做什么,就会发现,其实必须及时更新的知识变化并不频繁,大多数新鲜玩意根本不在自己关注范围内,任他三仙落地,五佛升天,与我何干?因此完全可以安步当车,稳扎稳打。
从本质上看,软件实际上只是夹在人与硬件之间的一个中间层,人们使用软件的根本目的还是要让硬件运转起来为自己服务。硬件平台如果长期稳定,软件就能够安稳发展,建起高楼大厦,硬件基础如果打个喷嚏,软件就会得一场感冒。过去十几年来,我们的计算环境已经发生了很多变化,比如RISC的兴起,大规模服务器集群的发展,SIMD的普及,特别是网络的大发展,令人印象深刻。每一项变化都给软件带来一定程度的冲击。不过大部分情况下,这种冲击力度有限:只需要有一小部分人去关注就好了,他们会尽可能把这些变化包装起来,从而使得其余的绝大部分人不受影响,而又能够享受硬件发展带来的免费午餐。比如说,RISC跟硬件平台带来的变革是非常巨大的,但是只有编译器和操作系统开发者真正需要关注它。SIMD(MMX、3DNow!、SSEx)的发展使普通计算机处理多媒体数据的能力获得了本质提升,但是厂商们也推出了一系列封装库,使应用软件开发者们在不需对开发方式做重大改变的情况下享受这些发展成果。