一个优秀程序员的最大的美德是懒惰
授你以鱼不如授你以渔
王炸不教你技术,只教你学技术
作者:王炸 |【坚持 1000 篇原创】
:iphone:2019.12.12 第 58 篇原创:iphone:
:point_up: 先赞后看是技术人的传统美德 :point_up:
一个懂天文学的程序员
拥有8年一线大厂经验,兴趣广泛,欢迎和我边玩边学,从今天起面朝大海。
我们的座右铭:“ 要好好学习,不然别人只会指着你的鼻子说“你看那个人,除了帅,一无是处。 ”
北京时间22:00,我丝毫没想下班的冲动,献身程序员改变世界的伟大工程,身处望京一带 最高档 的写字楼内,窗外星光璀璨、五彩斑斓、华灯初上、光彩夺目、流光溢彩、灯火齐明、暮色弥漫,我实在找不到一个准确的词形容这座美丽的城市,只能感叹: “鸡你太美” 。
我在公司内部最高端的千人技术群里看到一则招聘信息,这则招聘信息引发了我的关注,于是有了《一则技术专家招聘要求引发的深度思考》一文。
加入我们,您将参与:
建设大规模分布式系统,打造新一代以云原生和 Serverless 技术为基础的互联网开发领域基础设施平台
打造一整套可支持各种复杂业务场景,具备高可用,高性能,高扩展性,从软件设计到上线运维,贯穿整个开发生命周期的开发框架;
提供全方位立体监控、高可用容灾、具备软件开发最佳实践的产品解决方案;
岗位要求:
熟悉 Java语言,有大型分布式、高并发、高性能、高可用系统的设计开发经验;
对Spring,Spring Boot等架构设计,核心功能熟悉,主要流程有代码级的了解,具备修改该框架的能力;
熟悉 CNCF 生态技术,如 Service Mesh、Prometheus、Service Catalog、Knative等;
熟悉主流Web容器如Tomcat、Jetty,GlassFish等的架构设计及核心逻辑,对部分组件具备代码级的了解及修改能力;
熟悉Jvm相关的基础知识,如类加载,并发原理等;
精通设计模式,能写出优雅的代码,并能进行高效的重构;
注重代码质量,有良好的 Test Driven 习惯;
具备复杂需求及技术的研究能力,善于进行需求分解、技术突破,擅长团队的沟通协作,具备亲和力。
针对 岗位要求 的内容,我分享下我的想法,只拿最简单的第1条第2条为例。
第1条:熟悉Java语言,有大型分布式系统开发经验,这个不用说,就是要求基础扎实,无话可说。致于分布式系统开发经验,5年前只会一门Java/SSH/M就能找到一份工作,如今已世殊时异,2020年如果还不了解 分布式 恐怕要转行送外卖了,兄弟,电瓶车转卖吗?
第2条:对Spring xxx 有代码级的了解,为什么要阅读Spring源码呢,工作中真的需要让你去修改spring源码吗?读源码有什么收益。
从岗位级别区间分析(p2-2到p3-2),毕竟这个是一个年薪30w起的岗位,这点要求不过分,不能再低了,再低就发不了offer了。
Spring使用了控制反转的理念解决了编码强依赖问题,不希望改一个类,依赖它的类也需要改,进而,我理解了微服务为什么会流行起来,答案是 解耦 ,第一次领略到Spring可以这么完美的解决解耦。
通过依赖注入和AOP,我学会了偷懒的思路,诸如日志,鉴权,很多地方都需要用到代码,在没有了解spring的年代,我只能到处复制粘贴这些恶心的代码,如今我再也不需要复制粘贴了,面向切面编程通通帮你搞定。
面试的使用面试官总喜欢问:你知道哪些设计模式呀?SOLID了解吗?
SOLID分别是:单一职责原则、开放封闭原则、里氏替换原则、接口隔离原则和依赖倒置原则,这乱七八糟的都什么呀,如果你理解了这些设计理念,你发现spring源码里随处可见这些原则,读Spring源码,第一次真正了解SOLID。
比如控制反转、依赖注入和AOP,分别对应了3个spring的jar包:spring-beans、spring-context、spring-aop。每个包独立负责一个核心功能的实现,第一次领会单一职责原则。
Spring中的 BeanFactory
或 ApplicationContext
,用于创建 bean 对象,使用了工厂模式来管理程序中使用的对象Bean,第一次知道如何写带有Factory模式的代码。
通过 BeanFactory
源码我get到了什么是延迟注入,当程序使用到某个 bean 的时候才会注入,相比于 BeanFactory
来说会占用更少的内存,程序启动速度更快,想让系统更快,原来还可以这样设计。
通过注解: @Scope(value = "singleton")
我get到了什么叫做 单例模式 ,
我还记得前几年我面试一家叫 艺龙网 的初面中,面试官问我的第一个问题就是手写一个double-check的单例模式。
public class SingletonClass { private static SingletonClass INSTANCE = null; private SingletonClass() {} public static SingletonClass getInstance() { if (INSTANCE == null) { synchronized (SingletonClass.class) { if (INSTANCE == null) { INSTANCE = ; } } } return INSTANCE; } }
不到一分钟时间写完扔给面试官,面试官似乎轻视了我,还沉浸在玩手机中, 这是我从Spring源码中学到的 ,还问了我为什么synchronized包住的是SingletonClass.class而不是方法,我给面试官解释了什么是原子操作,以及: new SingletonClass()
在虚拟机中究竟做了什么。
我还给面试官讲了double-check单例模式在Spring中的应用,Srping 通过 ConcurrentHashMap 巧妙的实现单例注册表。
讲了这些,面试官服服帖帖不在问我任何关于Spring的题目了,话锋一转到了问JVM源码,也就是上面 岗位要求 的第5条:熟悉Jvm相关的基础知识,言多必失?我给自己挖了一个坑?
你以为JVM源码就能难住我了吗? 我的 王炸 牌还没打出:boom::boom:。
别跑题,接着说Spring源码
通过AOP(Aspect-Oriented Programming:面向切面编程)我学到了 代理模式 。
通过ApplicationListener我学到了 观察者模式 。
通过AdvisorAdapter我学到了 适配器模式 。
还有Spring如何解决事务问题,Bean如何解决循环依赖问题。
还有很多很多.....
读到我文章的各位侠客,您不点个赞 转发到朋友圈 ,我恐怕要写不动了。
有态度,对代码存敬畏之心。
超过 2000个 阅读我写JVM源码?你们说了算,上面那些岗位要求哪里不懂你们提问, 步步高打火机,哪里不会点哪里。
2020年没被淘汰的IT精英都看这14个全球知名网站
王炸吐血整理60个Redis面试题,全网最全了
月薪三万的码农: 工作拧螺丝有什么不好?
Java和Python哪个更适合初学者的问题