国外的同事来国内出差,趁着这个机会,邀请他跟我们一起进行 code review。公司的代码没办法拿出来,只能临时写个伪代码让大家鉴赏一下:
/**
* 代码鉴赏:执行 1 个任务
*/
public class JavaTasteSample {
public static void main(String[] args) {
// 国外同事:1 行代码就搞定,简洁明了
// ==(浪费了大量的时间在做过度设计,毫无意义的炫技)==
new Thread(() -> System.out.println("task1 running...")).start();
// 国内同事:高内聚低耦合,把具体要执行的任务跟线程进行分离,方便扩展......
// ==(这老外太 low 了,连设计模式都不懂,估计不会写代码)==
new Thread(new Task(new TaskInnerSupport())).start();
}
}
interface TaskInner {
void execute();
}
abstract class AbstractTaskInner implements TaskInner {
@Override
public void execute() {
runTask();
}
abstract void runTask();
}
class TaskInnerSupport extends AbstractTaskInner {
@Override
public void runTask() {
System.out.println("task2 running...");
}
}
class Task implements Runnable {
private TaskInner inner;
public Task(TaskInner taskInner) {
inner = taskInner;
}
@Override
public void run() {
inner.execute();
}
}
团队中有好几位热门开源项目的 contributor ,他们写业务代码也跟写中间件源码一样,导致代码中存在严重的过度设计,60% 以上的预留扩展点,估计等公司没了都用不上。他们代码写爽了,接手的人一看惨了,调个 "1+1" 的方法要经历一堆 "接口、抽象类、实现类、回调、各种设计模式......" 才能拿到 "2" 这个结果。
这 2 种写法没有谁对谁错,一方水土养一方人,很明显国外的同事水土不服,不知道国内领导喜欢听一些装逼的名词,比如:"高内聚、低耦合、扩展性......"
作为程序员,我内心赞成国外同事说的用第一种写法。1 行代码就搞定,简单明了,等到需要扩展的时候再去抽取不就行了。但作为 "国内的程序员",我也只能跟着用第二种写法了。没办法,国内领导喜欢第二种,如果你用 1 行代码就实现了,那领导会认为你工作过于简单,工作量极不饱和;而用第二种写法,各种设计模式绕来绕去的,没十天半个月根本看不懂,既能体现你技术上的不可替代性,又能提供足量的代码......
我个人觉得很多时候一个不是很复杂的需求一开始就没必要像 Javaer 搞那么重那么过度设计。只有需求比较复杂,有系统化的倾向的时候才开始做这种设计会比较好。
- 不做任何设计先按流水代码写,后续继续迭代此处时再来做设计,实际上后续不管是自己还是其他人来接手的时候都是倾向于"复制粘贴"、"保持风格一致",谁 TM 有时间给你去做设计做重构,想多了!就跟到处打的 TODO 注释一样
- 别以为统计代码行数是互联网段子,如果你们公司在用项目/代码管理工具,那大概率会统计工时/代码,只是你不知道或者没明面上拿来做绩效
你写一行?
你这个月的代码量怎么这么少?
喊你把你做的事情,写个 ppt 讲一下
你说这里,我起了一个线程?
我这里运用了 xxx 模式,能有效 xxxx ,利于后续扩展 xxx
比一下?外行领导喜欢听哪个?
那么多公司,用户就几十上百人,你看看架构师要设计多大并发?
动不动就千人级,万人级,最后就那么几十人。。。
为啥。。。
卷呗
然后 TaskRunner 作为一个中间组件
到这个程度的话:
1. new Thread(() -> XXXService.DoSomething).start(); // 原生线程池,没有特殊处理
2. TaskRunner.Run("doSomething", () -> XXXService.DoSomething); // 中间件封装
为什么中间件封装:
1. 统计,监控,日志
2. 线程数量控制(即便是协程)
3. 以后 TaskRunner 控制复杂调度(优先级,丢弃,限流...)
如果你们是一个成熟的团队,本来就需要这些中间件,在这个基础上,都只是一个简单的方法调用而已