目录
后端的职责就是管理数据,包括处理、存储、查询。这就要求后端工程师具有数据结构的设计能力、优化数据库查询的能力等。 为了防止单机崩溃导致数据完全丢失、或者降低读写负载,需要使用数据库分区、分片、多机; 为了更好的监控系统负载需要性能监控组件; 追踪错误数据开始出错的地方,需要使用日志 还有导入、导出、打印、解析,调用其他服务,提供接口,校验幂等之类。
基础:java、Apache 工具包 框架:Spring 全家桶、Redis、MQ、K8s、docker 技巧:编程技巧,代码整洁,重构代码
在我刚刚开始工作的时候,忽略了编程技巧,这个其实非常重要。 举个例子,实现同样的功能,有的人只需要 2 行代码,有的人需要 10 行代码,再结合这段代码的可读性,就能体现编程编程技巧了。
比如说,判断字符串是否为空,有以下几种方法
StringUtils.isNotBlank(str);
也可以用
str != null && str.length > 0 && !isWhitespace(str)
使用 Apache 包里的 StringUtils 简化了判空代码,也提升了可读性。 这就体现了对 Apache 包的熟练程度。
此外代码的易读性也非常重要,举个例子:
- public class Test1 {
-
- public void process() {
- check();
-
- modify();
-
- persist();
- }
-
- private void check() {
- checkReq();
- checkAuth2();
- checkBusiness();
- }
-
- private void modify() {
- modifyReq();
- clearSensitiveFields();
- modifyCreatedByAndUpdatedBy();
- }
-
- private void persist() {
- createLog();
- createRecord();
- }
-
- // ...
- }
从 Test1 中,可以读出:
process() 的修饰符是 public 其余均为 private,隐含了只有这个方法是对外提供的。process() 方法中有 3 步,分别是 check(),modify(),persist(),其方法名明示其作用分别是检查,修饰请求,持久化。check() 中,修饰类均在 modify(),持久化代码均在 persist()。persist() 需要保证事务然后再举两个反例:
- public class Test2 {
-
- public void process() {
- check();
-
- modify();
-
- persist();
- }
-
- private void check() {
- checkReq();
- checkAuth2();
- }
-
- private void modify() {
- modifyReq();
- clearSensitiveFields();
- modifyCreatedByAndUpdatedBy();
- }
-
- private void persist() {
- createLog();
- checkBusiness();
- createRecord();
- }
-
- // ...
- }
Test2 的的问题是 persist() 方法中有 checkBusiness() 且在 createLog() 与 createRecord() 之间。如果这里检查失败,抛出业务异常,那么创建日志成功,但是创建记录失败,如果 persist() 方法没做原子性的话,那就会导致数据错乱。 推荐所有的检查类代码均放在 check() 里。
另一个反例:
- public class Test3 {
-
- public void process() {
- check();
-
- modify();
-
- persist();
- }
-
- private void c() {
- cr();
- ca2();
- cb();
- }
-
- private void m() {
- mr();
- msd();
- mcu();
- }
-
- private void p() {
- pl();
- pr();
- }
-
- // ...
- }
Test3 类的方法名可读性很差,比如 cr() 与 checkRequest() 前者很难理解是什么意思,但后者能根据方法名理解其内部功能。