从7.10来到点评实习,已经过了2个半月。
在这里总结一下自己的收获。
- Java
(面向切面)一直很喜欢用注解,虽然了解面向切面的概念,但是没有自己去做过。在点评的实习期间,看到卫平会写一些自己注解,由此自己也去学会了自定义注解以及使用@Aspect来包裹自己的代码。比如说对特定的Exception来触发一个邮件通知,其间要感觉卫平的一些帮助
(Spring)尽管从写Java web开始就是Spring的用户,后来即使脱离了Web也喜欢用它的全家桶Spring Boot, Spring Data这些。但是其实来点评之前我从未自己完整搭建一个Spring的Web项目(Spring Boot是开箱即用的)实习期间对XML配置减少了几分抵触,也对Spring提倡的Java Config做了一点尝试,包括结合这两种配置,在一个非Boot的Spring项目中抛弃XML等。期间遇到一些问题,都是袁浩厉害,我跟着学了一些
(Mybatis)尽管以前就听说业界喜欢Mybatis,而我一直用的是Hibernate。感觉起来Mybatis更像JDBC, Hibernate则契合JPA规范,并且有一套标准的JPA接口与实现。至于Spring Data JPA,更加简化了db访问。对于Mybatis每次根据表生成实体类,表的变动将覆盖mapper文件以至于要手动merge这件事儿始终还是不喜欢……
(跨域)这个问题一开始出现的时候是我和舍友做母婴商店那会儿……当时我们在chrome里面调用没问题,用ajax报错,还煞有介事在stackoverflow找为啥。后来虽然解决了但是很糙就是添加一个@crossorigin的注释。来了点评以后详细的了解为什么会出现跨域问题以及解决方式还有JSONP是啥
(关于远程调用)因为受REST, Spring Boot, Spring Cloud影响,一直觉得HTTP是一个极好的调用方式。然而在点评这样的公司里,无论是因为性能的缘故或是其他什么考虑,并没有这样做……
- 开发习惯
(Log很重要)在过去的项目里,总是不重视log,又或者说,要么是本身项目简单,要么说本身质量管理就不存在。经常依赖于在IDE中debug来找问题,极其不喜欢去服务器端看log文件。而事实上,在你没有办法debug的时候,log对于排错而言是很重要的,借助于此可以了解到一些模块具体的执行状态。此外,一个运行中的系统,如果出现错误,应该把这些预期到的或是未预期到的都打印出来,通过阅读log便能定位到问题。
(防御式编程)质量上的另一重,所有的网络请求,依赖其他人的服务,数据库访问,用户输入,这些都是在一开始应该考虑其如果崩溃自己的系统应该如何应对,而不是乐观相信这些外界服务总是良好的。这一点儿我自己此前很多时候因为偷懒不愿意去考虑边界情况,造成质量可能不够高的情况下,在企业级开发中是极其业余和不应该的,所有可能会发生错误的地方都应该妥善提供处理方法,在点评这样的系统中,应该保障无论如何不会出现用户可见的问题,至少要做到予以一个优雅的错误告知/退出。
(性能)能够批处理的请求(数据库、远程服务),理应提供一个批量的接口,或者在一些情境下并发进行,而应该避免去循环去调用。而线程数需要根据机器实际核心数、操作所需时间、应用场景进行设置,设置线程池的核心线程数、最大线程数、队列类型时应该慎重,而不是觉得差不多就好。提供给前端的服务,又或者是提供给第三方的服务,应该去关注其响应时间,并且尽可能保证在10-100ms这样一个数量级,无论是服务响应时间还是数据库查询时间,都应该予以关注,并且在其不满足要求时考虑如何重构。在成熟的系统中,不能存在明显的完全可以解决和避免的短板,在正常的访问下正常,也需要保证在预期可接受的负载内正常。
(协作)对外接口、实体类多写注释,来降低阅读代码的难度,类注释可以描述一下这个类是干嘛用的,方法的注释如果必要可以给一个调用事例等等。尽管这么做会显得很多余,但是我认为这是一个好习惯。写别人和自己都能看得懂的注释,交代一些基本内容,是应该的。调用对方服务时,能自己确认的自己确认,不能确认的应该即使和对方沟通清楚、不留隐患。在企业中,文档不全,甚至作者已经离职的情况很常见,应该自己想办法克服结局、不能把锅甩给文档。
(Git与Maven)在Maven中,一开始就尽可能使用<DependencyManagement>
来指定版本,好过一个个exclude
。Dependency Analyzer
是个好插件。开发中应该绝不在master分支开发,如果每次commit能够尽量的是原子的,每个分支对应一项需求或者一个功能点,这样万一出错了,排查问题,或者回滚都很方便。如果commit信息几乎是无意义的、分支仅仅作为一个个人工作区与其他人隔开,终究还是浪费了Git作为一个版本控制工具的职能
(监控很重要)在Spring Boot中,有actuator这样一个模块,其内置了一些基础的监控,可以通过http等手段来获得系统的实时的一些指标,也可以很容易地通过实现HealthIndicator
来定制自己的监控。以前没有在意这个事情,上次听了du.yi的case study以及后来高师傅指出的,觉得这一点儿是很重要的。 听闻JavaEE 8 中也加入了这一内容。前两天Java 9 与JavaEE 8一起发布,待确认……
- 前端
学会了最基本的一些CSS,js,终于用上了bootstrap和JQuery然后转投了一些Vue.js与一些组件库,在实习期间从运营后台起步,终于能够使用Vue.js进行前端开发,由此了解了一些周边的npm,node,webpack,算是踏出了第一步,完整了一下自己以前想做一个业务地全栈的技能点。其实在很早以前尝试学习过node在web端的使用,但是后来没有继续,打算之后安排一些时间去详细学习Node,ES6,重点关注一些其性能上的特点以及V8虚拟机