You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

89 lines
9.9 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 12丨外包外包不也是写程序吗有什么不一样的
有一种软件公司,叫做软件外包公司。软件外包公司做的是拿甲方的钱,按甲方的要求,帮甲方完成项目的工作。这里的工作一般就是写代码,也可能会包括一些上线、运维、维护等内容。
外包的工作一般是以项目为单位的。一般来说,如果项目需求设计都很清楚,外包公司都会在自己的办公地点工作。也有项目需要频繁和甲方交流的,根据实际情况,外包公司也会让项目相关的员工去甲方的办公地点工作。
除了这个形式上的特殊之外,软件外包具体是做什么的呢?和软件研发有什么区别呢?外包值不值得做呢?
我可以在这里先甩出结论:一个程序员,如果想长期从事这个行业,那么外包不值得做太多年。下面我们就来说说为什么。
## 从修路的例子看,外包有什么限制?
首先,我们来看个修路的例子,通过这个例子我们来看看外包的主要矛盾到底是什么。
假设A公司要给一个开发区规划公路那么A公司要考虑的事情其实有很多比如哪里是居民区哪里是办公区哪里是主干道各条道路分别需要几个车道路的承重多少路基怎么设计才能扛得住承重……除了设计可能还要铺设简单的实验道路验证设计的可行性。
当A公司做好所有这些设计之后就会交给市面上专业的修路公司将修路工程外包给这些公司去做。修路公司人多长期从事铺路工作签了合同之后就可以带着几百上千号人拿着图纸开干。
这时候我们可以认为A公司就是甲方修路公司就是外包公司。外包公司在具体做项目的时候对路的各种技术细节以及其背后的奥妙其实并不是特别清楚。比如为什么这条路是双向8车道而不是双向6车道为什么路基要分这么多层每层要这么厚为什么路面的坡度是这样的而不是大一度或者小一度
看到这里,我想你应该明白了,我们的软件开发上也是同样的道理。
软件外包中,甲方公司一般也都有些软件背景,会自己分析需求,自己做出详细的系统设计,但是写代码的人手不够。这时候甲方公司就找到外包公司,让外包公司按照自己的设计,帮自己写代码做系统。
做软件外包其实就要面对着一堆需求文档、API文档和详细设计说明书照着要求写代码。但是代码背后的业务逻辑外包人员可能是无法理解的。比如说原始的需求是什么样的基于这些需求又经过了怎样的讨论和权衡才得出这样的API设计API文档中为什么要强调某个地方缓存为什么是Redis为什么设计里使用的数据库是MySQL而不是MongoDB
看到这里,是不是已经隐约感觉外包和非外包的区别了?外包工作并不能让我们详细地了解工程的本质,除此以外,它对我们的限制还体现在方方面面。
## 外包的限制具体有哪些?
### 难以获得完整地解决问题的能力
**如果用一句话来概括,我觉得外包真正的问题在于,它的工作内容只包括最后的写代码,不包括写代码之前的思考和筹备过程**。然而就是这个思考的过程,对程序员来说,是非常重要的锻炼。通过这种锻炼,程序员可以逐渐培养出思考问题的能力,再学着将这些问题分解为一个个小的、复杂度可控的模块,进而通过编程完成一个能解决问题的系统。这就是使用技术解决问题的能力。另外,还能够积累在相关领域的专业经验。而这些积累,是程序员拥有更好待遇的有力支撑。
纯粹写代码,并不是解决问题的完整过程。如果不经过前期的思考和锻炼,解决问题的能力是无法得到很好的锻炼的。就好像只修路的工人很难理解路背后各个参数的含义,自己也就没办法设计出一条合格的公路。
### 外包公司不注重人才的技术成长,涨薪受限
外包的工作内容,事实上也决定了外包公司对人才的态度。从外包公司的利益来看,只要员工能够“按照需求,写出代码,完成功能”就可以了。只要能够到达这个水准,那么外包公司就没有理由,也没有动力去培养人才了。
同样的道理,一般外包公司也不会鼓励员工深入学习一门技术。毕竟外包公司的任务就是把事情做出来,至于怎么做更好就不在外包公司操心的范围内了,甚至可以说,外包公司也操不上心。所以,我们在前面提到的很多主观能动性等内容,在外包公司看来,并没有太多的适用场景。
在我看来,外包公司不鼓励程序员深入学习还有两层利益的考虑,一方面,学习需要耗费时间。技术够用就行,没必要探索用不到的新技术,公司更希望你用这个时间来干活。另一方面,如果程序员技术精进了,跳槽的几率就会变大。因为外包公司不需要程序员有强大的技术,而程序员有了技术傍身,工资又不涨,自然会考虑跳槽。
### 外包公司没有探索的环境
因为需求和详细设计都是甲方定的作为实施的乙方也没有权利和自由去实践可能更好的方案。需求里写的用MySQL那么就是MySQL即使乙方的开发人员再怎么觉得用MongoDB好也没有权利和渠道更改。
我们还是用修路的例子来举例。如果A公司的一个设计人员通过计算认为改一下混凝土的成分比例和路基的厚度可以降低成本达到更好的承重效果。那么A公司大概率会鼓励创新让设计人员铺个实验路面试试看。
但如果是铺路公司的施工工人有这个想法,负责人大概率只会让工人老老实实按照图纸施工。一方面是因为就算乙方有了更好的实施方案,也不会拿到更多的钱,另一方面是铺路的材料可能都已经按照之前的规划定好了,已经过了方案修改的窗口期,修改的代价太高了。
### 可替代性强,可能无法完整参与一个项目
因为外包公司的工作比较单一,所以可替代性也更强,同样外包公司程序员的可替代性也强。这也造成了外包公司的人员流动比较大。
外包公司可能会被甲方换掉,即使不换掉,一个项目的程序员也可能无法参与项目的下一期的工作,甚至有可能在做一个项目的过程中就被抽调走了。
从成长和积累的角度来说,程序员最好能参与项目的整个过程,甚至一个项目多期的开发,这样就能够沉淀完整的经验。如果是东一榔头,西一棒槌,技术和业务都很难沉淀下来。如果能参与一个项目多期的开发,也可以从这个项目的技术演进中,学到不少东西,但是如果无法连续参与,也无法收获这部分经验。
## 什么情况下可以考虑外包?
看完了上面的内容,我不知道你有没有发现,我不赞同长期从事外包工作的出发点只有一个,那就是不利于程序员的个人成长。那么反过来说,只要你觉得自己有成长,有收获,那么从事外包也不要紧,毕竟凡事没有绝对。外包没有好与不好,只有合适与不合适。
这里我一下可以考虑外包的几种情况。
### 通过外包快速积累经验
对于刚毕业的同学来说,好的外包公司也不失为一个不错的开始。成熟的外包公司一般会有规范的项目管理、文档管理和代码规范管理等,这些可以培养程序员优秀的编码习惯。同时,在还没有熟练掌握一个技术之前,在外包公司可以通过项目将自己的熟练度提升上去。
### 希望进入一个新的行业
有的外包公司有自己的工作风格,比如主要接某个行业的外包项目。那么如果你想进入某个行业,但没有相关经验,无法通过面试直接进入这些公司。那么不妨考虑相关行业的龙头外包公司,积累相关的行业经验。
当然,并不是每个人都喜欢一直从事一线程序员的。相比来说,外包公司更容易转管理。当然,我并不认为管理是程序员必须走上的道路。后面我会专门写一篇文章来聊这个话题。
## 总结
外包公司并不是一个很好的让程序员可以长期发展成才的环境。在外包公司呆久了,这种氛围可能会让人有两个错误的认知:程序员的工作就只是写程序;程序员只有转管理才有前途。
如果想要成长,就不要被外包公司的氛围影响,做个有心人,肯下功夫,也会有自己的收获。当然,如果你觉得在外包公司已经没有太多的成长空间了,感觉自己不想只是写程序了,那么不妨换个环境。一般来说,在一项技术上如果有三年的积淀就差不多成熟了,五年就可以说很成熟了。这时候如果还想继续做程序员,就要考虑向更高的层面发展了,去锻炼自己除了写代码之外的能力。
当然实际的外包形式有很多今天的内容里只是讨论了一种最主流的形式。也有一些外包公司反其道而行之专门做一些甲方无法搞定的非常专业的工作甚至连方案都是外包公司参与一起制定的。想当初MS-DOS就是IBM外包给微软开发的。如果你正在从事外包工作千万不要否定自己的工作。总之一句话只要感到自己有成长有收获那么就是值得的。
![](https://static001.geekbang.org/resource/image/f1/f2/f190315878631678eae30a1f7d4144f2.jpg)
## 思考题
外包可以说是一个很常见的现象了。不知道你有没有在外包公司工作过呢?根据你的成长历程,你有哪些感触呢,欢迎在评论区和我交流。也欢迎把这篇文章分享给你的朋友或者同事,一起交流一下。