我是JAVA初级,有必要学架构设计吗?

我是JAVA初级,有必要学架构设计吗

1.请问老师,我目前还在初学阶段,勉强能够实现CRUD功能 。对于基础内容和ssm、spring boot等框架,在百度谷歌的帮助下,也能使用。最近,总能看见一些公众号,或者视频里面提到“架构设计”或“高性能XXX设计”。对于我这样,实现一些基础功能都比较吃力的,还有必须去学习架构设计吗?

答:我觉得是很有必要的。

用鸡汤来解释,就是“人总要打破自己的舒适区”。

用现实来讲,只能实现一些CRUD等基础功能,是没有任何价值的。任何一个在IT企业上班的技术人员,都应该会CRUD,你的价值何在?甚至我们可以花几天时间,开发一个自动生成CRUD的模板,以后直接用这个模板来套任何常见的CRUD,代码都几乎不用写了。

再举几个具体的例子,说明架构学习的必要性:

(1)“用户的等级,要根据积分决定;用户的积分,来自于他发表文章的数量”。对于这么一个简单的功能,初级开发者可能会这样做:在“发表文章”的service层增加一个积分变量score,每发表一次就进行一次if判断:if(score>当前等级的积分范围),则升级。

这么做看上去没问题吧?如果没有架构设计、性能设计的意识,应该是看不出问题的。但如果你学了架构设计或性能设计,也许你就会发现:在当前项目中,用户的等级重要吗?如果用户等级仅仅是一个“头衔”而没有任何实际意义,就完全没有必要在每次发表文章时,都进行判断(判断是否达到升级条件)。因为,你每次在判断“if(score>当前等级的积分范围)”时,就会访问一次数据库(从数据库里获取当前最新的score值)。显然,这样做,会大大增加对数据库的访问次数,从而给数据库带来压力。

如何解决呢?可以把“用户的升级判断”这一行为放在“用户登录”那里。也就是说,在“发表文章”时不用判断用户当前的等级 是否需要升级;而仅仅是用户每次登录时,才会进行升级判断。这样一来,就可以把“每发表一次文章,进行一次判断”变为“每登录一次,进行一次判断”,显然可以大大减少对数据库的访问次数。

发现没有?同样的代码,放的地方不一样,对系统的性能影响是千差万别的。而只有具备了架构设计的思维,才可能在编写代码时注意到。

(2)“做一个【商品收藏】的功能”。

初级开发者可能这么想:简单,一对多!做一个“用户”和“商品”的中间表。如图,goods_id是商品的id,user_id是用户的id,下图就表示1001这个用户收藏了2001、2002、2003三个商品。

这类问题也是“看上去没问题,用起来也好像没问题”,但如果站在架构设计的角度,问题就太多了,举例:

①有限制吗?如果系统有10万个用户,每个用户了收藏100个商品,那么仅仅“收藏”这一项,就需要1千万条数据库记录。而传统的单节点mysql、oracle等数据库容量是有限的,这样很快就会导致数据库容量不足。即使你搭建了水平扩容的分布式数据库,容量的压力也是不可小觑的。怎么办?限制就行了,例如限制每个用户最多只能收藏30个商品。

有些初级开发者会问“这样做就影响用户体验了啊。原来能收藏无限个,现在只能收藏30个,差评!”。的确如此,实际上前一个例子也是一样的 ,“原来每发表一次文章,就马上进行一次升级判断,实时性很高;而修改后,只会在每次登录时才进行升级判断,因此无法保证用户等级的实时性。例如,用户可能在发表了某一篇文章后,已经达到了升级的积分,但由于此时没有进行新的登录操作,而导致没有及时升级”。没错!如果让我用两个字总结架构设计,那就是“权衡”。架构设计不是一味的满足用户、不是一味的追求完美主义,而是要在性能、稳定性、可持续性、可扩容性、用户体验、成本等因素之间做权衡。

②这种教科书式的一对多设计,真的是唯一的选择吗?能否改用字符串解决?例如,直接在用户表增加一个字段,在这个字段里直接用字符串存储用户保存的商品id,如图所示。

这样做好像很low吧?但好处是很明显的,将原来的3条数据,压缩成了1条。但同时也有缺点:需要在java后台代码,将"2001,2002,2003"用逗号拆分,然后分别处理每个值。

一对多和上面这种用字符串直接存储的方式,哪个效率高?没人知道!不同业务、不同技术选型的结果,可能造成的性能高低完全不一样。那怎么办呢?压力测试!通过测试结果,判断哪一种方式更适合当前的系统。

所以发现了没有?初级开发者往往是“教科书”式的功能开发,而很少考虑性能或其他因素。而架构设计者总是在“权衡”、在纠结是否有更好的方式(哪怕看起来很low)。

以前听过一句话,大概意思是说“事物的价值不在于价值本身,而在于稀缺性;例如空气、水,这俩太重要了,但是不值钱(没有价值),因为它们太多了(不稀缺)”

调试时,看不到细节

2.颜老师,我在js里用console.log()调试对象,但打印出来的总是:[Object object],看不到细节,怎么办呢?

如下

console.log(person + "1111")

结果:

[object Object]111

答:类型转换了,因为“任何类型遇到字符串,都会自动转为字符串类型”。你分开打印就行了,如下:

console.log(person)
console.log("111")

- 完 -

推荐阅读

Java小白到大神的心路历程(Java SE)

答疑 | 面试全对,却没offer?

答疑 | 背下这300字,面试就能加薪!

猜你喜欢

转载自blog.csdn.net/yanqun007/article/details/106015152
今日推荐