一, 面试不是简单的你问我答
一般来讲, 作为面试官和候选人进行沟通的第一个问题是一般是自我介绍, 整个自我介绍的情况应该控制在 2 分钟左右, 阐述自己的教育背景, 项目经历, 用到的主要技术栈, 如果有很厉害的开源项目或者优秀的博客也可以说. 整个过程应该放轻松和面试官是一个平等的交流过程, 面试官应该做到倾听且给出回应.
技术问题也一般会从自我介绍或者第一个项目开始, 加入面试官的问题是 JVM 的调优, 那么我们作为面试者可以从自己经历过的场景入手, 尽量不要像背诵课本一样旁若无人的开始描述, 中间可以和面试官进行互动, 比如说'我是这么做的, 你们遇到过么? BLALALALA'然后还可以说一下假如遇到一些其他的状况该如何处理等等.
二, 遇到不会的问题除了说不会还可以阐述思路
首先大家要有一个认知, 面试官不是什么都会. 术业有专攻, 闻道有先后.
很多面试题是根据你的项目中的描述进行展开的, 加入面试官问到一个自己没有遇到多的场景, 或者不会的问题, 他更希望你能说一下自己的思路或者遇到这种问题你会如何去处理.
比如说, 我曾经和一位同学交流过'从 Redis 中一亿个 key 里去查询某 1 万个具有相同前缀的 key 遇到什么问题', 这位同学从线程模型入手判断到了我们常用的查询所有 key 命令存在的问题, 然后说出了自己的看法. 我觉得非常好, 要知道一些场景可能只是在某个业务场景下才会遇到, 这是很常见的. 那么面试者在遇到这种情况的时候可以从相关问题入手进行推测, 用一些假设性的判断来阐述自己的思路.
三, 除了回答问题, 还可以稍微扩展
这一块在面试高级别的技术岗位时显得尤为重要, 那么在回答面试官的问题的同时可以进行拓展和深入, 比如我们在探讨'轮询策略'这个问题上可以把自己项目中用的策略以及为什么这么选型和为什么不用其他的策略, 这些策略的优劣点说出来, 那么是大大加分的.
四, 现在的应届生已经不是当年的应届生了
互联网行业发展至今, 已经从原来大量缺少开发人员的阶段过渡到了优胜略汰的阶段, 不是以前那种会一个简单的后端 Spring 全家桶, 用过一些大数据套件就可以轻易的找到工作的阶段了.
行业门槛在这两年出现了明显变高的迹象, 这个行业是对应届生和初级开发人员不友好的行业, 那么初级开发者和应届生就要丰富自己的技术栈, 不能单纯的说自己基础好, 因为基础好的人太多了...
五, 现在的老技术人也不能是当年的老技术人了
互联网开发行业是一个更新迭代极快的行业, 技术的更新速度需要我们 5 年 + 的技术人员跟上时代, 之前和一些同行交流过一个技术人员应不应该去追求一些新的技术, 有一部分人持这样的态度: 他们认为技术是通用的, 轮子这么多, 只要会几个, 其他的轮子触类旁通.
我个人赞同这种说法. 但是要考虑到, 如果我们用到再去接触学习的时间成本问题, 作为面试者去面试的话, 还是需要跟上时代, 让自己技术能力跟上工作年限. 这样才不会出现你还在 jQuery 一把梭, 我已经 vue 和 React 都能写的尴尬局面.(这个例子可能不太恰当, 只是举个例子) 因为这个行业是需要终身学习的.
六, 要有广度, 也要有深度
这个问题我曾经和我的领导进行过讨论, 我的老领导是我的校友, 当时就直截了当的跟我说, 广度和深度缺一不可. 未来从事技术开发, 这是你进阶和升级的要素, 我至今非常感谢这句话, 这句话可以说是我能来到阿里巴巴很重要的原因. 我们在工作中会遇到各种各样的轮子, 比如说我从事的数据开发领域, 轮子多到不计其数. 如果是做平台开发和业务开发, 那么技术选型这时候不仅要广度还要熟悉每个轮子的优劣才能在特定的业务场景找到最适合自己的那个. 你的技术深度在遇到特定的场景和 Bug 的时候就会体现出来, 你能不能迅速定位问题, 找到解决办法, 借鉴你已经知道的其他轮子中的解决方案, 可以直接拿过来用.
还有一些专门开发轮子的同学, 我要特别跟你们说, 做中间件开发很容易限到一个误区, 就是我只负责一个很小的模块开发, 这个模块的性能我能做到世界第一, 但是其他的模块我一概不了解, 缺少全局的概念, 这个是很致命的. 因为这样会把你自己局限在一个范围, 工作机会很少, 你的方向可能只有很少的公司能去, 这岂不是很尴尬.
以上是我的一点点个人感悟, 技术人的成长道路平缓且陡峭, 你付出的多收货的也就多. 在满足工作需要的同时, 能多思考, 你和其他人的差距就会慢慢体现出来. 同时还给工作 1 到 5 年 Java 开发的朋友提供一个学习进阶的技术路线, 互联网白银时代机会是留给有目标准备的人!
1. 性能优化
我们不仅仅对项目要运筹帷幄, 还要能解决一切性能问题. 只有深入学习 JVM 底层原理, MySQL 底层优化以及 Tomcat 调优, 才能达到知其然, 知其所以然的效果. 除了性能优化之外, 也能提供通用的常见思路以及方案选型的考虑点, 帮助大家培养在方案选型时的意识, 思维以及做各种权衡的能力.
2. 应用框架 源码解读
程序员每天都和代码打交道. 经过数年的基础教育和职业培训, 大部分程序员都会「写」代码, 或者至少会抄代码和改代码. 但是, 会读代码的并不在多数, 会读代码又真正读懂一些大项目的源码的, 少之又少. 这也造成了很多错误看源码的方式.
那要如何正确的分析源码呢?
我们的目标应该放在最常用的框架上面, 下面就介绍两个: 一个是 Spring, 另一个是大家用来觉得一直不怎么出问题的 Mybatis.
3. 分布式架构设计
透彻理解高性能架构的好处和优点
必然性, 适应市场需求, 能够去找一些更大的平台发展, 提升自己的综合技术能力和薪资.
了解从传统架构到分布式架构演变过程所带来的技术变革, 将理论和实战相结合, 透彻理解分布式架构及其解决方案.
从分布式架构原理, 到分布式架构策略, 再到分布式架构中间件, 最后在加上分布式架构实战, 让程序员可以在技术深度和技术广度上得到飞跃的提升, 成为互联网行业所需要的 T 型人才.
4. 微服务架构设计
随着业务的发展, 代码量的膨胀和团队成员的增加, 传统单体式架构的弊端越来越凸显, 严重制约了业务的快速创新和敏捷交付. 为了解决传统单体架构面临的挑战, 先后演进出了 SOA 服务化架构, RPC 框架, 分布式服务框架, 最后就是当今非常流行的微服务架构. 微服务化架构并非银弹, 它的实施本身就会面临很多陷阱和挑战, 涉及到设计, 开发, 测试, 部署, 运行和运维等各个方面, 一旦使用不当, 则会导致整个微服务架构改造的效果大打折扣, 甚至失败.
5. 团队协作
一名优秀的架构师必须有适合自己的兵器, 也就是工欲善其事必先利其器, 不管是小白, 还是资深开发, 都需要先选择好的工具. 工程化专题的学习能帮助你和团队提升开发效率, 让自己有更多时间来思考.
Git: 可以更好地管理你和你团队的代码.
Maven: 可以更好地管理 jar 包和项目的构建等.
Jenkins: 可以更好地持续编译, 集成, 发布你的项目.
Sonar: 一个开源的代码质量分析平台, 便于管理代码的质量, 可检查出项目代码的漏洞和潜在的逻辑问题 (提升代码的质量, 更加高效地提升开发效率).
6. 大型商城项目实战
要想立足于互联网公司, 且能在互联网浪潮中不被淹没, 对于项目的开发实战演练是不必可少的技能, 也是对自身能力的一个衡量, 有多少的量对等于获得多少的回报. 看似简单的一个项目需求图谱, 其中的底层原理, 实现原理又能知道多少? 你搭建一个完整的 B2C 项目平台到底需要多少知识? 这一切都是需要我们考量的.
总结的这些架构技术希望对 Java 开发的朋友们有所参考以及少走弯路, 本文的重点是你有没有收获与成长, 其余的都不重要, 希望读者们能谨记这一点. 同时我经过多年的收藏目前也算收集到了一套完整的学习资料, 免费提供给大家, 希望对想成为架构师的朋友有一定的参考和帮助.
想领取到免费架构视频以及面试资料学习提升自己的可以加 Q 裙: 935-692-859 免费获取!
来源: http://www.jianshu.com/p/0901ef170344