揭秘一线大厂研发流程前端
你们好,我是鱼皮。git
不少未工做过的小伙伴都很好奇:企业中作项目是怎样的流程?尤为是大厂那些百万用户的项目,和本身学编程时作项目到底有什么区别呢?程序员
实话说,区别可大了!算法
本身开发项目那是单打独斗,本身掌握命运,不会拖垮队友;但企业中开发项目是开团打本,你们是一根绳上的蚂蚱,每一个人都会影响整个项目。数据库
我本身也在几家公司实习过,不得不说,大厂和其余公司的研发流程也有很大的区别。编程
所以,对于大多数同窗,若是没有在大厂工做过,对不少研发环节可能都是一无所知的。后端
因此今天给你们揭秘一下大厂的项目研发流程,帮你们开拓思路。设计模式
正好以前有同志质疑个人平常工做就只有写代码和摸鱼?!这篇文章就做为回击,让他明白,在大厂作项目,可不止写代码那么简单!数组
为了规范团队、保证项目的进展,大厂研发流程一般仍是比较复杂的。安全
能够分为不少个阶段,用一张思惟导图来归纳:
须要注意的是,以上阶段并非彻底按从上到下的顺序执行,阶段间可能存在交叉,好比 技术选型 其实在 设计阶段 就应该考虑。
正式工做一年多,我也是经历过屡次项目的完整研发流程的。下面就以个人视角,带你们快速过一遍~
(为了内容更有趣,如下故事有虚构成分)
今天是周一,鱼皮像往常同样骑着他的小电动车来到公司,却不知,等待他的是一场噩梦的开始。
上午十点,产品妹子找到鱼皮,告诉他:我们的系统上线后,用户表示不少功能并很差用,须要大改。
老板也找到鱼皮,告诉他:我今天打开页面居然加载了十几秒,我们这个系统的性能太烂了吧!
鱼皮心想:呕豁,完蛋!估计得作个新的项目了,又要开会了。
果真,没过多久,屏幕上弹出了一条 “欢迎加入会议” 的邀请。
次日上午,老板、产品、测试、几位开发大哥和鱼皮一块儿来到会议室,具体讨论昨天提到的那些需求 是否合理、要不要作 ?
产品妹子打开文档,说到:这一期呢,咱们要作这几个需求,下面我来详细讲一下,你们一块儿评估下有没有问题。
接下来,产品妹子正在对着屏幕侃侃而谈、疯狂输出时,旁边的开发大哥坐不住了。
开发大哥:这个需求不合理啊!
产品:为啥不合理?用户就是有这个需求啊!
开发大哥:我知道,实现不了啊!
因而开始了经典的产品开发撕逼大战。。。
而鱼皮正躲在角落冷静分析 这个需求怎么作 ,过了一下子,提出了一种改动低、实现快的解决方案,平息了这场战争。
肯定需求合理、可实现以后,产品妹子问到:那这个需求啥时候能上线呀?
开发大哥:我这周忙,下周吧。
产品:用户可能比较着急,这周就要呢!
开发大哥:我知道,作不完啊!
因而开始了经典的产品开发撕逼大战。。。
鱼皮:要不咱们把这个需求拆解为功能 A 和功能 B,这周我先把功能 A 作了,功能 B 排到下周二测试,下周四上线?
就这样,咱们一个个安排了需求的计划完成日期。
终于开完会了,看了下时间,都该下班了!
唉,需求讨论完了,产品的工做是完成了一些,可鱼皮的工做才刚刚开始。
急着开始写代码么?
不,想好怎么写代码比写代码更重要。
鱼皮打开写文档软件和画图软件,开始梳理整个系统,从总体到局部,依次设计出系统的层次结构、各层间交互的接口和通信方式、每层之间包含哪些重要模块、模块选择何种物理部署方式等。
写完架构设计后,鱼皮开始对着产品妹子写的 PRD(产品需求文档),分析需求,而后依然是从总体到局部,先整理出系统须要的功能模块,再分析每一个功能模块内有哪些子模块。
和抽象的架构设计相比,概要设计和需求的关系更紧密,是对架构设计的细化。
打个比方你们就明白了,你要盖一栋楼,架构设计就是从总体来考虑,总共有几层、每层管道怎么接、每层有几户、地基怎么打等;而概要设计就是考虑每户套件的内部怎么划分,哪里是客厅、哪里是卫生间。
不少状况下,概要设计和架构设计可能会在一个文档中进行,划分并不明确。
想好系统有哪些功能后,鱼皮就开始具体分析每一个功能如何实现,用到哪些算法、须要注重哪些细节等。
写好设计文档后,下次会议上,鱼皮和其余的开发同窗(前端、后端等)一块儿针对本身设计的方案展开讨论,最终产生一个统一的方案,而后你们分工去作就行了。
为了保证系统功能的正常稳定,测试同窗(或者叫 QA)是很是重要的,测试不是像咱们本身作项目同样对着网页点几下就 ok 了。
在大公司中,为了保证测试的覆盖度、提升测试效率,通常是要设计测试用例的,好比:用户点击 “登陆”,未传任何数据,指望结果是警告用户输入用户名和密码。
测试用例设计完后,须要其余同窗一块儿来评审把关,而不是只交给测试同窗。由于一我的很容易忽略掉不少测试细节,最好让更熟悉代码的开发同窗一块儿帮忙补充。
鱼皮本身也写了几个测试可能会遗漏的用例,和测试同窗一块儿进行了确认,尽可能让问题暴露在测试阶段而不是线上。
写了快一周的设计文档,终于准备开始动手搭建项目了。但在此以前,还有一些准备工做要进行。
现在技术发展太快,新技术层出不穷,因此鱼皮首先对项目中须要或可能须要用到的技术进行了调研。
经过调研,鱼皮获得了几个能够知足需求的技术,但他开始纠结:这么多技术,我该用哪个呢?是用 SSM 框架仍是 Play 框架呢?用 guava 包仍是 Apache Commons 呢?
鱼皮又打开了写文档软件,开始对比不一样技术的优劣,头疼啊,技术选型要考量的因素太多了,好比:
对于关键的项目,鱼皮本身还不敢彻底肯定选型,所以在写好本身的选型文档后,与同事和 Leader 一块儿讨论,才最终确认。
确认好技术后,就要申请资源。好比鱼皮用到了 MySQL 数据库,可是这个 MySQL 从哪儿来呢?
之前的话,鱼皮都是去买一台云服务器,本身搭建 MySQL。可是在企业中,通常是有集中管理和分配资源的平台的,直接到平台填写预算、等领导审批、而后等着下发资源就行了。千万不能私自用本身的或买外部的服务器来部署项目,不安全!
鱼皮此次直接申请到了 2 万多一年的云数据库,真的是爽死了。
申请好数据库等资源后,鱼皮按照申请机器的版本搭建了如出一辙的本地开发环境和测试环境,后面就能够直接链接了。
环境准备稳当后,因为是新项目,鱼皮要搞一个最小可运行的初始化项目 Demo,使用 脚手架 自动生成代码,而不是从零开始一个个新建文件、手敲重复代码。
生成了项目代码后,鱼皮使用包管理工具(前端 yarn、Java Maven / Gradle 等)自动安装依赖,而后项目 Demo 就能够运行啦!
前期准备完成后,这才到了程序员朋友们最熟悉的写代码环节,也是鱼皮最爱的环节。
由于以前设计方案时须要保持冷静、仔细思考,无法边听歌儿边作;而方案设计好后,已经明确了该怎么作,写代码实现就很简单了,顶可能是遇到一些坑,上网搜索去解决就行了。
开发时,通常鱼皮会先在本地写代码,经过配置热更新工具,实现代码更新时自动从新编译打包,而不用手动重启项目,大大提升了开发效率。
对了,企业开发都会使用版本控制系统的,好比 Git,开发前记得先建立一个本身的分支,在这个分支上开发。
如今还有一种比较流行的远程开发方式,就是能够像编辑本地文件同样编辑远程文件,直接修改服务器上的代码。通常咱们每位研发同窗是有本身的开发机的,经过远程开发就省去了反复部署调试的麻烦,提升效率。通常用 VSCode 等开发工具,安装远程开发插件就能够实现了。
鱼皮在写代码的时候,始终保持主动优化代码的好习惯,注重代码的时空复杂度;而且当重复代码多了,会想办法抽象成函数或者使用设计模式。以前专门写文章分享过个人编程习惯:我写代码时的小倔强 。
注意!不要听到测试就觉得是测试同窗的工做,开发同窗也一样须要编写小粒度的测试来为本身的代码负责。
鱼皮通常会为每一个数据库读写函数和业务逻辑函数编写单元测试,像 Java 的话通常用 JUnit 等工具,还能够用 Jacoco 生成测试覆盖度报告。每次修改关键代码后,都要执行一遍单元测试,防止意外错误。
鱼皮终于写好了后端代码,也自测完成了,下面就是把写好的代码打包构建,而后把可执行项目包发布到测试服务器上,和前端同窗一块儿联调,让他请求个人接口,验证系统的功能是否可用。
鱼皮和前端联调完毕后,告知了测试和产品同窗。
测试验证是企业中相当重要的环节,甚至能够说是最后一道防线。测试的目的是找 Bug,尽可能发现系统中的问题,把它们扼杀在测试阶段。
在企业中,测试验证又有不少类型。
集成测试比单元测试粒度更大,是把多个模块或代码单元放在一块儿,验证模块之间的集成和调用关系。
由于单个函数的执行多是正常的,但把多个函数组合在一块儿顺序调用,可能就会出现问题。
打个比方,咱们有个吃面包系统:
功能 A:小鱼吃一个面包
功能 B:小皮吃一个面包
每次只有一个面包,独立执行功能 A 和 B 都是容许的。但若是两个一块儿执行,后执行的那个功能就会报错。
系统测试比集成测试的粒度更大,测试对象是整个系统,不只包括软件,还可能覆盖对硬件的测试。
除了测试同窗要验证系统可用性,产品妹子也要体验下功能是否符合预期、是否易用。大多数状况下,产品会在体验时提出修改建议,开发可能还要再去作一些修改。
测试和产品妹子终于表示没有问题啦,那就到了最后一步,把整个产品或功能给最终的用户来体验。老板 用户说没问题,才是真的没问题!
系统没问题以后,鱼皮就能够把代码发布到远程仓库了,通常使用 Git 和 SVN 等版本控制系统。
鱼皮首先在本地触发代码提交(git commit),为保证规范,在大项目中通常会使用提交检测插件,防止你把错误的代码进行了提交。
下一步就是把本地的提交推送到远程的同名分支。通常大厂会有推送检测工具,检测代码的错误、圈复杂度、代码规范等,和提交检测同样,防止你把错误或不规范的代码进行了推送。
代码分支推送到远程以后,鱼皮发起了一个分支合并请求(MR),但愿把该分支的代码合并到主干分支(没问题的代码)。
并非发起了合并请求就能直接合并,还要经过代码审查,即 CR。
审查又分为两种方式:人审和机审。
相信很多同窗都知道人审,通常是由你的上级和其余项目负责人来阅读和评论你的代码,以为没问题就 Approve(经过),不然打回去修改。
那机审是个啥呢?其实就是机器自动检测你的代码是否符合规范,是否可以成功自动化构建等,通常是由项目负责人配置的,能够帮助发现一些人工难以发现的问题。
刚接触新项目的时候,鱼皮常常被机审折磨得苦不堪言,常常被提示一些莫名其妙的代码问题,好比加号要换行,文件行末要加空行等。但后来注意编码习惯后,就很天然地适应了,的确不错。
代码审查经过后,鱼皮的项目代码就能够发布上线啦。
传统上线方式是开发人员到正式服务器上拉取代码,而后安装依赖,再经过工具把代码打包构建,获得部署包,经过 Nginx、Tomcat、Docker 等技术运行。
但这样效率很低,有不少重复工做。因此大厂通常是用自动化构建的,像 Jenkins、各类 CI / CD 工具等。代码合并到主分以后,由机器把代码打包构建为最终的部署包。
为了防止上线出问题,通常咱们会先在预发布环境部署项目,再观察一下是否可以正常运行。
预发布测试正常后,鱼皮终于等到了上线的这一刻。大项目通常都会部署在多台机器上,因此不可能一台台登陆机器去发布部署包。
一般公司会提供可视化发布平台,点选须要发布机器(通常先灰度,选一小部分机器,再全量发布),点击一键发布,等项目管理员审批经过以后,就交给机器自动部署吧!
鱼皮曾天真地觉得项目上线以后,就能够高枕无忧了。但后来发现,项目上线以后,一样须要保持警觉。虽然已经测试过,但仍然时不时会出现个预期以外的小 Bug,仍是很考验心态的。
来看看上线以后,鱼皮作了哪些事呢?
鱼皮会按期查看项目的监控面板,观察项目的运行状况,机器的负载等。
鱼皮在代码中添加了一些日志,能够利用 ELK 等日志收集可视化平台对这些日志进行分析,从而感知到用户的行为,进一步优化业务和系统。
好比我会统计用户执行 SQL 查询的耗时,对重复率高的慢 SQL 进行针对性地优化。
有的时候,用户本身都不能清楚地描述 Bug,并且历史 Bug 也不方便找到。因此公司内部通常会有事件反馈平台,产品等内部同窗在接收到 Bug 时,会在该平台发布一个 Bug 事件,详细描述 Bug 出现的时间、情况、详情等,便于咱们开发集中分析和处理问题。
每次上线了新功能和项目,鱼皮都会经过写文档来记录项目的背景、设计方案、开发过程和一些坑点,便于后续其余同窗了解项目,这是很是重要的!利人利己。
曾经分享过个人写文档技巧:如何写好文档?
最后,一个需求的结束每每只是另外一个需求的开始。像鱼皮最近在跟进的项目,一期作完作二期,二期还没作完三期就来了;还要抽出时间去优化之前的代码,这日子遥遥无期,没盼头啊!
以上就是本期分享,看完本文后,欢迎阅读我以前的这篇文章:大厂机密!30 个提高团队研发效能的锦囊 ,了解更多大厂技术。
最后再送你们一些 帮助我拿到大厂 offer 的学习资料:
欢迎阅读 我从 0 开始自学进入腾讯的编程学习经历,再也不迷茫!
我是鱼皮,点赞 仍是要求一下的,祝你们都能心想事成、发大财、行大运。