# 面试鸭分享

做着玩和真正上线有很大的区别

https://github.com/liyupi/mianshiya-public



### 创作原因

1. 挖掘需求：自己遇到的问题，看别人的项目并且找出别人项目的缺点 

验证需求是否有价值：能解决别人的问题，**能否解决通用的问题**（对内 - 对自己、对外 - 对其他用户）

#### 这个项目能给我们带来什么？

1. 对别人的价值
2. 兴趣
3. 引流
4. 做项目出视频、分享
5. **巩固所学知识**、学习知识



**程序员面试刷题讨论平台**

竞品：

- A 知乎：问答 | **不垂直**
- B LeetCode：算法刷题 | 主打的不是面试题，大家很少在上面讨论某一道题目
- C 牛客网：讨论面经 + 刷题 |  主打的不是面试题，大家很少在上面讨论某一道题目，不能集中搜索面试题
- D 其他现成的面试题库 | 不能讨论、个人维护（更新慢）

A + B + C 进行融合，取长补短、精简化

**为什么轮子多？**

1. 每个产品都有优点、优缺点，面向的需求不一样
2. 卷：API Fox、API Post、Eolink，竞争
3. 大佬的任性



### 需求篇

千万不要一上来就大而全，要先把核心功能 **快速上线和验证**，得到用户反馈

再进行下一步操作。

**不要闷头开发。**

**敏捷开发，小步快跑，慢慢加功能。**



#### 核心功能

搜索面试题

分类查看面试题

在线查看题解、讨论题目

自由上传题目



#### 扩展功能

试卷功能

语音读题

视频题解

讨论区



调研、按优先级排期



### 技术选型

**人力成本**

**稳定**



- 项目的量级（用户数、频率、做到什么地步？）

- 成本

  - 价格
  - **人力成本** ：围绕着人来，团队对技术的熟悉程度；团队内要有一个问题解决者、领导者

- **生态**

  怎么判断：去网上搜 github 的 star 数**（开源）**、业内的认可、文章

  - Spring
  - Vue、React

- 看作者（看公司）

  - 稳定性

- **目的**：学习



为什么选某些技术？

后端为啥不用 Java？

- 效率第一：选用云开发，对 node.js
- redis： 限流
- Elasticsearch 搜索引擎技术：提高搜索的灵活性**（贵）**
- 对象存储：存文件（用户图片、静态文件）



为什么后来对技术架构做了升级？！将云开发重构为 Express？

- 开发框架：Express（Express Session）

云开发 Serverless 架构：每个函数都是一个系统，独立开发、独立更新、独立维护。多个函数共同组成完整系统。

> 粒度比为服务更新。清晰、互不影响，云开发对云函数的支持很好。

随着系统量级增大：

1. 云函数数量太多
2. 云函数之间要共享变量比较麻烦
3. 不方便增加统一的逻辑（比如增加请求拦截）



**为什么重构为 Node 而不是 Java？**

方便迁移，降低成本



CDN 加速：**如果是自己的项目，尽量不要用付费的**

**没有必要过度去技术选型**



用 Java 的 SpringBoot 做了一些微信公众号登录服务。

主要原因：有现成的 WxJava 库。



> 对技术不了解的话，看下星球的用户中心项目。



### 设计篇

#### 数据库设计

我使用云开发可视化界面操作，没有写 SQL 语句。

类型在 TypeScript 中也有定义，所以不会丢失。

> liyupi/mianshiya-public/src/models/类型定义



#### ES 索引 设计

> 搜索性能更好、更灵活的数据库

es 安装 ik 中文分词器（免费）

有自己的词库。

索引 => 理解为 MySQL 的表

```javascript
{
  "aliases": {
    "question": {}
  },
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "ik_max_word",
        "search_analyzer": "ik_smart",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "detail": {
        "type": "text",
        "analyzer": "ik_max_word",
        "search_analyzer": "ik_smart",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "reviewStatus": {
        "type": "keyword"
      },
      "link": {
        "type": "keyword"
      },
      "tags": {
        "type": "keyword"
      },
      "links": {
        "type": "keyword"
      },
      "userId": {
        "type": "keyword"
      },
      "params": {
        "type": "object"
      },
      "type": {
        "type": "long"
      },
      "difficulty": {
        "type": "long"
      },
      "meetNum": {
        "type": "long"
      },
      "favourNum": {
        "type": "long"
      },
      "shareNum": {
        "type": "long"
      },
      "commentNum": {
        "type": "long"
      },
      "thumbNum": {
        "type": "long"
      },
      "viewNum": {
        "type": "long"
      },
      "reviewMessage": {
        "type": "keyword"
      },
      "priority": {
        "type": "long"
      },
      "reviewerId": {
        "type": "keyword"
      },
      "reviewTime": {
        "type": "date"
      },
      "publishTime": {
        "type": "date"
      },
      "_createTime": {
        "type": "date"
      },
      "_updateTime": {
        "type": "date"
      },
      "isDelete": {
        "type": "keyword"
      }
    }
  }
}
```



#### ES 和 MySQL 怎么同步（保证一致性）？

强一致性：

1. 事务双写：插入数据时两个库里都必须插入成功，才算成功，有任何一个失败就回滚（写入性能低）

稍强一致性：

1. 监听 binlog：mySQL 在插入数据成功后，会写入 binlog 日志，我们只开一个程序（线程）需要监听 binlog 的变化，如果发现有插入，就也插入到 es（canal 技术）

弱一致性：

1. 定时同步：每分钟读取 MySQL 中近 5 分钟内新增的数据，然后写入 ES（根据 id 判断已写入）

定时检测和补偿程序：每天 / 每小时去对比两个库，如果发现不一致，自动以数据库为主，或者发送告警，人工处理。



### 团队开发篇

### 内容

1. 群众的力量（钞能力）

公开招人帮忙上传题目、审核题目。

**定制规范很重要！** 统一标准

2. CV 的力量



### 团队怎么开发和管理

1. 要有一个协作文档 / 平台

   分场景：小团队建议直接用腾讯文档。平台有使用成本、没有使用习惯、没那么方便。

2. 日常沟通：了解成员工作情况、代码编写信息

3. 团队代码怎么管理：

   1. GitHub 组织功能，私有仓库

   2. 不能所有同学都把直接提交到一起，要划分分支来区分每个人的代码

      分支：

      1. 每个人一个分支
      2. 每个需求一个分支（大项目）

   3. 提交前 MR **代码审查**



### 技术源码篇

前端

后端

其他服务



### 上线篇

1. 选择 Docker 方式部署，原因：

   1. 腾讯云云开发支持快速 Docker 部署，很方便。
   2. 分布式部署，Docker 弹性伸缩很方便，不用自己输命令。

2. 测试

   1. 拉了个 500 人内测群
   2. 产品反馈平台 —— 腾讯图小巢：https://support.qq.com/products/370820?

3. 开源前：写好 README.md 项目介绍文档，参考知名项目的文档仿写，可以复制别人的 README 改写

   > 小图标网站：https://shields.io/



### 运营篇

1. 关于网站维护，最麻烦的是内容，建议：
   1. 大家找帮手 / 合作来维护
   2. 完善系统，开发一些功能来降低维护成本

2. 持续看用户反馈

3. 给网站添加统计分析功能（比如百度统计），每天查看一下用户访问数、**用户来源**

4. 关于网络安全

   1. 少用收费的东西（比如 CDN），或者用免费的 CDN，降低不稳定因素
   2. 如果有条件，不要暴露你项目的真实 ip
   3. DDOS 防不住！！！**轻量级应用防护 31 一块钱一年防 10 G**

   

### 推广篇

不细讲。

1. 自己有流量，自己写文章视频
2. 如果你完全没有流量，怎么推广？
   1. 花钱
   2. 找类似的项目，去适当的、找机会去分享自己的项目（介绍你的项目）
   3. 友链
   4. SEO：搜索引擎优化，别人能搜到你的网站

加入星球的同学，如果你有 **足够好的** 项目和点子，可以来找我
