08 从项目概念到技术概念

我们从技术转型到管理的路上,如果没有贵人引路,基本上都是要先从项目管理这关过。这其实是一件好事;项目管理里面很多琐碎的知识点,非常有用。我今天想举个例子是项目管理过程中经常提到的 “输入-输出”。

## 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 我。

理论有方向,实践出真知,欢迎交流。

如果你和我一样,也看到了这里,谢谢关注,谢谢点赞!(同名文章微信公众号也已发布)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爬上树顶

打赏可验证我能否靠此文财务自由

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值