外包?非外包?哪种类型的IT公司你更青睐

很高兴这个标题把你吸引进来了,不得不承认,多少有点标题党的意思了。在你往下看之前,我想说明:文章内容都是出自于笔者亲身经历,且文中提到的两类公司都是中小企。目的是分享给一些有需要的小伙伴,大佬们可以直接忽略掉这篇文章了。

笔者在新公司已经工作一个多月。在这段时间里,我感受到工作职责与上一家外包公司有很多不同之处。趁着周末给自己做一下总结,也顺便分享给有想要了解这方面内容的你们。任何一种类型的公司,都有其利与弊,文中我尽量不带自己的情感偏好,把客观的事实展现出来。另外需要注意一点的是:文章中仅为个人经历的情况,并不代表所有公司都如此。

有一些小伙伴会私聊问我面经,所以在文章留了一节《面试经验》用来分享在之前的面试中被问到的部分问题,仅供参考。

工作职责比较

各部门间的协调合作

这部分会简单介绍一下组织架构,以及这些部门的协作。

外包

以业务范围划分,主要分为以下两个部门:

  1. 金融部
    1. 项目经理
    2. 售前组
    3. 前端开发组
    4. 后台开发组
    5. 客户端(IOS, Android)开发组
    6. 测试组
  2. 政务部
    1. 项目经理
    2. 售前组
    3. 前端开发组
    4. 后台开发组
    5. 客户端(IOS, Android)开发组
    6. 测试组

每个部门都有各自的项目经理、售前、开发(前端、后台、客户端开发组以下简称开发组)、测试组。两个部门的人除了技术交流或者人员借调以外,其他时间几乎没有业务上的联系。

简单来说也就是金融部的人负责金融项目,政务部的人负责政务项目。如果各部有UI上的需求,都是外包给其他UI设计公司去做。

一个新项目一般是先由售前组的人去跟客户推销,成功后会与项目经理一同跟客户收集更详细的需求(有时候开发组一同参与)。开发组组长在评估所需工时后,由项目经理和售前跟客户进行一轮“讨价还价”(按每人每天算钱,客户一般会要求压缩工时,以减少成本)。意见统一后,开发组开始开发,测试组待项目开发完成后进行测试,客户在约定时间前完成验收,然后上线。

非外包

笔者所处的公司目前仅有一个社交类的产品(还有其它两兄弟公司负责其他产品线,此处不多说),以职能划分,主要分为以下几个部门:

  1. 美术部
    1. 礼物组
    2. UI设计组
  2. 运营部
    1. 活动运营组
    2. 平台运营组
  3. 产品部
    1. 项目经理
    2. 产品经理
  4. 技术研发部
    1. 前端开发组
    2. 后台开发组
    3. 客户端(IOS, Android)开发组
    4. 测试组
    5. 运维组

更详细的分组在此不过多列举。

该产品的一个新功能的产生一般是由运营部和产品部提出后,与所有部门负责人开评审会,讨论是否能实现,然后下发任务给所有人,所有人评估各自所需工时后,交由项目经理统筹规划,确定新功能上线时间。

美术部做好的资源(如图片、动画)会交由技术研发部去做开发、测试等等。然后会由运营部和产品部进行验收,最后上线。

运维组会监控所有服务器,负责服务器的异常处理和反馈。

部门内部的协调合作

显然,本文只讨论技术部门内部的工作。

外包

开发组长从项目经理和售前组了解清楚业务需求后,按功能模块拆分给相应的开发组组员。组长同时需要输出概要设计、接口文档、流程图、数据字典等文档,各组员根据相关文档进行开发。

笔者在上一家公司负责的一些项目,严格来讲都算不上微服务架构。所以后台开发组的同事是以功能模块划分的小团体。

如果开发组需要特殊的图片或UI资源,需要外包出去让其它公司提供图片或UI资源。开发组完成开发后,由测试组根据组织产出的相关文档进行测试。

非外包

各开发组织在结束完评审会后,将任务下发给各自的组员。由组员按照需求文档各自实现自己需要完成的功能。

该产品后台的架构是微服务架构,后台开发组是以微服务来划分小团体。比如会员微服务的功能是由A、B、C三人负责开发,支付微服务的功能是有D、E、F三人负责开发。

开发组需要的图片或特效资源由美术部提供。后台开发组定好接口协议后,前端和客户端开发组根据协议完成开发,最后测试组根据产品部提供的文案进行测试。

个人的日常工作

外包

在做组长的那个项目中,在项目的初期就要划分每个人的工作,预估工作量,报给项目经理。并且输出上面说的各种文档。文档编写完成后,就需要开始按架构设计搭建各环境中的组建。

在项目的中期就会参与功能的开发,也就是coding。coding的日常:

  1. 半小时会议
  2. 处理之前投产项目的紧急BUG(若无则忽略)
  3. 开发当前项目的功能

项目的后期就负责部署代码到各种环境。协调测试组开发组修改BUG,与项目经理共同完成客户验收。

非外包

由于笔者所处的新公司的产品已经上线运营几年了,就不需要再搭建环境。

目前在新公司的没有担任管理职务,所以日常的工作就是coding。coding的日常:

  1. 十分钟短会
  2. 处理线上紧急BUG(若无则忽略)
  3. 通过监控平台观察自己负责的接口性能(最大响应时间,平均响应时间等等)
  4. 开发新版本的功能
  5. 优化接口的代码(若接口性能比较差)

在新版本的测试期,修复测试组提出的BUG。

项目/版本上线流程

实际流程有很多细节,笔者就不一一列出来,只列出大概流程。

外包
  1. 组员领取到开发任务后在【本地开发环境(自己电脑)】根据架构设计搭建组件(MySQL, Redis…)
  2. 组员在【本地开发环境(自己电脑)】开发;
  3. 开发完成后将代码提交至dev分支上;
  4. 组长以dev分支的代码打包项目并部署到【内部测试环境】,供公司测试组测试;
  5. 在通过测试以后组长将项目部署到【客户测试环境】,供客户测试验收;
  6. 客户完成验收,组长将dev分支的代码合并到master分支;
  7. 组长将项目部署到【生产环境】。
非外包
  1. 组员领取到开发任务在【本地开发环境(自己电脑)】根据架构设计搭建组件(MySQL, Redis…)
  2. 组员在【本地开发环境(自己电脑)】开发,如果有需要调用其他微服务的接口,需要将自己开发的微服务部署到【开发环境】才能调试;
  3. 开发完成后将代码提交至各自的分支,提起合并至dev分支的请求。同时也将各自分支的代码合并到staging分支;
  4. 将staging分支的代码部署到【测试环境】,供测试组测试;
  5. 通过测试后,组长从dev开出一个release分支用以发布新版本;
  6. 将新版本部署到【生产环境】
  7. 将release分支合并到master分支。
  8. 运维组每天观察服务器运行情况,定期生产报告总结。如果出现性能问题,需要开发组配合修改代码。

工具/组件的选择和使用

由于新公司还有一些自动化构建,自动化测试等等的工具还没有掌握,以下我先暂时列出已经了解的工具(项目/个人使用过)。

外包
  • 原型:幕客
  • 团队沟通:微信
  • 代码托管平台: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;)