ABstract是一个AB测试平台，整合了配置管理和实验管理，为企业提供数据驱动的决策能力。

例如，一个用户想要创建一个实验来测试两个不同版本的网页，以了解哪个版本能带来更多的服务注册。

他们将创建一个实验，包含两个分组（bucket），每个分组对应一个网页版本，并将不同的用户分配到每个分组以比较结果。

每个实验可以包含1个或多个分组，每个分组都有一个不同的配置。

实验信息包括：实验名称、实验描述、开始和结束时间、抽样百分比、识别实验的关键字、每个分组的名称及其关联的配置和分配给每个分组的流量百分比，以及将用户分配到分组的目标规则。

实验和分组可以一起配置。

实验中的配置用于为用户提供不同的交互体验。

一个实验最多可以创建10个分组。

分组配置将作为分组的一个配置项与分组关联。

实验分为灰度发布、AB对比和多分组实验三种类型。

一个实验应该包含：实验名称、实验描述、开始和结束时间、抽样百分比、识别实验的关键字、每个分组的名称及其关联的配置和分配给每个分组的流量百分比，以及将用户分配到分组的目标规则。

实验的目的是将用户随机分配到不同的分组，不同分组中的用户获得不同的软件交互体验。

通过收集不同分组中用户的行为数据，对比不同设计的效果。

一个实验至少包含1个，最多10个分组。

用户在同一个编辑界面编辑实验和分组信息，点击保存按钮时一起提交。

创建实验时应该包含：实验名称、分流比例、开始时间、截止时间、分组（名称、关键字、分流比例）。

实验类型分为灰度发布、AB对比和多分组实验三种。

- 实验的目标是通过将用户随机分组，收集不同组用户的行为数据，对比分析不同设计的效果，找出最有设计
-

-

实验有三种： 1.灰度发布（一个实验只有一个分组，通过实验采样比例控制新特性的发布比例）

-

2. A/B对比（一个实验有两个分组，在用户总量中采样部分用户进行实验，对比新旧两组的数据）

-

3. 多分组实验（一个实验有多个分组，在用户总量中采样部分用户进行实验，对比不同设计的效果））

# Engineering Wiki

<aside>
💡 **Notion Tip:** Use this template to organize important information for your team.

Add owners, verification, and tags to pages to keep them up to date.

Just replace this sample content with your own.

</aside>

#

</aside>

#

# Codebase

---

[Code Reviews](Engineering%20Wiki%202402f5396a3244fdb3f1d135bdb0f3d6/Code%20Reviews%202b60c26d2a2e4a348f8f14c77023c385.

# Codebase

---

md)

[ABstract（插件化AB Testing平台）](Engineering%20Wiki%202402f5396a3244fdb3f1d135bdb0f3d6/ABstract%EF%BC%88%E6%

md)

8F%92%E4%BB%B6%

E5%8C%96AB%20Testing%E5%B9%B3%E5%

8F%B0%EF%BC%89%20746b87acd94643ca871ec661b63f196c.

md)

[VUE](Engineering%20Wiki%202402f5396a3244fdb3f1d135bdb0f3d6/VUE%209501304a2b03470cad0eea93992d65ae.

md)

md)

[Backend](Engineering%20Wiki%202402f5396a3244fdb3f1d135bdb0f3d6/Backend%20137c41fa386f43249b249e956eb06bb0.

md)

[AWS](

md)

md)

[AWS](

Engineering%20Wiki%202402f5396a3244fdb3f1d135bdb0f3d6/AWS%20b022fe0cb7084cc0b64624f7bc8cde2c.

md)

[AWS](

md)

[Redis](Engineering%20Wiki%202402f5396a3244fdb3f1d135bdb0f3d6/Redis%209e063b60eca24a1783c225cfdc21dd8c.

md)

[CircleCI](Engineering%20Wiki%202402f5396a3244fdb3f1d135bdb0f3d6/CircleCI%20719905fcb593423cad302d3fdc1c5dff.md)

[Smart Domain](Engineering%20Wiki%202402f5396a3244fdb3f1d135bdb0f3d6/Smart%20Domain%203b0daf8bb0d740439426cfab214f1fa6.

md)

#

md)

#

# Guides & Processes

---

[Getting Started](Engineering%20Wiki%202402f5396a3244fdb3f1d135bdb0f3d6/Getting%20Started%206bc871dcdd4a4554b5b22c0c40740841.

md)

[Engineering Guidelines](

md)

Engineering%20Wiki%202402f5396a3244fdb3f1d135bdb0f3d6/Engineering%20Guidelines%204208cbd4733d4f6f94982f3fb24f6379.

md)

[Development Lifecycle ](Engineering%20Wiki%202402f5396a3244fdb3f1d135bdb0f3d6/Development%20Lifecycle%20e20a5470e52f49e9bbc4f255cf81db4

b.md)

[How to Deploy](Engineering%20Wiki%202402f5396a3244fdb3f1d135bdb0f3d6/How%20to%20Deploy%20b7c4f3fd308944af8ba4637ec40fa4f9.

md)

[Useful Commands](

md)

Engineering%20Wiki%202402f5396a3244fdb3f1d135bdb0f3d6/Useful%20Commands%208a05b1de77ec44b6a55e388c2cc7fe47.

md)

[How to QA ](Engineering%20Wiki%202402f5396a3244fdb3f1d135bdb0f3d6/How%20to%20QA%202f036148193a4fccac2c9e8ae9e6d197.

md)

[Engineering Wiki](Engineering%20Wiki%202402f5396a3244fdb3f1d135bdb0f3d6/Engineering%20Wiki%208da06b3dcf1b4eaaa3e90aa70feefe56.

md)

md)

# How to QA

Last edited time

: March 31, 2023 1:49 PM
Owner: Anonymous
Tags: Guides and Processes, Testing

<aside>
💡 This template explains our QA process for shipping bug-free software.

</aside>

documents/bussiness_context/NOTION_DB/Engineering Wiki 2402f5396a3244fdb3f1d135bdb0f3d6/How to QA 2f036148193a4fccac2c9e8ae9e6d197.md

# QA Philosophy

Write about your approach to QA and why it's critical to success. 

# Processes

#

#

# Making Code Changes

-

Test PRs rigorously before requesting review.
- Include test cases you've checked for in your PR description.

#

#

#

-

#

## Reviewing Code

- If the change is substantial and user-

facing, pull down the branch.
-

-

Test for cases (particularly edge cases) that the PR author may have missed.

#

#

# QA

-

Look at the list of items going out for release the next day.

-

#

#

# QA

-

- Go down the list one-by-one and thoroughly test changes.

documents/bussiness_context/NOTION_DB/Engineering Wiki 2402f5396a3244fdb3f1d135bdb0f3d6/Engineering Wiki 8da06b3dcf1b4eaaa3e90aa70feefe56.md

# Code Reviews

Last edited time: March 31, 2023 1:49 PM
Tags: Codebase

<aside>
💡 This template documents how to review code.

Helpful for new and remote employees to get and stay aligned.

</aside>

documents/bussiness_context/NOTION_DB/Engineering Wiki 2402f5396a3244fdb3f1d135bdb0f3d6/Code Reviews 2b60c26d2a2e4a348f8f14c77023c385.md

</aside>

# Philosophy

Why do you perform code reviews?

What are your guiding principles for these reviews?

You may want to mention other pages here.

Like Engineering Guidelines.

To link to another page inline, type `@` followed by the name of the page: [Engineering Guidelines](Engineering%20Guidelines%204208cbd4733d4f6f94982f3fb24f6379.

md)

# Preparing Code for Review

Preparation sets your reviewers up for success.

#

#

md)

#

#

# Commit Messages

Make sure your commit messages are descriptive. 

#

#

#

#

#

#

#

Github PR Descriptions

Your PR descriptions should be an extension of your commit messages.

#

#

#

Write about both what the commit changes, and how you implemented the change.

#

#

#

Write about both what the commit changes, and how you implemented the change. 

# Performing Code Reviews

##

# How to Review

-

##

-

Make two passes over the PR if it's substantial.

##

-

- On the first pass, come to an understanding of the code change at a high level.

-

- On the second pass, pay more attention to semantic details.

# Examples

```jsx
var commentCount = 0;
```

You might suggest that this be a `let` instead of `var`.

# Engineering Guidelines

Tags: Guides and Processes

<aside>
💡 Use this template to create guidelines for all of the engineers on your team.

documents/bussiness_context/NOTION_DB/Engineering Wiki 2402f5396a3244fdb3f1d135bdb0f3d6/Engineering Guidelines 4208cbd4733d4f6f94982f3fb24f6379.md

Add a table of contents by typing `/table of` and pressing `enter`.

</aside>

# Engineering philosophy

Summarize your team's approach to engineering here.

#

# History

Notes about how the current codebase evolved.

# Patterns to follow

-

#

# History

-

List patterns that engineers should follow here.

#

# History

-

- You can create `inline code snippets` with the shortcut `cmd/ctrl + e`.

-

# Code samples

Add code blocks for common snippets.

Type `/code` and press `enter`.

Choose the language you're using from the dropdown at the bottom right corner.

Hover to copy with one click.

```jsx
var a = 1;
while (a <= 10) {
    document.

```jsx
var a = 1;
    document.

write(a + "<br />");
    a++;
}
```

# Further Reading

Check out this [Notion guide](https://www.notion.

    a++;
}
```

so/68c7c67047494fdb87d50185429df93e) to learn about more ways to create content.

# Redis

Tags: Infrastructure

# ABstract（插件化AB Testing平台）

Last edited time: April 23, 2023 3:58 PM

Project name： "ABstract".

documents/bussiness_context/NOTION_DB/Engineering Wiki 2402f5396a3244fdb3f1d135bdb0f3d6/ABstract（插件化AB Testing平台） 746b87acd94643ca871ec661b63f196c.md

It plays on the words "AB testing" while also hinting at the concept of abstracting away the complexity of building and managing an AB testing platform.

>

>

这篇文档介绍了一个插件化AB Testing平台的产品愿景、项目目标、核心业务能力、业务模型和进程间架构。

该平台提供配置管理、实验管理、数据收集和配置发布等核心能力，可以帮助公司业务/开发人员基于AB测试实现数据驱动产品迭代，同时提供核心能力插件化管理和最小实现，支持开发人员结合实际需求进行剪裁或扩展。
> 

#

> 

#

# 产品愿景

对于：我们的目标客户/用户

<aside>
💡 想要基于AB测试实现数据驱动产品迭代的公司业务/开发人员

</aside>

他们想：目标客户的痛点或者希望

<aside>
💡 想要自建AB测试平台,方便与自身业务系统集成

</aside>

#

# 产品愿景

<aside>

</aside>

<aside>

</aside>

这个：产品名称

<aside>

💡 插件化AB Testing平台

</aside>

是一个：什么样的产品类型（平台？工具？）

<aside>
💡 AB测试平台核心能力套件

</aside>

这个：产品名称

<aside>

</aside>

<aside>

</aside>

它可以：通过什么样的功能，为用户带来什么样的价值。

<aside>
💡 提供AB测试平台核心能力：配置管理、实验管理、数据采集、实验结果分析能力，实现Feature管理和AB实验统一，做到数据驱动产品迭代

</aside>

不同于：市场上的竞品及其特点

<aside>
💡 商业化AB测试平台缺乏与实际业务结合的灵活性

</aside>

<aside>
💡 大而全的开源AB测试平台难以与现有系统集成或进行二次开发

</aside>

它的优势是：我们产品的独特价值

<aside>
💡 提供核心能力插件化管理，并提供最小实现，即能满足独立部署运行需求，亦可支持开发人员结合实际需求进行剪裁或扩展

</aside>

## 项目目标

>

完成插件化AB Testing 平台核心功能开发
> 

>

## 项目目标

>

> 

>

探索AI在软件开发中的应用实践
> 

#

> 

#

# 核心业务能力

- 配置管理
    1. Feature Flag管理
        1. 提供Feature Config的元数据
    2. Feature Config管理
        1. 提供依据Feature Flag生产Feature Config 配置界面的能力
- 实验管理
    1. 实验管理
        1. 提供实验、分组、指标配置的管理功能
        2. 提供实验实验运行结果查看
    2.

互斥组中的实验流量之间互斥
    3. 实验执行阶段分组结果查询能力
- Tracking 数据收集
    
    埋点事件上报收集
    
- 配置发布
    
    提供统一的通过featureKey 获取配置的结果，统一Feature Config 和实验配置下发结果
    
```mermaid
graph LR
    subgraph "AB Testing 平台"
        AB测试核心能力 -->

配置管理
				AB测试核心能力 -->

配置管理

实验管理
				AB测试核心能力 --> 数据收集

配置发布
        数据收集 -->

指标分析
        配置管理 -->

FeatureFlag
        配置管理 -->

FeatureConfig
				实验管理 -->

实验配置
				实验管理 -->

实验分级
        配置发布 --> 实验结果
        配置发布 -->

配置发布
        数据收集 -->

指标分析
        配置管理 -->

        配置管理 -->

				实验管理 -->

实验配置
				实验管理 -->

实验分级
        配置发布 -->

FeatureConfig结果
    end

```

## 业务模型

[业务模型](ABstract%EF%BC%88%E6%

				实验管理 -->

实验配置
				实验管理 -->

实验分级
        配置发布 -->

    end

```

## 业务模型

    end

```

## 业务模型

8F%B0%EF%BC%89%20746b87acd94643ca871ec661b63f196c/%E4%B8%9A%E5%8A%A1%E6%A8%A1%E5%9E%8B%20d31846027b4f40ca99f6e76f897663a4.md)

#

#

# 进程间架构

[进程间架构](ABstract%EF%BC%88%E6%

#

# 进程间架构

# 进程间架构

8F%B0%EF%BC%89%20746b87acd94643ca871ec661b63f196c/%E8%BF%9B%E7%A8%8B%E9

%97%B4%E6%

9E%B6%E6%

9E%84%20d50744212b044d06a4b29fe931df391b.

md)

# Backend

#

# 技术栈

我们的技术栈是Sprig WebFlux + Spring Boot + Spring Reactive Data Couchbase

**

Sprig WebFlux**是Spring Framework 5.0引入的一种新的反应式Web框架，可以用于构建高性能的Web应用程序。

# 技术栈

**

它支持异步编程模型，可以处理大量的并发请求，适用于高负载的Web应用程序。

与传统的Servlet API相比，Sprig WebFlux提供了更好的性能、更高的吞吐量和更少的资源消耗。

**

**

Spring Boot**是一个用于构建独立的、生产级别的Spring应用程序的框架。

**

它提供了许多开箱即用的功能，如自动配置、嵌入式Web服务器和健康检查等，可以帮助开发人员快速构建Spring应用程序。

**

**

Spring Reactive Data Couchbase**是一个基于反应式编程模型的Couchbase客户端库，可以与Sprig WebFlux和Spring Boot一起使用。

它提供了异步的、非阻塞的API，可以处理大量的并发请求。

**

同时，它还提供了一些有用的功能，如自动映射、复杂查询和事务管理等。

#

**

#

# 架构风格

Smart Domain是一种软件架构风格，旨在通过将业务逻辑与数据访问逻辑分离来提高可维护性和可扩展性。

#

# 架构风格

在Smart Domain架构中，业务逻辑被定义为一个领域模型，它包含了应用程序的核心概念和行为。

与此同时，数据访问逻辑被封装在一个或多个数据访问对象中，它们负责与数据库交互。

#

# 架构风格

通过这种方式，Smart Domain架构可以使开发人员更加专注于业务逻辑，从而提高应用程序的质量和可维护性。

#

#

# Couchbase

Couchbase是一款面向企业应用的NoSQL数据库。

它提供了高性能、高可用性和可扩展性，使得它成为了许多企业的首选。

#

Couchbase支持类JSON文档、键值对和图形数据模型，非常适合用于Web应用、移动应用和物联网应用等场景。

对于需要高可用性和可扩展性的企业来说，Couchbase提供了一些非常有用的功能，如动态数据分片、自动故障转移和跨数据中心复制。

Couchbase还提供了一个灵活的查询引擎，使得查询数据变得非常容易。

同时，Couchbase还支持各种各样的客户端库，包括Java、Python、C#和Node.js等。

有关Couchbase的更多信息，请查看[Couchbase官方网站](https://www.couchbase.com/)。

# VUE

Last edited time: March 31, 2023 1:56 PM

<aside>
💡 This template provides context/instructions for the languages you use.

</aside>

# TypeScript

We use VUE3 with TypeScript for our frontend codebase.

We use VUE3 with TypeScript for our frontend codebase. 

# Code Style Guide

We largely follow Airbnb's React/JSX Style Guide:

[Style Guide | Vue.

js](https://vuejs.org/style-guide/)

# Engineering Interviews

<aside>
💡 Use this template to document your approach to interviewing engineers!

</aside>

documents/bussiness_context/NOTION_DB/Engineering Wiki 2402f5396a3244fdb3f1d135bdb0f3d6/Engineering Interviews 4be8039581d04456b0151f2cc4b22130.md

Create a quote by typing `/quote` and pressing `enter`.

>

Before you build a better mousetrap, it helps to know if there are any mice out there.

—Yogi Berra
> 

#

> 

#

Interview Question Database

<aside>
💡 [Inline databases](https://www.notion.

> 

#

<aside>

so/c523297c17634873a52317dd7a3e0b77) can be added to any page as tables, boards, calendars, lists or galleries.

<aside>

Just type `/database` to see your options.

</aside>

</aside>

[Questions](Engineering%20Interviews%204be8039581d04456b0151f2cc4b22130/Questions%20ede8818b3a0e447f80145905690eb3f6.

md)

For more on databases, check out this [Notion guide](https://www.notion.

so/fd8cd2d212f74c50954c11086d85997e).

# AWS

# Smart Domain

Last edited time: April 23, 2023 3:59 PM
Tags: Architecture, DDD

[Smart Domain](https://

github.com/Re-engineering-Domain-Driven-Design/Accounting/blob/main/public/Smart%20Domain%20Pattern.

documents/bussiness_context/NOTION_DB/Engineering Wiki 2402f5396a3244fdb3f1d135bdb0f3d6/Smart Domain 3b0daf8bb0d740439426cfab214f1fa6.md

pdf?raw=true)是一种新的软件架构模式，主要用于实现领域驱动设计（DDD）。

相较于传统的分层架构，Smart Domain更加注重从业务领域的角度去划分层次，并在每一层次上都使用领域专家和开发人员共同理解的通用语言进行交流，从而建立起完整的领域模型。

与此同时，Smart Domain还摒弃了服务层的概念，将原本在服务层实现的逻辑下沉到领域模型中，从而让领域模型更加丰满和清晰。

总之，Smart Domain是一种新的软件架构模式，通过从业务领域的角度去划分层次和使用通用语言建立领域模型，以及将服务层逻辑下沉到领域模型中，提高了领域驱动设计的实现效果。

[https://github.com/Re-engineering-Domain-Driven-Design/Accounting](https://

github.

github.

com/Re-engineering-Domain-Driven-Design/Accounting)

[直播加餐02｜如何使用Smart Domain实现DDD？

-极客时间](https://time.geekbang.org/column/article/556440)

#

github.

#

# SmartDomain 分层

1. Domain层
Domain层是整个系统的核心，主要定义业务相关的实体（Entity）和表示实体之间关联关系的关联对象。

#

1. Domain层

该层定义的实体和关联对象是业务模型的核心，反映了整个系统的业务规则和逻辑。

同时，该层仅提供接口或抽象类定义，不包含具体实现。

这样做可以避免业务逻辑和实现细节的混淆，也方便后续的扩展和维护。

#

1. Domain层

2. 集成层
集成层主要负责Domain层中关系对象的实现，该层会依赖数据库、Http接口访问进行功能实现。

2. 集成层

该层的职责是将Domain层的抽象定义转换成具体实现，包括数据持久化、网络通信等。

该层还可以处理一些跨域访问和数据加密解密等底层功能。

2. 集成层

3. API层
API层是整个系统的入口，基于Domain层的Entity或关联对象提供的能力，提供外部访问的RestFul接口。

2. 集成层

3. API层

该层负责处理外部请求，将请求参数转换成业务对象并调用Domain层的业务逻辑实现，返回结果给客户端。

3. API层

该层还可以对请求参数进行验证、安全过滤等操作，保证系统的安全性和可靠性。

-

-

chat prompt
    
    Smart Domain 架构模式，将系统架构分为三层：
    
    1. Domain层 - 定义与业务相关的实体（Entity），表示业务概念和实体之间的关联关系的关联对象。

关联对象通常是一个集合概念，表示实体的集合。

-

关联对象仅提供接口或抽象类的定义，不包含具体实现。

Domain层没有Repository、Service等技术型组件。

2. 集成层 - 提供Domain层中关联对象的实现。

该层会依赖数据库、Http接口等进行功能实现。

3. API层 - 基于Domain层的实体或关联对象提供的能力，提供外部访问的RestFul接口。
    
    #

    #

# 构建项目脚手架
    
    使用 Smart Domain 架构模式，本系统采用 Spring Boot 3.X、Java 17、Spring WebFlux、Spring Data reactive CouchBase、WebClient、Spring RSocket 等技术栈，并通过多模块实现分层管理。

# 构建项目脚手架
    
创建脚手架项目步骤：
    
    >

请给出脚手架项目搭建总体步骤，先不用给出具体操作
    > 
    -

    >

    > 
    -

创建 Gradle 多模块项目
        
        >

请仅给出创建 Gradle 多模块项目时root project的创建步骤
        > 
        -

        > 
        -

创建root project
            1. 创建 Gradle 多模块项目（如果未安装 Gradle，需要先安装）
                1. 打开Intellij IDEA，选择"Create New Project"。
                2. 在新建项目向导中，选择"Gradle"。

3. 选择"Create New Project"并点击"Next"。

4. 在"Project SDK"下拉菜单中选择您想要使用的Java JDK版本，并点击"Next"。
                5. 输入项目名称和项目路径，并点击"Finish"。

6. 删除src目录
        - 创建sub module
            
            创建sub module的步骤为：
            
            1. 在root project的根目录下，使用命令行或终端创建一个新的子目录。
            2. 进入子目录，并在其中创建一个新的Gradle项目。
            3. 在root project的settings.

gradle文件中，添加新的sub module。
            4. 在root project的build.

gradle文件中，定义新的sub module的依赖关系和构建任务。

- 创建root project

6.

删除src目录

# Getting Started

<aside>
💡 Notion Tip

: When creating a page, it's important to give it a clear title and provide some content.

documents/bussiness_context/NOTION_DB/Engineering Wiki 2402f5396a3244fdb3f1d135bdb0f3d6/Getting Started 6bc871dcdd4a4554b5b22c0c40740841.md

This could include verifying the information, summarizing the topic, or sharing your thoughts and opinions on something that matters to you.

</aside>

#

The Basics

## Create a Page

In your sidebar, click the `+` that appears next to the word **Workspace** on hover. A new page will appear.

Give it a title and start typing like you would in any other document.

#

#

# Headings

You can add headings and subheadings in one of two ways:

-

Type `/heading` or `/h1`, `/h2`, or `/h3` to choose the heading size you want.

-

# Headings

-

-

Use Markdown shortcuts, like `#`, `##`, and `##

-

#`.
    - Create inline code by wrapping text with ``` (or with the shortcut `cmd/ctrl + e`).

#

# Toggle Lists

-

-

#`.

#

-

Toggle lists streamline your content.

Click the arrow to open.
    - Click the arrow again to hide this content.
    - Create a toggle by typing `/toggle` and pressing `enter`.
    - You can add anything to toggles, including images and embeds.

#

# Callout Blocks

<aside>
💡 Create a callout block like this by typing `/call` and pressing `enter`.
Helpful for adding inline instructions, warnings, disclaimers, and tips.
Change the emoji icon by clicking on it.

</aside>

#

#

# Code Blocks

You can add code notation to any Notion page:

-

-

Choose the language from the dropdown in the bottom right corner.
- Here's an example:

```html
Hover over this block to see the <b>Copy to Clipboard</b> option!
```

- Your teammates can select any code to comment on it.

#

# Organizing Pages

Instead of using folders, Notion lets you nest pages inside pages.

-

Type `/page` and press `enter` to create a sub-page inside a page.

Like this

Like this

:

[Example sub-page](Getting%20Started%206bc871dcdd4a4554b5b22c0c40740841/Example%20sub-page%

2048f64d6186ec4428b2e4180475245a9c.

md)

#

Like this

:

md)

#

Advanced Techniques

Check out this [Notion Editor 101](https://www.notion.

md)

#

so/68c7c67047494fdb87d50185429df93e) guide for more advanced tips and how-to's.

# Useful Commands

Tags: Codebase, Guides and Processes

<aside>
💡 Frequently used commands.

This is a helpful page to [add to your Favorites](https://www.notion.

documents/bussiness_context/NOTION_DB/Engineering Wiki 2402f5396a3244fdb3f1d135bdb0f3d6/Useful Commands 8a05b1de77ec44b6a55e388c2cc7fe47.md

so/7ef7287cee00464d9a813073b02ce24a).

</aside>

# 🚚

Run Locally

In the `acme` directory, run: 

```bash

acme run --local
```

For a full list of options, use:

```bash
acme --help
```

To run the typechecker on the entire codebase:

```bash
acme typecheck
```

# 🚢 Deployment

When you deploy to staging or production, run the following on the deployment server:

```bash
acme deploy --staging 
```

Replace `--staging` with `--prod` if deploying production.

# Development Lifecycle

<aside>
💡 This page documents the development process engineers should follow at your company.

documents/bussiness_context/NOTION_DB/Engineering Wiki 2402f5396a3244fdb3f1d135bdb0f3d6/Development Lifecycle e20a5470e52f49e9bbc4f255cf81db4b.md

Helpful for getting new employees up to speed.

</aside>

# 1. Create a branch off of `master`

Name the branch with your first name pre-pended:
`leslie/cool-feature`

# 2. Writing code

You can link to other pages in your workspace in a couple ways:

-

Type `/link`, press `enter`, and type the name of the page you want.

This creates a link like this one:

[Engineering Guidelines](Engineering%20Guidelines%204208cbd4733d4f6f94982f3fb24f6379.

md)

-

md)

-

To create a link inline, type `@` followed by the title of the page, then press `enter`.

md)

-

The result looks like this: [Engineering Guidelines](Engineering%20Guidelines%204208cbd4733d4f6f94982f3fb24f6379.

md)

#

3.

md)

#

3.

Create a pull request on Github

Include the Notion task link in your PR description.

md)

#

3.

Include the Notion task link in your PR description. 

# 4. Submit for review

- Assign the task in Notion to the appropriate reviewer.

- You can always tag a person on a Notion page by typing `@` followed by their name.

# CircleCI

# How to Deploy

<aside>
💡 Use this template to describe the steps engineers should follow to deploy.

</aside>

# 1. Ping in Slack #deploys channel

Let everyone know

documents/bussiness_context/NOTION_DB/Engineering Wiki 2402f5396a3244fdb3f1d135bdb0f3d6/How to Deploy b7c4f3fd308944af8ba4637ec40fa4f9.md

you're about to start a deploy. 

#

2. SSH into the deployment server

<aside>

💡 Create a code block by typing `/code` and pressing `enter`.

</aside>

```bash
ssh deployments.

<aside>

</aside>

```bash

acmecorp.com
```

#

3.

```bash

```

#

3.

Run the following commands

```bash
acme deploy --

prod
```

# 业务模型

#

# 模型图

```
@startuml
'https://plantuml.com/class-diagram

left to right direction
package "Feature Flag" {
    entity

documents/bussiness_context/NOTION_DB/Engineering Wiki 2402f5396a3244fdb3f1d135bdb0f3d6/ABstract（插件化AB Testing平台） 746b87acd94643ca871ec661b63f196c/业务模型 d31846027b4f40ca99f6e76f897663a4.md

FeatureFlag #pink{
        id: FeatureFlagId
        featureKey: String
        description: FeatureFlagDescription
        featureConfigs: FeatureConfigs
    }

    entity FeatureConfig #pink{
            id: FeatureConfigId
            featureKey: String
            data: Object
            trackData: Object
            condition: FilterCondition
            description:

FeatureConfigDescription
            status

: FeatureConfigStatus
    }

    interface FeatureFlags #Orange {
        getFeatureFlag(featureKey: String): FeatureFlag
    }

    interface FeatureConfigs #Orange {
        getFeatureConfigs(featureKey:

String): List<FeatureConfig>
    }

    interface CustomerFeatureConfigs #Orange {
        getFeatureConfigs(feature

Key: String, customer: Customer)

:

:

List<FeatureConfig>
    }

    FeatureFlags "1" -- "0..N" FeatureFlag
    FeatureFlag "1" -- "1" FeatureConfigs
    FeatureConfigs "1" -- "0..N" FeatureConfig
    CustomerFeatureConfigs "1" -- "0..N" FeatureConfig
}

package "Experiment"

as ExperimentPackage{
    entity ExperimentGroup #pink {
        id: ExperimentGroupId
        description: ExperimentGroupDescription
    }

    entity Experiment #pink {
        id: ExperimentId
        groupId:

ExperimentGroup

Id
        description: ExperimentDescription
        condition: FilterCondition
        percentage: Percentage
    }

    entity Bucket #pink {
            key: String
            config: Object
            percentage: Percentage
    }

    entity Assignment #pink {
        id: AssignmentId
        experimentId

: ExperimentId
        bucketKey:

String
        client

Id

: String
        customer

Id: String
        description: AssignmentDescription
    }

    interface ExperimentGroups #Orange {
        getExperimentGroup(groupId: ExperimentGroupId)

: ExperimentGroup
    }

    interface ExperimentGroupExperiments #Orange {
      getExperiments(groupId: ExperimentGroupId): List<Experiment>
    }

    interface Experiments #Orange {
        getExperiment(experiment

Id: ExperimentId): Experiment
    }

    interface CustomerAssignments #Orange {
        getAssignments(experimentId: ExperimentId, customer: Customer)

: Assignment
    }

    interface ExperimentAssignments #Orange {
        getAssignments(experimentId: ExperimentId): List<Assignment>
        getAssignments(experimentId: ExperimentId, bucketKey:

String): List<Assignment>
    }

    ExperimentGroups "1" -- "0..N" ExperimentGroup
    ExperimentGroup "1" -- "1" ExperimentGroupExperiments
    ExperimentGroupExperiments "1" -- "0..N" Experiment
    Experiments "1" -- "0..N" Experiment
    Experiment "1" -- "1..N" Bucket
    ExperimentAssignments "1" -- "1" Experiment
    ExperimentAssignments "1" -- "0..N" Assignment
    CustomerAssignments "1" -- "0..N" Assignment
}

package "Tracking" {
    entity TrackingEvent #pink {
        id: TrackingEventId
        clientId: String

        bucketKey: String
        name: TrackingEventName
        description: TrackingEventDescription
    }

    interface TrackingEvents #Orange {
        getTrackingEvents(experimentId: ExperimentId, bucketKey:

String): List<TrackingEvent>
    }

    TrackingEvents "1" -- "0..N" TrackingEvent
    TrackingEvent "1..N" .. "1" Experiment
    TrackingEvent "1..N" .. "1" Bucket
}

package "metrics" {
    entity MetricMeta #pink {
        id

: MetricDescription
    }

    entity Metric #pink {
        id: MetricId
        name: MetricName
        description: MetricDescription
    }

    interface Metrics #Orange {
        getMetrics(me

tricMetaId

: MetricMetaId): List<Metric>
    }

    interface MetricMetas #Orange {
        getMetricMetas()

: List<Metric

Meta>
    }

    interface MetricMetaMetrics #Orange {

    }
    MetricMetas "1" -- "0..N" MetricMeta
    MetricMeta "1" -- "1" MetricMetaMetrics
    MetricMetaMetrics "1" -- "0..N" Metric
    Metrics "1" -- "0..N" Metric

}

package MemberCriteria {
    entity Segment #pink {
        id:

SegmentId
        name: String
        description: SegmentDescription
    }

    interface Segments #Orange {
        getSegments()

: List<Segment>
    }

    interface CustomerSegments #Orange {
        getSegments(customer: Customer)

    }

    }

    Segments "1" -- "0..N" Segment
    CustomerSegments "1" -- "0..N" Segment
}

    }

}

entity Customer #Green {
    id: CustomerId
    clientId: String
    description: CustomerDescription
}

Customer --

}

CustomerFeatureConfigs

CustomerAssignments
CustomerAssignments -- CustomerSegments
CustomerFeatureConfigs -- CustomerSegments

Experiment "1" -- "0..N" MetricMeta
Experiment "1" -- "0..N"

Metric
CustomerFeatureConfigs "1" -- "1" CustomerAssignments
Experiment "1" -- "0..N" Segment
FeatureConfig "1" -- "0..N" Segment
"metrics" .. "

Tracking"
@enduml
```

![Untitled](%E4%B8%9A%E5%8A%A1%E6%A8%A1%E5%9E%8B%20d31846027b4f40ca99f6e76f897663a4/Untitled.

png)

# 进程间架构

```
@startuml
'https://plantuml.com/component-diagram
package "前端" {
  [APP]
  [H

5]
  [小程序]
}

package "BFF" {
  [APP] -->

[APP BFF]
  [H

5] --> [H

5 BFF]
  [小程序] --

documents/bussiness_context/NOTION_DB/Engineering Wiki 2402f5396a3244fdb3f1d135bdb0f3d6/ABstract（插件化AB Testing平台） 746b87acd94643ca871ec661b63f196c/进程间架构 d50744212b044d06a4b29fe931df391b.md

5]
  [小程序]
}

  [APP] -->

[APP BFF]
  [H

5] --> [H

5 BFF]
  [小程序] --

> [小程序 BFF]
}

package "AB Testing" {
    package "数

据埋点" {
      
[APP BFF] --> [数

据埋点]
      [H

5] --> [H

5 BFF]
  [小程序] --

> [小程序 BFF]
}

    package "数

据埋点" {
      
据埋点]
      [H

5 BFF] --> [数据埋点]
      [小程序 BFF] --> [数据埋点]
      [数据埋点] -- [数据仓库]
    }
  [APP BFF] --> [Feature Flag]
  [H

5 BFF] -->

据埋点" {
      
据埋点]
      [H

    }
  [H

5 BFF] -->

[Feature Flag]
  [小程序 BFF] -->

  [

据埋点]
      [H

    }
  [H

5 BFF] -->

  [

Feature Flag] -- [Feature Configs]
  [

Feature Flag] -Right-

5 BFF] -->

  [

  [

[Experiments]
  [Experiments] --

[Experiments Analytics]
  [Experiments

Analytics] -Right->

  [

  [

[数据仓库]
}

@enduml
```

![Untitled](%E8%BF%9B%E7%A8%8B%E9

[数据仓库]
}

@enduml
```

9E%B6%E6%

9E%84%20d50744212b044d06a4b29fe931df391b/Untitled.

png)

# FizzBuzz

Difficulty: Easy
Skills: Algorithms, Front end

<aside>
💡 Create a new question in this database and choose `Interview Question` from the list of templates to automatically generate the format below.

</aside>

documents/bussiness_context/NOTION_DB/Engineering Wiki 2402f5396a3244fdb3f1d135bdb0f3d6/Engineering Interviews 4be8039581d04456b0151f2cc4b22130/Questions ede8818b3a0e447f80145905690eb3f6/FizzBuzz 70828a5e5e6846a48686f66bb9ccc8b6.md

# Description

Write a description for the interview question here.

#

Sample Inputs

Give some valid inputs the candidate can expect to test their solution with.

- ...
- ...

# Expected Outputs

For each sample input above, list the expected output. 

- ...
- ...

# Solutions

Provide possible solutions

in common languages to this problem.

#

#

# Javascript

```jsx
function solution() {
	
}
```

#

#

# Python

```python
def solution():
	pass
```

# Alphabet Ordering

Difficulty: Hard
Skills: Algorithms, Data Structures

documents/bussiness_context/NOTION_DB/Engineering Wiki 2402f5396a3244fdb3f1d135bdb0f3d6/Engineering Interviews 4be8039581d04456b0151f2cc4b22130/Questions ede8818b3a0e447f80145905690eb3f6/Alphabet Ordering a3c46877392e4fff85a9dcf594f4e066.md

# Sample Inputs

- ...
- ...

- ...
- ...

# To Do List Design

Difficulty: Medium
Skills: Architecture, Backend, Front end

documents/bussiness_context/NOTION_DB/Engineering Wiki 2402f5396a3244fdb3f1d135bdb0f3d6/Engineering Interviews 4be8039581d04456b0151f2cc4b22130/Questions ede8818b3a0e447f80145905690eb3f6/To Do List Design 9d9cb6c13b4b4a0a8f7ab03a8c98a2d8.md

# Example sub-page

Tags: Testing

documents/bussiness_context/NOTION_DB/Engineering Wiki 2402f5396a3244fdb3f1d135bdb0f3d6/Getting Started 6bc871dcdd4a4554b5b22c0c40740841/Example sub-page 48f64d6186ec4428b2e4180475245a9c.md