|从P5到P7,我眼中的阿里人才观
经常会有读者问我以下类似的问题:达到什么水平才能进阿里?阿里的 P6 有哪些要求?我想进阿里 , 我要准备什么?到底什么样才算是高级开发?
本文插图
图片来自 Pexels
刚好现在自己在阿里待了 5 年了 , 前 4 年里经历了两次晋升 , 从 P5 到 P7 , 算是大概了解了一些阿里对于人才的要求 。
在阿里的这 5 年里 , 经历了太多太多 , 我也从一个刚刚毕业的懵懂少年 , 成长成一个独当一面的技术专家了 。 也回过头思考了很多很多 。
所以 , 今天斗胆来谈一谈我认为的阿里的人才观 , 试着回答一下这几个问题 。 本文所有内容都是我的个人观点 , 所有言论仅代表我个人 , 不代表我供职的公司!!!
其实最近两年自己一直在做面试官 , 也面试过很多优秀的人 , 心里大概有一个标准 , 知道什么样的人才是我们想要的人 。
但是这个标准我一直都没有仔细的去思考过 , 刚好最近有时间 , 我好好的思考了一下 , 根据我的理解 , 谈一谈我认为的阿里的人才画像是怎样的 。
我觉得阿里需要的人才大概需要具备这几方面的能力:
- 软件开发能力
- 架构设计能力
- 项目管理能力
- 线上运维能力
- 业务理解能力
- 学习能力
- 影响力
- 目标导向
到阿里巴巴的招聘网站上 , 随便找几个 P6 的岗位 , 看一下岗位要求:
本文插图
本文插图
这些岗位描述和要求里面的内容 , 基本都能和以上几个能力对应的上:
架构设计能力:负责平台核心功能、公共模块的规划及架构设计 , 包括系统架构设计、接口规范制定、技术文档、单元测试的编写等 。
业务模型理解和抽象能力突出 , 参与科学决策、数字兴业、数字治理等相关系统的架构设计 , 承担核心模块的代码编写。
业务理解能力:业务理解和建模能力突出 , 能独立完成系统(或核心模块)的设计、开发和系统维护 。
软件开发能力:扎实的 Java/JEE 知识基础和功底(重点包括包括 JVM、类装载机制、多线程并发、IO、网络等) , 有比较优秀的动手能力 。
扎实的 Java 编程基础 , 理解 IO、反射、多线程、集合等 , 清楚 JVM 的原理 。
熟练掌握主流 Java 框架 , 并且能了解到它的原理和机制;熟悉 MySQL/Oracle 数据库中的一种或多种 , 有一定的 SQL 性能优化经验 。
良好的面向对象设计能力 , 对互联网高并发、高可用和高复用有一定的理解和实践 , 熟悉分布式技术(包括缓存、消息系统、热部署、JMX 等)优先 。
线上运维能力:具有比较强的问题分析和处理能力 , 有比较优秀的动手能力 , 热衷技术 , 精益求精 。
目标导向:有强烈的责任心 , 抗压能力强 。
项目管理能力:保障业务系统的稳定性和项目质量 , 参与平台核心系统的架构设计 。
业务理解能力 、学习能力:业务理解和学习能力强 , 善于与商业/合作伙伴交流 , 有很好的适应和沟通能力 , 具备责任心、耐心、细心的品质 。
以上的岗位描述中 , 对于一些能力的描述都是使用了一些形容词或者程度副词 , 如突出的、扎实的、比较优秀的、熟悉、熟练掌握、比较强的、有强烈的、强、善于、很好的等 。
那么 , 到底什么样算是优秀?做到什么程度又算是扎实、熟练呢?又要怎么做才能达到突出呢?
接下来我分别说说对于阿里的 P6 这个层级 , 以上这些能力大概需要达到什么样的标准 。
本文插图
1.软件开发能力
对于一个程序员来说 , 软件开发能力当然是一个最最基础的能力了 , 很多面试主要考察的也都是软件开发能力 。 那么 , 到底需要掌握哪些知识 , 才能达到阿里的 P6 的标准呢?
在回答这个问题之前 , 我看了很多大厂的招聘要求 , 并且回顾了一下以往面试时自己对于候选人的要求 , 大概总结出一些我认为比较重要的知识点 。
可以说 , 如果以下这些知识点 , 候选人不能完全掌握的话 , 面试挂掉的概率很大:
Java 基础:这个是最最基本的 , 像集合类、IO、反射这些常见的内容一定要做到如数家珍 。
并发编程:这个也是面试很看重的知识点 , 对于线程安全问题、相关关键字的用法及原理、并发包等知识也要掌握 。
JVM 相关:这部分几乎是面试必考!JVM 内存结构、GC 相关的、调优、类加载等等这些的原理都要有了解的 。
框架相关:目前主流的一些框架一定要了解的 , 如 Spring 等开源框架 ,要知道用法及重要特性的原理 。
分布式相关:这是大厂比较看重的一点了 , 对于分布式理论知识、缓存、消息、RPC 等工具的用法和原理有了解的话 , 面试会轻松很多 。
高并发、高性能方面:这部分也是挺重要的 。
数据库相关知识:如 MySQL 的一些知识、锁、隔离级别、事务、索引等等 。
数据结构与算法:这部分很多公司喜欢问一些算法题 。
那么 , 具体如何衡量自己的知识面和深度是否足够呢 , 有一个简单的办法 , 那就是打开我之前总结的《Java 工程师成神之路》 , 从头到尾浏览一下知识点列表 。
如果你能满足以下要求 , 那么说明你已经基本达到了:
- 基础篇 , 掌握 70% 。
- 底层篇 , 掌握 60% 。
- 进阶篇 , 掌握 50% 。
- 高级篇 , 掌握 30% 。
2.架构设计能力
很多人会认为 , 我只是一个做开发的 , 又不是架构师 , 为什么要求我有架构能力呢?
之所以有这个要求 , 其实也能理解 , 因为一个 P6 在公司内部的定位应该是一个系统或者一个域的 Owner , 他需要负责这个系统和这个域的系统设计 , 那么就需要具备一定的架构设计能力 , 这样才能设计出合理的系统 。
要想设计出好的架构 , 我觉得需要几个方面:
- 了解常见的架构设计原则 。
- 对于常见的架构问题的解决方案有了解 。
- 有一定的架构经验 。
除此之外 , 还需要对于常见的架构问题的解决方案有了解 , 很多人觉得这个好像离开发很远 , 到底什么是架构问题的?
其实并不远 , 简单点说 , 分布式一致性问题、性能问题、高并发问题 。 这些都可以理解为是架构问题的 , 所以 , 需要掌握的就是一些分布式相关知识 。
如果你能把以下几个问题回答好 , 那么你算是对于这些问题有一定的理解了:
- 如何分布式系统的解决数据一致性问题
- 说一下想要设计一个高并发的秒杀系统 , 都需要做哪些事情?
好像很多公司有专职的项目经理 , 但是在阿里的的大部分技术团队 , 都是不设立纯项目经理职位的 , 一般都是由项目组中的某位技术人员兼任项目经理角色 , 负责项目推进 。
所以 , 一般一个小型项目 , 都会需要一个 P6 来担任 PM 的 。 那么相关管理的能力就至关重要了 。 一般需要可以作为负责人领导部门内跨团队的项目 。
首先最基本的要求就是需要把控项目进度以及项目质量 , 这个就需要有很好的协调能力 , 可以在项目中很好的了解到成员的情况 , 适当的想办法解决合作的问题 。
稍微高一点的要求 , 就是要求可以提前预知项目风险 , 并给出建设性建议 。 如果能够做到这一点的项目经理 , 就算是比较优秀的了 。
还有一点我觉得也是比较重要的 , 那就是在项目管理中 , 如何协调业务方以及开发团队之间的矛盾问题 , 如何做到业务方满意 , 又让兄弟们不那么累 。 好的办法就是既要适当降低业务方的预期 , 又要提升兄弟们的战斗力 。
还有一点 , 我觉得也挺重要的 , 那就是项目经理需要保护项目组好兄弟们 , 不要因为项目倒排就压榨兄弟们的时间 , 因为加班一方面会影响兄弟们的身体健康 , 另外加班加点上线的项目 , 一旦出了故障 , 还是需要兄弟们扛的 。
本文插图
4.线上运维能力
我之前看过一份调查报告 , 在雇主调查中 , 雇主们最希望程序员掌握的技能列表中 , 问题排查能力是排在前三名中的 。 而问题排查就是线上运维的能力之一 。
不要以为线上运维就是专职的运维人员的工作 , 其实不是的 。 还是那句话 , P6 的人是一个系统或者一个域的 Owner , 他是要对这个系统的所有情况都负责的 。
从开发到上线再到后期运维 , 他都要完全掌握 , 要知道线上的正常水位是怎样的 , 什么指标是存在问题的 。 出了问题之后又如何排查 , 这些都是至关重要的技能 。
关于这种部分 , 其实需要掌握的知识点并不是特别的多 , 主要有以下这些:
- 常见的 Linux 命令的使用 。
- 常见的服务器指标(Load、CPU、内存、GC 情况等)的查看、问题排查 。
- 系统调优、性能调优、SQL 优化等技能 。
- 常见问题排查思路 。 如死锁问题、慢 SQL 问题、内存溢出问题、Load 飙高问题等等 。
我在面试的时候 , 最开始都会问一下和业务有关的 , 如果候选人对于自己负责的业务都不是很理解的话 , 那么基本就很难过关了 。
因为技术是服务于业务的 , 尤其是一个业务开发 , 如果自己做的业务都不了解 , 只是机械的完成自己负责的小功能的话 , 那么我不认为他是一个好的开发人员 。
而且 , 我们希望一个达到高级开发的人 , 不只是一个只会做业务需求的人 , 达到这个层级的人 , 需要有自己的判断 , 先用嘴解决需求 , 不行的话再用代码解决 。
我之前写过一篇文章 , 关于砍需求 , 大概阐述了一些我的观点:在家办公的我 , 砍需求砍得更狠了 。
一个好的 P6 应该是可以独立负责一个业务 , 并且分辨出需求的优先级 , 能够提出自己的意见 。 可以影响业务的走向的 。
所以 , 针对大部分程序员来说 , 首先要理解业务 , 然后要尝试着提出自己意见 , 并且可以分辨出需求的优先级 , 并且敢于对不合理需求说不 。
当然 , 在提出问题的和意见的时候 , 如果能够给出好的方案 , 那就更好了 。 大多数情况下 , 技术人员应该是整个项目组最了解业务的 , 毕竟代码是他写的 。
6.学习能力
学习能力不用我说 , 大家一定都觉得他很重要 , 这是毋庸置疑的 。 但是经过这么多面试下来 , 我发现 , 这个能力并不是所有人都具备的 。
P6 这个层级在阿里并不是一个很高的层级 , 还有很大的上升空间 , 所以 , 真的需要很强的学习能力才能不断的提升自己 。
而且 , 我理解的学习能力 , 不仅仅是快速学会一个知识 , 而是可以在实际工作中运用他 。
所以 , 我面试的时候 , 一般会通过以下几个问题考察候选人的学习能力:
- 你知道最新版的 JDK 是哪个版本么?新特性知道吗?
- Java 8 的 Lambda 表达式用过吗?
- 最近在看什么技术书籍吗?有什么技术是你刚刚学会的吗?
7.影响力
影响力 , 这一点看起来很虚 , 但是确实也很重要的 , 这也是为什么很多招聘要求中会写''有开源项目经验优先''的一个原因之一 。
从外面招人的话还不是特别的明显 , 阿里内部的晋升在影响力方面比较看重 , 因为提名晋升是要可以服众的 , 那么怎么让别人信服?那就是这个人有足够的影响力 。
一般来说 , 对于一个 P6 的工程师来说 , 要求是要在自己的团队内部有一定的影响力 , 可以被团队内重视 , 一提到某个领域 , 大家第一个想到你 。
提升影响力的方式有很多 , 比如经常帮助团队内同学解决技术问题、经常在团队内部做技术分享 , 经常分享技术文章等等 。 还有一些比如开源项目、专利、著作等也是很好的提升影响力的方式 。
但是其实 , 影响力这东西 , 并不是刻意培养就能做得到的 , 这个是一个潜移默化的过程 。 真的做到可以正面的影响到别人 , 影响力就出来了 。
8.目标导向
很多招聘都会说要求有钻研精神、责任心、抗压能力强等 , 很多人理解是要求能加班 , 但是其实这是对于候选人是不是目标导向的一个筛选 。
对于 P6 来说 , 目标导向就是可以做到指哪打哪 , 交给你的工作 , 你可以全力的把他做好 , 无论遇到什么样的困难 , 都可以想办法去克服 。
目标导向 , 还可以换成一个词 , 那就是要性 , 一个要性强的人 , 必然是目标导向的人 。 ''要性''就是代表着我不仅想做 , 我还一定要做成 。
本文插图
9.总结
以上 , 分别从 8 个方面说了一下优秀的程序员 , 或者说一名高级开发工程师应该具备哪些能力 。
说了很多很多 , 我的一些理解 。 相信很多人会有不同的意见 , 这也是正常的 , 每个人的人才观都不太一样 。
至少我面试的时候 , 招人的一个标准 , 就是和他聊下来之后 , 我觉得我可以和他很好的合作 , 可以把我认为重要的事情交给他的 , 那么他就可以通过我的面试了 。
那么 , 如何在面试中给到我这种信任感 , 那就是让我觉得他技术能力不错 , 有一定的架构思维、有线上问题排查的能力、了解自己的业务、可以负责一个项目的管理、也能快速的学习一些新的知识 。
另外 , 如果可以让我感受到他是一个目标导向的人 , 并且有一定的影响力的话 , 那么我会更加愿意接受他 。
以上 , 这 8 点 , 不仅仅是对 P6 这个层级的要求 , 其实不同的层级都适用 , 只是针对具体某一项 , 不同层级的要求不同而已 。
当然 , 其实我并不觉得这只是阿里的要求 , 因为我只是在阿里当过面试官 , 所以我只能表达下我认为的阿里需要的人才是什么样的 。
如果以后我去到其他公司了 , 或者自己创业了 , 那么我相信我招人的标准也一定还是这个 。 因为我始终认为 , 高级开发工程师 , 一定不仅仅是写代码的 。
最后 , 希望我今天的文章可以让你找到一点方向 。 愿所有读者:长风破浪会有时 , 直挂云帆济沧海 。
作者:Hollis , 一个对 Coding 有着独特追求的人 。
编辑:陶家龙
【|从P5到P7,我眼中的阿里人才观】出处:转载自公众号Hollis(ID:hollischuang)
推荐阅读
- 米歇尔·戴斯玛克特|海奥华预言的真相,地球人被带到九级文明,揭开神话背后的秘密
- 从小就馋此口,比肉香多了,几块钱做一大盘,咋吃都不腻
- 这早餐我从3岁开始吃,三十多年了,从没吃腻过,晶莹剔透很好吃
- 萝卜做饺子馅时,到底要不要焯水?很多人都不清楚,吃完告诉家人
- 显微镜|假如人类可以把显微镜提升到40亿倍,是不是全新的宇宙观?
- 火星|拍摄11064张照片后,火星毅力号看到了什么?这次还真看到了
- 冬天到了,教你几道暖胃家常菜,营养健康,孩子营养不发愁!
- 水煮鱼到底怎么做即简单还好吃呢?下面三款家常做法你觉得怎样?
- 孩子特爱吃的煎饼,颜色鲜艳,营养美味,2分钟出锅,看到就想吃
- 豆腐不要红烧了,教你做外脆里嫩的炸豆腐,家人吃到赞不绝口
