程序员如何通过成长体现价值

738 阅读7分钟

背景

笔者是一位经历比较丰富的码农,头部大厂和初创公司都待过,体验过很多不同风格的团队。最近又加入了一个新团队,工作 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
  • ……

其他

  • 提效工具
  • 项目管理
  • 产品思维
  • 跨领域知识
  • ……

结语

程序员是最典型的脑力劳动者,“终身学习,不断成长”是我们这行的基本要求,这也恰恰是我们实现自我价值的途径。本文先论述了程序员的价值体现,然后粗略描绘了程序员的成长阶段,最后尝试列出具体可提升的能力点。目的是想从宏观到微观,从理论到实际的给出参考,希望对大家有所帮助。

最后来碗鸡汤(血),与大家共勉

努力一点点.jpeg