程序员应当是终身学习型人才,学习的目标是使自己获得成长。今年的自己比去年的自己有进步,这就是成长。不要将做了多少项目作为评判依据,而要看自己的技能库里有没有新东西、担当的责任是不是变大了、职级是不是上升了。
所以成长的第一步是要学会学习。可能有人会有疑问,学习谁还不会,不都是寒窗苦读出来的吗?然而,在实际工作中解决问题和考试并不一样,这需要综合能力的提升,我们看一下《程序员的README》中提出的好方法。
首先,在实践中学习。按照“二八定律”来看,学会一门新语言 20% 的特性就可以完成 80% 的实际工作。所以不要想着把知识都学完才应用,要在做中学。
其次,向高手学习。高手的输出都是可以学习的内容,例如,开源项目的代码、技术博客文章、专题演讲等。在公司里,如果有机会能和高手进行结对编程,那就是进步最快的方式。
最后,提出正确的问题。不要随便将一个模糊抽象的问题抛给别人,在工作中提问一定要具体并提供有意义的细节。同时要注意提问的方式,书中提出的“非打扰式交流”就很有借鉴意义。
是不是做到以上方法就能稳步成长呢?还真不一定,因为要识别自己是否出现“冒充者综合征”或者“邓宁-克鲁格效应”,以做出正确应对。前者是极不自信、自我怀疑的心理状态,明明有实力,却施展不开;后者是盲目自信,认为自己都是对的,错的都是别人。
从心理上克服成长障碍,需要自我觉察,并且能够主动寻求帮助,找到真正的自我,在学习中不断成长。
要对程序员的工作水平进行评判,就看交付成果的水准如何。新手交付的大多是“能用”,而资深程序员交付的一定是“可靠”。
能用只是达到一项工作的最低要求,远不能让人放心。而可靠则是稳定的预期,从代码质量到程序运行高可用。即使出现故障,也能将破坏性控制到最小范围,并快速定位和解决问题。
要成为一名交付可靠的程序员,需要做到从《程序员的README》中提炼出的三个方面:编写良好代码的实践、负责任的测试、自动化构建发布工作。
这项工作的第一点,就是要编写可维护的代码。书中提出要采取防御式编程原则,以此保证代码的安全与弹性,为此列举了包括避免空值、验证输入、构建幂等系统在内的10条方法。
在程序运行期间则要通过日志和监控手段持续关注代码的质量,书中对此又提出了日志分级、不要记录敏感数据、测量一切等原则。
第二点,是认真参与代码评审工作,以提升代码质量。代码评审能产生三项明显的效益:一是从他人的代码中学到更好的技巧与方法;二是有助于发现隐藏的 bug;三是在团队中共享信息,利于协作。
书中对准备自己的代码给别人评审,以及如何评审他人的代码都做了详细的说明。总之,不要将个人情绪带入代码评审中,将这看成成长的机会吧。
新手会倾向于写完全部代码之后,验证一下正常功能就提交测试。这样并没有尽到自己对代码的责任,负责任的做法应当是编写单元测试,力争覆盖所有代码分支路径,并有正向测试用例和反向测试用例。
在保证基础功能正确的前提下,还要进行集成测试、性能测试、系统测试。书中为此也提出了关于测试确定性的9项原则,包括不要在单元测试中调用远程系统、记得关闭网络套接字和文件句柄等。
开发工作之后,程序上线之前有4个阶段,分别是构建、发布、部署、展开。主要工作是编译打包,提交运维去安装,在生产环境中配置部署,启动运行等。
不要试图手工执行编译操作、手工复制程序到线上环境去部署。应当使用自动化工具或者编写脚本去完成构建发布工作,书中针对每个阶段都提出了注意事项,并且列举了不少第三方自动化工具。
软件交付流程做到以上三件事,程序员就能够交付可靠。如果还能再做好一件事,那就值得让老板托付所有的信赖了,这就是随时响应能力。
《程序员的README》对于 On-Call 能力的论述,在其他同类书籍中并不多见,却非常宝贵地揭示出这其实是一项重要的软技能。书中对于 On-Call 的描述是一项专门的工作任务,要跟随支持团队为线上服务提供随时响应的支持。
其实国内互联网行业的程序员,基本都处于 On-Call 状态,手机 24 小时保持畅通,随时待命解决紧急问题。但新手在遭遇突发状况时会做出不理智的处理。例如,推诿责任、胡乱操作,甚至关掉手机拒绝沟通,这都是职业生涯的减分项。
看看正确的做法吧,书中的 On-Call 技能包有5项原则:随时响应、保持专注、确定工作优先、清晰的沟通、跟踪你的工作。就是说,要保持积极开放的心态,不要慌张,专注于问题本身,判别清楚故障等级,以简洁准确的描述寻求技术支持,最后记录解决问题的过程。
所以,你最好的能力是随时响应,做出合理应对并控制影响范围,在事后总结复盘,进行改善修复,避免发生同类问题。
学习到这一步,你已经向着资深程序员迈出了坚实的步伐,再具备两项技能,你就能成为程序员之中的王者:一是软件架构设计能力,二是管理能力。
做好架构设计的核心,在于能以简单的技术方案解决复杂的软件需求。书中提出了构建可演进的架构以适应软件的复杂变化。这需要综合运用 MVP(Minimum Viable Product,最小可行产品)、最小惊讶原则、DDD(Domain-Driven Design, 领域驱动设计)等方法。
管理能力包含两个方面,一是对软件开发过程的管理,二是对上下级人员的管理。书中详细说明了 Scrum 敏捷方法用于推动软件开发的实践,还对涉及人员管理的沟通和谈话技巧给出了翔实的建议。
书中用来说明观点的穿插小故事非常有趣,两位作者克里斯和德米特里现身说法,没少拿自己开涮。看完本书你一定会对这两位老兄印象深刻,你会发现大佬也是这么过来的。
这份专门写给程序员的 README 你看明白了吗?走上自己的王者之路吧。