了解、入门、熟练、精通
程序员是一个门槛不高的职业,但是优秀程序员的门槛很高。用代码实现功能是一个十分容易完成的任务。自然语言的语法那么复杂,大家都能很好的组织成文,何况程序语言的那几个单词和几条简单的语法规则呢?花点时间,人人都会。一个优秀的程序员,则需要极强的抽象与概括的能力,还有优秀的逻辑分析能力,沟通和理解能力也是程序员非常重要但总是被忽略的能力;抽象概括的能力是代码简洁优美的基础,逻辑分析能力是代码高效稳定的基础,这两者也是架构能力的基石;沟通与理解能力是代码有效易用的基础。程序员通过沟通才能充分知晓并理解需求,通过理解才能知晓需求背后的本质诉求和需求边界,这样才能写出客户真正想要的代码,真正瞄准客户痛点的代码。
基础能力很重要,但是难以度量。工作这么多年,也阅读了许多简历,有些人在简历上的技能清一色的都是精通。汉语中精通是对一个人技能的最高评价吧。这么多的精通,一个月 20k 的要价不觉得低了么?技术能力永远是程序员的核心能力,上述的抽象概括、逻辑分析和沟通能力决定一个程序员在技术的路上能走多远,有些人工作十几年,技能水平可能仍然是入门,有些人可能工作一年就精通了,这折射的就是这个人的基础能力,而技能水平是易衡量的。
了解、入门、熟练、精通。
了解表示某个人对某个技术有所了解,能说出这个技术的几个特点,比如问你了解 JAVA 吗,如果可以回答出 JAVA 是面向对象的语言,运行在 JVM 虚拟机上,具有跨平台的特点,其他点也可以,只要能知道一两个,就达到了解的水平了。入门,表示会用了,当然不是会写 hello world 了,而是了解这个技术的用法,在搜索的辅助下,能完成大部分的任务,比如用 JAVA 写多线程,处理 Exception。熟练,表示技术人员对某个技术的基本特性有深刻的理解,技能熟练度不再是业务实现的瓶颈,技术人员可以在这个技术的限制之内实现任何自己期望的结果,比如用 JAVA 写一个用户管理系统,用 JAVA 写一个后台服务,定位 CPU 过高、内存泄漏的问题。精通表示技术人员不仅对某个技术的特性有深刻的理解,对这个技术的边界也有清晰的认识,知道这个技术可以做什么,不可以做什么;知道这个技术的实现原理,能处理该技术的绝大部分问题,并有自己的经验总结。精通也意味着技术人员不仅可以用这个技术实现自己的期望,还知道实现得怎样,即这个实现存在的风险,以及风险的处理。怎样的事情需要程序员达到精通水平呢?比如用JAVA 实现一个高性能的稳定的用户管理系统和后台服务。总结下来就是:了解了,会写功能了,会写系统了,会写一个高性能高稳定性的系统了。
技术入门很容易,熟练和精通不易。照着教程,就可以入门了;写功能,几个类,几个方法,简单的抽象和逻辑分析就可以实现,沟通也相对简单;写系统则需要在系统层面进行模块的划分和逻辑过程的切分,要求更高些,沟通过程也较长;高性能高稳定性的系统,不仅要会进行模块的划分和逻辑切分,还需要会进行更加合理的模块划分,更加高效的逻辑切分,这个划分和切分不仅是系统功能的实现的基础,还是系统性能和稳定的基础。对照程序员的水平,一门技术入门是初级程序员,熟练是中级程序员,精通是高级程序员,多门技术精通就是资深程序员了。
沟通、设计、实现、检查、自测、文档
有人误会程序员的主要工作内容就是写代码。如果要做个类比,写代码就相当于餐饮店炒菜的环节,餐饮店还有计划、采购、处理……程序员的工作内容除了写代码,还包含需求的沟通,即知道自己接下来写的代码要实现什么东西;还有代码的设计,即思考接下来的代码怎么写;然后才开始写代码;写完代码还需要检查和自测试,即看看自己写得怎么样了;最后还需要写写文档,让大家知道怎么用你写的东西;有时候还要组织大家评审下,让别人知道自己完成任务了。
写代码,或者程序员的工作的一般步骤是沟通、设计、实现、检查、自测、文档。沟通是理解需求,明白需求的核心诉求和需求的边界;设计是分解需求,进行代码结构和逻辑的设计,如果是在已有代码的基础上的开发,还需要确认当前设计对现有代码的影响,确定修改的范围;实现就是写代码。实际工作中,实现和设计有时候是交替进行的,在实现的过程中发现设计的问题,则需要返回修改设计,甚至完全推倒原来的设计。实现完成后,很多人就认为任务完成了,可以提交测试了。写完代码,检查下,自己阅读下代码,补充注释,删繁就简,这个工作是当下多一小时,未来少十小时的杠杆工作,还可以降低代码的 bug 率,提高代码可读性可维护性。自测保证代码的质量,可以从功能、性能、稳定性、并发四个方面进行。自测的内容很多,实际操作就是写完代码,跑下功能,多跑几次,几个并发一起跑个几分钟。文档一般是程序员任务的最后一个环节,也可以在之前的几个阶段积累。文档包含程序的设计文档,必要的关于功能的说明,比如服务的接口文档,功能的使用方式,还有一些必要的自测试的结论。写好文档,就可以和代码的一起交付给测试,开始代码的下一个生命周期了。
从需求的沟通,到文档的输出,是程序员开发任务的一个闭环,即代码和文档的交付是一个程序员某个任务完成的标志。单纯的代码提交仅仅是写完代码了,不意味着整个任务的完成,文档不仅是对这次任务的总结,也是这次任务质量的一个保证。当一个程序员完成文档输出,并通过了交付评审,意味着他可以开始下一个任务了。有人说,还有 bug 修复,bug 修复属于另一个流程,不属于上述开发中的一环,它应该属于测试中的一个环节。