最近几个月,与公司Boss大雷交流得比较多,也学习到了很多新的东西,了解到了一些没有接触和实践的业界做法。
简要介绍下Boss,姓雷,定居武汉好几年了,之前在一号店、UC、支付宝干过,有丰富的电商-支付-游戏开发经验。
这几个月,我一边工作,一遍学习了下他的设计。这些设计,Boss主要参考了支付宝等前几家公司的架构设计经验,当然还有自己对技术的理解,对一起好项目的业务理解。
最近探讨的若干问题:
1.p2p算不算电商网站。
应该算,水电费缴费也算。电商是个很大的概念,当然购物网站、不同的购物网站、P2P理财,还是有不同玩法的。
每个细分领域、每个公司都有自己的特色,要不然竞争太激烈,也不容易生存下来。比如某公司的平台做得好,某公司的物流很牛逼,某公司的食品还不错,某公司的图书很火爆。
2.开发过程中,账务系统先不做成WebService,只做成普通的接口,提高整体的开发效率,后期再重构成服务不就行了么。
Boss不这么认为,根据他之前的经验,前期你一旦开发好了,提供了接口,别人的调用,你无法控制,因为别人引入了包之后,所有的API都可以进行调用。另外的问题是,自己写的代码和别人的代码可能会有循环依赖,一个项目的代码过多,加载启动变慢。
我的观念和Boss的观念有很大的不同,主要是由于,他在大公司干的多,团队比较多,项目协调管理麻烦一些。而我更多是在技术团队比较小的公司,我觉得人就这么多,追求开发效率,不会存在太多随便调用的情况。
3.Spring中的@Autowired和@Resource。
在最初学习的时候,用Resource,后来偷懒,就用了Autowire,后来甚至只要实现类,根本不要神马接口。因为,在我参与和独自写的项目中,一个接口一般就一个实现类,很少有一个接口多个实现类的场景。定义那么多接口,用Resource注解,麻烦很多。
而Boss认为,@AUtowired现在是没有问题,后来不知道什么时候就遇到问题了,之前经历过这种类似的问题。既然知道可能会有这个问题,现在就避免它出现。另外,就是写代码本身只占实际开发时间的很小一部分,花不了多少时间。我觉得这一点还是很有道理的,写代码太简单了,难点在于思考如何实现一个业务。
@Autowired(required=false),不同的注解还是有不同之处的,以前真心没有研究过,或者遇到这么个需求。
4.Map与Model。
很久以前,尤其在用Hibernate那段时间,我就用Model,一个项目建立了很多实体类。后来用Mybatis,自己讨厌建立太多Bean,正好公司大牛那段时间也用了Map,所以很久以来,我主要用的是Map接收参数和传递数据。但是,发现Map也有自己的缺点,可读性太差了,也不方便协调。即使是几个人开发,如果项目有很多逻辑要处理,用Map也确实不好搞,毕竟Map与Java强类型和面向对象的优势有点矛盾。
Boss自身,更偏好用Model,用面向对象,可读性好。当然,有时又想偷懒,一个Model是多个用处的,也存在一定让人纠结的地方。比如一个Model中的属性,有时有值,有时没有值。
我喜欢用Map,还有一个理由,就是遇到的每一个问题,用Map也确实可以解决。想想看,Map和Model都是数据类型,本质还是一样的嘛。
根据自己这几年的实践来看,如果强调可读性、可维护性、面线对象,或者项目成员比较多、项目业务逻辑比较多和复杂,用Model是比较好的。如果是自己开发一个小项目,用Map还是很不错的。
这里面还存在一个问题,用Map和Model是2种不同的哲学,代码实现还是很有区别的。意味着,你同时维护2套代码,思想负担有点大。
就目前的心态来看,今后我的项目,还是主要尽可能用Model,尽可能不再用Map,除非Map真得比较符合实际需求。
5.安全问题。
前几天,铁路票务系统账号泄露。我关注了下,实际上是别人碰库搞出来的,然后那2个黑客被抓起来了。
于是,和Boss探讨了Md5加密问题。我感觉md5也不是很安全啊,如果数据库泄漏了,别人根据你的加密算法,搞个彩虹表,就很快把你的密码明文给拿到了,然后你就跪得很彻底了。
Boss是看法是,md5加密确实有这个问题,实际主要是防止内部人的。如果数据库泄漏了,安全真的很难保障。我想到的是,除了MD5再搞一套自己定义的加密,即先自己加密,再MD5加密,更安全。Boss的想法是,你是更安全了,但是开发成本也更高了,而且你牛逼了,黑客也会更加牛逼的。
此外,Boss还透露一个小道消息,国内的那些高级黑客,都是有圈子的,而且是分产业链,盗号与卖钱是分开的。阿里等大公司,除了有自己的安全团队外,可能每年还要花费不少的公关费,把自己泄漏的信息花钱给买回来。或者,“向黑客交保护费”,你不要攻击我啊,我给你钱,要攻击,你去攻击我的对手去。
前几年,不少公司数据库泄漏,黑客太嚣张了,后来,有的被抓起来了,黑客们也更加注重自保。
6.账务系统
账务系统,通用性还是比较强的,与其它系统相对比较独立。按照账务系统提供的接口进行调用,很容易实现不同系统之间的对接。
电商网站、第三方支付、银行,账务系统各有各的。
可能不会实时去对账,不然成本太高,2元一笔的费用之类的,量太大,自己内部算好,然后和银行一次接口通信就处理完了,比如批量转账接口。
7.通用DAO方法。
我非常喜欢去写通用的DAO方法,想少写代码,多个项目都能用。而Boss不喜欢这样,他担心太通用,别人可能会滥用,导致系统不稳定。
这又是一个观念不同的地方,我自己一个人开发,怎么调用非常清楚,也不会去随便调用,错误地调用当然可能出现问题。而多个人,也确实不好控制。