程序员如何选择技术方向
最近写了《程序员真正的价值》和《当程序员老去》两篇文章,传播甚广,今天是第三篇——《程序员如何选择技术方向》,史称“程序员三部曲”。
那之前写的几篇程序员文章算什么呢?算前传吧。以后再写程序员文章算什么呢?算后记吧。
2008年秋天的一个午后,温暖的阳光透过落地窗落在我面前这个长长的写字桌上,桌子对面坐的是一个瘦小的程序员,他的名字叫小明。小明有些茫然,他看着我,不知道该说些什么。
程序员都是很严谨的,我不得不首先发出一个System Call:
“你在客户现场这半年做什么工作?”
“写单元测试。”
“还有呢?”
“没了,就一直写JUnit。”
“别人也写单元测试吗?”
“没人愿意写单元测试,只有我写。”
……
“你为什么想来研究院呢?”
“我想写一些真正的程序。”
“什么是真正的程序?”
“比如Java,比如面向对象编程,你总要写一些类和各种各样的方法,而不是一直写测试用例(test case)。”
“好的,沿着这个楼梯上三楼,那里有一群和你一样的程序员,他们不仅写Java,还写JavaEE相关的各种程序,你会找到自己需要的东西。”
“真的吗?”
“真的。”
那时候我风华正茂,没有现在这么老成持重。阳光照在我的翘着二郎腿的脚面上,一切都显得十分虚幻。在小明的眼里,那时的我估计很像“黑客帝国”里的墨菲斯,但是他不能确定自己是不是“The One”。小明疑惑地看了我一会,最终还是上楼了。至此,他完成了第一次技术方向的选择。在三楼,他碰到了一群同样严谨的程序员,他不仅学会了写真正的Java程序,而且掌握了部分Web编程和服务器端编程,包括JavaScript、jQuery、Spring、Hibernate、JMX、Web Service等。小明变得快乐起来,渐渐摆脱了注定孤独一生的阴影。
过了一段时间以后,小明已经不满足只写Java相关的程序了。有一天他看到我手里的iPhone和Mac,仿佛见到了初恋的情人,眼中重新燃起了绿油油的光芒,他知道了iOS开发者这回事。很快,他花掉了所有的银子购买了Mac和iPhone,开始日夜兼程,学习iOS开发。他在写Java的间隙编写Objective-C代码,在编译Web App的同时构建IPA,在清晨的微光中调试程序,在每个夜晚与模拟器窃窃私语……他完成了第二个阶段的技术方向选择。
终于到了离别的时候,他要去寻找更大的梦想。经年以后,在南方的某个城市,他成了一个知名公司的iOS主程,并开发出了多个著名的iOS应用,比如“丁香医生”“用药助手”“家庭用药”等。难以想象,如果没有小明,张老师怎么去见小姨子,冯老师何以拯救互联网,二爷怎么鉴书,西湖何以养醋鱼!
第一个故事讲完了,主角小明利用两次主动的技术方向选择,完成了从小球到小牛的逆袭,以至于现在连女朋友都有了。
这时候就有读者要问了,那些大牛是如何做技术选择的呢?
大牛不需要做技术方向的选择,他们需要什么就学什么,学什么就成什么。他们就像掌握了“九阳神功”的张无忌,各种类型的技术和程序到了他们的手里都能发挥出巨大的威力。技术,是他们生命中最重要的组成部分。
如果你们以为我在吹牛我就给你举个例子。我在《MacTalk·人生元编程》中写过一个技术高手,他的名字叫做攀攀。很长一段时间我都不知道他掌握了哪些技术,因为他的技术是我们很多人的超集,我们遇到的所有问题都可以在他那里得到解决,他只是叼着烟翘着腿敲下几行代码而已。后来我才知道,他在高中的时候已经痴迷于计算机了,大学时代自学了大量的计算机相关的知识,在他大学毕业之后,操作系统、数据结构和算法就已了然于胸。
直到最近,我才从网络上拿到一份他几年前的简介,那个时候,他的履历是这样的:
ID:攀攀
性别:男
师门:电子科技大学1998年计算机系
职业:网络引擎设计者
人物背景:精通C、C++、Java、Pascal、Basic、Fortran、Cobol、PL/M、Perl、Python、Lisp、Prolog、Smalltalk、Ldap、PVM、MPI、编程自动化、Linux核心代码、JDK源码、GLibc源码、Apache源码、常见的网络协议内部实现、网络通信……是真的精通。
武学造诣:决不要把计算机强加给人们的限制认为理所当然,人不是机器的奴隶,把了解机器的限制作为通晓计算机的标准只能是自欺欺人。
游戏感言:IP路由和认证的双重功能将是未来网络游戏发展的障碍,今后的网络应该是以分布式目录服务为基础的,以网络设备为中心,与具体主机无关,集成了广泛的认证与授权能力的网络(全公司上下没有人能听得懂他在说什么,好在大伙儿都已经习惯了)。
都是1998年毕业的,人和人的差距怎么那么大呢?无语泪千行!
两个故事讲完了,究竟如何做技术方向的选择呢?答案就飘在风里……
1.操作系统、数据结构、算法、网络等基础技术应该在大学时代深入学习,如果毕业了你还没有掌握这些内容,那就随用随学好了。学习这些基础理论极为枯燥,只有实际工作中的需求才能给你最大的学习动力去掌握这些艰深的内容。
2.至少要掌握一门静态语言,如C、C++、Java、C#、Objective-C等。至少掌握一门动态语言,如Python、Ruby、PHP等。
3.推荐学习一些同时具备动态语言特性和静态语言特性的语言,如Go、Swift、Scala等。这样你会对面向对象编程、面向过程编程、编译型、解释型语言有更深入的了解。
4.系统地构建自己的知识体系,而不是局限在某个点上。经常有读者问我,我前几年一直在写VBA/ActionScript/Delphi/SQL……现在项目组突然不再采用这些语言了,怎么办?很多人难以预料未来技术的走向,但是你至少要构建自己的技术壁垒和平台。学习Java,就应该构建你自己的JavaEE平台;Objective-C对应iOS/OS X开发平台;C#对应.Net平台;SQL对应数据库平台。如果你在用ActionScript,那你不应该局限在Flex上,你对应的应该是整个前端平台。立足平台,你会站得很稳。立足一个点,你可能摔得很惨,就是这样。
5.主动选择技术方向比被动等待好。根据自己的兴趣和技术的发展主动选择,就像小明一样,有时候放弃也意味着得到。
6.不要过于追新,不要每出一门“颠覆性”的语言或技术都投入精力、物力。追新的后果很可能是该学的没学会,不该学的学完也忘了。我有一哥们儿,我们都在写JavaScript的时候,他认为Java新推出的JavaFX才是前端的未来……然后就没有然后了。我们都用Java的时候,他认为Erlang才是编程语言的未来……然后就没有然后了,可谓一步早,步步早,让人扼腕叹息。
7.也不要过于保守,比如Go、Swift、Docker等技术,我个人以为是值得投入时间和精力的技术。
没有8了,写到这里,冬夜已经黑得不像样子。站在阳台望出去,仿佛看着某个巨大IDE的黑色编码主题,我想起了某位大牛的一句话:我不是懂得多,我只是学得快而已。