背景
笔者是一位经历比较丰富的码农,头部大厂和初创公司都待过,体验过很多不同风格的团队。最近又加入了一个新团队,工作 3 年以内的同学占了大多数。为了能够尽快提升团队的战斗力,最近花了不少精力去思考和总结,希望能从过往积累的知识和经验中提取一些经典的思想和理论,在宏观层面梳理清楚团队未来的技术成长方向,对齐思路,让团队内部能够形成一股“合力”。最终希望达到的效果是:个人可以借助团队的势,让自己的成长事半功倍;团队可以汇集每个人的成长成果,不断进化。
另外,从管理角度来讲,统一的价值观可以大大降低管理成本,虽然比较难量化,但是带过团队的人肯定都有所体会。让价值观统一,是比较难的事,需要一直反复强调,不断增强团队成员的认知,也请各位读者在理解理论后注意落实情况。
本文内容具有较高的普适性,适合绝大多数程序员,甚至非技术人员阅读。只有“技能框架”的部分内容较偏前端。
正文
程序员的价值体现
笔者对其理解为:
能够利用 “技术手段” ,尽最大可能 “快(速度)、好(质量)、省(成本)” 地实现一个 “让用户满意的产品” 。
“实现产品功能”是基本职责,“快、好、省”是价值体现,“技术”是手段之一。
如何“快、好、省”
这是贯穿程序员整个职业生涯的“核心问题”,只不过不同阶段会有不同的视角和侧重点。这是一个足够大的主题,可以写一个系列文章。为了不影响本文的内容结构,这里先列出个思路大纲,不做具体展开,在后文的“程序员的成长阶段”会有一定的细节体现。
- 对线上环境怀有敬畏心;聚焦并解决问题是第一优先级;
- 代码复用;代码解耦;流程化;规范化;自动化;有梯度;
- 提高开发效率;降低维护成本;增强 ownership;减少沟通损耗;
段子 VS 现实
新手最容易出的问题就是被“带节奏”,不分领域,不分行业,程序员也不例外。既然我们是职业的,那就要足够的专业,要用独立而专业的眼光去看问题:
- 不要说这个功能实现不了,而要说怎样才能实现,需要付出多少成本;
- 不要把调侃当做现实,产品经理和程序员从来不是敌对关系;
- 不要试图用黑话自欺欺人,如果你没有给别人讲明白,那就是你没真明白;
- 不要想着上来就改变世界,先从优化你的项目和团队开始;
- 不要过度抽象(设计),虽然“任何问题都可以通过加一个中间层来解决”,但是每多一层抽象,维护难度会呈指数级增加;
- 不要给自己设边界,每天以“码农”自居,要在更大范围寻找最优解;
程序员的成长阶段
成长一定是一步一步的,我们在羡慕那些大牛,能够画出结构复杂的架构图,能够写出 10k stars 的 repo,能够三言两语优化团队一周工作量的时候,也要客观的认识到他们也是一步一步走到今天这个高度的。
人的精力是有限的,当你还需要通过查文档来实现数组排序时,你是不可能有精力去思考别的问题的。而且人类对于过于超出自己掌控的事情会有天然的抗拒甚至恐惧。我们要客观的认识到这点,接收甚至利用它来成长。
所以正确的做法是,尽快把当前等级的经验“拉满”,然后升个区,继续打怪攒经验升级。上来就打 BOSS,除了死,就是死的很惨了。怎么算拉满呢?举个例子,当让你去接入微信第三方登录时,你脑子里立刻出现 APP_ID,SECRET_TOKEN,JWT,SSO……等概念,通过查看文档,一个下午就能够画出整个流程的时序图。这就证明你在第三方接入这块,已经构建出了系统的知识体系,可以算是拉满了。
上面举的这个例子其实不够恰当,而且容易“吓”到新手同学。实际上把 React 全家桶、Ant Design、Vue 全家桶的 API 记的很熟练,也是一个阶段的经验拉满,也足够升一级了。
下面是真正的干货,列举了每个阶段程序员需要关注的重点,以及推荐做法,请仔细阅读
Step 1 - 个人能力提升
“任何傻瓜都能写机器可执行的代码,而优秀的程序员写的代码傻瓜都能看懂。”——Martin Fowler
- 熟悉语言、框架、工具、库,并对同类方案进行总结对比;
- 积累常见业务场景的代码最佳实践,如表单、表格、弹窗等;
- 带着实际场景研究技术,多做实践 demo,多读经典书籍;
Step 2 - 团队效率提升
“谨记,你是在寻找最好的答案,而不是你自己能得出的最好答案。”——Ray Dalio
- 熟悉开发、工程、协作规范,并提供最适合团队的解决方案;
- 熟悉工程化、自动化方案,提升流程效率,降低人工影响;
- 提供高质量、可复用的代码、组件或技术方案,即符合当前业务的最佳实践;
- 总结可传承的经验,带新人,教学相长;
Step 3 - 团队管理建设
“Context not Control.”——Netflix
- 了解团队情况,明确招聘需求,落实招聘工作;
- 建立分享、评审、团建等机制,提高团队技术能力及凝聚力;
- 具有架构设计能力,明确模块边界,让模块的复杂性有梯度;
- 有项目管理的知识和方法论储备,科学拆解任务,合理协调团队资源;
- 具备跨领域基本知识和方法论,如产品、交互、运营等,从更大范围寻找最优解;
程序员的技能框架(偏前端)
这部分就更细节了,也是最具有实际意义的部分。无论是诊断个人技术能力、规划团队技术成长方向、设计面试题库,还是单纯拿出来展(zhuang)示(bi),都可以作为参考。也希望大家留言补充,一起完善这部分内容。
编程能力
- 语言基础
- IDE、Terminal 等工具
- 主流框架、库、包
- ……
最佳实践
- 框架/库对比
- 场景解决方案
- 架构设计
- 理论思想
- ……
开发规范
- Lint 规则、工具
- 代码规范
- 文档模板
- 流程协作规范
- 目录、文件规范
- ……
工程/自动化
- 云计算
- 监控、报警、埋点
- CI/CD
- Unit/E2E Test
- ……
其他
- 提效工具
- 项目管理
- 产品思维
- 跨领域知识
- ……
结语
程序员是最典型的脑力劳动者,“终身学习,不断成长”是我们这行的基本要求,这也恰恰是我们实现自我价值的途径。本文先论述了程序员的价值体现,然后粗略描绘了程序员的成长阶段,最后尝试列出具体可提升的能力点。目的是想从宏观到微观,从理论到实际的给出参考,希望对大家有所帮助。
最后来碗鸡汤(血),与大家共勉