前言
阿里面试成功已经过去一个月了, 入职也已经过去十多天了, 趁着周末写点东西和大家进行一下分享, 本文会写到以下的内容:
个人一路走来的经历
未来的一些思考
我自己理解五年这个时间节点一名优秀程序员应当具备的技术素质
小广告时间
那这次加入的 BU 是菜鸟, 一个非常有发展前景的公司.
从校园出发, 走向阿里
工作五年, 标题却是 "四年努力", 实际上确实是这样, 2013 年从母校杭州师范大学毕业之后, 我和很多刚毕业的同学一样, 会没有目标, 找不到方向, 不知道未来到底要做什么, 所以大约有一年的时间是很迷茫的, 工作也就那样吧, 得过且过.
大约一年过后, 也就 14 年样子, 那个时候公司还在西湖科技园, 也许是自己的上进心作祟, 也许是母校学长马云情怀作祟, 有一段时间每天沿着石祥路回家, 就想着这辈子我一定要凭借着自己的努力进入阿里, 而且这种想法每天每天越来越强烈.
就像我公众号里面写的, 4 年前其实并没有现在这么多面试经或者程序员成长经, 虽然有心, 但是并不知道朝哪个方向去努力. 于是想了一个办法: 花了一个礼拜时间, 把 51job, 猎聘这些那时候比较有名的招聘网站里面的 Java 岗位通通看了一遍, 把每个岗位描述都写下来, 并进行整理和总结, 列了一份比较大的提纲, 作为自己的学习目标.
在这之后, 开启了算是比较疯狂的 2015 年吧, 那一整年只有一个关键字 ---- 学习. 一整年除了几个极重要的人, 几乎没有和同事, 朋友出去玩过, 八九点下了班回去就开始学习到十一二点, 工作中比较空余的时间学习, 双休日学习, 各种大小长假学习, 反正各种能利用到的时间都用来学习了, 各种 JDK 源码, 多线程, Java 虚拟机这些都看了个遍, 前前后后看过的书不下 10 本, 像虚拟机这本书我好像有说过几次, PDF + 实体书看了不下五遍, 这个博客也是从 15 年开始写的.
学习是寂寞, 枯燥的, 这段时间里其实有太多次想要放弃, 但每次也都熬了过来, 可以分享给大家一个感悟: 花一年自己逼自己一下, 让一切优异的品质成为你的习惯. 像我现在, 就感觉努力, 上进, 钻研, 好奇心这些已经是骨子里的东西了, 研究一个技术点, 不整理成一篇博文, 我都不认为自己掌握了这个技术点.
至于工作, 经过 15 年这一年的学习, 由于个人水平的长进, 16 年到 18 年间, 在工作中领导也愿意给我机会, 会写一些底层的东西, 会做一些系统性的设计, 也有机会带几个人的小团队, 在这一过程中, 慢慢发现基本功并不能说明所有问题, 因为必然会遇到没碰到过的东西, 会遇到一些更复杂的问题, 然后通过查资料, 研究, 寻找解决方案, 解决问题进一步提升自己的能力.
个人技术成长, 工作中成长 (实际解决问题能力) 一定是缺一不可的, 就像前几天我们大部门老大分享的: 什么是好的技术, 能解决实际问题的技术就是好的技术.
18 年年中, 对的时间遇到一个对的部门, 对的领导, 对的团队, 梦想照进现实.
希望我分享的个人成长经历, 能对看到的人有一些鼓励, 有一些感触, 如果让我总结一下, 那么希望告诉大家两点:
相信你自己, 我这样学校一般又不聪明的人都能走到今天这一步, 那么大多数人一定都能走到我这一步, 而且能走得比我更远, 更好
世界上没有什么是努力办不到的, 如果有, 那么就更努力一些吧
五年之后, 何去何从
在之前写过的一篇文章面试感悟 ---- 一名 3 年工作经验的程序员应该具备的技能一文中, 有一段专门写了对程序员的几个阶段的理解, 当时是工作三年写的, 一转眼两年过去了, 我自己也差不多工作五年了, 在这个节点上, 结合自己的认识, 说一下第五年开始, 一个程序员应该朝哪个方向努力.
首先, 前五年, 如果一个程序员大致能做到一下几点(后面还会详谈):
具有扎实的基本功
能快速完成领导交给你的代码开发任务
能在遇到问题的时候有正确的解决思路
能对公司的新人进行一定辅导, 包括但不限于技术点分享, 代码评审, 需求分析, 表结构设计等
那么, 从第五年开始, 我认为可以, 也应当朝更高的层次进行迈进, 前一个层次如果更多是偏重个人, 那么这个层次我认为更多应该偏重团队, 简单罗列一下大致上应该有:
系统设计能力, 或许在之前给一个功能, 能从 DB 设计 -->服务端开发 -->前端开发一栈把事情都做好, 那么之后, 在领导给出具体一块大业务, 比如想做一个淘宝商场的会员模块, 能充分分析出整个功能并把功能拆分成一个一个的点, 能对每一个点之间的交互画出交互图, 能梳理清楚数据库的 ER 关系图, 能把工作合理分配给同事进行开发
带领团队能力, 大致就是把控整体开发节奏, 保证在约定时间点前进行交付, 不出现延期的情况
大而博不如小而美, 会 10 门技术, 每门技术掌握到 6 分, 不如会 5 门技术, 2 门技术掌握到 8 分, 我感觉整个行业什么都会一点的人比较多, 把一门技术进行深入研究的比较少, 毕竟掌握也许只需要 1 星期, 深耕或许需要 1 个月甚至更久. 在五年这个节点, 我认为选择一到两个自己感兴趣的方向进行深入研究会是一个比较好的选择
这是我自己的思考, 也是我在第五年开始对自己的要求, 希望这一些思考也能给大家带来一些启发.
五年节点, 我理解的优秀程序员应当具备的技术素质
网上有很多所谓的 Java 程序员面试经, 其实看下来的感觉就是没多大用, 面试是没有套路的, 每一个面试官问的东西也都不一样, 如果根据那些面试问题去学习和准备, 那真的是只见树木不见森林, 对个人提升没有太大提高.
那么, 在五年这个阶段, 一个优秀的程序员应当具备怎样的技术素质呢? 按照我个人的理解, 主要就是基本功 + 项目.
为什么之前说针对面试题进行学习和准备作用不大, 因为我认为我们关注的不应当是题, 而是题背后的一个一个的方向, 这也就是我认为的基本功. 那从基本功的角度来说, 罗列一下我能想到的, 包括但不限于以下内容:
工作相关使用到的 JDK 类及其相关源码, 机制
设计模式, 设计模式在工作中用到了哪些, 具体使用场景
并发类的相关知识, 线程安全, 锁机制, 信号量, 闭锁, 栅栏, 线程池等
框架相关, Spring 相关机制, Spring MVC 相关机制, MyBatis 相关机制, 使用的细节点, 框架实现原理等
JVM, 内存布局, 垃圾识别算法, 垃圾回收算法, 垃圾收集器, 类加载机制, 内存模型, 出现内存问题时定位问题的方法等
数据库的基本数据类型, 索引机制, 各引擎区别, 锁机制, 慢 SQL 定位及优化等
缓存机制, 这里的机制指的是缓存加载, 缓存击穿, 缓存雪崩这些机制及其相关应对方案, 用过 Redis,MemCache 的最好理解一下它们的原理或者缓存提供的一些高级功能, 集群如何实现
分布式的一些知识, 比如 CAP 理论, 数据一致性的几种解决方案, 分布式事务如何处理, 分库分表怎么做, 现有的相关解决方案等
NIO 的作用, epoll 模型是否知道一些, Netty 的相关机制, Netty 相比原生 NIO 的优点, 半包拆包, 断线重连解决方案等
web 相关, Get 与 Post 的区别, 转发与重定向的区别, 跨域问题如何解决, 如何保证接口幂等性等
网络层相关, 三次握手和四次握手, 全连接队列和半连接队列, 负载均衡算法等
其他中间件, MQ 作用和使用场景, 服务化治理框架的作用和使用场景, 配置中心的作用和使用场景等
数据结构, 数组, 链表, 栈, 队列, 树等优缺点, 在什么场景下使用什么数据结构
Linux 相关知识, 基本命令的使用, 排查日志, 定位问题, 项目或者第三方组件的基本运维等
坦白讲, 以上的这些东西全都掌握也不可能, 哪怕面试官肯定也有很多不会的, 但这就是基本功, 能多掌握一点多掌握一点, 技多不压身, 至于别人如何评价你, 就留给别人去评价吧, 做好自己能做好的就行了. 我在之前写过的文章中反复强调深度 + 广度, 深度优先, 广度次之, 有了深度 + 广度, 在开发过程中我们可以尽快完成需求, 在遇到问题情况下我们可以第一时间找到应对方案.
在三年的时间点, 能掌握上述的知识点我认为已经是非常非常优秀的了, 但这两年的经历让我意识到的是, 到了五年的时间点, 如果只是具备这些硬性技能, 还是不够, 这两年更多的应当是在项目上进行积累, 也就是前面说的项目, 大致上应该有:
独立完成复杂业务, 或者完成一个已有项目中的大功能点, 这就需要有根据业务对功能进行分解, 分析的能力
独立排查复杂问题, 在项目运行过程中, 一定不可能安然无事, 除开业务性的问题, CPU 100% 是否能独立排查, 内存溢出是否能独立排查, 应用死锁或者 DB 死锁能否独立排查, API 调用时间长能否独立排查, 以上问题排查完毕能否及时解决
带领团队的能力, 可能这时候带领的是 1~2 个人的小团队, 即使一个小团队, 也能考验带团队, 任务合理分配的能力
可能上面的要求有点高, 可能工作中未必有这样的机会, 但是不要抱怨, 机会永远留给有能力, 有准备的人, 我们首先想的不应该是等待别人交给你一件有挑战性的事情, 你在做这件事情的情况下去提升自己, 而应当是先提升自己的素质, 然后让别人放心把有挑战性的事情交给你来做.
回到我之前写的, 为什么 16 年到 18 年间, 领导愿意给我机会去进行尝试, 首先就是因为个人水平的提升.
来源: https://www.cnblogs.com/xrq730/p/9159586.html