学习、工作心得分享-2018

版权声明:本文来自kid_2412的csdn博客,欢迎转载! https://blog.csdn.net/kid_2412/article/details/79349243

2017一晃就过去了,忙碌的2017,可以说从来没有这么忙过了,博客也忙的没时间搭理。不过这忙碌的一年带来太多太多的东西,技术从没有过的突飞猛进,处理事情的能力和抗压能力也得到提高。很开心这一年跟小伙伴们填坑、挖坑、抗雷。2018继续,充实、快乐、闹心、遭罪,就是干!
这篇文章就说说2017年都得到了什么吧!

一、技术

基础

来了京东,真的理解了为啥面试要问spring BeanFactory和Factorybean的区别和多线程的知识。可能我们在日常开发中几乎不会用到面试官问的东西,但是如果真的不理解这些东西,很容易写出坑来。
下面我也抛出很多问题,这里不做详细的解释,如果你去了解这些并用到项目中,欢迎你来京东面试。

  • spring

    • spring中最常用的就是注解,面试了很多人,大部分不知道@Autowired和@Resource的区别是什么,是很基础简单的东西。在我们开发的时候也会看到这两种注解混用的时候。我想如果你的项目希望能好快速更换其他IOC容器的话,一定要用@Resource。
    • spring的BeanFactory和FactoryBean,记得几年前我来京东面试的时候一个大神问的,至今我也会拿这个面试题去面试他人。虽然我们很少用FactoryBean,但经常会用BeanFactory。当你真的想定义一个自定义对象的时候,FactoryBean该粉墨登场了。
    • spring的生命周期和作用域,其实spring bean的生命周期挺难理解和记忆的,但是当你想要c++一样的析构函数的时候,生命周期就得用上了。同时要知道spring对象的作用域,记得之前做一个项目的时候,因为bean使用默认的作用域的时候出现了并发问题。
    • 事务相关,spring的事务由两种方式实现,一种aop的玩法拦截所有,一种声明式事务,声明式事务可以更细化,aop的玩法当然要会写spel表达式。
    • AOP和IOC,不用多说了,我们最常用的就是这俩东西,京东的很多项目也都是拿AOP管理数据源切换的。
  • 多线程(要多实践!!!)

    • HashMap是不是线程安全的?不是,那么如何让它线程安全?Collections.synchronizedMap()与ConcurrentHashMap的区别?HashMap线程不安全的时候会出现什么问题?这些是面试的时候必问的东西。如果你的项目请求量真的很大,需要全局变量的时候同时很难设计出无锁的算法,那这些问题都是要面对的。HashMap 0.75是什么?这关系到了你的程序性能。
    • 创建线程的三种方式都有什么?Feature模式是什么?教科书上只告诉我们了Thread和Runable。而最方便的恐怕是第三种了。
    • 线程池有几种?如何创建一个自定义线程池,以及构造函数是什么?当然回答肯定不是用commons-pool了。在京东某个子系统一天就能生产出上百万条数据的情况下,使用线程池消费数据提高处理能力是很常见的。如果不知道线程池的这些东西,死定了。。。
    • 线程安全的实现方式,锁:synchronized、ReentrantLock 无锁:CAS、ThreadLocal等。如果设计了一个多线程的业务流程,不考虑线程安全造成了脏数据,数据量大,业务复杂修数据要熬夜通宵的!
  • 基础语法
    • 枚举的好处和用法,最常用的就是在安全的单例模式上了。我们经常会给枚举一定的初始化值,然后在枚举类中编写相关的查询方法(getValueByCode、isXxx)来更方便的在外层调用,枚举值可以让代码阅读性更高。
    • static本质是什么?为何要使用static?可以说static是个很方便的关键字,可以让我们快速编写工具类,也可以安全的初始化一些数据(要比构造函数安全)。静态工厂方法取代构造函数,提高代码阅读性。
    • final修饰在类上、变量上、方法上各自有什么效果?我经常在mybatis的创建namespace上用到
      private static final String getNameSpace(final String method){ return NAME_SPACE+"."+method;}的写法。这样可以让JIT进行inline method提高性能。而final在全局变量中更会保证线程安全。
    • 深刻理解多态的本质,使用spring IOC ByName和lookup能够快速进行实现类的切换,spring本身也是一种工厂模式的实现。利用这个特性在三方联调的时候可以快速编写mock对象。而对于DAO层可以注入基于redis、mysql、es的多种持久化实现,方便快速降级、提高扩展性等。
  • 设计模式

    • 单例:逢考必过,这东西跟写冒泡排序一样普及。当然会设计模式不是为了考试,很多请求量大要求QPS和实时性的系统通常不会使用spring或其他IOC容器来管理对象,因为那么做系统会太臃肿牺牲的太多。每个请求不能都new一个业务对象,那么如何写好一个安全的单例模式(线程安全、性能高、防反射攻击)都是要思考的。
    • 工厂:spring本身就是个大工厂,理解工厂模式就很好理解spring。当然工厂模式不是专门为spring准备的。我们有很多时候要自己写个工厂创建对象,或者使用spring的FactoryBean。那么三种工厂模式如何选择?
    • 适配器:其实这个模式我们经常用的到,仔细回想InputStream和OutputStream子类的使用方式。很多面试官也会问这个模式,当你真的理解这个模式的时候,编写工具类会感觉很舒服。
    • 监听者:其实监听者不只局限于编程中,我经常会问面试者消息队里的本质是什么?有的人会把mq服务器的搭建包括cluster叙述一遍。但其实我的感觉本质就是监听者模式。如果你的项目中没必要用个非常强大的消息队列服务器,而又异步通信时,你就可以用这个模式。
    • 策略:很工厂很像,很难区分,但要记住策略关注的是算法。在近期的结算项目中和之前的差值率功能上,我多次使用策略模式,整合到spring中来实现不同业务的算法。
    • 状态:京东一个单据数据结构中通常会包含一些状态字段,而这些状态字段中也会有多种状态(有的可能十几种),如果你用十几个if或者switch去做这件事,架构师一定会喷死你,我和我的小伙伴们经常在code review中被劝退重构这些if,用状态模式重构。自然重构后的代码很难理解但很单一职责。
    • 责任链:我们经常使用责任链在web项目中,比如过滤字符集、参数和权限校验等。我们应该理解责任链的工作原理并且自己编写一个责任链,这样当我们不使用servlet或者第三方框架提供的过滤器的时候,代码依旧能够那么风骚,可以说:我们不一样。
    • 建造者:一个领域对象(domain object 即DO)有几十个属性很正常,那么如果一个一个写setter&getter一定会累死,你可能说我们有编译器自动生成工具。那你的调用者一定会很难看,new一个对象一堆set方法调用。试试builder,会让调用者很舒服,可以看看protobuf的java实现,就是一个大大的build,调用起来很方便。
    • MVC:model-view-control,很经典而且很普及的模式,很基础的模式,但是很多人会把业务代码写在control中,职责混乱,在你改曾经某个被强奸了的control层痛苦难耐。我们有必要好好想想,mvc的本质是什么?
  • 异常:

    • 使用自定义异常做业务异常处理(好处大大的),消灭所有非自定义异常(谁写出空指针请吃冰激凌)!
    • 自定义异常编写原则:继承RuntimeException,重写getMessage和getLocalizedMessage,getMessage可以返回详细的异常栈信息,getLocalizedMessage要返回识别度高的错误提示(用于前台展示)。
    • try{}catch()中要处理Exception和业务异常,提供给调用者不同的体验,Exception要记录为系统异常,自定义异常要记录为业务操作不当。
  • 工具类库
    • apache commons:一定要使用StringUtils、CollectionUtils,这两个类库几乎每天都要用,用于防御式编程中,做好防御编程bug会大面积减少。当然commons还有http、pool等功能。
    • guava:google提供的第三方工具类,包含了jvm内的本地缓存、限流令牌桶的实现、lambda等功能。目前互联网公司很多一级缓存用的guava,二级缓存使用的memcache或redis。
    • dozer:性能要比apache的BeanUtils高,而且可以通过xml定义要复制什么属性,同时避免了apache BeanUtils Date类型空拷贝时NPE的出现。整合spring很友好。
    • lombok:一个注解统一天下,在bean或者方法上加个小小的注解,再给编译器安装个插件(idea和eclipse都有哦!),你可以很快得到一个builder模式或一百个属性的setter&getter。当然还有线程安全、重写toString、hashCode、equals等强大功能。
    • fastjson:alibaba总是为人类做出很大的贡献。目前业内序列化和反序列化速度最快的json类库,据说为了性能代码写的很烂。一个字:屌!
    • druid:alibaba总是为人类做出很大的贡献。提供了高性能的线程池,强大的sql监控功能。一个字:屌!
    • MBean:当你用到反射感觉这个技术很牛逼的时候,MBean其实更牛逼。一般人不知道。。。JMX的全称为Java Management Extensions. 顾名思义,是管理Java的一种扩展。这种机制可以方便的管理、监控正在运行中的Java程序。常用于管理线程,内存,日志Level,服务重启,系统环境等。
    • junit&mock:保证代码没bug一定是要大量做单元测试,其实京东的每个子系统都很庞大和复杂,很多项目都很古老了,我们在做一个简单的读取单据信息可能就要对接很多系统。很多项目启动的速度可能达到几分钟,而一些主要系统上线一次就要几个小时。我们需要把代码写到最优、bug尽量降低到0才能上线。单元测试复杂度高,两种方案:
      1. 随时重构:随手重构,方法和类都要明确职责,单元测试到每个类的每个方法上,方法长度和类长度要控制。大量细小的方法和对象被测试成功,最终组合起来构成整个模块。
      2. mock测试:对接第三方系统很糟心,撕b常有。保证自己的代码没问题除了记录好的日志,还有就是mock测试。mock测试保证了业务整体的正常运转、消灭明显的代码bug、数据传输的结构确定。同时能够保证快速运行单元测试。
    • slf4j:一定要用slf4j,提高性能、更换日志系统不用改代码。记得要用{}占位符!
  • 框架(一定要看看常用框架的源码)
    • mybatis:使用mybatis的orm外,可以尝试编写它的插件,interceptor能够帮你坐很多事情(慢sql检查、分页)。
    • spring mvc:最简单的一定要理解@RestController和@Controller的区别,问了好多面试者不知道这个。@RequestMapping注解中的每个属性都很有用。spring mvc整体跟spring区别不大,本身就是spring社区周边。核心还是理解好spring。
    • spring boot:有的人会直接去学习spring cloud,其实还是建议先学习spring mvc然后spring boot,最后可以选择性的看看spring cloud。国内用spring cloud的目前很少,spring boot倒是挺多的,其实掌握了spring mvc对spring boot上手也快。记得一定要会自定义boot-starter和java config。
    • spring 社区:spring社区是指spring其他产品,比如spring data、spring ldap等。框架总是用的,拿来用主义,主要是学会spring社区的路子和精神,spring的template思想很值得借鉴。记得要会阅读spring.io的doc。
    • dubbo:alibaba总是为人类做出很大的贡献。java业内很普及的最近分布式服务框架,性能卓越,上手快(当然原理不简单),dubbo的双手甚至已经伸向了国外和其他编程语言上。dubbo又开始更新维护了,参加了一场dubbo的开发团队的分享,他们也欢迎dubbo的社区贡献者加入团队。 一个字:屌!
    • jedis:redis的java sdk。每个redis的指令都会被映射为一个java方法。可以说我们会使用jedis,redis的指令基本也会了很多了。spring整合jedis很简单,spring社区也推出了相关的框架。如果你能坚持阅读jedis源码,那会对理解redis通信协议很有帮助,包括它的cluster。
  • git(被忽略的技能,经常成为重灾区,不多说,自己体会)
    • 还用svn多low b?看看灵魂摆渡人,鬼差都用iphone10s了,还不用国际流行的git?
    • 使用rebase
    • 读懂reflog
    • 利用cherry-pick
    • 不要用图形界面,这点很重要!
  • linux
    • 如果你能理解epoll、select、zero copy、sys和user空间、中断,你非常好
    • 如果你会用top、vmstat、iostat、netstat、ping、telnet,你很好
    • 如果你会部署配置nginx、mysql、redis、haproxy、lvs,你真好
    • 如果你上面都不会,那最基本要会cd、ls、tail -f、rm、vi
    • 考一个rhce的认证,你能学到很多,如果你想挑战,来个rhca

深入

  • jvm:jvm要说的太多,这是java的核心。如果你把jvm插的深一些,BAT不难进。推荐《深入理解java虚拟机》、《java虚拟机规范》、你假笨的公众号。如果你会c/c++,一定要下载openJDK,自己去make一个虚拟机,然后用source insight阅读源码。经常对你的项目进行jvm层面调优,把你的编译器修改jvm参数变得快快的。看看gclog和dump文件,使用jprofile、mat去分析jvm。
  • redis:至少你应该知道redis的五种数据结构的用法,redis是单线程的,redis的pipeline事务,redis的锁,redis实现分布式锁方案,redis做session共享,redis防重,cluster是在客户端实现的。更深入的可以阅读《redis设计与实现》。
  • mysql:这年头会写sql语句不算啥,不会写复杂的也没啥(为了查询效率,很多复杂语句要转换成业务代码)。一定要知道explain怎么用,一定要知道索引怎么加,一定要会评估表空间和库空间大小,一定要会选择存储引擎。如果你能说出innodb buffer pool的一些特性,最左原则,什么语句写法不会走索引,面试官一定会让你过。《高性能mysql》、《mysql技术innodb存储引擎》多看看。
  • mq:消息队列有很多实现,kafka、rabbitmq、activemq…层出不穷。但是还是一通百通。《RabbitMQ实战:高效部署分布式消息队列》可以看看,虽然是python的。最起码要知道mq两个重要的作用:
    1. 解耦,消除异构系统、三方系统的差异最终解决方案,mq服务器大多使用mqtt协议或自定义协议,但不同语言的sdk是可以直接对mq服务器进行通信的(协议统一化)。开发者不需要自定义协议。
    2. 消峰,十万个请求要扣减一个商品的库存,库存只有十个,库存不能超卖!没错这就是每年的6月18日全国各地败家娘们干的。棒棒只有十个,十万的娘们含苞待放,先到先得五金一件,统统放入消息队里中逐一处理,剩余九万九千九百九十个全滚回家睡觉去!
  • worker:定时任务通常会用linux系统的crontab、java的ScheduledExecutorService类自定义、Quartz服务、自定义TimerTask。而对于一些数据量大的需要快速消费掉数据,光凭多线程是很难提升消费能力的(毕竟是单机)。而分布式调度系统应该用上,京东有自己开发的clover,淘宝开源的tbschedule。worker其实实现不复杂,复杂与分布式一致性上,如果需要深入理解,可以读读paxos协议(挺复杂的,简单点的是raft)或直接阅读tbschedule源码。
  • Refactoring:重构,不是什么工具也是个工具,不是工具是因为它是个技能,是个工具是因为重构手段能够帮助你快速达到很多目的。单纯的说让你去重构,重构有多么好是没人会听的,因为这种东西通常非常抽象并且教科书。如果你真的想提高自己的话,一定要看看《重构》、《代码整洁之道》这两本书,老书经久不衰!通常很多设计模式也会用在重构上,如果《设计模式》这本书太枯燥,看看《大化设计模式》。

写作(软技能)

  • markdown,还用word多low b?看看灵魂摆渡人,鬼差都用iphone10s了,还不用国际流行的markdown?写分享文章要用markdown!写笔记要用markdown!写说明书要用markdown!面试没准考你markdown!
  • ppt,做好ppt,升职加薪没问题!
    • 一个好的ppt一页要控制在半分钟到一分钟
    • 一个好的ppt要拿数据说话,而不是特效和样式
    • 一个好的ppt不要纯文字!没图你说个xx?没人会读我这又臭又长的总结文章,我媳妇说的,她说的很对,真的很墨迹,凑字数没干货,扯犊子Tree tree=new B();
    • 一个好的ppt末尾要简单,一句话:感谢各位的聆听!
  • blog
    • 写blog提高你的总结能力;
    • 写blog提高你的影响力;
    • 写blog提高你的写作能力;
    • 写blog提高你的记忆力;
    • 写blog new B();

二、职场

多想:慢点动手,慢点敲键盘,慢点想,想仔细,多想,想不到位自己遭罪!

少说:说错了,得罪人!说多了,墨迹!说快了,没礼貌!

多做:领导都看着呢,别偷懒,干!当然,我们相信天道酬勤!

三、总结

2017真的很充实,很累,很快乐。从我不会做,到我做到了,这个过程真的很艰难。俩个双十一,一个618,每次都是一种考验,考验自己的代码,考验自己的心智,考验自己的毅力。不断的出错、改正、优化,不断的学习、思考、验证。线上事故,代码bug,设计不合理,都发生过,就是因为这些,才充实,累,快乐。2018年,希望在我做到了再上一个台阶,我能独当一面了。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/kid_2412/article/details/79349243