前言
九月旺季已经来临,曾经何时,在 17 年的九月,经过再三考虑,我决定跳出一份干了四年且比较安逸的开发工作,当时下定决心,选择跳槽。最后跟着诸多农码一起涌进了一段为期两个月的面试高峰期。但是在选择跳出后,好多人都问我:“阿光,现在不是做的好好的么,怎么突然间就选择离职了,再说了,现在外面的工作也不好找啊,而且在这里薪资也还不错,为啥要走?”当时,面对这样的问题,我只用了几个字给回复他们了:“我是做开发的,但现在的工作不是我想像的那种,我不要在每天做哪些业务代码了,我要跳出舒适区,我要迎接新的挑战。”
在这狂热的九月里,我的简历投了无数个,也面试好几家不错的一线互联网公司,但最后都没有面上,最后,还是无意间通过一个群的渠道,认识了几位大牛,最后报名,获取内推机会,最后经过努力,成功面入狗厂。算起来我还是挺幸运的。
现在也是九月,现在回味起来,那时候面试的路上也是蛮艰辛的。最近这几天我抽空整理了一下 17 年的面试经验,相信这些面试经验对那些想跳出舒适区,近期想换工作的码农们,这些面试经验,希望对你们有所帮助。——后面我还总结了我的工作心得。
源码分析真题
你有没有用过 Spring 的 AOP? 是用来干嘛的? 大概会怎么使用?
说说你对 Java 注解的理解
什么是依赖注入?什么是控制反转 (IOC)?在 Spring 中,有几种依赖注入方式?
工厂模式你知道哪几种?你用过哪几种?每一种的用法知道么?
在 Spring 中,有几种配置 Bean 的方式?
SpringMVC 中 RequestMapping 可以指定 GET, POST 用法么?怎么指定?
SpringMVC 如果希望把输出的 Object(例如 XXResult 或者 XXResponse) 这 种包装为 JSON 输出, 应该怎么处理?
分布式真题
1、说说 HashMap 和 Hashtable 的区别
2、说一下实现一个保证迭代顺序的 HashMap
3、说一说排序算法,稳定性,复杂度
4、说一说 GC
5、JVM 如何加载一个类的过程,双亲委派模型中有哪些方法?
6、TCP 如何保证可靠传输?三次握手过程?
7、你们用什么 Redis 客户端? Redis 高性能的原因大概可以讲一些?
8、你熟悉哪些 Redis 的数据结构? zset 是干什么的? 和 set 有什么区别?
微服务真题
1、什么是微服务?你知道有哪些框架?用过哪些框架?
2、springCloud 和 dubbo 有哪些区别?
3、什么是微服务熔断?什么是服务降级?
4、springboot 和 springcloud,请你谈谈对他们的理解?
5、你所知道的微服务技术栈有哪些?请列举一二
6、说说 RPC 的实现原理
7、说说 Dubbo 的实现原理
并发编程真题
1、并发了解么?说说看你对并发的理解
2、什么是线程?线程和进程有什么区别?如何在 Java 中实现线程?
3、死锁与活锁的区别,死锁与饥饿的区别?
4、你知道在 java 中守护线程和本地线程区别么,说说你的看法?
5、Java 中用到的线程调度算法是什么?
性能优化真题
1、JVM 内存分哪几个区,每个区的作用是什么?
2、如和判断一个对象是否存活?(或者 GC 对象的判定方法)
3、简述 java 垃圾回收机制?
4、java 中垃圾收集的方法有哪些?
5、如何自定义一个类加载器?你使用过哪些或者你在什么场景下需要一个自定义的类加载器吗?
6、做 gc 时,一个对象在内存各个 Space 中被移动的顺序是什么?
7、你有没有遇到过 OutOfMemory 问题?你是怎么来处理这个问题的?处理 过程中有哪些收获?
上面就是我的面试笔记记录,这几个面试点应该是面试比较喜欢问的了,特别是分布式和 JVM 这些,如果想进大厂且薪资高的话,这两个知识点是必学要弄清楚的。还有就是你的个人见解了,这些都是非常重要的了。废话不多说,大家往下看我的近期总结学习心得,继续往下看干货 ………..
(如果想和作者一样系统化的学习面试真题后面的架构体系图,大家可以加文章末尾的群号,里面有学习资料,加群备注即可领取。我只能帮你们到这里了。我也在群里,希望和大家共同学习进步。)
程序员应有的几个阶段
第一阶段 —- 三年
我认为三年对于程序员来说是第一个门槛,这个阶段将会淘汰掉一批不适合写代码的人。这一阶段,我们走出校园,迈入社会,成为一名程序员,正式从书本上的内容迈向真正的企业级开发。我们知道如何团队协作、如何使用项目管理工具、项目版本如何控制、我们写的代码如何测试如何在线上运行等等,积累了一定的开发经验,也对代码有了一定深入的认识,是一个比较纯粹的 Coder 的阶段。
第二阶段 —- 五年
五年又是区分程序员的第二个门槛。有些人在三年里,除了完成工作,在空余时间基本不会研究别的东西,这些人永远就是个 Coder,年纪大一些势必被更年轻的人给顶替;有些人在三年里,除了写代码之外,还热衷于研究各种技术实现细节、看了 N 多好书、写一些博客、在 Github 上分享技术,这些人在五年后必然具备在技术上独当一面的能力并且清楚自己未来的发展方向,从一个 Coder 逐步走向系统分析师或是架构师,成为项目组中不可或缺的人物。
第三阶段 —- 十年
十年又是另一个门槛了,转行或是继续做一名程序员就在这个节点上。如果在前几年就抱定不转行的思路并且为之努力的话,那么在十年的这个节点上,有些人必然成长为一名对行业有着深入认识、对技术有着深入认识、能从零开始对一个产品进行分析的程序员,这样的人在公司基本担任的都是 CTO、技术专家、首席架构师等最关键的职位,这对于自己绝对是一件荣耀的事,当然老板在经济上也绝不会亏待你。
我认为,随着你工作年限的增长、对生活对生命认识的深入,应当不断思考三个问题:
我到底适不适合当一名程序员?
我到底应不应该一辈子以程序员为职业?
我对编程到底持有的是一种什么样的态度,是够用就好呢还是不断研究?
最终,明确自己的职业规划,对自己的规划负责并为之努力。
如何成为一名优秀的程序员
1. 愿意学习新技术
随着技术的不断进步,我们学到和实施的技术会很快地过时。所以,作为一个程序员,你就需要更新你的技能,保持与时俱进。市场上出现的所谓新技术通常由一些进程和语法变化而构成,但逻辑是相通的,所以你可以很快地掌握它。
2. 调试技巧
程序员不但需要创建代码,而且当软件不按预期方式工作时,程序员还必须能够快速而有效地解决问题。
因此,与其更改所有代码,还不如在创建程序时制作适当的流程文档,以便你可以快速检查代码并尽快找到问题。制作正确的文档可以方便你快速调试程序,而不浪费时间。
3. 解决问题的技巧
当一名普通的程序员获得项目 / 模块时,他们会直接写代码。但一名成功的程序员会试图找出代码出现问题的根源,并通知团队领导或项目负责人。因为有时在文档化项目需求并启动项目后,或者甚至在完成项目后,我们才会在项目中遇到一些问题。所以最好在出现问题之前先找到问题。
此外,快速地找到解决问题的方法。
4. 对工作的热情
我们的工作时间大多为朝九晚五,但是当你对工作迸发激情时,那么不要到了休息日就将工作束之高阁。一直工作直到完成它。当然,我的意思不是说如果你没有解决方案,还得成天垂头丧气对着电脑,我的意思是如果你已经接近于完成的时候,那么索性一鼓作气搞定吧。
你的经理或高层将会欣赏你的工作,并且当你有一个良好的环境时,你的激情将会越发高昂。
另外,在没有工作的时候也不要无所事事。不妨尝试构建一些新的应用程序,如游戏,拼图,聊天应用程序等,这将有助于使你更加热爱你的工作。
5. 懒惰…我的意思是更高效!
当有很多任务并且快没有时间来完成项目的时候,这时只有懒惰的程序员才能找到更好和最快的解决方案,因为他非常了解如何才能事半功倍。
如果你想找到做事的最好方式,那么就去问懒惰的人;很多时候这些所谓的懒人会找到最好、最快和最有效的方法,因为他们总在试图寻找更高效的路径方法。
在此我向大家推荐一个架构学习交流群。交流学习群号:478030634 里面会分享一些资深架构师录制的视频录像:有 Spring,MyBatis,Netty 源码分析,高并发、高性能、分布式、微服务架构的原理,JVM 性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
大家觉得文章对你还是有一点点帮助的,大家可以点击下方二维码进行关注。《乐趣区》公众号聊的不仅仅是 Java 技术知识,还有面试等干货,后期还有大量架构干货。大家一起关注吧!关注烂猪皮,你会了解的更多 …………..