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)) {
        // 继续其他处理
        if(isTravaling()) {
          // 运输中...
        }
      } 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(){
    }
    ……

}

// 然后写个main 方法运行下下面这段:
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,

前端打包编译相关的 webpack、 npm 、cnpm、pnpm、yarn (what ?)

玩 node的谁不用管理工具 nvm,玩node 的谁不用 nginx(ssl 开启、反向代理)

如今 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、付费专栏及课程。

余额充值