编程是不是有前途的职业?30岁以后一定得转行?工作外包到越南怎么办? 新技术层出不穷,怎么才能跟上技术发展的趋势?工具越来越牛,以后编程像组装乐高积木怎么办?也许俺比较孤陋寡闻,看到的消极观点多。比如
这里,还有
这里。积极的观点少。像
云风那样的
铁杆编程迷更为罕见。嘿嘿,我没有答案。前天重读Frederick P. Brooks的《
没有银弹》,有点感想而已。
《没有银弹》的中心思想是软件开发的困难分为两类。一类是暂时困难(accidental difficulty) ,另一类是本质困难(essential difficulty)。暂时困难可以通过技术的进步来解决。比如说检查句法错误就是暂时困难,写出绘制窗口的代码也是暂时困难。现代IDE基本解决了这些问题。而本质困难没有工具或技术可以消除。B老大争辩道,软件的本质是一堆互相作用的抽象结构:数据,算法,关系,函数调用。。。这些抽象结构应该尽量独立于表现它们的具体形式。所以说,软件编程的本质困难在于写出这些抽象结构的规范,设计这些抽象结构,和测试这些结构的正确性。注意哈。B老大说,
如果上述判断正确,那么世上便没有银弹。幸好,到目前为止B老大的判断颠扑不破。
银弹和我们的职业发展有什么相干?很简单:我们得把时间用于学习解决本质困难。新技术给高手带来方便。菜鸟们却不用指望被新技术拯救。沿用
以前的比喻,一流的摄影师不会因为相机的更新换代而丢掉饭碗,反而可能借助先进技术留下传世佳作。因为摄影的本质困难,还是摄影师的艺术感觉。热门技术也就等于相机。不停追新,学习这个框架,那个软件,好比成天钻研不同相机的说明书。而热门技术后的来龙去脉,才好比摄影技术。为什么推出这个框架?它解决了什么其它框架不能解决的问题?它在哪里适用?它在哪里不适用?它用了什么新的设计?它改进了哪些旧的设计?
Why is forever. 和朋友聊天时提到Steve McConnell的《Professional Software Development》里面引了一个调查,说软件开发技术的半衰期20年。也就是说20年后我们现在知识里一半的东西过时。相当不坏。朋友打趣道:“应该说20年后IT界一半的技术过时,我们学的过时技术远远超过这个比例。具体到某人,很可能5年他就废了”。话虽悲观,但可见选择学习内容的重要性。学习本质技艺(技术迟早过时,技艺却常用长新)还有一好处,就是不用看着自己心爱的技术受到挑战的时候干嚎。C/C++过时就过时了呗,只要有其它的系统编程语言。Java倒了就倒了呗,未必我不能用.NET?Ruby昙花一现又如何。如果用得不爽,换到其它动态语言就是了。J2EE被废了又怎样?未必我们就做不出分布系统了?
这里还举了更多的例子。
一句话,只有人是真正的银弹。职业发展的目标,就是把自己变成银弹。那时候,你就不再是人,而是人弹。