很高兴这个标题把你吸引进来了,不得不承认,多少有点标题党的意思了。在你往下看之前,我想说明:文章内容都是出自于笔者亲身经历,且文中提到的两类公司都是中小企。目的是分享给一些有需要的小伙伴,大佬们可以直接忽略掉这篇文章了。
笔者在新公司已经工作一个多月。在这段时间里,我感受到工作职责与上一家外包公司有很多不同之处。趁着周末给自己做一下总结,也顺便分享给有想要了解这方面内容的你们。任何一种类型的公司,都有其利与弊,文中我尽量不带自己的情感偏好,把客观的事实展现出来。另外需要注意一点的是:文章中仅为个人经历的情况,并不代表所有公司都如此。
有一些小伙伴会私聊问我面经,所以在文章留了一节《面试经验》用来分享在之前的面试中被问到的部分问题,仅供参考。
工作职责比较
各部门间的协调合作
这部分会简单介绍一下组织架构,以及这些部门的协作。
外包
以业务范围划分,主要分为以下两个部门:
- 金融部
- 项目经理
- 售前组
- 前端开发组
- 后台开发组
- 客户端(IOS, Android)开发组
- 测试组
- 政务部
- 项目经理
- 售前组
- 前端开发组
- 后台开发组
- 客户端(IOS, Android)开发组
- 测试组
每个部门都有各自的项目经理、售前、开发(前端、后台、客户端开发组以下简称开发组)、测试组。两个部门的人除了技术交流或者人员借调以外,其他时间几乎没有业务上的联系。
简单来说也就是金融部的人负责金融项目,政务部的人负责政务项目。如果各部有UI上的需求,都是外包给其他UI设计公司去做。
一个新项目一般是先由售前组的人去跟客户推销,成功后会与项目经理一同跟客户收集更详细的需求(有时候开发组一同参与)。开发组组长在评估所需工时后,由项目经理和售前跟客户进行一轮“讨价还价”(按每人每天算钱,客户一般会要求压缩工时,以减少成本)。意见统一后,开发组开始开发,测试组待项目开发完成后进行测试,客户在约定时间前完成验收,然后上线。
非外包
笔者所处的公司目前仅有一个社交类的产品(还有其它两兄弟公司负责其他产品线,此处不多说),以职能划分,主要分为以下几个部门:
- 美术部
- 礼物组
- UI设计组
- …
- 运营部
- 活动运营组
- 平台运营组
- …
- 产品部
- 项目经理
- 产品经理
- 技术研发部
- 前端开发组
- 后台开发组
- 客户端(IOS, Android)开发组
- 测试组
- 运维组
更详细的分组在此不过多列举。
该产品的一个新功能的产生一般是由运营部和产品部提出后,与所有部门负责人开评审会,讨论是否能实现,然后下发任务给所有人,所有人评估各自所需工时后,交由项目经理统筹规划,确定新功能上线时间。
美术部做好的资源(如图片、动画)会交由技术研发部去做开发、测试等等。然后会由运营部和产品部进行验收,最后上线。
运维组会监控所有服务器,负责服务器的异常处理和反馈。
部门内部的协调合作
显然,本文只讨论技术部门内部的工作。
外包
开发组长从项目经理和售前组了解清楚业务需求后,按功能模块拆分给相应的开发组组员。组长同时需要输出概要设计、接口文档、流程图、数据字典等文档,各组员根据相关文档进行开发。
笔者在上一家公司负责的一些项目,严格来讲都算不上微服务架构。所以后台开发组的同事是以功能模块划分的小团体。
如果开发组需要特殊的图片或UI资源,需要外包出去让其它公司提供图片或UI资源。开发组完成开发后,由测试组根据组织产出的相关文档进行测试。
非外包
各开发组织在结束完评审会后,将任务下发给各自的组员。由组员按照需求文档各自实现自己需要完成的功能。
该产品后台的架构是微服务架构,后台开发组是以微服务来划分小团体。比如会员微服务的功能是由A、B、C三人负责开发,支付微服务的功能是有D、E、F三人负责开发。
开发组需要的图片或特效资源由美术部提供。后台开发组定好接口协议后,前端和客户端开发组根据协议完成开发,最后测试组根据产品部提供的文案进行测试。
个人的日常工作
外包
在做组长的那个项目中,在项目的初期就要划分每个人的工作,预估工作量,报给项目经理。并且输出上面说的各种文档。文档编写完成后,就需要开始按架构设计搭建各环境中的组建。
在项目的中期就会参与功能的开发,也就是coding。coding的日常:
- 半小时会议
- 处理之前投产项目的紧急BUG(若无则忽略)
- 开发当前项目的功能
项目的后期就负责部署代码到各种环境。协调测试组开发组修改BUG,与项目经理共同完成客户验收。
非外包
由于笔者所处的新公司的产品已经上线运营几年了,就不需要再搭建环境。
目前在新公司的没有担任管理职务,所以日常的工作就是coding。coding的日常:
- 十分钟短会
- 处理线上紧急BUG(若无则忽略)
- 通过监控平台观察自己负责的接口性能(最大响应时间,平均响应时间等等)
- 开发新版本的功能
- 优化接口的代码(若接口性能比较差)
在新版本的测试期,修复测试组提出的BUG。
项目/版本上线流程
实际流程有很多细节,笔者就不一一列出来,只列出大概流程。
外包
- 组员领取到开发任务后在【本地开发环境(自己电脑)】根据架构设计搭建组件(MySQL, Redis…)
- 组员在【本地开发环境(自己电脑)】开发;
- 开发完成后将代码提交至dev分支上;
- 组长以dev分支的代码打包项目并部署到【内部测试环境】,供公司测试组测试;
- 在通过测试以后组长将项目部署到【客户测试环境】,供客户测试验收;
- 客户完成验收,组长将dev分支的代码合并到master分支;
- 组长将项目部署到【生产环境】。
非外包
- 组员领取到开发任务在【本地开发环境(自己电脑)】根据架构设计搭建组件(MySQL, Redis…)
- 组员在【本地开发环境(自己电脑)】开发,如果有需要调用其他微服务的接口,需要将自己开发的微服务部署到【开发环境】才能调试;
- 开发完成后将代码提交至各自的分支,提起合并至dev分支的请求。同时也将各自分支的代码合并到staging分支;
- 将staging分支的代码部署到【测试环境】,供测试组测试;
- 通过测试后,组长从dev开出一个release分支用以发布新版本;
- 将新版本部署到【生产环境】
- 将release分支合并到master分支。
- 运维组每天观察服务器运行情况,定期生产报告总结。如果出现性能问题,需要开发组配合修改代码。
工具/组件的选择和使用
由于新公司还有一些自动化构建,自动化测试等等的工具还没有掌握,以下我先暂时列出已经了解的工具(项目/个人使用过)。
外包
- 原型:幕客
- 团队沟通:微信
- 代码托管平台:SVN
- 项目管理:Execl, 禅道
- IDE:IDEA, VSCode
- DB:MySQL, Oracle, PostgreSQL
- 中间件:Redis
非外包
- 原型:幕客
- 团队沟通:企业微信
- 代码托管平台:GitLab
- 项目管理:TAPD
- IDE:GoLand, VSCode
- DB:MySQL
- 中间件:Redis, Kafka, Elastic Search
- …
其它
外包
- 使用自己的笔记本电脑
- 使用微信(朋友圈相互点赞)
- 不定时部门聚餐(通常几个月一次)
非外包
- 不定时举办技术分享会
- 标配Mac mini
- 下班后同事间几乎不联系(用的企业微信,朋友圈点赞的机会都很少)
- 固定每月一次聚餐
- 每周五下午茶,各种运动俱乐部,加班补贴
面试经验
在进入现在这家公司前,我挑了几家公司,经历了两个月的面试。都是面一家,查缺补漏几天,再面下一家。无奈技术能力达不到大厂的要求,最终还是没能进入大厂,最后分享在面试中,面试官问的部分问题(有一些当时没记下来)。
京东一面
- 先介绍一下你自己和简历上的项目
- TCP三次握手,四次挥手详情
- 手写一个单例模式(通过屏幕分享)
- 我看你简历上写了看过Spring源码,请你说一下Spring的启动流程
- 你对多线程了解吗?
- 有什么特别熟悉的?
- …
阿里菜鸟一面
- 选择你觉得最值得说的项目介绍一下
- Redis哨兵模式说一下
- List怎么去重
- Set有什么实现?如果HashSet里面已经有很多数据了,怎么办?
- 技术能力、交流能力、应急能力、管理经验、软知识能力。这5个方面,觉得哪个比较好的可以继续聊聊
- for循环需要注意些什么?(我选了技术能力才问的这个)
- …
最后我好奇地通过面试软件问面试官为什么问我这5个方面(作死ing)。面试官回答如下:
考核有几个方面, 第一个方面:技术能力,有分类为你的架构能力和你的coding 能力, 第二方面:就是你在描述项目中的交流能力, 第三方面:在面试过程里面遇到一些不好回答问题的一些应急能力, 心里抗压能力, 第四方面:如果你有管理经验的时候, 会聊一下管理方面的能力。第五方面:软知识能力 。 这个一般不会在第一面去聊太多, 不知道能否对于你的疑惑能够解答。 在面试过程里面我也耐心回答你想要了解的问题。 另外作为不同技术部门,考核的重点也会不同。 不是你觉得自己其他方面非常优秀, 就一定适合。
阿里菜鸟面试官
乐信一面
- 有什么负载均衡算法?什么时候用轮训?
- MySQL索引:有a,b,c三个索引,MYSQL会自动选择一个,如何指定让他选择一个索引
- explain字段底层实现逻辑
- MySQL有什么锁
- 数组和ArrayList区别
- 这个项目遇到的难点和怎么解决的
- 为什么要用微服务架构
- …
领星一面&二面
- Redis Cluster新增/删除master节点,其底层实现是怎样的
- Spring事务什么时候会失效
- B和B+树的区别
- 在Spring Cloud微服务间调用,权限字段是怎么传输的?例如电话号码,唯一性的字段
- MySQL函数的使用,找出每个name相同的记录的time最新的结果(给我画了张表,具体忘记了,答案是这个:SELECT MAX(time), name FROM table GROUP BY name;)
- B树3层和B+树4层哪个效率更高
- MySQL一般根据什么建索引
- 画某个项目的架构图
- Redis五个基础类型什么场景可以使用
- 如果有一个用户感觉特别慢,怎么去排查问题
- 有什么情况会导致内存泄漏
- 线程池的底层
- MySQL索引的使用:
- … where a = 1 and b > 1 and c = 1会怎么使用联合索引(a,b,c)
- 用一条sql查询三科都大于70分以上的同学并按分数从高到低排序(给我画了张表,具体忘记了,答案是这个:SELECT name FROM table WHERE score>70 GROUP BY name HAVING COUNT(*)>2;)
- …