程序员,你能真正掌握多少编程技术?
我总能看到一些公司在招聘广告里这样描述他们的岗位要求:“有丰富的从零开始构建iOS及Android应用的经验;精通移动及 Web 技术,包括 Java、HTML5、CSS3、JavaScript 和 AJAX。“
(可世上根本)没有这样的人:一个人只能真正精通一个(技术方向),而在其他方向上技术平平。你也可以在精通一门技术后转而钻研另一种技术,(但这会让你很快)忘掉前者的很多细节。这样或许已经足够让你轻松唬住很多人,让他们认为你无所不能、无所不晓——但真遇上棘手的问题,你也只能靠运气了。
今时不同往日,当代任何一个主流领域的技术都相当复杂,并且不断地变化,需要人投入大量时间。只是利用业余时间学习的话,连保持跟进某个技术领域的最新动态都很困难,更不用说从零开始“精通”这项技术了。因此,只有参与一个真实的项目才能让你真正学习一套新的(技术)环境。而能够同时参与开发大型原生 Android、iOS 应用以及响应式 Web 客户端程序的又有多少人?
在过去 34 年的程序员生涯里,我很少同时在多个技术领域上工作。我的第一份工作是在 Supermini 上开发,后来用 Apple 写 6502 汇编、在PC 上写 Pascal,我的两个创业公司的开发环境都是 Mac 和 C。在为别的公司(包括 Apple)工作时, 我先后用过 C、一点 C++、Objective-C/WebObjects, 然后转向基于 Java 的 Web 前后端开发(但很少同时开发这两者)。再后来,我写了一些 JavaScript,做过基于 C++ 的游戏编程, 最后,就是我现在做的: Objective-C 和 iOS。为了掌握各种新知识,这中间的每次技术转变我都花了几年时间一边做一边进行大量的学习。
如果出于某些原因,有人真的能够同时精通 Android 和 iOS,甚至是 Web ,那么作为一个真正的全才,我想他的期望薪酬会远远高出多数公司愿意给出的价格:公司实际上只想以最低的工资水平招几个“什么都能做”的人以节约成本。我至今无法理解有人能够同时成为许多方面的专家,以及他们怎么能同时掌握不同的技术、开发不同平台的应用并与时俱进。我认识一些才华横溢的人,但我不记得有哪一个能够像耍杂耍一样将多种技术玩弄于股掌之上,并开发出能体现精湛技艺的应用。
好吧,可能会有一些例外吧,但是我始终认为多数人做不到这一点。一个人固然能先精通一种技能,然后再尝试精通另一个,但这个过程中必然会忘记很多前面的知识。去年我有几个月无所事事,等着被公司解雇(公司所有的技术都早已经落伍被替代了,他们开始把整个品牌打折出售,所以显然我的下岗也只是早晚的问题)。我花了一个月做了一些 C++ 开发,然后是 Node.js, 最后还搞了一段时间 Swift。今年再回顾这些学过的技术时(我的新工作用的是 Objective-C),我发现我已经忘了之前学到的大多数内容。如果不是经常使用的东西,肯定会很快被忘到脑后。当我用 PHP 重新搭建我现在这个博客系统时,我掌握过的各种语言在我脑袋里全都糊成了一片。
如果你用过 Objective-C、然后使用 Swift 做 iOS 开发的话,那至少两者还有一部分重叠。不过 Android 开发跟 iOS 相比可不仅仅只是另一种语言的差别了:你需要掌握完全不同的开发工具、布局方法,以及如何支持多个版本的操作系统,并兼容 24000 多种安卓设备。另一方面,单单要跟上今年六月 WWDC 里发布的新变化就要花很大的功夫,Apple 发布的示例代码并不兼容最新 beta 版的 Xcode 更是雪上加霜。 就算你能不写代码,每天能看完最新的视频、读完最新的文档和示例代码,不过这样你又哪来的勇气称自己是个专家呢?
除了安卓和 iOS 这两个截然不同的复杂移动开发环境,现在的 Web 开发也添了不少乱,尤其是此起彼伏层出不穷的各种 JavaScript 框架, 要跟随它们的变化真得有三头六臂才行。而且从跟我共事过的 JavaScript 程序员来看,他们甚至连一个框架的变化都跟不上(嗯,我说的就是 AngularJS)。
所以如果你找到这样一个人选,他/她:iOS 和 Android 开发不在话下、JS 桌面/移动端 Web 编程小菜一碟;熟练运用现代风格的 API 又能兼容各个老版本 OS,各种 UI 设计方式优劣如数家珍,诸多浏览器特性及安卓设备特例了然于胸,还总能以破纪录的时间交付无 Bug 的产品…那你就真的赚大了——对了,他应该还愿意以低于市场价为你工作。