欧美软件外包系列 (二): 谁说外包不需要技术

前言

由于之前一些外包公司对外包行业造成了一些不良的印象,其中很多程序员对外包的误解是就是外包缺乏技术,或者说外包行业里面学不到技术,我不知道别的外包公司,但是在我们公司,我觉得外包很多的项目对技术要求都不低。

技术

其实不管是外包还是非外包,都是要做项目,说到底就是产品,这些产品可以是一个商务网站,可以是一个企业内部的系统,也可以是是一个APP等,从我接触的项目来说,形形色色的项目都可以外包,要么是全包,要么是半包。

我们想想只要是一个软件产品,怎么会不需要技术呢? 总不能动动嘴皮子就出软件了?站在最终客户的角度,一个好的软件产品怎么样,他们需要的就是怎么样。当然,有的情况下,没有找到好的合作方式或者没有合适的价格,会经常出现一些凑合的产品或者失败的产品,这个后面我们会谈到如何避免,这里我们就是要说外包不是没技术。

外包(或者说软件项目)常常驱动一些技术

拥抱变化

更快的拿到 “WHAT TO DO”

软件业里流行一句话,就是:“不变就是变化本身”,所以需求会经常变化,尤其是外包或者是离岸外包,业务人员没有和开发人员座在一起,这样导致变化的成本就更加增加,另外我们需要把业务人员把需求转给开发人员这之间的时间尽量缩短,就像TCP/IP一样,我们需要两端数据传输 “快速、完整、准确”,那么我们就需要像很多办法,比如我们就用到比如BDD(Behaviour Drive Development), 我们就需要用到像NSpec, NUnit这样的东西。

更快的反馈 “What We Did Is Right Or Not”

同时,我们需要客户尽快的反馈,我们就需要用到自动集成的技术,我们就要用到Build系统,所以我们就用到了比如TeamCity, Jekins, Grunt, NAnt等等。我们需要解决 “防火墙”等问题,我们需要使用云比如Azure, Amazon等。

适应变化

更好的架构

为了支撑变化,我们需要根据不同的项目来设计好的架构,什么是好的架构呢? 就是“一点也不多,一点也不少”,每当增加新功能的时候,我们不用改太多代码,甚至我们只增加代码,不影响原来代码,这不就是OCP(开闭原则)吗? 我们希望写过的代码能够更多的重用,已有的代码能够更稳定,于是我们就需要分层设计,我们就需要多层的架构,我们就需要解耦,因此我们就用到了比如 MVC, MVVM, Domain Driven Design, Event Driven, CQRS, Event Soruce, Message Queue等等。

可靠的质量

为了提交高质量,我们除了需要一定的过程保证之外,同样需要很多技术的支撑,我们如何对我们提交的代码质量有信心呢?
我们需要Unit Testing, 我们甚至需要引入TDD, 我们需要引入一些自动化测试工具来做回归测试,比如Selenium, Watin 等。为了很好的进行单元测试,我们必须要面向接口编程,我们需要去掉系统里的New. 我们因此需要使用依赖注入比如Castle, NInject, 或者Unity等。

整洁的代码

为了更方便增加新功能,那么我们要更容易阅读之前的代码,这就要求我们不要产生 “Legacy Code”,因此就需要考虑什么是Clean Code, 因此我们就必须要学习S.O.L.I.D原则,我们就需要学到重构等相关的知识。

总结

学无止境

说到底,就是给客户提交高质量的软件,而且是高效率,也就是做出好东西,越快越好。

软件行业,聪明的人很多,他们不断在生产新的东西(语言,框架,工具)来帮助程序员提高软件的质量和效率,那么我们要想高质量,高效率做出软件,不管在哪里,我们都需要这些知识和技术。

外包更能学技术

我们在一些产品公司,我们其实很难去使用一些新的技术,原因如下:

  • 产品已经设计完成
  • 技术选型已经确定
  • 遗留代码太多
  • 项目的管理人员不拥抱新技术。

但是在外包公司,更能学技术。原因如下:

  1. 接触项目多,因此可以在不同的项目里学到多种技
  2. 同时针对不同的项目,会思考多种的架构方式。
  3. 如果和国外团队合作,可以看到很多优秀的代码。
  4. 欧美常常比较先引入一些新技术。
  5. 欧美常常比较先引入一些开发模式。
  6. 逼迫你提高英语,你能看到更广阔的世界。

最后,列一下我们现在的.Net项目用到的一些技术和开发方法。

####过程

  • SCRUM
  • Kanban

开发方法

  • TDD
  • BDD

架构

  • MVC
  • MVVM
  • SOA
  • Domain Driven Design
  • Event Driven

技术

  • C#
  • EntityFramwork, NHibernate, Dapper, NoSQL
  • ASP.NET MVC, ASP.NET Web API
  • WCF, Restful
  • jQuery, AngularJS
  • Nunit, NSpec, Selenium
  • Git, Github
  • TeamCity, PowerShell, NAnt, Grunt
  • Database Migration
  • Message Queue, NServicebus
  • Castle
  • Event Source, CQRS, DDD

所以,谁说外包无技术? 看你怎么做而已。

想加入我们吗? 发邮件到 wangds@shinetechchina.com.

欧美软件外包系列 (一): 正确看待外包

前言

做欧美外包8年了,积累了很多对欧美外包的一些经验和认识。由于看到很多人对外包产生了很多误解,有很多发包方也在大家的误解中错误的看待外包团队,所以想让大家对外包有一个正确的认识。 由于我一直做的都是欧美外包,所以主要是在谈欧美外包。

欧美外包简介

欧美外包其实就是欧洲和美国的软件外包,主要是欧美发达国家和离岸顾团队的一种软件协作。

对外包的误解

国内很多的程序员一谈到外包就色变,什么没完没了的加班,做完项目就走人等等,最主要的是说外包项目没技术。

传言

我个人觉得这个不能全怪程序员,由于早期的外包,以及项目管理的方式都违背了一些软件开发的本源,导致出这样的一个结果,其实这些问题,在非外包公司里更严重,也同样存在,而软件行业又是外包的主要一个领域,就显得大家格外关注,而且程序员又是喜欢上网的一群人,所以对一个事情的传播非常快,而且年轻人居多,不乏一些FUD的人员。

国内某些不良外包公司

我们公司确实有一些程序员的上一家公司里是这样的,这样的公司大概是这样的:

  • 这个公司主要是做国内的外包,老板对软件没有什么概念,认为做软件跟盖楼是一样的。所以,有项目就堆人,找最便宜的人,项目不能按时完成就加人,我时常对这种情况,想说:“老板,你是黑色会吗? 做项目还是打架,靠人多?”

  • 这样的公司做项目时,第一要素是最大的利润,也就是最大化的从客户那里赚取利润,赚自己的钱,让客户无钱可赚,赚员工的钱,让员工够活命就行了。

  • 由于是搞房地产的,或者是有几个搞房地产的朋友,觉得自己也要搞个软件业的房地产,找一个技术好点的,剩下的都是能多便宜就多便宜,是不是像建筑行业从设计院设计个图纸,找个监理,剩下全都是找便宜的人? 但是软件行业是不一样,每一个软件就像每一片茶叶一样,哪那么容易相似,就算茶叶一样,泡茶的人也不同呀,亲! 我把这样的架构师叫做海鸥,在海上拉一坨翔后,飞走后你再也找不到了(你想想你会在一个地方看到同一个海鸥两次吗?)。 所以我们很多人就基于已有的设计来填空,不管尺码合不合适,也要硬往里面塞,结果能好吗?

我想个中痛苦你们经历过的人有共鸣。

欧美外包

其实欧美外包在这几年已经有了很大的进步,也越来越多的人愿意做欧美的外包,进步如下:

  • 发包方对软件的意识提高,不在把软件看做简单的一个产品发包出去,而是当做一个软件。
  • 敏捷开发的流行,在欧美国家有更好的认识,更多的发包方知道软件写作的重要性,而不是只是一开始给个需求。
  • 发包方愿意花更多时间参与,我们知道软件开发客户更多的协作的重要性,因为很多东西在开发过程中才能发现和改进。
  • 发包方里有更多人了解软件开发,开始接受重构这样的一些工作并且愿意为之付费。
  • SCRUM或者Kanban让异地的团队更好的协作

所以和欧美软件公司合作,你可以学到很多正确的做软件或者产品的方法。

总结

根据我的经验,欧美的软件公司更早,更多的开始使用正确的软件开发方式和对软件行业的正确认识,欧美很多国家软件从业者很受其它工作者的尊重,而中国很多的程序员还被称为 “程序猿”,“码农”,“IT男”,非诚勿扰你要敢说你是程序员,我想肯定是关上灯留下一屋子黑。(不过很多姑娘被别人留下一屋子黑后,还是觉得程序员挺好的)。