来自 Google 官方的代码评审最佳实践-摘录

  • 文章地址
  • CR的标准
  • 在 CR 中要看些什么
  • 如何浏览这次改动(CL)
  • Review 的速度
  • CR 要多快?
  • 速度 vs 中断
  • 快速回应

文章地址

原文地址:https://mp.weixin.qq.com/s/zIiDk7rcIKgvqh0YAvQPaA

英文地址:https://github.com/google/eng-practices/

CR的标准

  • Reviewer 有责任保证CL的质量,作为Review的代码的Owner
  • Reviewer不应追求完美,而应追求持续改进
  • CR要具有指导意义
  • 代码风格应该与现有的一致。如果项目没有统一风格,那就接受作者的风格
  • 解决冲突难以达成共识时,需要面对面或者拉起更大的团队讨论,带上Leader

在 CR 中要看些什么

  • 代码经过完善的设计
  • 功能性对于使用者们是好的
  • 对于任何UI改动要合理且好看
  • 任何并行编程的实现是安全
  • 代码不应该复杂超过原本所必须的
  • 开发者不该实现一个现在不用而未来可能需要的功能
  • 代码有适当的单元测试
  • 测试经过完善的设计
  • 开发者对于每样东西有使用清晰、明了的命名
  • 注释要清楚且有用,并只用来解释why而非what
  • 代码有适当的写下文件(一般在g3doc)
  • 代码风格符合style guide
  • 确保你查看被要求review的每一行代码、确认上下文、确保你正在改善代码质量,并赞扬开发人员所做的好事与优点吧!

如何浏览这次改动(CL)

步骤1: 用宏观的角度来看待改动,查看CL描述以及它做什么步骤2: 检查CL主要的部分步骤3: 用合理的顺序看CL 其余的改动

Review 的速度

为什么 Review 速度要快?

在Google我们优化开发团队 共同生产产品的速度,而不是优化个人开发的速度。个人的开发速度很重要,但它不如整个团队的开发速度重要。

CR 如果很慢,则:

①、团队整体的速度下降。

②、开发人员开始抗议 cr。

③、代码质量会收到影响。review 慢时,开发者提交的压力大。

CR 要多快?

如果你并没有处于需要专注工作的时候,那么应该在 review 完后尽快修改。回复最长的极限是一个工作日。

速度 vs 中断

我们可以在投入到处理他人给的review评论之前,找个适当的时机点来进行cr。这有可能是当你的当前开发任务完成后、午餐、刚从会议脱身或从微型厨房回来等等。

快速回应

个人回应评论的速度,比起让整个 cr 过程快速结束更重要。

 若在整个过程中能快速获得来自 reviewer 的回应,大大减轻开发者对缓慢 cr 过程的挫败感。

 reviewer员要花足够的时间来进行review,确保他们给出的LGTM,意味着“此代码符合我们的标准”。

 理想的个人的回应速度还是越快越好。

算法题题库

序号题号题名难度URL标签备注
17171比特与2比特字符简单https://leetcode-cn.com/problems/1-bit-and-2-bit-characters/数组简单,使用过
250Pow(x, n)中等https://leetcode-cn.com/problems/powx-n数学,二分查找简单,使用过 
469x 的平方根简单https://leetcode-cn.com/problems/sqrtx/数学,二分查找简单,使用过注意边界,不能用库函数
51006笨阶乘中等https://leetcode-cn.com/problems/clumsy-factorial数学简单,使用过
6984不含 AAA 或 BBB 的字符串中等https://leetcode-cn.com/problems/string-without-aaa-or-bbb贪心算法中等,使用过 
8299猜数字游戏中等https://leetcode-cn.com/problems/bulls-and-cows哈希表中等,使用过 
14849到最近的人的最大距离简单https://leetcode-cn.com/problems/maximize-distance-to-closest-person/数组简单,使用过 
18236二叉树的最近公共祖先中等https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree中等 
19111二叉树的最小深度简单https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/树,深度优先搜索,广度优先搜索简单
24560和为K的子数组中等https://leetcode-cn.com/problems/subarray-sum-equals-k数组,哈希表简单,使用过
4961旋转链表中等https://leetcode-cn.com/problems/rotate-list链表,双指针简单
7354螺旋矩阵中等https://leetcode-cn.com/problems/spiral-matrix/数组中等,使用过
7471简化路径中等https://leetcode-cn.com/problems/simplify-path/submissions/栈,字符串简单,使用过
51468验证IP地址中等https://leetcode-cn.com/problems/validate-ip-address字符串简单,使用过
56678有效的括号字符串中等https://leetcode-cn.com/problems/valid-parenthesis-string字符串中等,使用过 
64459重复的子字符串简单https://leetcode-cn.com/problems/repeated-substring-pattern/字符串简单,使用过
2393复原IP地址中等https://leetcode-cn.com/problems/restore-ip-addresses字符串,回溯算法中等 
3222括号生成中等https://leetcode-cn.com/problems/generate-parentheses字符串,回溯算法中等
4046全排列中等https://leetcode-cn.com/problems/permutations回溯算法简单,使用过
6677组合中等https://leetcode-cn.com/problems/combinations回溯算法简单
63149直线上最多的点数困难https://leetcode-cn.com/problems/max-points-on-a-line/哈希表,数学中等,使用过
483无重复字符的最长子串中等https://leetcode-cn.com/problems/longest-substring-without-repeating-characters哈希表,双指针,字符串,Slinding Window 
9372超级次方中等https://leetcode-cn.com/problems/super-pow数学
57367有效的完全平方数简单https://leetcode-cn.com/problems/valid-perfect-square/数学,二分查找简单
44495提莫攻击中等https://leetcode-cn.com/problems/teemo-attacking数组简单
41746使用最小花费爬楼梯简单https://leetcode-cn.com/problems/min-cost-climbing-stairs/数组,动态规划 
4333搜索旋转排序数组中等https://leetcode-cn.com/problems/search-in-rotated-sorted-array数组,二分查找简单
6739组合总和中等https://leetcode-cn.com/problems/combination-sum数组,回溯算法简单
68670最大交换中等https://leetcode-cn.com/problems/maximum-swap数组,数学中等,使用过
50287寻找重复数中等https://leetcode-cn.com/problems/find-the-duplicate-number数组,双指针,二分查找 
60209长度最小的子数组中等https://leetcode-cn.com/problems/minimum-size-subarray-sum数组,双指针,二分查找 
28134加油站中等https://leetcode-cn.com/problems/gas-station贪心算法 
38321拼接最大数困难https://leetcode-cn.com/problems/create-maximum-number/贪心算法,动态规划 
26991坏了的计算器中等https://leetcode-cn.com/problems/broken-calculator贪心算法,数学中等,使用过
291053交换一次的先前排列中等https://leetcode-cn.com/problems/previous-permutation-with-one-swap贪心算法,数组 
4555跳跃游戏中等https://leetcode-cn.com/problems/jump-game贪心算法,数组中等 
65784字母大小写全排列简单https://leetcode-cn.com/problems/letter-case-permutation/位运算,回溯算法 
39169求众数简单https://leetcode-cn.com/problems/majority-element/位运算,数组,分治算法简单,使用过
52331验证二叉树的前序序列化中等https://leetcode-cn.com/problems/verify-preorder-serialization-of-a-binary-tree中等,使用过
341019链表中的下一个更大节点中等https://leetcode-cn.com/problems/next-greater-node-in-linked-list栈,链表 
5520有效的括号简单https://leetcode-cn.com/problems/valid-parentheses/栈,字符串简单 
37148排序链表中等https://leetcode-cn.com/problems/sort-list/排序,链表 
35518零钱兑换 II中等https://leetcode-cn.com/problems/coin-change-2/
54794有效的井字游戏中等https://leetcode-cn.com/problems/valid-tic-tac-toe-state递归,数学 
3670爬楼梯简单https://leetcode-cn.com/problems/climbing-stairs/动态规划中等
62650只有两个键的键盘中等https://leetcode-cn.com/problems/2-keys-keyboard动态规划 
71673最长递增子序列的个数中等https://leetcode-cn.com/problems/number-of-longest-increasing-subsequence动态规划使用过 
46691贴纸拼词困难https://leetcode-cn.com/problems/stickers-to-spell-word/动态规划,回溯算法 
42215数组中的第K个最大元素中等https://leetcode-cn.com/problems/kth-largest-element-in-an-array堆,分治算法简单,使用过 
311054距离相等的条形码中等https://leetcode-cn.com/problems/distant-barcodes堆,排序 
70973最接近原点的 K 个点中等https://leetcode-cn.com/problems/k-closest-points-to-origin堆,排序,分治算法 
691046最后一块石头的重量简单https://leetcode-cn.com/problems/last-stone-weight/堆,贪心算法简单 
17354俄罗斯套娃信封问题困难https://leetcode-cn.com/problems/russian-doll-envelopes/二分查找,动态规划
11127单词接龙中等https://leetcode-cn.com/problems/word-ladder/广度优先搜索 
15491递增子序列中等https://leetcode-cn.com/problems/increasing-subsequences深度优先搜索 
13200岛屿数量中等https://leetcode-cn.com/problems/number-of-islands深度优先搜索,广度优先搜索,并查集中等,使用过 
58109有序链表转换二叉搜索树中等https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree深度优先搜索,链表 
12695岛屿的最大面积中等https://leetcode-cn.com/problems/max-area-of-island深度优先搜索,数组中等
5398验证二叉搜索树中等https://leetcode-cn.com/problems/validate-binary-search-tree树,深度优先搜索简单
16101对称二叉树简单https://leetcode-cn.com/problems/symmetric-tree/树,深度优先搜索,广度优先搜索简单
61513找树左下角的值中等https://leetcode-cn.com/problems/find-bottom-left-tree-value树,深度优先搜索,广度优先搜索简单,使用过
221043分隔数组以得到最大和中等https://leetcode-cn.com/problems/partition-array-for-maximum-sum 
3715Range 模块困难https://leetcode-cn.com/problems/range-module/线段树,Ordered Map 
47732我的日程安排表 III困难https://leetcode-cn.com/problems/my-calendar-iii/线段树,Ordered Map 
75564寻找最近的回文数困难https://leetcode-cn.com/problems/find-the-closest-palindrome/字符串困难
76102二叉树的层次遍历中等https://leetcode-cn.com/problems/binary-tree-level-order-traversal/树、广度优先搜索简单
7712整数转罗马数字中等https://leetcode-cn.com/problems/integer-to-roman/数组,字符串简单
7836有效的数独中等https://leetcode-cn.com/problems/valid-sudoku/哈希表中等
79845数组中的最长山脉中等https://leetcode-cn.com/problems/longest-mountain-in-array/双指针中等
8015三数之和中等https://leetcode-cn.com/problems/3sum/数组,双指针

后端开发能力模型(后端)v1.0

能力模型(后端)
   T3T4T5T6T7T8
岗位职责业务能力业务梳理和设计Xa. 能清晰的梳理和描述完整的业务流程,理解并指导开发工作b. 能指出明显的业务流程错误和不足a. 能发现业务流程中较深入的问题a. 帮助业务方设计合理的流程b. 用逻辑和数字作为辅助工具a. 使用数字和逻辑主动发现流程问题b. 主动推进流程的设计和改进 
开发能力




需求分析a. 能理解并分解小规模的需求并指导开发小规模 < 3pda. 能理解并分解中等规模的需求并指导开发中规模 < 10pda. 能理解并分解大规模的需求并指导开发大规模 < 30pd经验要求. 领导3个以上 10~20pd级别的项目a. 能理解并分解超大规模需求并指导开发超大规模 >= 30经验要求. 领导3个以上超过30pd的项目a. 有能力领导超过100pd的需求经验要求. 领导过5个以上超过50pd的项目 
架构设计XXa. 能理解架构设计原理b. 能理解自己参与的系统架构c. 能设计小规模的系统架构d. 能在设计中考虑并处理高并发问题/大数据量问题a. 深入理解架构设计和常用模式b. 能进行大规模的系统架构设计或大规模系统重构经验要求. 参与3个以上部门内系统架构的设计与实现,并至少负责其中1个子系统的设计与实现a. 能主导设计部门级系统架构b. 能参与规划公司的架构模型和演进方向c. 在设计中充分考虑并平衡 业务要求/可扩展性/并行开发能力/高并发要求/大数据量要求/高可恢复性 等经验要求. 领导3个以上部门内架构的设计与实现经验要求. 参与制定过部门级的年度技术规划a. 能主导设计公司级别的系统架构经验要求. 领导2个以上跨部门系统架构的设计与实现经验要求. 参与制定过公司级的年度技术规划
详细设计和编码a. 能理解设计的目的和常用设计模式,范式/反范式b. 能够使用UML图/ER图等工具c. 规避并处理常见的边界问题/异常问题等d. 代码严谨并符合代码规范e. 能够进行简单的领域建模a. 熟练掌握设计过程和工具b. 能在设计中考虑并处理幂等问题/一致性问题c. 代码高效d. 能处理基本的性能优化e. 熟练掌握常用的领域建模方法并用于实践a. 代码优雅,可扩展性强b. 掌握性能优化的常用规律和方法,能处理日常遇到的绝大多数性能问题c. 能优化领域模型或者重构a. 除个别case外完全处理日常遇到的各种技术问题和性能问题b. 具备丰富的领域建模经验,理解业务本质经验要求. 编写或抽取系统核心代码或核心结构,有效的提升开发效率和可读性经验要求. 编写过框架/中间件级别代码,能高效的处理一类业务问题 
测试a. 掌握单测和集成测试方法b. 构思工作中的测试方法并实现a. 掌握测试的常见场景和方法,能快速识别风险和影响范围,给出高效的测试方案b. 积累日常测试的工具和用例a. 设计相对长期的测试方法和测试用例,提升测试效率b. 掌握从可测试行角度出发设计和实现的能力c. 能从测试的角度出发影响详细设计和编码a. 能从测试的角度出发影响架构设计  
前端技能      
运维技能a. 能合理埋点和设置监控b. 使用shell/python分析问题c. 习惯性查看监控/日常并处理问题a. 高效的排查和解决问题b. 积累日常运维的工具和用例a. 能梳理和设计高效的监控体系/日志体系   
技术技能a. 基础过关,能熟练使用常用框架b. 知道常用组件的使用方法c. 知道常用中间件的使用方法a. 了解常用中间件的原理并用于排查问题a. 深入理解常用中间件中的至少一类b. 能够快速学习新知识技能,直接用于简单的日常应用a. 有擅长的技术,熟知其实现和原理,在团队内形成优势互补a. 是某一领域的专家,公司内解决该问题的大拿 
领导能力制定标准XX经验要求. 领导制定过团队内的标准经验要求. 参与制定过部门内的标准经验要求. 参与制定过公司级别的标准 
团队管理Xa. 能指导低级别工程师进行日常开发a. 有能力带领2-3人b. 敢于公开表扬a. 有能力带领5人以上的团队b. 了解每个人的能力,为每个人制定发展规划并实施c. 敢于维护公司的价值观并用于团队管理a. 有能力带20人以上的团队 
通用素质学习能力 a. 能快速了解任务和简单业务b. 能快速学习一个技术的用法a. 能迅速并深入理解新的业务和系统 a. 理解技术领域的最新动态并推进团队使用b. 对使用的技术有体系性的认知,在某一方面有特长并持续学习  
逻辑思维 a. 具备基本的逻辑思维能力和数字感b. 能简单的用于日常工作a. 能理解具备一定深度的逻辑链条 a. 能主动作有一定深度的逻辑思考b. 能利用手边的工具获取数据证明自己的观点a. 主动用严密的逻辑来规划工作和方案b. 具备用全面而恰当的数据证实或者证伪的能力  
沟通能力 a. 能在team内分享技术和业务,时间不少于30分钟a. 能在团队内分享技术和业务,时间不少于1个小时b. 能掌控并转换自己的表达方式以让对方听懂a. 在团队内做过有深度的分享,描述清楚并让大家听懂经验要求. 领导3个10pd以上跨团队项目的沟通工作a. 具备面试更低级别工程师的能力经验要求. 领导3个30pd以上跨团队项目的沟通工作经验要求. 做过公司级的分享经验要求. 领导5个以上超过50pd的跨团队项目的沟通工作