从事IT业15年 德拓9年元老级程序员
资深处女座
很多人不喜欢被叫做程序员,于是世面上有很高级的头衔:软件工程师、软件研发、架构师、科学家,再配上诸如首席、高级、资深之类的前缀,营造出丰富多彩的名片世界。
可是不管头衔多丰富,程序员,Programmer,写程序的人(*注释1),最后留下能被世人所知的还是程序,要分出个高下来恐怕最后还是要落回到程序上。
那么怎么比较写程序水平的高低呢?
按编程的行业惯例需要先建一个数据模型,毕竟计算机只能处理可以数值化表达的问题。
我们先设计一个最简单的分级,虽然没有从“0”开始,显的没有那么“程序”(*注释2),但是按中文的表达习惯“零流程序员”实在是不太好理解,那么我们就从“一”开始, 即一流、 二流、 三流(T1, T2, T3)。
正在看文章的读者老爷们一定在好奇,一流程序员和二流的区别在哪里? 别急,请看标题,区别很简单:“打十个”。
科普一个编程常识: 一个高级程序员的产出成果可以轻易达到低级程序员的十倍甚至更多, 不是打字速度, 而是综合考虑功能实现,bug修复和维护成本。 “打十个”代表的是程序员世界里指数级的战斗力差异。
口说无凭,我们来看一个现实世界的例子:Linus Torvalds——Linux 之父。
尽管程序员面对的问题千奇百怪,领域行业也各有不同,但是相信大家对把他划归为T1级别还是没有什么异议的。我们来看一下一个T1级别的程序员战斗力究竟如何。
相信大家对git这个工具都不陌生,而这个工具正是由Linus本人开发来管理Linux内核代码的,在项目早期,由2005年4月3日启动项目;第四天,实现self-host (自启动,即用git管理git代码)(*注释3);第二周完成第一次linux kernel 代码提交,基础功能已实现;第二个月,linux kernel 在git管理下正式发布2.6.12版本。
两个月的时间,对很多人来说不够完全掌握git的用法,然而在一流程序员的手里已经从无到上线了。Hadoop第一个版本发布只用了三个月,著名的游戏引擎Doom也只用三个月的时间就完成了开发。
大家可以参考这些一流程序员的战绩暗暗评估一下自己的水平。一般来说按本文的分级方法,二流程序员可以认为是对个人能力的极大认可和褒扬,想象一下集齐二十个你能用4个月做个Mapreduce出来(没错2个人4个月就把这玩意儿连设计带实现搞定了,后来还发了篇著名的论文),是不是也值得以后和孙辈吹嘘一下?
看完了天上的神仙们表演,回到地面上,我们每个在编程圈发展的程序员需要认真考虑怎样提升自己解决问题的能力。在实际工作中不乏见到两个同时入行,背景相仿的萌新,在短短两三年内就有级别上的能力差距。造成这样差距的原因是什么呢? 通常在认知上有个误区:决定程序员水平的是“智商”,“天赋”,可是在实际的工作中我的个人经验和看法是我们绝大部分人在智力和天赋上是在同一个级别上的,类似于“打十个”这种完全不在一个水平线上的神仙人物在现实中你很难遇到,决定发展差异的大部分源于以下几个方面:眼界、热情、缜密。
眼界影响的是个人的努力方向。软件和计算机领域的基础理论虽然多年未有大变化,但是在实际工程技术应用领域的更新迭代确是一刻也未停止过,技术发展的前沿在哪里,行业内顶级程序员们都在面临什么样的困难问题,硬件厂挤出来的新牙膏对我们程序有啥影响,如果对这些全都不闻不问变成井中青蛙,就很容易遇到发展瓶颈,陷入到重复的体力劳动中变成人肉打字机。
热情会严重影响个人的投入程度。你是否对优化自己的代码念念不忘,是否会再应用到新学到的技巧时感到兴奋和成就感,业余时间愿意写写代码的人和看十行源码就犯困的人谁在程序员这个职业上更有发展前途不言而喻。
缜密是程序员必须具备的思维方式和工作习惯。程序会一丝不苟的按你编写的代码在计算机中执行,你脑中的逻辑世界构建的越严密,越和现实一致,最后在芯片中的运行结果就会越与你想象的一致,所有你没有考虑到的地方最后都会变成大大小小的坑,随缘坑人。得益于开源项目的发展,我们从各个开源项目中看到的一流程序员的代码基本都是格式规范,注释齐全的(*注释4), 这里写“基本”是为了严谨,迄今为止还未看到过哪个一流程序员的源码是乱糟糟一团的。
程序员的能力发展是迅速但又是漫长的,得益于软件行业的整体进步,每个愿意花时间提升自己的程序员都可以很快的在某个领域达到入门级别的水平,然而在后面能不能跨越程序员级别间的关卡,成为可以打十个自己的“高手”,就需要花费时间有目的一点一滴的积累了。作为一个早已度过了“网定”退休年龄暂时还赖在编程行业的从业人员,希望年轻的朋友们可以从小文中有所收获,至少涨一点奇怪的知识也不错。
感谢你能坚持看完,我是樊飞, 来自上海德拓的老年程序员。
注释1
冷知识:图灵奖得主,著名的计算机科学家狄杰斯特拉(Dijkstra)非常喜欢自称程序员,对就是那个喝咖啡的时间就想出最短路径算法的人
注释2
狄杰斯特拉:为什么数字序列要从0开始(https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html)
注释3
Linus, git项目的第一次提交记录: Initial revision of “git” the information manager from hell
(https://github.com/git/git/commit/e83c5163316f89bfbde7d9ab23ca2e25604af290)
注释4
比尔盖茨在微软幼年时期写的Basic 解释器源码,可以看到代码规范工整,注释清晰详细
https://github.com/brajeshwar/Microsoft-BASIC-for-6502-Original-Source-Code-1978/blob/master/M6502.MAC.txt