Skip to content

Commit

Permalink
Update
Browse files Browse the repository at this point in the history
  • Loading branch information
youngyangyang04 committed Nov 10, 2023
1 parent 2caee6f commit 139a4db
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 116 deletions.
60 changes: 31 additions & 29 deletions problems/前序/互联网大厂研发流程.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# 揭秘互联网大厂研发流程

[B站:揭秘互联网大厂研发流程](https://www.bilibili.com/video/BV1KR4y1H7ST)

很多录友会很好奇这么个事:

* 大厂的研发流程应该是什么样的呢
Expand All @@ -8,17 +10,6 @@

这次给大家介绍一波大厂的研发流程,让大家明明白白。

同时我已经录制了视频,昨晚已经在B站首发了。

视频里讲的更清楚一点,因为我是没有草稿,先录的视频,然后在根据视频写的文章,写文章的时候,发现我视频里讲的太多了,码字实在是码不过来,所以这篇文字稿中每一个研发环节的解释稍稍精简了一下。

如果详细了解研发流程就直接看视频吧,**别告诉卡哥,你还没关注 「代码随想录」的B站,还不赶紧关注一波[机智]**

重要重要重要: **要给三连呀!**

[B站:揭秘互联网大厂研发流程](https://www.bilibili.com/video/BV1KR4y1H7ST)


其实对于几十人或者上百人一起开发一个项目的话,一个规范的研发流程是很重要的。

有的同学可能想,哪有这么多流程啊,就是写完代码,跑一下,没问题,然后就上线了。
Expand All @@ -33,15 +24,15 @@

看需求文档,我们要根据需求文档来确定我们究竟要做什么。

一些同学可能感觉 为什么还要用一个需求文档呢,你就告诉我做啥我就做啥不就完事了
一些同学可能感觉 为什么还要用一个需求文档呢,你就告诉我做啥我就做啥不就完事了

其实需求文档一方面是倒逼产品经理去系统性的思考这个需求究竟有哪些功能,用来满足哪些用户的需求。
需求文档一方面是**倒逼产品经理去系统性的思考这个需求究竟有哪些功能**,用来满足哪些用户的需求。

另一方面,是保证我们在研发的时候,研发出来的功能是满足需求文档里所描述的。
另一方面是**保证我们在研发的时候,研发出来的功能是满足需求文档里所描述的**

如果是口头对接的话,很有可能就是你做出来的东西,产品经理看完感觉:这和我说的需求不一样啊!!这和我想的不一样啊!!

这样就是两个人相互甩锅,那这究竟是谁的锅呢。都没有一个证据,对吧。
这样就是两个人相互“甩锅”,那这究竟是谁的锅呢。都没有一个证据,对吧。

所以说,有一个需求文档很重要。

Expand All @@ -67,13 +58,13 @@

你说你一周的时间就能把它开发完,那为什么是一周呢,为什么不是两天,为什么不是两周呢。

其实 和上面的领导汇报你的工作的时候 都要把自己的工作进行量化。
其实 和上面的领导汇报你的工作的时候 **都要把自己的工作进行量化**

那么这个功能有哪些难点,我们要克服这个难点,所需要花费的时间,都要有一个大体的量化。

这样才能量化我们自己的工作,**领导其实不知道你的工作是简单 还是困难, 领导只在意最终结果**所以你要展现给领导你的工作是有难度的是有挑战的
这样才能量化我们自己的工作,**领导其实不知道你的工作是简单 还是困难, 领导只在意最终结果**所以你需要展现给领导你的工作是有难度的是有挑战的

而且这些也是我们年底用来晋升或者评职称的素材
而且**这些也是我们年底用来晋升或者评职称的素材**

如果这些东西你自己都不在乎的话,谁还会帮你在乎呢。

Expand Down Expand Up @@ -108,7 +99,7 @@

所以只要有交互,就要确定协议的数据格式。

定协议要考虑到兼容,要考虑易于维护。
**定协议要考虑到兼容,要考虑易于维护**

## 6.设计数据结构和算法

Expand All @@ -122,13 +113,19 @@

为什么会这样呢? 一个很简单的例子,互联网研发讲究其实就是要快,例如一个功能2天就要开发完,如果算法都要自己去写的话,等都写完了,花都谢了。

最关键的是,**你实现的算法 极大概率没有现成的算法接口安全性高**

**开发中要学会才在巨人的肩膀上**

## 7.预估一下容量

特别是后端开发,要估计出 我们自己模块大体需要多大磁盘,多大内存,多大带宽,多少核CPU。

这也是没有做过研发工作的同学经常忽略的,**因为大家好像默认 磁盘、内存、带宽、cpu是无穷的**

其实我们在设计一个模块的时候,这些都要评估的,不能模块一上线,把机器直接打爆了,例如 直接把带宽打满了,不仅影响自己的模块功能,还影响了机器上其他模块的运行。
其实我们在设计一个模块的时候,这些都要评估的,不能模块一上线,把机器直接打爆了。

例如 直接把带宽打满了,不仅影响自己的模块功能,还影响了机器上其他模块的运行。


## 8.考虑部署
Expand All @@ -139,7 +136,9 @@

还有就是要弹性可伸缩,即我们的模块可不可以直接 部署多台机器来提高承载能力。

如果用户量突然上来了,或者流量突然上来了,可以通过快速部署多台机器来抗住流量。而不是模块只能在单机上跑,多部署几台就发生各种问题。
如果用户量突然上来了,或者流量突然上来了,可以通过快速部署多台机器来抗住流量。

而不是模块只能在单机上跑,多部署几台就发生各种问题。

**这才能说明是有足够强的风险意识的**

Expand Down Expand Up @@ -170,19 +169,19 @@

这里就有很多沟通工作了,因为其他同学可能手头有自己的活,那么就要协调一个时间来一起测试。

这一步也是很费时间的,其费时关键是要等,要等其他同学有空和你联调,而且往往不是联调一次就能解决问题的。
这一步也是很费时间的,**其费时关键是要等,要等其他同学有空和你联调或者是别人等你**,而且往往不是联调一次就能解决问题的。

所以 在评估开发时间的时候 也要考虑到联调的时间。

这也是大厂研发效率低的地方,但上百人开发的项目,这种沟通上消耗也是在所难免的。
这也是大厂研发效率低的地方,但上百人开发的项目,**这种沟通上消耗也是在所难免的**

## 13.交给测试

自己的代码,自己测 一般都测不出什么问题,需要交给测试同学来给你测一测。

这里如果测试同学测出问题,你就要判断确实有问题还是 测试方式不对,如果有问题就要修改,在提给测试,反反复复这么几轮,直到测试同学测试没问题了。
这里如果测试同学测出问题,你就要判断确实有问题还是 测试方式不对,如果有问题就要修改,再提给测试,反反复复这么几轮,直到测试同学测试没问题了。

这个过程也是累心的。
**这个过程也是累心的**

## 14.code review

Expand All @@ -202,12 +201,15 @@

其实合入主干是很重要的,经常是自己的代码没问题,但合入主干之后就有问题了。

一般就是合入主干的时候有冲突,例如你从主干拉出一个分支,另一个同学从主干拉出一个分支,而且两个分支修改了同一个模块,如果另一个同学提前合入主干,你在合入主干的时候就会有代码冲突
一般就是合入主干的时候有冲突,例如你从主干拉出一个分支,另一个同学从主干拉出一个分支,而且两个分支修改了同一个模块,如果另一个同学提前合入主干,你再合入主干的时候就会有代码冲突

在解决代码冲突的时候 就会修改别人的代码,这个过程很容易产生新的bug。


**一般合入主干之后,测试同学还要重新跑一个全量测试,才能放心发布**

如果跑全量测试没有问题的话,才会松一口气(懂的人都懂)。

## 16.发布

最后一步就是发布了。
Expand All @@ -218,15 +220,15 @@

用大白话来讲,就是把 本地的代码或者某台机器的代码,编译成可执行文件,然后更新到 线上的服务器(一个独立的集群,专门处理线上的流量)并运行起来。

上线是最重要的一步了,也很容易出问题,因为一个大型项目,其上线的过程都非常复杂(要更新上百台机器的集群),而且要考虑线上新版和旧版本的兼容问题
上线是最重要的一步了,也很容易出问题,因为一个大型项目,其上线的过程都非常复杂(要更新上百台机器的集群),而且**要考虑线上新版和旧版本的兼容问题**

这也是为什么大厂项目都选择深夜上线,**因为深夜在线用户最少,如果出问题,影响的用户会比较少,可以快速修复**

所以大家经常看到 某大厂程序员深夜上线发布版本之类的。

# 总结
## 总结

好了,整整讲了十六个步骤!把大厂研发流程中 具体都有哪一步,为什么要这么做,都分析的很清楚了。
好了,整整讲了十六个步骤!把大厂研发流程中 具体都有哪一步,为什么要这么做,都分析的很清楚了。

不过在大厂也不是所有部门都按照这个流程来的,每个部门都有自己玩法,各个部门也不太统一。

Expand Down
Original file line number Diff line number Diff line change
@@ -1,120 +1,60 @@

# 什么是核心代码模式,什么又是ACM模式?

现在很多企业都在牛客上进行面试,**很多录友和我反馈说搞不懂牛客上输入代码的ACM模式**
很多录友刷了不少题了,到现在也没有搞清楚什么是 ACM模式,什么是核心代码模式

什么是ACM输入模式呢? 就是自己构造输入数据格式,把要需要处理的容器填充好,OJ不会给你任何代码,包括include哪些函数都要自己写,最后也要自己控制返回数据的格式。
平时大家在力扣上刷题,就是 核心代码模式,即给你一个函数,直接写函数实现,例如这样:

![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231109193631.png)

**这里给大家推荐ACM模式练习网站**[kamacoder.com](https://kamacoder.com),把上面的题目刷完,ACM模式就没问题了。

而ACM模式,是程序头文件,main函数,数据的输入输出都要自己处理,例如这样:

而力扣上是核心代码模式,就是把要处理的数据都已经放入容器里,可以直接写逻辑,例如这样:
![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231109193743.png)

```CPP
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
大家可以发现 右边代码框什么都没有,程序从头到尾都需要自己实现,本题如果写完代码是这样的: (细心的录友可以发现和力扣上刷题是不一样的)

}
};
```
![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231109193931.png)

**如果大家从一开始学习算法就一直在力扣上的话,突然切到牛客网上的ACM模式会很不适应**

因为我上学的时候就搞ACM,在POJ(北大的在线判题系统)和ZOJ(浙大的在线判题系统)上刷过6、7百道题目了,对这种ACM模式就很熟悉
**如果大家从一开始学习算法就一直在力扣上的话,突然切到ACM模式会非常不适应**

接下来我给大家讲一下ACM模式应该如何写
知识星球里也有很多录友,因为不熟悉ACM模式在面试的过程中吃了不少亏

这里我拿牛客上 腾讯2020校园招聘-后台 的面试题目来举一个例子,本题我不讲解题思路,只是拿本题为例讲解ACM输入输出格式。

题目描述:
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20230727163624.png' width=500 alt=''></img></div>

由于业绩优秀,公司给小Q放了 n 天的假,身为工作狂的小Q打算在在假期中工作、锻炼或者休息。他有个奇怪的习惯:不会连续两天工作或锻炼。只有当公司营业时,小Q才能去工作,只有当健身房营业时,小Q才能去健身,小Q一天只能干一件事。给出假期中公司,健身房的营业情况,求小Q最少需要休息几天。
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20230727163938.png' width=500 alt=''></img></div>

输入描述:
第一行一个整数 表示放假天数
第二行 n 个数 每个数为0或1,第 i 个数表示公司在第 i 天是否营业
第三行 n 个数 每个数为0或1,第 i 个数表示健身房在第 i 天是否营业
(1为营业 0为不营业)
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20230727164042.png' width=500 alt=''></img></div>

输出描述:
一个整数,表示小Q休息的最少天数
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20230727164151.png' width=500 alt=''></img></div>

示例一:
输入:
4
1 1 0 0
0 1 1 0
<div align="center"><img src='https://code-thinking-1253855093.file.myqcloud.com/pics/20230727164459.png' width=500 alt=''></img></div>

输出:
2
## 面试究竟怎么考?

笔试的话,基本都是 ACM模式。

这道题如果要是力扣上的核心代码模式,OJ应该直接给出如下代码:
面试的话,看情况,有的面试官会让你写一个函数实现就可以,此时就是核心代码模式。

```CPP
class Solution {
public:
int getDays(vector<int>& work, vector<int>& gym) {
// 处理逻辑
}
};
```
有的面试官会 给你一个编辑器,让你写完代码运行一下看看输出结果,此时就是ACM模式。

以上代码中我们直接写核心逻辑就行了,work数组,gym数组都是填好的,直接拿来用就行,处理完之后 return 结果就完事了
有的录友想,那我平时在力扣刷题,写的是核心代码模式,我也可以运行,为啥一定要用ACM模式

那么看看ACM模式我们要怎么写呢。
**大家在力扣刷题刷多了,已经忘了程序是如何运行的了**,力扣上写的代码,脱离力扣环境,那个函数,你怎么运行呢?

ACM模式要求写出来的代码是直接可以本地运行的,所以我们需要自己写include哪些库函数,构造输入用例,构造输出用例
想让程序在本地运行起来,是不是需要补充 库函数,是不是要补充main函数,是不是要补充数据的输入和输出。 那不就是ACM模式了

拿本题来说,为了让代码可以运行,需要include这些库函数:
综合来看,** ACM模式更考察综合代码能力, 核心代码模式是更聚焦算法的实现逻辑**

```CPP
#include<iostream>
#include<vector>
using namespace std;
```
## 去哪练习ACM模式?

这里给大家推荐卡码网: [kamacoder.com](https://kamacoder.com/)

然后开始写主函数,来处理输入用例了,示例一 是一个完整的测试用例,一般我们测了一个用例还要测第二个用例,所以用:while(cin>>n) 来输入数据
你只要能把卡码网首页的25道题目 都刷了 ,就把所有的ACM输入输出方式都练习到位了,不会有任何盲区

这里输入的n就是天数,得到天数之后,就可以来构造work数组和gym数组了。
![](https://code-thinking-1253855093.file.myqcloud.com/pics/20231109195056.png)

此时就已经完成了输入用例构建,然后就是处理逻辑了,最后返回结果
而且你不用担心,题目难度太大,直接给自己劝退,**卡码网的前25道题目都是我精心制作的,难度也是循序渐进的**,大家去刷一下就知道了

完整代码如下:

```CPP
#include<iostream>
#include<vector>
using namespace std;
int main() {
int n;
while (cin >> n) {
vector<int> gym(n);
vector<int> work(n);
for (int i = 0; i < n; i++) cin >> work[i];
for (int i = 0; i < n; i++) cin >> gym[i];
int result = 0;

// 处理逻辑

cout << result << endl;
}
return 0;
}
```

可以看出ACM模式要比核心代码模式多写不少代码,相对来说ACM模式更锻炼代码能力,而核心代码模式是把侧重点完全放在算法逻辑上。

**国内企业现在很多都用牛客来进行面试,所以这种ACM模式大家还有必要熟悉一下**,以免面试的时候因为输入输出搞不懂而错失offer。

如果大家有精力的话,也可以去POJ上去刷刷题,POJ是ACM选手首选OJ,输入模式也是ACM模式。





-----------------------
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码.jpg width=450> </img></div>

0 comments on commit 139a4db

Please sign in to comment.