我们从技术转型到管理的路上,如果没有贵人引路,基本上都是要先从项目管理这关过。这其实是一件好事;项目管理里面很多琐碎的知识点,非常有用。我今天想举个例子是项目管理过程中经常提到的 “输入-输出”。
## 1. 好奇的 DDD
DDD 并不是一个新概念了,很多年前就已经有这个概念。
和大多数技术人不一样,我个人更喜欢把它理解成一种编程思想,但是大部分技术人习惯将它称作技术。
更早前我是先从 MVC 三层架构开始学起的, 先入为主,当开始接触到 DDD 的概念的时候,非常排斥里面的一些相对于 MVC 来说非常新的概念,以至于直到如今我依然对其比较排斥。
不过 DDD 中的一些设计思想,真的是很好的解决了 MVC 三层架构中的痛点。如果我用一个 “输入-输出” 模型来提取 DDD 的精华会不会被打。
## 2. 项目管理概念之“输入-输出”
“五大过程组” - “九大知识域”。
方法论也一直在升级,现在不知道什么样子了。不管现在变成什么样子,输入 - 输出 模型一定是不会变的。
我们在接手一个项目的时候,一般需要将任务过程分解, 脑子里会有一条主干, 然后一个任务完成后,会接着下一个任务。如果上一个任务的结果会影响下一个任务, 我们称为有依赖, 这种情况下上一个任务的结果我们称之为输出,同时这个输出也是下一个任务的输入。呵呵有意思。我们来看一段代码:
```
// 有这么多种肉
let meats = ["pork", "beef", "chicken"];
// 想从中找到猪肉
meats.forEach(meat => {
if(meat == "pork") {
return "ok"
}
});
```
这个简单的例子中,是一个找猪肉的需求。我们常常会遇到老板改需求:现在不想找猪肉了要找牛肉。我们把代码优化成
```
// 有这么多种肉
let meats = ["pork", "beef", "chicken"];
function findMeat(name) {
meats.forEach(meat => {
if(meat == name) {
return "ok";
}
});
}
let res = findMeat("beef");
// 老板你还要找鸡肉吗? 来吧哥们早准备好了
// let res = findMeat("chicken");
```
其实 findMeat 就是我说的一个极简版的 “输入-输出 ” 模型。有人说了你这不就是一个最基本的方法封装嘛。。吹得跟神似的。
我想说 DDD 本质上也是一种封装,只不过吹它的人太多了,吹成了神,我们应该取其中最精华的部分。。
试想下 findMeat 的需求扩展了, 如果老板要的肉变质了,老板要的肉还在运输过程中,有的有物流信息, 有的没有物流信息, 有的说猪肉没了要不要来点小龙虾肉 ……? 我们是写在 findMeat 里面呢, 还是另写些其他方法?
```
class MeatDomain{
// 我用 private 表示该函数仅内部调用, 外部访问不到
private let meats;
// 在 MeatDomain 的任意对象中, 仅可访问 buy 函数, 对于其他内部的处理细节一概不知, 并且所需要的参数、变量一律由函数的形参传入, 或者由对象的 setMeats(setter) 方法传入。
public function buy(name ) {
let res = findMeat(name);
if(isOk(meat)) {
// 继续其他处理
} else {
console.error("...")
}
}
public setMeats(meats) {
this.meats = meats;
}
// 我用 private 表示该函数仅内部调用, 外部访问不到
private function findMeat(name) {
meats.forEach(meat => {
if(meat == name) {
return "ok";
}
});
}
private function isOk(meat) {
}
private function isTravaling() {
}
private function insteadOf(){
}
……
}
MeatDomain meatDomain = new MeatDomain();
meatDomain.setMeats([xxx]);
let res = meatDomain.buy("sheep");
结束了。输入【"sheep"】-输出 【res】
```
## 3. 再聊回DDD 的概念
我知道有很多资深的剑客都能把 DDD 里面的概念到背如流,例如贫血模型、充血模型,防腐层,基础层,聚合层,四层架构等等讲了很多, 讲真的程序员真的挺辛苦的, 能用到 DDD 的他一定已经学习过很多设计思想了,38 种设计模式也是如数家珍,我恐怕接下来要稍微献丑下了:
工厂\单例\建造者\代理\享元、struts ~ struts2, hibernate, mybatis ~ mybatis-plus, spring 3.0 ~ spring 5.x , springboot1.x ~ srpingboot 2.x、 srpingboot 3.x , 还有 springcloud 各项版本(注册中心、配置中心、调度中心), 链路跟踪还要分侵入型、非侵入型, 数据存储还要分各种流数据库, 还有 mysql 和 oracle 之争 , redis、mongo,搜索引擎(es、lusence、 solr), Flink,Hadoop, js -》 jquery, 后来兴起的双向绑定技术又要分几个阵营 react 、 vue、 angular, 还有各种样式框架 ,ele 、 ant 、扯得远了,如今 AI 相关技术栈又出来了, 我还特意去补了下微积分。(还有啥?评论区欢迎你)。
所以说程序员真的挺辛苦,很多时候很多思想并不是100% 覆盖所有应用场景的, 所以个性化需求一定会存在,而且会花样百出。我们大多时候喜欢发明轮子都是觉得,这个需求跟已有的轮子不适配所以要重新做一个。
我认为可以造但没必要完全重头再来, 这个世界永远是共性与个性并存的, 就好象 DDD 一样, 我认为它的部分封装的思想借用下再与 MVC 融合,足够应付大部分需求了。
不够再学,边学边用。
## 4. 放松下
这篇文章我可能文字用得偏多些, 但是请大家不要介意, 都是我一点一点深度思考的过程, 关于 “输入-输出 ”模型也是我长期实践,一次又一次的解决了复杂需求和迭代,吹个牛对我来说它就是最佳实践。希望有人来 PK 我。
理论有方向,实践出真知,欢迎交流。
如果你和我一样,也看到了这里,谢谢关注,谢谢点赞!(同名文章微信公众号也已发布)