只接受发布货源信息,不可发布违法信息,一旦发现永久封号,欢迎向我们举报!
1064879863
16货源网 > 餐饮行业新闻资讯 > 软件开发 >  大型公司开发软件的流程是怎样的?


大型公司开发软件的流程是怎样的?

发布时间:2019-05-27 04:59:27  来源:网友自行发布(如侵权请联系本站立刻删除)  浏览:   【】【】【
像我们经常开发那些出了bug的话客户都会过来杀了你的软件(如SQLServer)的公司,我们的开发是很严格的。在保证功能完成之后,首要的一件事就是,确保软件不会给客户带来破坏。因此除了敏捷开发以外,我
大型公司开发软件的流程是怎样的?

像我们经常开发那些出了bug的话客户都会过来杀了你的软件(如SQLServer)的公司,我们的开发是很严格的。在保证功能完成之后,首要的一件事就是,确保软件不会给客户带来破坏。因此除了敏捷开发以外,我们主要做了三件事情来让码农不要在开发的时候太分心搞别的。


第一件事就是你做了一个关键的设计之后,会有一个负责security review的小组来看你的文档,问你问题,根据他们的专业经验指出软件哪里可能是会被攻击的薄弱环节。举个例子,你用了XML做配置文件,如果用户偷偷给你换了一个破坏过的XML,你的程序就会挂。一旦程序进入挂了的状态的时候,是很危险的。如果你试图恢复它然后继续运行,你就得考虑大量的细节,来把你的软件从错误的状态恢复到正确的状态。中间稍有不慎就容易被攻击。所以我们都鼓励说,一旦发生了这些不可逆转的破坏,就让程序自己出dump然后自杀。当然具体到XML这个例子,我们还有xsd文件,用Windows自带的MSXML组件来实现验证一下,所以还算是个小事。JSON就没这个福利了。


第二件事情就是,我们的环境搭得特别科学。譬如说你开发SQLServer2014,那你还要给SQLServer2008打补丁。2008打补丁的时候用的SDK和开发环境可能跟2014有巨大的区别。所以我们有一个Build Team,写了几万行的perl和bat脚本,来使得我们可以做到说,我们只要从2014的branch切换到2008的branch,这些工具就自动变了,譬如说cl.exe就从新的版本指向了旧的版本,库啊什么其他的乱七八糟的也是。如果你刚好用不上Visual Studio的话,只要你把代码从Source Control上搞下来,运行他帮你建立在桌面上的一个快捷方式,就可以打开一个cmd,里面的环境都配置好了,而且不会污染别的cmd。那我们就再也不怕手忙脚乱用错工具来开发导致出现更多问题了。一个人有可能要同时在不同的版本上干不同的事情,因此这是很重要的。因此我们也会把大量的二进制文件checkin进去,因此很多组尝试使用git最后都失败了(啊哈哈哈


Visual Studio组跟SQLServer做法也差不多。但是因为VS要用上一个版本来开发下一个版本(譬如说2010就是用2008写出来的),因此Source Control里面的脚本还要负责编译一个干净的、临时使用的、不在注册表里面捣乱的、热拔插的Visual Studio。你们想,如果我给2010写的代码出了翔,把2008的注册表阉割了,还是把几个文件删了,我再也打开不了2008来改2010,这种事情能被允许发生吗?不能!但是程序总是会出bug的怎么办?所以我们要有特殊的手段来解决这些问题,就是随时编译、checkin一个绿色的、但是功能丝毫不少的Visual Studio。当然这个东西只有Visual Studio组的人才有,而且长得跟正常的VS还是有显著的区别的。不过这样Source Control里面的东西就更大了,但是微软有的是硬盘,而且Perforce和TFS天生就对二进制文件支持的好,没关系,跟git什么的不一样。


第三件事情就是制度的问题了。产品狗在我们这里,责任很大,权力很小。原则上产品狗是管不了我们的,我们之所以听产品狗的话,是因为我们跟产品狗都有相同的目标——把软件做好。所以每当产品狗做了一些奇怪的决定的时候,我们可以很容易的拒绝他。他为了完成他们自己的工作指标,要么就要来说服我们,要么就只能改自己的决定了。因为产品狗和码农之间没有达成一致从而导致软件没按时完成的,产品狗具有很大的责任。我们还有专业的测试团队。测试团队的权力不小。譬如说产品狗提了一个需求,测试可以跳出来说这个功能会给测试带来无比的困难,从而拒绝产品狗的决定。因此产品狗的每一个决定,首先要保证可以被科学的实现出来。当然产品狗自己通常可能不知道什么是科学,所以我们要通过不断的打他的脸来让他明白,什么是科学。

我所在的成都分部有200多号人,类似的分部全国各地有十几处。应该算是比较大的公司了。
大致流程如下:
1、采样、收集汇总数据,确认产品类型。
2、立项评估(demo演示,PPT/VISO/思维导图/Axure都行)。
3、立项书撰写与审核(包括团队成员的确定、工期预估、经费等等)。
4、详细设计文档(分程序类和美术类,项目开发,策划先行)
5、开发过程(不细说)
6、真机测试(细化、反复修正改良,小的半月,大的3~6个月)
7、上传审核(自家渠道可以不用)
8、上线试运营期(1~2周,没什么问题的话这个项目才能算完结)谢邀,我当前部门的开发流程其实并不够规范高效。
一般企业级软件定制开发有的毛病一样不少。。。
一般首先是销售去卖软件,签合同。
然后需求调研去调研需求。
需求调研完形成需求文档,传递给开发人员,再由系统架构师分析并分解需求为各个足够小并相对独立的功能点,分派给各个开发。
开发去写代码,写完转测试。
测试开始测试的时候,开发相互review代码。
修改各种问题,写各种文档。
发布。


流程大概就是这样,至于喜闻乐见的需求变更和产品之间相互不配合什么的,等我下班在补。。。继续加班

—————————————华丽丽的分割线———————————————
下班回来补上,由此可见业软狗的苦逼。
牢骚结束。

首先,业内流行的软件开发模式无外乎两大类,一类叫CMMI,一类叫敏捷。
其次,这两类开发模式无所谓优劣,只有适不适合项目和团队当前的需要。从无一竿子打死,说XX一定比XX好这样的事存在。
再次,从本人目前经历过的若干项目来看很少有极为纯粹的CMMI或者敏捷的实践,多数都是因地制宜的以一种模式为主,并且加入了另外一种模式的几个关键动作形成了所谓的流程。
CMMI和敏捷的共同点就是核心思想是一致的,就是持续改进,随着团队技能水平的提高和沟通效率的提升,逐步的优化流程,这才是管理者应该做的事,而不是天天盯着报表和文档上的数字,精品佛进度条到头了,项目就可以大功告成了一样。
CMMI和敏捷不同的地方,CMMI相对来说信任过程,要求通过过程中每一步的监督和审核,来保证每个步骤都是合格的,从而保证最后结果的可控。敏捷相对而言,更基于人为出发点。个体和互动高于流程和工具(敏捷宣言第一条),所以如果在团队的个人水平都达到一定程度以上,并且建立了相互信赖关系(为什么我想到了ssh信任关系。。。)之后,采用敏捷的开发模式为主,能提高团队的工作效率,并且带来更好的工作体验。
对于客户来说,CMMI每一步都有可视化的输出件来保证最后结果一定是符合合同上约束和要求的产品。敏捷则更为灵活多变,客户合作高于合同谈判(敏捷宣言第三条),响应变化高于遵循计划(敏捷宣言第四条),能容忍更多的需求变更。(更多不是无限!无休止的需求变更是神也无法解决的问题)两者各有所长吧。
BUT,敏捷就一定优于CMMI么?未必未必!如果你的团队刚刚组建,团队人员水平参差不齐,甚至不乏拖后腿和浑水摸鱼之辈,相互之间也没有经过磨合形成一定程度的默契的话。贸然采用轻量化的敏捷开发模式,很可能就是要吃亏的。毕竟敏捷的本质不是快和抛弃文档,而是一个可以工作的软件高于详尽的文档而已。(敏捷宣言第二条)如果连一个可以工作的软件都不能按时按量输出的话,还是先走CMMI控制住项目进度再说吧。

好长好累,滚去重构我的东西去了会有很多不同的里程碑,分别从平台,产品等不同角度来定义需求,开发,测试等各阶段的target和check list等等。

先说需求吧,理想状况下,需求会从一页纸的One Page Product Description(说明产品定位,卖点)开始,逐步细化成数百数千行的feature list(产品需要支持的各种特性)再『翻译』成工程人员开发所依据的system requirement(需要的各种修改,需要过的测试、认证,需要达到的各项性能指标等)需求确定下来之后,一般会有一个milestone表示该项目需求已经lock down,再进新的需求要走change request流程,需要各个stakeholder review对本项目及同期其他项目的影响。

开发及测试的计划方面,在细化system requirement的同时基本上也会细化开发计划,估算每个feature需要的修改工作量,测试工作量,什么时候拉哪个feature branch, 什么时候merge back。什么时候拉产品分支,什么时候做功能测试,集成测试,压力测试,各做几轮等等。计划做完后又是一个milestone,表示已经承诺delivery scope和schedule了。

日常的开发工作基本上对每个feature的开发会拉一个feature branch, 在feature branch上提交代码基本上由开发组自己测试保证质量。每个提交都会做CI build和auto test, 保证使用该分支的所有产品都能build过,基本功能正常。如果开发持续时间较长,需要定期merge upstream。merge back回主线的时候要过事先同意的一系列merge back criteria,主要是架构一致性,兼容性,以及大量测试保证稳定等等。主线上所有的提交都需要Verification +1,Code Review +2。产品所有功能开发完毕并经过一定测试后,在产品发布前会拉产品分支,启用白名单制度(又一个milestone)。根据bug的来源,概率,严重程度确定bug是不是进白名单,严禁fix不在白名单里的bug.

最后,产品开卖,进入维护阶段(another milestone)开发项目完成会总结开发中的Lessons Learnt,下次接着犯,然后就是吃饭庆祝,互相吹捧或者挤兑什么的。维护项目就是收集客户反馈,修修bug,保证产品正常的生产销售什么的。大公司都是注重员工的公司,员工干的开心,效率和质量自然都高。

Development process都是扯.说的都挺高级的

我讲讲自己的看法

那就是

不是在走流程,就是在走流程的路上

改一行程序……然后开始走三天流程

真的有这么多流程啊!

有时候自己想想也觉得有趣

而且这流程也不是好走的

一行程序,有人提意见,你得来回邮件好几天;一个回归测试不过,你得调查好几天

总之就是走流程就对了我就说说之前实习过的某国外大型游戏公司的开发流程。
首先一款游戏的提出可能是任何设计师,设计师会异想天开,然后写一些文档,其中有剧情有玩法有设定。
然后这个游戏的设定会组织一小波码农、美工的小团队做个原型,原型可能很简陋,有的甚至拿公司现有的游戏改出来一个小场景。
原型需要被上级审核,审核通过后,成立一个相对比较完整的小团队,开发一个可玩的关卡。注意到这个时候游戏还是没有立项。
可玩关卡再拿去一般是总部审核,审核通过了,项目就有了自己的编号和对应的款子、配置。然后成立正式的开发团队,有设计师、美工、码农、PM等等。
这个时候基本跟软工课本上的软件项目一样了,迭代模型,一个版本一个版本往上走。如果走的顺利,最后能够发布,反之也有可能在开发过程中被砍掉(很多)。
发布后还有一些更新和维护,这些也跟一般软件类似。
这是一个完整的游戏所走的流程,从最开始的原型到最后发布,每一步项目都有被砍掉的可能,所以市面上能见到的游戏只是大公司开发过的很多游戏中的一小部分,更多的是胎死腹中。
但也不是所有游戏都是这样的,有些有很多代历史的游戏项目可能会一直做下去,还有一些移植的项目可能直接成立一个组开始改开始做。所以大公司也不是都按既定流程走的,变通的也很灵活。1,需求=>评审
需求可能来自很多角色:客户|市场|战略……,产品,架构,开发,测试……
当需求被提出来以后,就是对需求进行评审,针对不同种类的需求,后续流程也不太一样。
比如产品提的需求,可能流程就会复杂一点。测试或者开发提的需求,视不同情况走不同路径,需要审批路径可能会短一点。
2,设计=>评审
比较大的需求,可能会有架构参与进来,做一个整体的设计。小的需求,可能只需要高级工程师就OK了。然后自然又是一轮的评审。从各个角度看有没有风险和漏洞
3,开发=>CR
这个阶段最没意思,基本上就是按照设计原样CP。结束之后要进行N轮CODE REVIEW,讲解给别人听。接受别人的各种质询。包括各种低级的高级的质疑,比如空指针什么的。
4,测试=>N轮,包括开发的测试脚本,测试的
不同的项目组有不同的做法,但是一般要求有开发的单元测试、测试的集成测试。不过着两个环境貌似偷懒的最多。也有做的非常好的。
5,预发布=>流控=>正式上线
会有测试环境的验证。算是一种集成测试,没有问题,就生产环境上线。
流控:生产环境上线其实不算真正上线,流量其实还没有切进来,可以一点点的将指定比例,指定要求的交易切到指定系统中,进行验证。如有问题,可以迅速回切,回滚。
流控观察没有问题,开始放量,才算正式上线

这是支付宝要求最苛刻的交易系统的流程。如果不涉及到交易,其他系统相对就比较宽容

再多少一点,另外一点做的比较好的地方就是监控
硬件监控,软件系统,流量监控,业务监控,渠道监控等……监控几乎无处不在,并且以图形化直观的展示出来。可以方便的发现很多平时发现不了的问题。

比如每天天某一刻为什么有一段图形尖刺……都是调查和改善的有力帮助工具这是一个悲伤的故事:

// actually this should be a singleton, anyway I've made it global
Boss theBoss; 

Game* MakeAGame(Manager theProducer, 
                std::list& designers, 
                std::list& programmers)
{
	if (designers.empty())
		return NULL;
	if (programmers.empty())
		return NULL;

	Game* theGame = new (nothrow) Game(theBoss.GetALotOfMoney());
	if (!theGame)
		return NULL;
		
	// do the initializing work
	theGame->SetPlatform(theBoss.currentPhone.Platform);
	theGame->SetGameType(FindMostProfitableGameType());
	foreach (Designer designer : designers)
	{
		theGame->AddDesignDocuments(designer.docsFromElsewhere);
	}
	theGame->bugCount = 0;
	
	// the main loop (each iteration is a release cycle)
	while (true)
	{
		auto thisRelease = scoped_ptr(new Milestone());
		
		int intensity = theProducer.Push(designers, programmers);

		foreach (Designer designer : designers)
 		{
			designer.Press("Ctrl", "C");
			designer.Press("Ctrl", "V");
		}
		
		foreach (Programer programmer : programmers)
		{
			programmer.Hack(thisRelease, intensity);
		}
			
		theGame->bugCount += thisRelease->bugCount;
		if (theGame->IsPlayableWithoutCrash())
		{
			theProducer.Broadcast("Let's ship it!!!");
			break;
		}

		theProducer.CallForDelay();		
	}
	
	return theGame;
}

如果上边的故事太长的话,这是一个化简版:

-----------

v 1.04 修复 @蛋丁 同学提到的内存泄漏
v 1.03 @程睿 同学说参数太多,嗯嗯,俺虚心接受,想了想,把 theBoss 改成全局的了。
v 1.02 把传值的 std::list 改成std::list&,本来想传常引用的,不过想想还是算了。这个捏其实也是照顾广大还没用上 C++11 的同学的习惯,C++11 通常是 std::move 进来就可以了。
v 1.01 修复了 @阿峰 同学报的 bug,Hack() 传入 thisRelease 应该就好了吧 :)公司比较大, 但是部门很小..... 因此软件流程基本上跟小公司没差, 虽然也有这样那样的龟腚.
项目怎么来的? 不清楚...
项目给谁做的? 刚开始不清楚...
项目要做什么? 只知道自己负责的模块.

前期会开会,开会,开会,莫名其妙的就出来方案了. 某些设计师真是一开始就决定好了, 开尼玛什么会啊.
于是, 架构师将框架上传到svn, 找到自己的模块部分, 拉下来, 将接口插到合适的位置, 推进去. 划清自己的地盘, 准备工作做好...
接下来调研模块功能,
1. 在这段时间基本上将整个项目理清, 通过设计文档, UML, 需求文档等等.
2. 上网查各种相关知识, 及开源项目, 像海绵一样吸收获取...
3. 修改UML, 将自己的流程整理好, 给组长开讨论会议.
讨论会议结束后, 制定项目进度计划.
正式开工, 写程序实现功能, 完成.
然后是debug, 单项测试, 联调, 有时会有真实环境测试.
然后丢给测试再测.
最后发布版本.第一次被别人邀请唉!先嘚瑟一会儿。

楼上几位都是官面话,照着教课书或者CMMI讲一遍,等于啥都没讲。俺整点新鲜的吧!

先讲瀑布式开发的。其实大部分公司,90%的开发,都不是新产品。基本都是在原来的框架上做一个新功能,比如加个统计,报表之类,或者增加一个故障的自动保护什么的。所以基本上也就是需求,文档,测试那一套。其实楼上说的多太虚,基本上是在公司主要流程(CMMI类似)的基础上,具体细节千变万化,取决于具体的产品经理、项目经理、部门经理的个人风格,就是谁吵架能吵赢,就听谁的。产品经理吵赢了,就是客户导向,甲方说啥就是啥,虐你千边,待他初恋。项目经理吵赢了,就是,极度公司八股,照搬公司流程,一笔一划,慢慢来。部门经理吵赢了,就是极度工程师自由化,肩膀一拍,兄弟加个班,把丫搞定。各大公司,概不如此,从所谓严谨的德国公司,到自由的美国以色列公司,到土鳖的本土公司,都是一样。只是外国公司,项目经理吵赢的时候多,本土公司产品经理吵赢的多。

做新产品,没有框架,就很少有需求实现的那一套。一般会有几个大牛去预研,照抄竞争对手的功能,反向工程;或者买点code(土鳖公司可能是偷点),研究一下别人的框架;或者上开源的库,划拉一些东西;或者策反业界成熟团队(这个某司常用)。这个往往和公司和人紧密相关,倒是没有什么惯例。

再说点时髦的敏捷开发,不过只能中英混杂,可能引起不适,请自行找厕所解决。
一般来说,一个Agile Program,一般从源头到最后的交付和验收都是精益控制的。

1. Program Backlog:所有的需求都会存在于一个完整的backlog,里面把需求breakdown成一个个的user story.是执行Agile的源头。可以作为Agile Team的输入。产生Program Backlog的人一般是产品经理或者是一个角色在agile中叫PO(Product Owner)。这个Program backlog要求蛮高,这个一般都是有文档化的东西或者网站管理的。

2. Cross functional team planning game: 当Program Backlog is ready, Team 在planning game meeting 中进行commit.所有的user story都会被估成story point用来衡量工作量的大小,不用man hour来衡量的. 每个Team的velocity都有一定的bench maker,这是team对PO做commit的根据。

3. 通常是time box,一个sprint持续2周或者3周。但是一般都是固定长度的sprint.

4. 当team向PO做好了commit之后,就是team self-management的过程。一般所有的user stories 都breakdown成一个个的task贴在白板上了。采用daily stand up meeting每天跟进,这个都是没有文档记录的。

5. 当一个sprint做完以后,team要demo给PO,PO一个User story一个User story的验收,每个User story都有验收标准写在Program Backlog里面。当所有commit的User story被PO验收通话后,这个sprint就是成功的。如果有没有通过或者没有做完的就是失败的。

6. 每个sprint结束都要有retrospective meeting. TEAM 自己总结得失再制定AP做improvement.

基本上都是这样一个来回循环的做,在Agile里没有项目的概念,所有一个项目里的user story就要靠Program manager和Product owner 根据release roadmap去做计划。Program manager关注team的进度和产出,Product owner关注质量和具体的scope.在整个过程中,职能经历关注的更多的是团队的cross function 以及团队的成长和稳定程度。稳定是Agile Team的前提,不能经常变来变去,为了形成固定的team velocity.


请问以上agile日常,你看懂了吗?你看懂了的话,肯定是我没说清楚,你应该不懂才对!

类型IBM、微软、华为、BAT等大型公司,他们开发软件的流程,其实就是项目管理流程要包含的软件开发类项目管理流程,使用的方法论无非是IPD、IT-CMMI、SDL(安全开发生命周期)、敏捷项目管理等等,一般将几种方法融合使用,在自己的项目管理平台中实现落地,将各种质量控制活动(例如评审活动,特别是对安全的审核,也就是上面提到的Security Review)融入到项目的各个阶段。

项目阶段的划分,参考下图:

作为一个讨厌编程的本科计算机专业毕业生,从未想过自己会去思考软件开发这种事情。然而机缘巧合,人生中第一份工作是一家比较大的公司的PMO,刚刚入职两个月,看到这个问题,觉得自己刚好可以回答一下,算是复习总结入职以来的收获。(国外项目,国内的话不太了解,,)

  • 大型公司做一个IT项目往往是包含很多小项目并行的,最终组合实现一个商业目标。项目发起的过程不得而知,个人猜测是,公司高层提出想法,论证以后确定需求,划分若干小项目各自实现不同的目标,寻找合适的开发、管理人员开始项目,最后共同满足最初的商业目的。
比如我现在的PMO管理的还未完成的项目共有5个,已经go live的项目有若干,这些子项目(projects)共同组成了一个大的项目(program)。几乎每一个project产出的都是一个完整独立的软件,并且各个软件之间有接口,将来可以相互配合。

  • 大型公司一般不是自己独立开发软件,而是由一个甚至多个供应商(vendor)共同协作。如前所说,接触过的小项目超过5个,包括environment,testing等辅助项目,接近十个。它们由几个不同的软件/咨询公司共同协作完成。比如我来自一家小咨询公司,专做PMO,共事的同事来自Accenture,IBM,TaTa,Cognizant等等不同的咨询公司,可能一家公司负责一到两个项目,也可能一家公司只负责UAT或SIT。

  • 软件开发不仅仅是写代码,个人认为Business Analyst 和 Project Manager才是项目的灵魂人物。这个program的产出将会用在亚洲许多国家,所以整个工作环境是全英文的,因此程序员们绝大部分来自印度。年轻时候总觉得程序员才是最重要挣得最多的那个,现在发现BA和PM才是,并且他们不一定知道怎么写程序。BA从用户也就是我们服务的公司那里拿需求,转达给Developers。把需求说清楚就是他们的主要工作,也是开发过程中很重要的一环。PM管理整个项目,进度控制,人力资源分配,问题和风险的管理等等。接触到的每个PM都来自不同的国家,不同的咨询公司,大多有10年-20年的工作经验。他们像是Director指明方向,程序员和BA们去具体执行。
    这是我平时用的timeline,具体进度用MS project管理, 这张图给management看~ 可见design&build占用的时间很久但是并非项目的全部,SIT,UAT等等测试也非常重要,对于其他一些项目硬件/环境的搭建也很耗时间。这一个个过程都是PM去管理指导的。
仓促写的,以后想到什么再补充~多图警告!流量党迅速撤离现场!以下为顺序步骤。

第一步 我们要确定一个可行的设计方案

第二步 我们要开始把框架搭好

第三步 我们开始一个模块一个模块的完成
第四步 可以拿去给测试们看了(白盒黑盒都有)

第五步 我们的产品经过测试通过可以拿去给安全组检查了

最后 我们的产品就可以上线了

I make things.



----------------------下面是彩蛋----------------------------
我们是你有可能中途遭遇的无数需求变更

一 背景


时间太久,不为本文中的任何一句话的真实性负责。

08年的时候刚刚加入搜狐,刚刚有工作经验7个月,很快就开始做白社会的项目。
可以说是一个几乎什么都不懂新人,特别感谢琳姐带我走入编程的世界。

那时候开心网的偷菜正火,Facebook如日中天,Twitter刚刚起步,新浪和搜狐刚刚在博客上打的热火朝天。

同组的师兄刚刚从搜狐奥运组撤出,刚刚经历过奥运高峰期的考验,特地分享了架构,可惜当时才疏学浅,大部分都只能听一个皮毛,当然现在也很菜。

方老大带着我们做SNS,Mark带着琳姐,吉子哥他们闭门会开了好久-据说是好久,反正多久我不知道,我是小兵兵一个,这些都是后来他们告诉我们的。

终于他们决定了,要做白社会。从他们决定做白社会开始,就决定了太多人一生命运的改变。

用我六年前的话来说,就是在白社会的时候,没觉得有什么,可是在现在看来,60人的团队有条不紊,如同军队般整齐,条理清楚的做一个项目,是多么难得的一件事情。

更不用说在当时的白社会里,对于各种技术的调研和应用如雨后春笋。

这就是我经历过的最大的项目了~跟众多大牛比起来,大概微不足道,但是对我这种小兵兵来讲,回忆起来已经是感慨万千。毕竟当年的白社会团队,60多个人,最菜的就是我,其他人几乎全部是各个一线公司的CTO,副总裁,核心架构师,CEO等等等等。

我记得很清楚,要做这个项目的时候,第一次参加项目动员会,也是到今天为止最让我受震动的一次动员会。

二 启动

熊杰那个时候是PM组的Leader(后来一个新浪的朋友说,她们在做微博的时候,那个时候其他行业都没有产品经理这个岗位,新浪就有了。听我有点目瞪狗呆,这么算起来搜狐有产品经理这个岗位比新浪至少多了两年吧?)

做的PPT很漂亮,怎么漂亮的我不知道,反正就是讲一个人,经受着各种各样的压力,然后早上七点起床,开始挤地铁,上午被老板骂,下午被客户骂,晚上十点又要挤地铁什么的。

然后说他们需要一个地方,让他们释放压力--虽然我到现在都没太明白,一个单纯的网站能够释放这么多压力么?

总之,一屋子大概三十,或者是四十个人,聚在一起。
嗯。在开心网偷菜,抢车位,真心话最红火的时候,搜狐入场了SNS的领域。

然后,Mark他们定了一个很清晰的框架,这个框架,在未来半年到一年内,几乎没有变过。

整个网站的功能,被分解成三个模块。FrameWork,App,Common,到现在我都在延用这种模块结构。Framework是白社会的主要框架,Home,User什么的都在这里。App是预留的网站的应用,如真心话,池塘边等。Common是公共服务,邮件啊IM啊通知啊神马的都在这里面。

跟着对下面的员工做了一个分组。
两人一个组,做一个小的功能模块。吉子和琳姐好像军中大将,总共差不多十几个组。每个组领命而去,两周或者是三周交工,嗯,这是后话。

当时的目标就是,三个月左右,将白社会核心的功能做出来。包括:
用户,好友,消息,通知,任务,推荐,Feed等等等等。


三 开发


在此之前,就有了一周一次的技术分享,提前做了很多的技术储备。白社会是一个全新的架构,所以琳姐他们也决定要做一个全新的技术体系。

首先,是在项目中正式使用maven。

我在之前的项目中,用到过一点点的Maven,琳姐给了我任务,让我给大家讲一下maven.第一次技术分享就奉献给了白社会的团队,还是有很多东西不太懂,可能也讲不清楚,但是收到了申总的鼓励,说我讲的知识点可能不够深,可是条理很清楚,能像我一样把东西讲清楚的人不多。

实际上,后来各个牛人在项目里用到的maven,都比我讲的东西深的多。


其次,是在项目中推行敏捷开发。

在此之前,两人一个组,需求评审,需求讲解,方案评审,Demo,发布。
用Jira做Story的分解,每天早上跟着胡哥三人小组去茶水间开晨会。

当时的敏捷开发还有很多不完善的地方,但是已经给我留下了很深的印象,除了敏捷开发,我想我大概以后不会采用任何的开发流程了。

特别是需求评审的时候,我记得很清楚,琳子和吉子他们会争的很厉害,为了一个功能要不要做,有没有必要做,经常会吵得非常非常凶。可是我很喜欢这种氛围,很喜欢他们思考问题的方式。

印象最深的一句话就是:琳姐说,为什么要花费80%的工作量去满足了1%的用户的需求?池明想了想,说:可是用户会因为这1%的需求得不到满足而离开。

这个问题我到现在都在思考,虽然我现在思考的角度有了很大的不同,但是仍然会遇到同样的问题。

嗯。特别是在做方案评审的时候,我在一周之内,为了拿出一个为用户推荐二度好友的功能,做出了7种方案。

读研的时候我们的老师就说,我们那个年龄,22岁~28岁,是最容易出成果的年龄,现在想想也确实是,如果再次能回到那个年龄段该有多好,如果你在看这篇贴子,如果你处在这个年龄段,好好珍惜吧~

方案评审比较随意,不太在乎格式,只在乎能否把事情讲清楚,把要做的事情列清楚。我的第一次方案评审,也是交给了搜狐。

这是一件很开心的事情,那么多技术大牛告诉你方案中哪里做的不合理,告诉你需要怎么做,怎么解决高并发的问题,怎么去做算数据量,怎么去估算占用的内存大小,怎么去利用缓存,怎么去防止数据不同步。

Demo也是一件很开心的事情。整个搜狐的团队,没有测试。是的,搜狐60多人的研发团队,没有一个是测试。所有的程序员,自己就是测试。我们能确保,每一组工程师,做出来的程序,在Demo之后,几乎是零Bug的。


第三 是在项目中用了DAL

这是一个通用的,封装了缓存的DB访问框架。无数次我们都讨论过开源事情,只是一拖再拖~到现在,嗯。

申总和康总负责这个框架的研发,是的,你没看错,在我们做项目的同时,他们只比我们早启动了不到两个月。

然后DAL支撑了绝大多数情况下的并发压力,而且用起来很方便,很简单。

也直接影响了我对于DB使用的喜好,从此以后再也无法接受联表查询。

第四 是在项目用到了Tuscany

Tuscany是我至今仍然非常喜爱的框架,非常非常喜欢。Tuscany的设计哲学很经典,很开阔,又很简洁。看完Tuscany之后,再看Dubbo,有点无法忍受这种山寨版的Tuscany,虽然Dubbo有他自己的优点,也是国内很多公司正在使用的东西,但是几乎 没有什么思想,或者说我已经掉进Tuscany的坑里面根本不想出来了。

可惜Tuscany更新到2.0就不再更新了。

不仅仅是Tuscany的使用,Tuscany本身并不支持负载均衡。胡总神一样的花了两周时间,重新写了一个Scallop的框架,用于做负载均衡。

嗯。当时还没有Zookeeper,即便现在有了,我也更喜欢Scallop这种简单直接明了的方案。

第五 是在项目中用到了JMS

ActiveMQ确实有很多坑,我们遇到过不少的情况,折腾了好久才把他搞定。
用ActiveMQ来做解耦,也确实是让代码简洁了很多。比如说用户注册,要算积分,要算推荐,要加好友,要初始化任务,要做很多很多事情。这些东西,用JMS来解耦是最合适的。

而且还封装了Tuscany和JMS组件,这是我一直很佩服的地方,这些开源框架,在这些大牛手里就是一个个可以任意组装的玩具,三两下就明白别人怎么做的,然后自己要怎么改进。

第六 是在项目中用到了Comet&Erlang




最早听到Erlang的消息机制,进程的概念的时候还不太了解,直到后来被迫自己也要这么做的时候,才重新温习了一下Erlang的东西。

Erlang的语法也是真心醉了,如果不是看过一点Drools,还真的。。学不会。

白社会用Erlang来做五子棋,那时候对Comet也是一知半解,直到后来自己用Comet来做在线多人扫雷的时候,才深刻体会到重新打开Http连接是一件多么废时间的操作,才真正转向到WebSocket-可惜,白社会那时候没有WebSocket。

第七 是在项目开发了自己的标记语言


马丹是叫SML还是叫什么来着,我不记得了。精品照Fackebook的做法,解决第三方App怎么和我们的FrameWork交互。看到他们当时去推测和分析Facebook的技术原理的时候,福尔摩斯都不过如此。

很快,一个小的示例程序就做出来了~

第八 是在项目中使用了Groovy

Groovy用在了任务上,用户接受任务,完成,领取奖励,这些东西是通用的,但是每个任务的完成机制不一样,所以我们需要一个轻巧的,简单的动态语言来解决这个问题。

嗯。后来我在我们自己的项目中,把Groovy用到了后台统计各种复杂的计算公式算法中,可以在线编辑。


这是我记得,或者是我知道的,在当时三个月里,几乎全部出来的新技术和新框架。
而这一切,丝毫没有影响整个项目的开发进度,这么多人做出来的程序,几乎是没有Bug的。

嗯。我一直不知道该怎么描述。

四 内测

要上线之前,苏菲设计了一版粉红的UI,还有一个冬天雪人的UI。我更喜欢那个雪人的设计。

他们还加了小彩蛋,关灯,老板键。

先是开始内测,内测的时候,很快就发现了Feed里到处都是加好友的信息。然而,以我的感觉来看,搜狐内部其他部门对于这个产品,几乎是带着嘲讽的角度去看的。

并不会如我想像的一样,大家都是搜狐的员工,出了一个新的产品都会去开开心心的用,然后开开心心的提问题,大多数都会说:这什么鬼东西,怎么设计的这么烂?
因为都是同行的原因?我猜不透~也不想知道。

不过,白社会大部分的时候口碑都很好,UI的设计,交互的体验,简洁的功能,都是我做过的系统中最舒服的一个。

内测开始后,安全性,用户体验有了一波新的改进。跟着就进了公测了~



五 公测

公测之后,对于绝大多数的人,白社会的口碑都很好。特别是生活在别处,特别是小白这种亲切的称呼。

后续又出来了白社会小报,池塘边,梦幻城,绿光森林等几款很有特色的产品或者是游戏。

只是当时大家所谈的都是一件事情,想要复制开心网偷菜应用的成功,所有的人都认为,白社会只是缺少一个杀手级应用。

他们说,当时新浪在做新浪朋友。然后搜狐抢先上线了白社会,当白社会出来之后,新浪朋友的团队直接解散,放弃了新浪朋友,转做微博。

嗯。我不知道具体是怎么样的,白社会的产品研发团队都很赞,可是在运营上,在大的方向上或者还是差了一截。

只有北京的公交车似乎有过白社会的痕迹,搜狐主页上曾给白社会留过一个很值钱的广告位。
天天向上那时候也只是张朝阳大人一个人去了,似乎并未能展示白社会的团队。



六 最后闲谈一下发布流程


当时,白社会也是没有运维的,运维是胡总和洪涛两个大神负责。每周二,每周五,半夜十二点,每一个项目的工程师,都在自己的电脑面前,完全不需要聚在一起,完全不需要在一起加班,只需要在自己的家里,电脑面前,等着胡总说一句:发布了~检查一下有没有发布成功。然后开开心心的等着晚上第一个使用的用户,检查有没有问题。

嗯。每次发布,白社会就会写上一句:白社会正在进行日常卫生打扫.

现在发布一次程序,跟打仗一样。


现在安排60个人去做一个项目,在三个月之内做出这么多东西,又能几乎没有任何损耗的去有序开发,好难。

白社会战友群,写的是那些年,你上过的白社会。群里大概80多个人,有很多是在我离职之后才加入的,现在都混的很好很好。

最后,贴几张截图。

马丹,上传不了图片。

有关阿里集团在打造支撑百万用户的分布式代码托管平台,这里分享一篇阿里技术协会的内部文章,本文主要介绍了阿里巴巴集团代码服务团队,在过去一年基于GitLab进行的代码托管分布式改造,希望与大家进行分享与探讨,为云上开发者提供更好的代码托管服务。

一、背景介绍

毋庸置疑,代码是DevOps流程的起点,是所有研发流程的基础;代码托管为代码“保驾护航”,确保代码的安全性、可用性,同时提供围绕代码的一些基础服务,如MR、Issue等等。

阿里巴巴集团GitLab是基于GitLab社区版8.3版本开发,目前支撑全集团数万规模的研发团队,累计创建数十万项目,日请求量千万级别,存储TB级别,早已超过了GitLab社区版承诺的单机上限能力,且增长速度迅猛。

面对这种情况,顺理成章的做法就是——扩容。然而非常不幸,GitLab的设计没有遵守Heroku推崇的“The Twelve-Factor App”的第四条:“把后端服务当作附加资源”(即对应用程序而言,不管是数据库、消息队列还是缓存等,都应该是附加资源,通过一个url或是其他存储在配置中的服务定位来获取数据;部署应可以按需加载或卸载资源),具体体现是:

  • Git仓库数据存储于服务器本地的文件系统之上
  • GitLab所依赖的三个重要组件:libgit2、git、grit也都是直接操作在文件系统上GitLab

所以GitLab社区版是基于“单机”模式设计,当存储容量和单机负载出现瓶颈时,难以扩容!

二、面对挑战

2015年初,阿里巴巴集团GitLab的单机负载开始呈现居高不下的情况,当时的应对方案是同步所有仓库信息到多台机器,将请求合理分配到几台机器上面从而降低单机的负载。然而这个方法治标不治本:

  • 系统运行过程中的数据同步消耗资源和时间,不可能无限制扩充机器
  • 这种方案暂时缓解了单机负载的问题,但对于单机存储上限的问题束手无策

2015年中,团队正式启动了第一次改造尝试,当时的思路是去掉对本地文件系统的依赖,使用网络共享存储,具体思考和方案可以参见RailsConf 2016 - 我们如何为三万人的公司横向伸缩 GitLab。

然而由于本地缓存等问题的限制,网络共享存储的方案在性能上出现较明显性能问题,且大都为基于C/C++的底层改动,改造成本出现不收敛情况。而当时集团GitLab服务器在高峰期CPU屡屡突破**95%**甚至更高的警戒值,而高负载也导致了错误请求占比居高不下,无论是对上游应用的稳定性还是对用户体验都提出了严峻挑战。

2016年8月起新一轮改造开始。

三、改造方案

既然共享存储的方案暂时行不通(后续如果网络存储的读写性能有质的提升,未尝不是好的方式),首先明确了唯有分布式或者切片才能解决问题的基本思路。 我们注意到,GitLab一个仓库的特征性名称是"namespace_path/repo_path",而且几乎每个请求的URL中都包含着个部分(或者包含ID信息)。那么我们可以通过这个名称作分片的依据,将不同名称的仓库路由到不同的机器上面,同时将对于该仓库的相关请求也路由到对应机器上,这样服务就可以做到水平扩展。

下面通过一幅图介绍一下目前集团GitLab在单个机房内的架构。



3.1 各个组件的功能主要是:

  1. Sharding-Proxy-Api用于记录仓库与目标机器之间的对应关系,可以看作切片的大脑
  2. Proxy负责对请求做统一处理,通过Sharding-Proxy-Api获取信息,从而将请求路由到正确的目标机器
  3. Git Cluster由多组节点构成,每组节点内有三台机器,分别为master,mirror和backup。其中master主要负责处理写(POST/PUT/DELETE)请求,mirror主要负责读(GET)请求,backup作为该节点内的热备机器

说明

  • master在处理完写请求后,会同步更新此次变更到mirror和backup机器,以确保读请求的正确性和热备机器的数据准确
  • 之所以没有采用双master的模式,是不想造成在脏数据情况下,由于双向同步而造成的相互覆盖

3.2 保证方案可用

  • 如何确保切片信息准确 Sharding-Proxy-Api基于martini架构开发,实时接收来自**GitLab**的通知以动态更新仓库信息,确保在namespace或project增删改,以及namespace_path变更、仓库transfer等情况下数据的准确性。 备注:这样的场景下,等于每次请求多了一次甚至多次与Sharding-Proxy-Api的交互,最初我们曾担心会影响性能。事实上,由于逻辑较为简单以及golang在高并发下的出色表现,目前Sharding-Proxy-Api的rt大约在5ms以内。
  • 如何做到切片合理性 海量数据的情况下,完全可以根据namespace_path的首字母等作为切片依据进行哈希,然而由于某些名称的特殊性,导致存在热点库的情况(即某些namespace存储量巨大或者相应请求量巨大),为此我们为存储量和请求量分配相应的权重,根据加权后的结果进行了分片。目前来看,三个节点在负载和存储资源占用等方面都比较均衡。
  • 如何处理需要跨切片的请求 GitLab除了对单namespace及project的操作外,还有很多跨namespace及project的操作,比如transfer project,fork project以及跨project的merge request等,而我们无法保证这些操作所需的namespace或project信息都存储在同一台机器上。 为此,我们修改了这些场景下的GitLab代码,当请求落到一台机器同时需要另一台机器上的某个namespace或project信息时,采用ssh或者http请求的方式来获取这些信息。 最终的目标是采用rpc调用的方式来满足这些场景,目前已经在逐步开展。

3.3 提升性能

  • ssh协议的替换 目前阿里巴巴集团GitLab提供ssh协议和http协议两种方式,供用户对代码库进行fetch和push操作。其中,原生的ssh协议是基于操作系统的sshd服务实现,在GitLab高并发ssh请求的场景下,出现了诸如这样的bug:

由此产生的问题是:

ssh协议登陆服务器变慢

用户通过ssh协议fetch和push代码时速度变慢

为此,我们采用golang重写了基于ssh协议的代码数据传输功能,分别部署在proxy机器以及各组节点的GitLab服务器上。由此带来的好处有:

机器负载明显降低

消除上述bug

在ssh服务发生问题的情况下,仍旧可以通过ssh登陆(使用原生)服务器,以及重启sshd服务不会对服务器本身造成影响

下图是proxy机器采用新sshd服务后的cpu使用情况:


  • 个别请求的优化和重写 对于一些请求量较大的请求,例如鉴权、通过ssh key获取用户信息等接口,我们目前是通过文本转md5,加索引等方式进行性能优化,后期我们希望通过golang或java进行重写。

3.4 确保数据安全

  • 一主多备 如上面提到的,目前阿里集团GitLab的每组分片节点包含有三台机器,也就是相对应的仓库数据一备三,即使某一台甚至两台机器发生磁盘不可恢复的故障,我们仍旧有办法找回数据。
  • 跨机房备份 刚刚过去的三月份,我们完成了阿里巴巴集团GitLab的跨机房切换演习,模拟机房故障时的应对策略。演习过程顺利,在故障发生1min内接到报警,人工干预(DNS切换)后5min内完成机房间流量切换。 多机房容灾的架构如下图所示: http://pic3.zhimg.com/v2-3716c090e30a9b82f147dc3659a869d6_b.png 保证准实时的仓库数据同步是机房切换的基础,我们的思路按照实际需求,由容灾机房机器主动发起数据同步流程,基本步骤是:
    • 利用GitLab的system hook,在所有变更仓库信息的情景下发出消息(包含事件类型及时间包含数据等)
    • 同机房内部署有hook接收服务,在接收到hook请求后对数据进行格式化处理,并向阿里云MNS(Message Notify Service)的相关主题发送消息
    • 容灾机房内,部署有消息消费服务,会订阅相关的MNS主题以实时获取online机房发送到主题内的消息,获取消息后调用部署在容灾机房GitLab节点机上的rpc服务,主动发起并实现数据同步的逻辑
    • hook接收、消息消费以及**GitLab**节点机上的rpc服务,均由golang实现。其中rpc服务基于grpc-go,采用protobuf来序列化数据。 通过一段时间的运行和演习,已经确定了方案切实可行,在数据校验相关监控的配合下,容灾机房可以准实时同步到online机房的数据,且确保99.9%至99.99%的数据一致性。

3.5 如何提升系统的可用性

  • 日志巡检 面对集团GitLab每天产生的大量日志,我们使用阿里自研的监控工具进行日志监控,对系统产生的5xx请求进行采集和报警,然后定期去排查其中比较集中的错误。经过一段时间的排查和处理,5xx错误日志大致可以分为:
    • 分布式改造带来的跨分片操作的bug
    • GitLab本身的bug
    • 高并发情况下带来的系统偶发性故障
    • 数据库相关的错误等
    • 由于用户量大,场景多,阿里巴巴集团GitLab的使用场景基本覆盖GitLab的所有功能,因此也可以暴露出一些GitLab自有的bug。如Fix bug when system hook for create deploy key(从此,咱也是给GitLab供献过代码的人了)。
  • 服务器监控 无论系统多少健壮,完备的监控是确保系统平稳运行的基础,既可以防患于未然,也可以在问题出现时及早发现,并尽可能减小对用户的影响。目前阿里巴巴集团GitLab的监控主要有:
    • 机器cpu,内存、负载等基本指标的监控
    • ssh、ping等网络检测信息(用于判断是否宕机,后将详述)
    • 服务器各个端口的健康检查(80,90xx,70xx等等)
    • 异步消息队列长度的监控
    • 数据库连接的检查
    • 错误请求的监控
    • Sharding-Proxy-Api与GitLab的数据一致性校验
    • 很自豪的一点是,我们经常可以根据报警信息,先于用户发现问题。
  • 单机故障的自动切换 虽然监控足够完备,但谁也不能保证服务器永远不宕机,因此我们在同一组节点中保有一台backup机器以应对服务器故障。会有专门的client定期通过API轮询监控平台提供的机器监控信息,当确认机器宕机时(ssh和ping同时不通,且持续时间超过2min)自动触发机器角色的互换,包括master与backup互换,mirror与backup互换等。通过演习,我们已经具备了单机故障时5min内全自动实现机器切换的能力。
  • 机房故障时的切换 即前述的跨机房切换。

3.6 单元化部署

单元化架构是从并行计算领域发展而来。在分布式服务设计领域,一个单元(Cell)就是满足某个分区所有业务操作的自包含的安装。而一个分区(Shard),则是整体数据集的一个子集,如果你用尾号来划分用户,那同样尾号的那部分用户就可以认为是一个分区。单元化就是将一个服务设计改造让其符合单元特征的过程。

为了实现单元化的目标,我们在最初设计时就往这方面考虑。比如跨机房备份中,消息消费应用需要调用**Sharding-Proxy-Api**获取rpc服务的地址时,尽可能做到数据在单机房内闭环。这样在满足单元化要求的同时,也可以在机房故障时,尽量不影响已进入队列的消息在消费时出现数据断流。

现在阿里巴巴集团GitLab在架构上已经基本具备了单元化部署的能力,这样的情况下,无论是后续与阿里云合作对外提供服务,还是当收购海外公司需要单独搭建新服务时,都不会遇到问题。

四、未来的改进

4.1 偶发的cache大量释放

由于GitLab有大量的IO操作,使得系统占用cache的数值巨大,也正是因为cache,系统的性能得到保证。然而成也cache败也cache,为了确保系统不会发生OOM,我们设定了vm.min_free_kbytes,当cache占用过多且需要继续申请大片内存时,会触发cache的释放,势必会影响释放瞬间请求处理能力(通过日志分析得到,此瞬间的处理能力仅为cache存在时的1/2左右),直接后果是该瞬间的请求堵塞,甚至出现部分502。

为此我们咨询了系统部的同学,根据他们的建议修改了部分内核参数(目前仍没有根治),后续会尝试升级内核的方式,也希望遇到过类似问题或对这方面问题有研究的同学,把你的秘籍传给我们。

4.2 自动化运维

目前集团GitLab的发布主要靠手,在分布式架构下,机器势必越来越多,全自动化的发布、扩容机制,是我们需要完善的地方。

4.3 rpc方案的最终落地

如前所述,只有最终实现了全局的rpc替换,才能将web服务所消耗的资源与Git本身消耗的资源进行分离,阿里巴巴集团GitLab的分布式改造才能算最终结束。

后续

监控及日志数据对比显示,过去一年中阿里巴巴集团GitLab请求量增长4倍,项目数增长130%,用户数增长56%,在这样的增速下,系统调用的正确率却从99.5%提升到了99.99%以上,这些数字印证了我们方案的可行性和可用性。

接下来的时间里,小伙伴们会为继续代码服务的创新而努力,“高扩展、分布式、响应式、大文件、按需下载、流控、安全、数据化、单元化”,有些我们做到了,有些是接下来努力的方向。

现在阿里巴巴集团GitLab的架构,已经足够支撑百万规模的用户体量。在经过阿里工程师、开发者的千锤百炼之下,我们有勇气和信心通过阿里云code(阿里云代码开发服务现可免费使用)为更多的开发者提供代码托管服务,共同打造云上的协同研发生态!

本文作者:billy.lb 屹恒

有关:阿里云 code

这是一款从未在外面推广过的代码托管产品,估计很多人还不知道阿里云有这个服务。阿里云code旨在解决部分中小企业选择内部自行搭建 Git或SVN ,势必会遇到搭建、维护成本高,难于扩展和备份,数据安全和可靠性差的问题。

核心优势——阿里云上基于Git的分布式代码托管,高可用、安全、高性能以及无限容量是其核心竞争力,支持svn仓库的便捷迁移。

目前已面向个人或企业免费提供Git及SVN两种协议模式的代码托管服务:点击免费使用

更多几乎干货请移步:我是程序员 - 知乎专栏

软件和公司都分大型小型。对于软件来说,针对个人的算小型,也就是桌面应用,针对企业组织的算大型。公司么,就是人多人少,有的公司是产品性公司,有的公司是项目型公司。

我比较熟悉的针对金融行业的J2EE软件,通俗来讲,就是给银行保险公司投资公司等用的核心系统。这个领域除了互联网金融,其实电子化率很低,银行稍微高些,其他的保险公司也好,基金公司也好,很多中小型的,甚至真的用excel而已。原则上,和这些公司工作,流程基本上都是:

首先做售前和销售,这个时候多少会演示下系统,有的公司还会给你几个功能尝试下,这个叫POC。然后签合同,合同一般是分步签的,这个不细谈。

签完合同,给客户上课,把基线系统给客户演示,然后客户根据他们自己的需求,提功能需求,这个阶段叫workshop。

然后业务人员针对客户需求,写功能文档,当然,还有一部分非功能要求,叫做NFR,这是由架构师负责的,还有专门的集成部分,因为金融系统大多很多年,通常有十几个系统互相集成, 这些都写完,开始设计。

设计阶段主要分三个部分,概要设计,这个部分是看整个系统是否要大改动,比如我现在正在做一个项目,要把常用框架升级到Spring全家桶,这就在概要设计部分展开。

其次是高层设计,这个会针对每个功能点,详细写下什么地方如何改动。

然后是底层设计,这个部分会写伪代码和功能测试用例,用来给开发中心进行编码。

在开发中心编码的过程当中,还要采用CI的概念进行开发质量管理,直到提交。

代码完成了以后,提交发布,放到测试服务器进行人工测试和自动化测试,直到符合标准。

之后是客户SIT,这是系统集成测试,放到客户环境,和客户其他系统进行对接测试,看看通讯是否成功。

然后是UAT,这是客户的最终用户进行测试,用他们实际业务当中的行为进行操作。同时也是对他们的培训。

之后是上线,上线之前可能还要进行冻结以便进行数据迁移。

然后是保修期,一般1到3个月,这个过程当中,免费修bug。

然后是维护合同,按照合同对软件进行修bug和二次开发。

【谢邀】

企业在使用软件的时候可能会先考虑成品软件,因为节约时间,不需要开发周期,但是成品软件的一大缺点是功能上使用不灵活,不能满足客户大多数需求。因此为了更好的用户体验,大多数企业会选择软件开发公司开发。在开发过程中,有必要了解一下开发的流程,更好的和外包公司做好紧密配合。那么,今天我们就来谈谈大型公司开发软件的流程是怎样的?



一、需求调研、需求分析



这是整个软件定制开发过程中非常重要的环节,是盖房子打地基的环节。需要需求方和软件开发方的紧密配合,包括需求的收集,需求的分析整理,需求的评审,需求的变更管理等过程。很多需求方在选择了软件开发厂商后,就只等软件开发放交付系统,双方没有经过充分的需求沟通而交付的系统中间肯定会出现分歧,导致后期的推拉托现象,交付时也会造成用户满意度较低。确定需求细节时软件能否成功开发的基本保障,因此这一环节一定要足够重视才会验收到好的产品。



二、原型设计、产品设计、界面设计



根据第一阶段的收集整理的需求,进行系统的架构和设计。设计工作一般主要由软件开发方的设计人员完成,界面的设计也在这个阶段。如果是基于软件产品基础上的定制开发,那么需要考虑在现有产品的功能、设计和技术架构下进行设计,结合现有的业务需求,这就要求现有的软件产品需要具有较好的架构和设计,拥有较好的扩展性和二次开发能力,同时需要考虑到个性化的开发不能够破坏现有产品的设计,否则后续产品的升级需要重新整合和开发,成本和工作量非常大。



三、程序编码



这个阶段就开始系统开发了。需要根据前面确定的软件定制开发需求以及系统设计的确定,组织开发人员进行系统代码的编写。需求方常常很难将需求一次性提交完毕,常常会在开发过程中涉及到需求的问题,这中间需要与系统开发方进行设计细节的讨论和调整。一般大调整需要需求方增加薪酬。开发人员需要对需求方提出的问题进行充分理解,并确定到软件需求中,对代码进行合理规范的编写,并且保证质量,确保不会影响软件系统的质量和稳定性、安全性等方面的影响。



四、软件测试



系统开发完成之后进入测试阶段。软件开发人员需要根据开发完成的商品对照第一阶段中确定的需求进行测试,检查系统功能性、性能、安全性等方面整体测试。一般先由软件开发人员测试流程是否走通,再由双方一起进行同时测试。对于测试中发现的问题,一般提交开发人员进行修改,再进行回归测试(针对修改过的问题进行测试和验证)。系统测试是软件定制开发中准备收尾的重要环节,需要双方紧密配合,随时联系,合理规划好时间,保证测试的顺利进行是软件系统开发的根本保障。



五、打包发布



系统开发完成后部署在最终用户的正式运行环境,交付给最终用户使用,同时需要对相关的人员进行培训。这个环节中软件的推广和使用是重点,直接关系到软件的应用效果。软件在正式运行过程中会遇到系统错误、使用问题、功能的完善和修改等,软件开发方需提供相应的服务确保最终用户系统正常稳定的运行。



从以上描述中看软件定制开发整个过程,确定需求和测试阶段是需求方和软件开发方需要高度配合的重要阶段。软件定制开发的周期和复杂程度是由需求方决定的,对于业务需求比较简单的环节可以省略或合并。想要定制软件开发的用户可以先了解,以便后期与开发企业的沟通。

------------------------------------写在前面的吐槽......可以跳过-----------------------------

答主在2016年写了这个答案:写工业级别代码是怎样一种体验?, 当时也比较年轻,基本上是以抱定“工业标准一定是宝贝”的心态写的那个答案,可以说当时答主对aSPICE和ISO26262 part6 的流程推崇备至,然而这些年渐渐有了些新的感悟。

答主这几年也是比较坎坷,公司换了两家,部门换过四次,在中、美、德、英四个国家的汽车软件部门工作过,见识了不同的流程和文化,令我惊奇的是,所有这些公司、部门和项目,有一点是相同的:都是世界前五名的汽车零部件供应商哦,居然从来没有一个项目完全遵循了aSPICE和ISO26262 part6流程...

关注我的不少童鞋也在汽车行业:有一家算一家,甭管您是国内的、国外的,国企还是外企,传统车厂还是新势力,主机厂还是零部件,有哪位能告诉我你们是严格按照这两个流程来开发软件的?我真的很想知道。

这就说明问题了。我开始思考,也许不是这届项目管理不行,而是这些流程出现了一些问题,已经不太适应现在的汽车软件开发,特别是HAD(Highly Assist Driving)大背景下汽车软件的开发了。在此,我想结合我的项目经验,谈一谈我理解的实际的软件开发流程。事实上,我们很多部门已经开始在做这方面的实践,并取得了不错的成果。

-----------------------------------吐槽结束,下面是正文...----------------------------------

×××(一)写在前面 ×××

首先,结合我自己的专业,我想谈的是汽车行业里大型(超过一百万行代码)、重大安全系统(safety-critical system)软件的开发流程。业内对此有已经两个流程标准:ISO26262 part6 和aSPICE。前者现在是发布汽车相关软件必须遵守的标准,而后者基本上只有大众、戴姆勒等几家德国车企才强制要求(从我和他们打交道的情况来看,我都很怀疑他们自己内部遵不遵守这些流程..)。

关于这些流程的扫盲贴可以看这个答案: 写工业级别代码是怎样一种体验? , 相关细节这里就不重复了。

我在这里想探讨的,是一种与敏捷开发相结合的V型开发流程。这并不是我凭空生造的,而是我在实际项目中部分实践过的流程,很希望在这里和大家交流。


×××(二)V型流程的弊端 ×××

无论是ISO26262 part6 还是aSpice,它们的核心都是“V型开发流程”,说白了就是个变形的瀑布(Waterfall)流程。

V型开发流程

吹到天上,架构设计也要等软件需求文档冻结了才能进行,而单元设计要等架构设计文档冻结才能开始。每一级依赖上一级的完整输出作为本级的输入。讲真,在实际项目里,真的非常容易窝工!一旦软件计划或者资源上有一点变动,比如需求临时变更,或者架构师被领导临时抽调,那真的是产生连锁反应,整个项目后续都受影响,最后就是无穷无尽的加班。

再者,现在市场的实际情况就是,软件需求是永远不可能冻结的!V型流程建立的基础都快没有了。现在HAD功能大量上马,OEM们争分夺秒逐鹿蓝海,别说造车新势力,就是传统主机厂,也是不可能等到功能完全想明白了、写好了再把完整的需求文档给你的。往往都是先搭个框架,有个大致想法,需求就发布了。紧接着就是一遍一遍的沟通、测试、修改,大家都在抢时间,每周都有新功能进来。就这,你还指望软件需求有冻结的一天?!做梦呢。往往是上一版刚冻结,后续还没展开,新需求就又来了,所有人都崩溃。

第三就是“人”的问题。这个问题很影响项目实施,但我从来未见有帖子认真讨论过,所以想多写点。很多关注我的童鞋都是业内人士。我想问问你们,在实际情况里,上图的6到11这些环节中,您觉得那个环节最重要、薪水最高、最有意思、领导最重视、最容易升职/跳槽啊?

毫无疑问是7和8,架构设计和功能单元设计对吧,没悬念嘛。那么哪个环节或者职位最不受重视、薪水最低、最无聊枯燥、最不容易跳槽啊?6软件需求/需求工程师啊,完全没职业发展嘛。大一点的企业甚至干脆外包了对吧,咖喱味的需求有没有?

事实就是,做软件需求工程师和测试工程师的童鞋,但凡有经验、有能力、有机会的,都会努力转成控制工程师或者架构师,这家公司转不了,哪怕跳槽也要转。说句得罪人的话,您公司里的需求工程师,是不是相对来说,都是对产品不那么熟悉、经验不多,或者水平欠佳的同事在担任啊?

然而,要命的是,按照V型开发流原本的定义和初衷,最最重要的职位恰恰就是需求工程师。需求是一个项目的根本,是项目执行的第一级,可以说一切的一切都是围绕软件需求展开的。一个水平欠佳的需求工程师,不到位的理解和水平欠佳的需求文档,往往会给项目带来灾难性后果,有些甚至是后期弥补不了的。我想这一点童鞋们或多或少都有体会。

需求工程师的缺位,更是加重了V型流程的弊端。

V型流程的弊端


×××(三)保留V型流程的核心 ×××

在讨论完弊端以后,为了改进流程,我们要明确一下V型流程的核心,把它们保留起来,取其精华去其糟粕。

就像我在之前文章里论述过的, V型开发流程的核心有两个:1.实现分层次的测试和验证 和2. 建立完整的可回溯性。这两点是一定要保留下来的。否则在软件发布以后,根本就没法通过ISO26262或者aSPICE的验收审核。

V型流程的核心

分层次的测试,也就是单元测试(Unit Test)、集成测试(Integration Test)和硬件在环测试(HIL Test, Hardware in the loop),这些是必须的,没法省略也没法变动。但是,为了提升流程的灵活性,在文档的完整性和可回溯性上,我们可以适当做一点妥协。V型流程要求每一步骤都要时刻建立完整的文档和可回溯性,然后才能进行下一步骤。根据实际项目经验,我认为,这一要求可以放宽到“在成熟软件发布的时候,具有完整的文档和建立可回溯性”。用通俗的话讲就是从制度或者从流程上允许“先写代码后补文档”的做法,或者说,“文档、代码一起写”。

当然,这种妥协一定有一个前提,就是项目团队有充分的沟通和项目组长有清晰的框架,从我的实际项目经验来看,这是不难做到的。


×××(四)与敏捷开发相结合的V型开发流程 ×××

为了解决传统V型流程的的弊端,我在项目实践中引入了一些敏捷开发的元素,比如Scrum master,Sprint,Kanban Board等等,这里我们暂且先不讨论这到底是“真正的”敏捷开发还是只是借用概念。

与敏捷开发相结合的V型流程

这套改进的流程有两个要点:

1.与原有的V型流程在结果上兼容。在成熟的软件发布时,用新流程开发的软件同样具有完整的文档、完整的可回溯性以及完整的分级测试报告。新流程完全不影响原有的项目审核和质量控制。

2.新流程右侧(测试侧)不变,而左侧(设计侧)由瀑布式开发变成了“敏捷式”开发。各个步骤从原来的次第进行变成以Sprints的形式齐头并进,最大限度地提升灵活性。

下面我详细阐释一下新流程。

项目组长扮演Scrum Master的角色,组织例会。例会上需求工程师、架构师、基础软件工程师、应用层工程师(控制工程师)每人阐述本周的进度,对新需求或新修改项达成一致认识。这种认识是通过非正式的形式,比如口头沟通、演示来达成,并通过email和会议记录的形式(而不是冻结的完整文档)明确固定下来。随后组长明确这周的任务,并设置关键结点,形成一个Sprint,每位工程师开始完成自己规划的任务,发现问题快速反馈,这是并发的。

当关键结点到来的时候,再次例会,组长查看进度并根据新需求制定下一个Sprint的任务。这样随着Sprints的进行,最终会形成完整的需求文档、设计文档和代码,同时完成可回溯性文档。随后一切就和传统V型流程一样了:交付集成工程师进行集成,随后进行各级测试。


×××(五)新流程的人员配置 ×××

为了实现这种新流程,软件团队的人员架构也需要做一定微调。项目组长与需求工程师、架构师、基础软件工程师、应用层软件工程师组成一个敏捷开发小组,而软件集成工程师和测试工程师需要在敏捷开发结束后才进场工作,不再属于某个开发小组,而是为所有小组服务。

软件团队架构

需要注意的是,这种架构对项目组长提出了非常高的要求。高并行意味着各位工程师在执行自己任务时候可能会有冲突。组长一定要有能力协调好已经发生的任务冲突,并且还要有能力预见未来的冲突;另一方面,由于每个工程师的任务毕竟是模糊定义的(没有冻结的文档),组长要有全局掌控的能力,并和每位工程师流畅沟通并确认工程师已经充分了解自己的任务。

可以说,组长的能力是能否实现新流程的一个要点。不过我的参与过的项目中,这是实际实现过的。而我自己也做过项目组长,新流程并没有复杂到无法实现。


×××(六)新流程的优势与劣势 ×××

可以说,新流程的优势是明显的。首先,新流程灵活性大大增加,窝工情况缓解。每位工程师在每个Sprint的开端就(以“模糊”、非正式的形式)明确了自己的任务——如前所述,这种任务以Email、会议纪要的形式固定,以和组长的沟通来保证正确性——不必再等待自己前级的输出。就算架构师消失一周,其他工程师照样能写自己的代码/文档。架构师消失只会影响他自己的进度,最后只有架构师自己加班而不是拖累全员加班。

其次,新流程不必等待需求文档冻结。客户给一点我们就做一点,客户要改、要加料,研发团队可以从流程上随时奉陪,非常契合现在造车新势力和自动驾驶相关研发的节奏。

最后,新流程一定程度上可以弥补需求工程师的缺位。在String的执行中,任务分配可以比较灵活。原来由需求工程师承担的任务可以分配一部分给其他工程师。比如与客户的沟通、技术谈判,对需求的分析和确认等等,如果需求工程师能力足够,则这是他的本职工作;如果需求工程师能力、经验欠佳(这是普遍情况),则这部分工作可以分配给架构师、控制工程师来完成,而让需求工程师退化为一个把文字打进DOORS系统里的打字员或者文档整理员...(这也是从我们的项目实践里无奈的总结出来的)。

新流程也有着他的劣势。比如,高并行意味着对所有工程师都提出了更高的要求,无论是经验、技术还是团队配合都要求更加严格,这无疑对企业是一个新的挑战;特别是项目组长,更是一定要由经验丰富的员工担任,导致小企业里可能没有足够数量的员工能够胜任组长。然后,组长如果消失了,比如病了、或者跳槽了,对项目会有相当大的打击

您别说这例子还真发生过。曾经有一次一个项目组的英国组长连续休假三周(不得不说欧洲人假期就是多....),导致项目进展缓慢,气得客户打电话过来骂人.....不过这应该是企业整体考虑的问题,比如设置第二组长等等。

-----------------------------写在最后---------------------------------

这篇文章我想写给有一定基础的汽车软件从业人员,所以中间如果有解释不够细致的地方还请见谅。也可以留言提出意见让我修改。在此答主也是抛砖引玉,希望和大家共同交流~


话说,这篇文章有一个后续:

你如何理解敏捷开发?

如果你觉得我这个答案不错,也许你会喜欢我的专栏:汽车软件工程师生存手册

Tier1 汽车供应商的一枚小工程师飘过~

比较懒,就拿了个蔚来汽车在mathworks汽车年会的演讲PPT来举个栗子吧~


关注公众号:汽车ECU设计

一个菜鸟汽车程序猿的成长之路~

责任编辑:
热门阅读排行
© 16货源网 1064879863