草庐IT

谈一谈我对协同开发的一些认识

innuendo 2023-07-05 原文

如今各互联网公司普通都使用敏捷开发,采用小步快跑的形式来进行项目开发。如果是小项目或者小需求,那一个开发可能就搞定了。但对于电商等复杂的系统,其功能多,结构复杂,一个人肯定是搞不定的,所以都是很多人来共同开发维护。以我曾经待过的商城团队为例,光是后端开发就有七十多人。

为了更好地开发这类大型系统,往往把这种大型系统拆分为多个模块,团队成员也进行分组,每个组负责开发其对应的模块。于是,当有涉及到多个模块的需求进来时,往往就需要多个组的人协同开发。

这里我想谈两个问题:

1、假如有涉及到多个模块的需求进来时,有的组需求已经拉满了,所有人都在做别的需求,当前没有空闲的人力,这个时候怎么办?

2、参与此次需求的每个开发同学,是否都应该对这个需求有足够的了解,知道需求的来龙去脉以及各个模块之间如何做配合的?

对于问题1,通常是由PM或者项目owner去找到对应组的组长去做资源协调,组长给出一个可以进行开发和联调的时间,PM或owner再根据这个时间来协调其它组的时间,制定出整个项目的开发、联调、测试与上线的时间。

但我曾经待过的一个开发团队,在某个组当前没有人力时,就把这个组的开发需求分配给其它有人力的组,直接让其它组去把这个组的代码一起开发了。于是后来大家都这么干了之后,慢慢的,当有多模块的需求再进来时,直接就分给某个组了,然后这个组就去改其它组的代码,把所有的模块都给开发了。

但这样就衍生出了许多问题。首先,你去改其他组的代码,你不清楚他们原来的代码逻辑,所以你的先花一定的时间去熟悉被人的代码。假如你改到了一些隐藏的逻辑,那就容易出线上问题,而且别人来改你的代码,也会有相同的问题。其次,别人把你的代码改了之后,可能就破坏了你原有的逻辑。当你的同一段代码多其他人多次修改之后,你可能都不知道它现在是什么逻辑了。如果此时出现线上问题,你又改去找谁来看这个问题呢。

所以,如果开发去跨模块的进行代码开发,就会存在以上的问题,开发效率低,并且容易出线上问题。所以大家经常说:一个人走得快,一群人走得远。多人协同开发虽然增加了沟通与协调的成本,但当公司达到一定的体量,当项目达到一定的规模,靠一个或少数几个人是很难完成的,它一定需要很多人协同开发,共同完成。所以我们现在看大厂社招的开发岗位,很多都要求开发人员具有良好的沟通与协调能力。

对于问题2,比较理想的情况,是参与开发的每个同学都清楚的知道当前需求具体是做什么,整个系统每个模块都要该什么,我的模块该怎么改。但从我这几年的开发经历来看,要做到这一点比较难,尤其是在产品快速迭代的时期。

通常当有需求来的时候,会先叫组长去沟通需求,等这个需求确定了,组长就会看看当前组内谁有时间去做这个需求,就安排谁去做。但在业务发展初期,产品都在快速迭代,开发同学的工作基本都处于饱和的状态,一般做完一个需求后马上就做下一个需求。有的甚至是几个需求并行在开发,开发同学会趁着一个需求在联调或者测试的间隙去做另外的需求。假如这个时候组长又安排了一个需求让你去做,你会从头到尾的仔细研究这个需求吗?

对于大多数人来说是不会的。这个时期为了追求迭代速度,开发质量都是可以做一定牺牲的,更何况去研究需求的细节。当组长让他去对接需求的时候,他这个时候可能还在忙别的需求,都没时间去仔细看这次的需求是什么,只了解到它大概是什么。现在让他去参加具体的需求评审,他不想关心为什么要做这个需求,也不想关系其它模块怎么做什么,他只想知道他该做什么。然后定个开发与联调时间,他就可以去做了,做完后再去对接下一个需求。这个状态下,开发人员缺少了对项目的思考,其实已经沦为工具人角色了。但目前的高强度迭代,也没有时间给你去思考需求了。

这种情况其实也不仅仅是项目初期才会有,在项目稳定之后也会存在。我之前做过一个大需求,商城要增加一种商品的营销玩法,光是把后端导购、商品、营销、交易等几个组参与开发的同学拉到一起,就有十几个人。在产品沟通完需求,各模块都对接好了,准备进行开发的时候,我们的领导在当天晚上给我们来了个突击检查,要求我们每个人必须了解整个需求的交互流程,以及各个模块的具体实现,明天上班时开会检查成果。于是那天晚上我们十几个人就放下了手头的工作,开始研究这个需求的每个细节,每个模块的人互相介绍各自模块的实现逻辑,一直熬到了凌晨几点。第二天上午十点刚上班,就进到会议室,领导随机抽一个人来做需求的各个模块实现细节的讲解。

其实领导的想法是好的,让大家了解到其它模块的设计,能对项目需求有一个更充分的认识,在具体开发实现的时候也能考虑到更多的因素。但在大体量的业务部门,团队之间按照功能模块分组,系统也按照模块进行拆分,组内成员所做的开发内容其实已经固化了。因为开发同学只做了本组所对应模块的开发,本组的项目有问题你可以去找他,其它组的模块是怎么做的,他或许能了解个大概,但细节问题他没做过也不知道。这个时候再来需求,他也只想知道自己的模块该做什么,然后去把它做出来。

现在的产品功能这么多,各个系统也拆分出这么多的模块,多数开发一般也只关注自己模块以及上下游模块,要清楚的了解每个模块的细节还是很难的。当然了,也不能排查一些比较优秀的开发同学,他们会去了解其它模块的功能以及实现,对系统整体有个清晰的认识。这样的同学一般都是组长或者晋升组长的潜力股,但代价就是会花费更多的时间与精力。

回到问题2,对于参与某个模块开发的同学,让组长或者项目owner直接告诉他要改的内容,让他去改,这种方式效率会高很多。虽然这样会牺牲掉开发人员的主观能动性,但很多情况下都是采用的这种方式。不会单独安排时间让每个开发去熟悉整个项目的细节,直接安排具体工作,提升整体的效率。如果开发想要自我提升,想去了解其它模块,就得自己去花时间了。有的开发可能就去花时间研究了,有的就没有,于是开发人员之间的差距就慢慢拉开了。

那你说要不要让所有开发都去花时间做这样研究呢?我个人的看法是没必要的。因为这需要额外花费更多的时间,增加开发的成本。对于业务团队,开发人员的时间是宝贵的,对于大多数的开发,应该让他去做更多有价值的需求,产生更多的收益。谁想要做提升,那就得自己去花时间。这种情况下,也就不应该再要求每个开发同学去掌握其它模块,了解整体系统的原理了。

有关谈一谈我对协同开发的一些认识的更多相关文章

  1. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  2. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  3. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  4. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  5. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  6. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  7. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  8. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  9. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  10. ruby-on-rails - environment.rb 中设置的常量在开发模式中消失 - 2

    了解Rails缓存如何工作的人可以真正帮助我。这是嵌套在Rails::Initializer.runblock中的代码:config.after_initializedoSomeClass.const_set'SOME_CONST','SOME_VAL'end现在,如果我运行script/server并发出请求,一切都很好。然而,在我的Rails应用程序的第二个请求中,一切都因单元化常量错误而变得糟糕。在生产模式下,我可以成功发出第二个请求,这意味着常量仍然存在。我已通过将以上内容更改为以下内容来解决问题:config.after_initializedorequire'some_cl

随机推荐