你的公司的软件开发究竟是什么样子的(方法论、工具等)?

22

自从我两年前开始做专业软件开发工作以来,我阅读了很多关于软件公司中通常接受的方法论(例如Scrum、XP)、技术(EJB、Spring)、技巧(TDD、代码审查)、工具(缺陷跟踪、维基)等方面的文章。

其中许多内容我们在公司并没有使用,我想知道为什么。我们是做错了吗,还是说这些文章中描述的并不是真实世界中的情况?这些文章更多的是学术性的吗?

因此,请告诉我你们公司的情况。谈谈与软件开发有关的一切。以下是我的一些建议(按照我的思路顺序列出)。请至少告诉我你是否在使用这些,或者简单评论一下:

  • 测试驱动开发
  • 领域驱动设计
  • 模型驱动设计/架构
  • 你们是否进行测试?
  • 单元测试
  • 集成测试
  • 验收测试
  • 代码审查
  • 创新技术(Spring、Hibernate、Wicket、JSF、WS、REST等)
  • 敏捷开发
  • 结对编程
  • UML
  • 领域特定语言
  • 需求规范(如何进行规范?)
  • 持续集成
  • 代码覆盖率工具
  • 贫血领域模型
  • 沟通(维基、邮件、即时消息、邮件列表、其他文档)
  • 工作量估计
  • 团队规模
  • 会议
  • 代码指标
  • 静态代码分析
  • 缺陷跟踪
  • ...

请注意:我想知道你们真正做了什么,而不是你们想做什么或认为应该做什么。


2
我其实不知道... 我只做老板让我做的事情 :) - THEn
1
这应该是CW,这个问题没有一个单一的答案。 - Pascal Thivent
23个回答

26
  • Test-Driven-Development - 绝对不会。
  • Domain-Driven-Design - 什么是设计
  • Model-Driven-Design/Architecture - 什么是设计?我们有一支架构团队。除了最初级的架构师,其他人在编程方面都很弱。他们擅长画带线的框框,还喜欢建立糟糕无用、过于泛化和完全无用的标准。(旧的OPC东西还行,但UA标准已经延迟了4年左右。)
  • Do you test? - 是的,我们有一个专门的测试团队。大约有1个测试人员对应10-12个开发人员。他们非常忙碌。问我我们是否测试得好。
  • Unit Testing - 完全由开发者自行决定。如果时间允许,我会这样做。
  • Integration Testing - 是的。考虑到我们正在开发和支持的产品套件,这是必要的。
  • Acceptance Testing - 是的,仅用于合同工作。
  • Code Reviews - 总是口头承诺,从不实际执行。
  • Innovative Technologies (Spring, Hibernate, Wicket, JSF, WS, REST, ...) - 强烈反对引入新依赖项。例如,我们永远不会采用Boost。虽然通常比前沿慢2年左右,但我们通常运行较新版本的.Net,并取得了一般好的运行结果。
  • Agile - 不。管理层声称希望实行“敏捷”,但他们根本不理解它是什么。最近,我们修改了流程,以便按优先级规划和实现更高优先级任务……(等待中)……管理告诉我,这是我们新的“敏捷”流程。但它仍然闻起来、走路和叫声都像瀑布一样。
  • Pair Programming - 绝对不!花费两个人的时间完成一个人的工作?下一步你将建议开发者浪费时间在无聊的设计代码审查上。狗,猫,生活在一起!
  • UML - 不。我们曾经获得过一个UML工具来帮助我们理解一个已经演变的遗留代码库。负责评估该工具的人喜欢它,它在不到30秒的时间内逆向工程了整个100万行以上的C++代码库!在他们被说服购买并实际开发人员尝试使用它后,我们发现它实际上只需要这30秒来无法解析95%以上的代码库。错误报告非常糟糕,评估者甚至还没想到它会失败。(我在看你,小子!)我们花了一年半的时间摆脱了这个工具的许可证。见证了敏捷!
  • Domain-specific languages - 它们可能在某些地方使用,但我没有使用过。
  • Requirement Specification (How?) - 产品经理进行一些巫术并发明它们。有时甚至可能与客户谈论它们!如果你足够幸运,他们甚至会理解用例和需求之间的区别。不过,不要指望太多。我们真的没有做用例。
  • Continuous Integration - 不。一切同时崩溃时会更加激动人心。
  • Code-Coverage Tools - 有人曾经在寒冷的服务器房间里为源代码库盖了一条毯子。算不算?
  • Anemic Domain Model - 说真的,我以前从没听过这个。
  • Communication (Wiki, Mail, IM, Mailinglists, other documents) - 备忘录。Lotus Notes根本不做“电子邮件”。一堆新潮的垃圾。
  • Effort estimates - 不是很多。在我的组织中,估计是目标的代名词。项目的截止日期在开发的五个“敏捷”阶段的第一阶段就被锁定了。那些截止日期被称为“大致估计”,但实际上意味着“交货日期”。
  • Team size - 基于产品而异。我们有人数只有四个、最高达十五个(如果包括经理)的团队。
  • Meetings - 如果你相对较年轻,只在一两个产品上工作,那么会议情况还不错。我只需要参加每周2-3次1小时的会议。
  • Code metrics - 没有。
  • Static code analysis - 理论上用于 .Net,因为FxCop是内置的,并且我们的标准强制使用它,但实际上没有。没有人检查它,因为从来没有任何代码审查。只有偶尔的质量审核(也称为纸质审核/责任审核),以确保我们不会失去今年的任何认证。
  • Bug tracking - 是的,但仅用于客户报告的问题。开发人员不允许针对他们正在开发的产品提交已发现的错误,因为那样不是“团队合作精神”。(当我犯了那个错误时,我的上司向我详细解释了这一点。我现在和一个愿意“发现”我的“意外”报告中可能提到的错误的特定客户友好相处。)
就大型公司的开发而言,有更糟糕的情况存在。考虑到我所在的地方缺乏高科技工作机会,能有一份工作已经很幸运了。但这并不意味着我必须喜欢现状。要试图影响一个既定的企业文化需要花费很长时间和持续的压力。
但是,如果他们对我试图改变企业文化的努力感到厌烦并解雇我,那么我想我不会在那个晚上哭自己入睡。

1
“我不认为那晚我会哭着入睡。” - 这似乎取决于你在庆祝派对上喝了多少龙舌兰酒。 - Steve Jessop
10
你好,我们可以一起工作吗? :) - Nick Stinemates
2
我的最爱:“看到了吗?敏捷!” xD - Arnis Lapsa
1
但后来我读到:"嗨,我们一起工作吗?:)"。 - Arnis Lapsa
1
谁想来参加我的庆祝派对? :D 我要喝龙舌兰酒。我刚刚得知组织将退出此地的软件开发,可能是因为(令人震惊!)我们无法从这里编写的软件中获利。 - Greg D
显示剩余9条评论

5
我认为著名的“大泥球”模式描述了许多工作环境,并为您提供了一些有关如何应对这种情况的好主意。

顺便说一句,我意识到我并没有直接回答你的问题,但是“大泥球”在许多开发情况下仍然占主导地位。你可以问关于测试驱动开发、缺陷跟踪等其他类型的问题,但如果从我所见的情况来看,我会说“大泥球”基本上是人们工作的事实标准——无论他们是否应该这样做。


2
大泥球 - (也许应该改名为“熵热死亡”?)令人悲哀的是,当人们一直为泥球做出贡献,而且认为没有任何问题时。 - Steve B.
我的大多数同事认为编写正确的代码根本不可能。我感觉更加理想化。 :) - Arnis Lapsa
1
是的,我也一样,一个大泥球,当然不包括我的代码 ;) - Andriy Volkov

2
  • 测试驱动开发(TDD):没有。最多只是在很小的范围内谈论过,但并未实践。
  • 领域驱动设计(DDD):没有。如果你正在开发一个技术框架,那么很难知道“领域”是什么。我对DDD的经验不足,不知道如何实现。
  • 模型驱动设计/架构:没有。
  • 你是否进行测试?是的,但还不够。每次发布时(我们试图每8周推出一次小版本),总会有超过2个服务版本。我们正在产品开发的第一年,所以我认为这还可以接受。
  • 单元测试:是的。覆盖率约为30%。大多数开发人员现在都知道他们应该为自己编写单元测试。每当他们不得不修复自己代码中的关键错误时,他们可以看到如果他们事先编写了一个简单的测试来防止错误,它将产生的好处。
  • 集成测试:是的,使用Selenium和WebDriver。
  • 性能测试:是的,从现在开始。目标是实现长期性能测量,并将其与发布进行比较。使用JMeter和专用性能测试服务器。
  • 验收测试:不是很多,但我们的产品也在内部使用,我们很快就会得到反馈。我把这看作是验收测试。
  • 代码审查:没有。有时候,别人会花30分钟看一下,但仅此而已。
  • 创新技术(Spring、Hibernate、Wicket、JSF、WS、REST等):从我的角度来看,这些技术已经不再“创新”了。它们现在基本上都是老派的了。除了JSF,它在几年前就消失了。过去几年我们一直在使用Spring+Hibernate,现在已经使用Wicket+WS两年了。我们用iBatis SqlMaps代替了Hibernate。
  • 敏捷开发:没有。
  • 配对编程:没有。
  • UML:有一点点,主要用于部署图。类图太细粒度了,经常与现实不同步。开发人员做他们认为最好的事情,而不是遵循UML图表告诉他们该做什么。
  • 领域特定语言:是的,我们正在使用自制业务规则技术。这是一种适合最终用户的可视化DSL。有点像使用Visio来模拟决策。
  • 需求规格说明(如何?):没有。
  • 持续集成:是的。基于Hudson和Maven。每次构建都运行单元测试。额外的夜间构建启用了更详细的报告。整个团队都会被通知构建失败的情况(是的,如果某些东西打破了链条,所有30个子模块都出现构建失败,例如当Maven仓库无法访问时,他们抱怨收到太多的邮件)
  • 代码覆盖率工具:是的。Maven/Cobertura和Sonar。
  • 贫血领域模型:不知道这应该

    注意:

    • Sonar是一个代码质量服务器,它结合了PMD、Findbugs、Checkstyle等工具。

2
  • 测试驱动开发:是
  • 领域驱动设计:是
  • 模型驱动设计/架构:是
  • 你是否进行测试?是
  • 单元测试 - 是
  • 集成测试 - 是
  • 验收测试 - 是
  • 代码审查 - 是
  • 创新技术 - 是
  • 敏捷 - 仅限敏捷
  • 结对编程 - 是
  • UML - 有时用于领域驱动设计的白板较量
  • 特定领域语言 - 是
  • 需求规范(如何?) - 以示例和验收测试的形式
  • 持续集成 - 是 - TeamCity
  • 代码覆盖率工具 - 是 - NCover
  • 贫血领域模型 - 不确定
  • 沟通(Wiki、邮件、即时通讯、邮件列表、其他文档) - wiki、邮件、MSN
  • 团队规模 - 根据项目而定,至少6人以上
  • 会议 - 每天早上9:30 - SCRUM
  • 代码指标 - 不确定
  • 静态代码分析 - 不确定
  • 缺陷跟踪 - Mantis

最重要的是...

  • 每个人都在5:30下班:

然而,工资相对较低,因为很多人都想在这家公司工作。不能拥有一切!


2
有趣的观察。所以,如果一家公司提供非常好的工作场所,他们可以在工资上节省钱 :-) - Kugel
@Kugel:绝对正确。我已经观察到这种情况不止一次了。 - Greg D

2
  • 测试驱动开发 - 差不多了。
  • 领域驱动设计 - 不是。
  • 模型驱动设计/架构 - 不是。
  • 你进行测试吗? - 是的。
  • 单元测试 - 是的。
  • 集成测试 - 是的。
  • 验收测试 - 不是。
  • 代码审查 - 不是。
  • 创新/新技术(Spring,Hibernate,Wicket,JSF,WS,REST等) - ASP.NET MVC?NHibernate?是的。
  • 敏捷开发 - 刚开始。
  • 配对编程 - 不是。
  • UML - 没有正式采用。
  • 特定领域语言 - 不是。
  • 需求规格说明(如何实现?) - 是的。捕获故事需求。
  • 持续集成 - 是的。TeamCity。
  • 代码覆盖率工具 - 是的。NCover。
  • 贫血领域模型 - 不是。
  • 沟通(Wiki,邮件,即时消息,邮件列表,其他文档) - 即时消息,电子邮件。
  • 工作量估计 - 1、2、4、8。
  • 团队规模 - 4。
  • 会议 - 每日站立会议。
  • 代码指标 - 不是。
  • 静态代码分析 - 不是。
  • 缺陷跟踪 - 现有的自定义工作。

我的部门还在不断进步中。过去几个月,我致力于推动持续改进。有些事情确实很难谈论。然而,回顾过去,它们已经得到了改善。


1

我是一家小型软件公司的两个程序员之一,老板们非常不懂技术(“什么是浏览器”——上周真的有人这样问)。

优点是我可以自己选择大部分的工作方式。

测试驱动开发(TDD)——我们的老板有过不好的经历或者别的什么事情。只要提到测试,她就像在表演创伤后应激障碍症一样。

领域驱动设计(DDD)——是的。

模型驱动设计/架构(MDA)——是的。

你们会测试吗?——不会。测试工作需要由销售和支持人员以及老板来做。所以一旦离开我的开发机器,几乎没有什么被测试过。

单元测试(Unit Testing)——如果我做了,可能会被解雇。而且这也是唯一会让我被解雇的东西。

集成测试(Integration Testing)——参见“你们会测试吗?”

验收测试(Acceptance Testing)——好吧,总得有一天把它部署出去吧?

代码审查(Code Reviews)——其他人都看不懂。我看过所有人的代码。但真希望我没看过。

创新技术(Spring,Hibernate,Wicket,JSF,WS,REST,...)- 是的。但我因此受到了批评。我是那个“孩子”,不知道任何在过去十年中没有发明的东西(尽管我已经30岁,并且在我的桌子上有“数据库系统阅读”)。

敏捷 - 我不瀑布流。但我也不真正敏捷。

配对编程 - 你不想试着与我们公司的另一个“程序员”交谈。

UML - 不。但我有时会在白板上画带有标识符的框。老板们喜欢这个。幸好他们不太懂技术,否则我可能会看到更多的框。

特定领域语言 - 不。

需求规格(如何?) - 不。

持续集成 - 不。

代码覆盖工具 - 不。

贫血领域模型 - 是的。尝试过。在大多数情况下,我不喜欢它并且不使用它。

沟通(Wiki,邮件,即时消息,邮件列表,其他文档) - 尝试过,但无法获得同事的支持。我们的MediaWiki安装仍然具有默认的徽标图形。

工作量估计 - 我们必须估计每个任务需要多长时间完成。这就是客户要付费的。而且这也是我们预期在项目上花费的时间。即使是在开发新应用程序和修复错误(是的,我们会向客户收费)以及添加功能等方面,我们也会这样做。

团队规模 - 1。让我说一下,这不是一个好的工作方式。能够实时与其他有能力的程序员交流想法要好得多。

会议 - 每周几个小时,有时会加倍,很少少于这个时间。我参加的一半会议是与客户会面的,另一半则完全是内部会议。

代码指标 - 没有。

静态代码分析 - 没有。

缺陷跟踪 - 没有像我应该做的那样多。


1

我在澳大利亚布里斯班的一家Ruby on Rails咨询公司工作。

  • 测试驱动开发:在我们的办公室里,这个非常重要。不进行测试被视为“极其愚蠢”。你写了代码,如何通过自动化流程(例如CI)确保它仍然有效?测试。

  • 你测试吗?:见第一点。

  • 单元测试:一直使用RSpec。我也熟练掌握Test::Unit和Shoulda。

  • 集成测试:同样,一直使用Cucumber。

  • 验收测试:对于我们的工作票,我们会附上验收标准。然后客户必须按照指示“接受”或“拒绝”它们。验收标准还有一个额外的好处,就是我们的Cucumber功能也是按照这些标准编写的。

  • 代码审查和配对编程:我们进行配对编程。这是即时版本的代码审查。这很棒,因为你可以坐下来看别人工作,他们编写测试,然后你编写代码使该测试通过。如果你生病了,那么另一个人知道你在做什么,并且可以与其他人配对。

  • 创新技术:因为我们使用Rails,我们非常喜欢REST。

  • 敏捷开发:我们使用Pivotal Tracker进行2周迭代。

  • 需求规格说明(如何?):使用Pivotal Tracker中的功能,客户可以指定他们的要求,然后我们将它们具体化(通常是通过与他们交谈),最终成为真实世界的功能。

  • 持续集成:我们使用我开发的CI服务器construct。这是建立在Integrity基础上的,但具有后台作业和更好的分支支持的想法。现在Integrity已经具备了后台构建功能,但我们仍然保持着分支支持的领先地位。

  • 代码覆盖工具:有时会使用RCov。我们并不太关心代码覆盖率,因为在编写代码之前我们会对所有内容进行测试。如果它存在,就有一些东西可以进行测试。

  • 沟通(Wiki、邮件、即时消息、邮件列表、其他文档):我们主要使用电子邮件与客户沟通,但我们也会使用Skype进行“站立会议”。我们也曾经使用Basecamp。我想在我们的下一个项目中使用Google Wave,只是作为一个小实验。我认为这会非常有帮助。

  • 团队规模:我们的团队有4个人,通常是2个配对,除非有人生病了。

  • 会议:我们每天早上都会进行“Scrum”/“站立会议”,持续约15分钟。这样做的目的是回顾前一天的工作、遇到的问题、今天要做什么以及你发现的“新鲜事物”。这不应该变成一个项目会议。如果需要,那些会议可以在站立会议之后进行。
  • 缺陷跟踪:同样,

1
  • 测试驱动开发 - 如果你指的是先写测试再写代码,不总是这样
  • 领域驱动设计 - 不是纯粹的DDD
  • 模型驱动设计/架构 - 永远不会,但真的永远不会再做了
  • 你测试吗? - 是的,总是
  • 单元测试 - 是的,总是
  • 集成测试 - 这取决于情况,但我们尽量避免它们,因为它们通常很慢
  • 验收测试 - 是的,最好自动化
  • 代码审查 - 是的,这包括在完成定义中
  • 创新技术(Spring、Hibernate、Wicket、JSF、WS、REST等) - 不确定所提到的技术是否创新,但是对于Spring、Hibernate和WS是肯定的
  • 敏捷 - 是的,这是我的DNA
  • 结对编程 - 不总是,但是是的(在新主题、与新团队成员、如果明确要求时)
  • UML - 有一点(例如白板上的类或序列图),只有在有帮助的情况下
  • 领域特定语言 - 目前没有真正使用
  • 需求规格说明(如何?) - 轻量级规格说明(例如用户故事)
  • 持续集成 - 当然(根据我们的完成定义,代码必须已经“集成”)
  • 代码覆盖率工具 - 是的(cobertura),这是在完成定义中的
  • 贫血领域模型 - 不是,我们尽量避免这种情况
  • 沟通(Wiki、邮件、即时消息、邮件列表、其他文档) - 面对面、wiki、即时消息、邮件、邮件列表(但我们尽量避免Word文档)
  • 工作量估计 - 是的,在产品待办事项级别上以故事点为单位,在迭代级别上以小时为单位
  • 团队规模 - 7+/-2
  • 会议 - 是的,但只有有用的会议,并且总是限时的(迭代计划、每日会议、演示和回顾)
  • 代码指标 - 是的(圈复杂度、代码覆盖率、编码标准收集在Sonar中)
  • 静态代码分析 - 是的(findbugs、checkstyle)
  • 缺陷跟踪 - 当然,但我们尽快修复发现的缺陷

1

我在南非的Chillisoft.co.za工作。

测试驱动开发:自从Kent Beck的第一本书以来,我们一直在使用测试驱动开发实践,并且这是强制性的。我们使用NUnit和R#作为测试运行器。

你做测试吗?:除了TDD之外,我们还进行手动测试(可视化),并在必要时进行自动化。用于自动化的技术取决于UI技术。

单元测试:参见TDD。

集成测试:是的,但我们尚未广泛使用。

验收测试:我们为外部客户定制软件开发,只有在他们接受后才会付款,因此是的。

代码审查:每个项目定期进行双月代码审查,即使是那些已经进行了配对/同行编程的项目也是如此。

配对编程:我们大部分的编码都是成对进行的,但在某些任务和项目阶段中,这种方式效率会降低。因此,在项目启动阶段(每个阶段的前几周)我们会进行配对编程。在完成阶段,我们则不再采用这种方式。此外,我们还有特定的时间(每位开发人员每周8小时)用于开源项目,这些项目都是成对编程的。我们所有的机器都设置了多个键盘和鼠标,以便于开发人员之间的顺畅交互。 创新技术:我们在Habanero上做了大量的工作,并使用了该框架以及DI容器Unity和RhinoMocks。 敏捷开发:我们已经使用敏捷哲学8年了,并且在继续沿着这条道路前进时,我们仍在尝试各种工具和哲学。 需求规格说明(如何实现?):我们在MSWord中捕获下一次迭代的用户故事(用例)。然后我们在Jeera中捕获这些故事的摘要,包括工作量估计等,这可以管理绘制下降图等。 持续集成:我们目前正在使用Hudson,它可以在SVN之上工作。

代码覆盖率工具:我们每晚都会运行代码覆盖率作为项目的一部分。我们已将生成的报告集成到Hudson报告中,以便我们可以每天跟踪每个项目。

沟通(Wiki、邮件、即时消息、邮件列表、其他文档):显然,我们以许多不同的方式进行沟通,我们有一个内部Wiki等。

团队规模:我们有15名软件开发人员。

会议:我们每天早上都有一个大约持续10分钟的“Scrum”会议。

缺陷跟踪:我们使用不同的系统进行内部缺陷跟踪(即在开发和内部测试期间)和外部缺陷跟踪,即来自客户的缺陷。在内部跟踪(即在内部测试和开发期间),我们使用Redmine。在外部跟踪(即针对我们的客户),我们使用Mantis。


1
  • 测试驱动开发 - 否
  • 领域驱动设计 - 否
  • 模型驱动设计/架构 - 否
  • 你进行测试吗? - 几乎从不
  • 单元测试 - 几乎从不
  • 集成测试 - 否
  • 验收测试 - 否
  • 代码审查 - 否
  • 创新技术(Spring、Hibernate、Wicket、JSF、WS、REST等) - Spring、Hibernate、Wicket
  • 敏捷 - 否
  • 结对编程 - 否
  • UML - 只是草图
  • 特定领域语言 - 否
  • 需求规格说明(如何?) - 我们得到了一个庞大的客户需求规格说明,并使用思维导图提取实际功能,然后进行估算
  • 持续集成 - 否
  • 代码覆盖工具 - 否
  • 贫血领域模型 - 是
  • 通信(Wiki、邮件、即时消息、邮件列表、其他文档) - 思维导图、邮件
  • 工作量估计 - FITA(凭感觉估算,请参阅此处
  • 团队规模 - 2-6
  • 会议 - 每周2-3次
  • 代码指标 - 否
  • 静态代码分析 - 否(尝试了FindBugs和Checkstyle)
  • 缺陷跟踪 - 是,使用Bugzilla

2
嘿,你必须和我一起工作...否则,在紧迫的截止日期和资金压力下,方法论无法支撑。 - nportelli
请注意,方法论“不支持”的情况与从未尝试过的情况是有区别的。例如,大多数地方至少进行了一些测试,因此如果您没有进行任何测试,我不确定您是否可以将其归咎于测试是一种毫无价值的方法论... - Steve Jessop
这里几乎一样...猜猜我们的软件计算了数十亿,而且实际上没有任何错误(至少没有被最终用户测试人员发现)...无论如何,请注意以下短语:“不可能这个狗屎会起作用”的出现,来自http://www.youtube.com/watch?v=Pug_5Tl2UxQ。 - Yordan Georgiev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接