软件工程

针对在系统开发生命周期中工作的专业人士,学者和学生的问答

3
在“经常提前发布”环境中进行单元测试有什么意义?
在过去的一年左右的时间里,我带动了我的团队朝着经常提前发布的开发模式发展(又名:快速应用程序开发,而不是敏捷)。有关关闭构建方式的更多信息,请在此处查看我的答案: 一种提高RAD环境中发布质量的简单方法 当我们采用RAD时,人们是非常独立的,他们首先进行单元测试。集成测试发生在过程的后期。对于他们来说,这是自然的过程,无需太多正式的强制措施。现在情况大不相同了: 整个平台与已建立的内部版本/发行版很好地集成在一起,可在客户端工作,没有任何热点。 新功能需求不断涌现,我们会逐步构建它们。 系统的整体动力非常重要,因为尽管独立的开发小组可能会正确地遵循流程,但由于复杂,非显而易见的情况而导致了重大故障。 系统的许多部分都涉及新算法和研究投入,因此并非总是可以正确地预见到挑战(以及测试机制),例如在定义明确的软件中进行功能测试。 最近,我试图获得更好的整体情况,以查看我们是否需要改进流程。当我和我的团队坐下时,他们中的许多人都拒绝了:“我们不再进行单元测试了!” 而其他人则认为我们不应该立即开始,因为它将永远无效。 单元测试在相对成熟的系统中有用吗?我们是否至少需要根据单元的成熟度来权衡测试范围?单元测试会减慢开发速度吗?是否需要以其他方式评估单元测试? 在经常提前发布的环境中测试成熟平台的最佳实践是什么?
10 unit-testing  rad 

5
培训新员工的更好方法[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 我目前所在的团队拥有相当高的营业额,成员通常移至同一公司的不同项目。当前,我们对新成员的“培训”是将他们与主要联系人(通常是完成培训的最新人员)配对,后者将为他们提供动手实践经验,并将询问更多的高级开发人员,如果新聘的员工向导师咨询不知道 它为新员工提供了快速参与的机会,并向指导者提出挑战,以提高他/她对系统的理解。 但是,正如您可以想象的那样,这种培训方式非常耗时,并且不能提供很好的知识传递(误解不断扩大,差距不断扩大)。 我的任务是为未来的新员工生成文档和培训材料。我已经偶尔进行过技术写作,但这是针对最终用户的,它具有很多截屏,非常具体,并且花费大量时间来完成。 为新员工创建新文档被认为是低优先级的,我目前只有大约40个小时的工作时间。以我目前编写技术文档的方式来记录系统,几乎不会在40小时内刮擦表面。特别是考虑到我不仅必须记录有关代码库的内容,还要记录有关部署和支持的内容。 如何快速编写文档以使新员工尽快更新,而又不花费大量时间编写文档? 附加信息: 目前,我们既有Wiki,也有一些培训文档,但是两者都很少。

3
自动从git更新版权日期范围?
在我撰写本文时,我们距2012年还有10天。我敢打赌,许多程序员正在将其源文件顶部的版权字符串编辑为: // Copyright 2008, 2010-2012 Some Company Unlimited 您的版本控制系统知道何时修改文件,因此可以肯定地它可以帮助写入或重写这些字符串。所以我的问题是:是否有一个脚本可以检查每个文件的git日志并输出(或更好地插入)像这样的字符串? 我正在使用git,所以这是主要的兴趣所在,但是请让我知道其他系统是否存在这样的脚本。 更新: 我们需要执行此操作的脚本: 遍历我们工作副本中的所有源文件 找到现有的版权字符串并确定年份,例如2007、2009-2011为{2007、2009、2010、2011} 对于未提及的每一年,请在1月1日至12月31日(如果是当年,则为今天)之间进行区分。检查差异并确定是否值得在版权字符串中提及 插入新的版权字符串。
10 git  copyright 

9
我应该将对象传递给构造函数,还是在类中实例化?
考虑以下两个示例: 将对象传递给构造函数 class ExampleA { private $config; public function __construct($config) { $this->config = $config; } } $config = new Config; $exampleA = new ExampleA($config); 实例化课程 class ExampleB { private $config; public function __construct() { $this->config = new Config; } } $exampleA = new ExampleA(); 处理将对象添加为属性的正确方法是哪种?我什么时候应该使用另一个?单元测试会影响我应该使用的内容吗?

2
通过示例学习Django [关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 5年前关闭。 这个问题的答案是社区的努力。编辑现有答案以改善此职位。它目前不接受新的答案或互动。 刚开始学习Android时,我发现Marakana制作了一系列精彩的YouTube 视频,逐步构建了Twitter克隆。它引导我完成了所有步骤,从而向我解释了基础知识,通用库,最佳实践,资源等。在构建实用应用程序时,隔着专家的肩膀对我来说绝对是最佳的学习方法。最重要的是,它为我提供了可以构建的骨架。从那里我可以继续研究并知道要问的问题。 我现在正在寻找与Django类似的东西。当然,我签出了官方教程和Django Book。前者可以发挥Django的某些功能,但不能浏览完整的应用程序。后者当然更好,但是它构建的应用程序是非常基础的,到了更高级的主题时,该教程就会分解,并返回到简短的代码段和类似文档的说明。 签出Amazon并不令人感到鼓舞。最新的通用Django书籍大约在两年半前发布,仅涵盖v1.0。公平地说,我知道这可能是因为在线文档非常出色,但是我仍在寻找一个演练。当我遇到《实用Django项目》时,我确实感到很兴奋,这听起来就像我在寻找什么。但是,有些评论声称存在一些严重问题-没有源代码,很多错误且没有勘误表,完全冷漠的作者和反应迟钝的发布者等。 因此,我留在第一广场,需要您的建议。是否有地方可以坐在巨人的肩膀上,从头到尾地完成一个现实的Django项目?最好使用框架的最新版本。
10 learning  django 

6
受益于在GPU上运行的通用算法示例?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 我正在寻找通用算法(与图形无关)的示例,这些算法已被证明在GPU上比在CPU上运行快一个数量级。我将使用这些示例来创造性地考虑可以在GPU上实现的其他算法。



6
如何验证/证明编程语言的正交性?
我知道正交性的概念,但是从编程语言的角度来看,有没有一种方法可以验证/证明它呢? 例如在C#中,可以使用public或static进行方法签名。您可以使用其中之一,也可以使用两者,并且它们不会互相干扰,因此它们彼此正交,对吗? 我的问题是,我该如何处理其余功能,尤其是互不相关的功能? 所有功能都必须共存/堆叠在一起吗? 是否有100%正交的编程语言?

3
寻找分布式锁定模式
我需要为C#中的分布式系统提出一个自定义的递归对象锁定机制\模式。本质上,我有一个多节点系统。每个节点对n个状态段具有独占写入权限。至少一个其他节点上的只读也可以使用相同的状态。一些写入/更新必须在所有节点上都是原子的,而其他更新最终将通过后台复制过程,队列等变得一致。 对于原子更新,我正在寻找一种模式或示例,这些模式或示例可以有效地使我将对象标记为写锁定,然后可以分发,提交,回滚等。由于系统具有高级别的并发性,因此我假设我需要能够堆叠锁,这些锁要么超时,要么在释放锁之后展开。 事务或消息传递不是这个问题的重点,但是我已经为一些额外的上下文提供了它们。话虽如此,请随意阐明您认为需要的消息。 尽管我对实现全新产品不愿接受任何新想法,但是这是我所设想的模糊示例 thing.AquireLock(LockLevel.Write); //Do work thing.ReleaseLock(); 我在考虑使用扩展方法,可能看起来像这样 public static void AquireLock(this IThing instance, TupleLockLevel lockLevel) { //TODO: Add aquisition wait, retry, recursion count, timeout support, etc... //TODO: Disallow read lock requests if the 'thing' is already write locked //TODO: Throw exception when aquisition fails instance.Lock = lockLevel; } …

4
与Scrum配对编程
我在一个使用Scrum的团队中,我们正在考虑添加结对编程,以帮助提高团队的跨职能技能,并通过“两个头脑比一个头脑好”的哲学来帮助减少缺陷。 在我们的团队中,每个团队成员通常在sprint计划期间签约一个完整的工作负载(“完整”是每周少于40个小时的数字,允许开会,协作等),并且只有一个专门的所有者负责每个任务。我相信这在Scrum团队中很常见,但不一定是本书所讲的。 特别是,我希望避免因团队成员有自己的任务而对团队成员感到犹豫的情况,如果团队只是自我组织而没有为配对留出时间,恐怕会发生这种情况。 鉴于此,在配对情况下考虑工作量/小时/故事点的最佳方法是什么,以确保我们为配对分配了适当的时间? 考虑的一些选项是: 允许两个人注册每个任务,并且(大约)将估计小时数加倍 仅“手动操作”团队成员注册每个任务,该任务基于该人的估计工作时间进行估计。团队中将支持配对的任何人都将在sprint中签署较少的任务,以留出时间来支持配对。

3
是否有正式的反模式来描述这种情况?
编写了一些代码来生成Excel电子表格(Office Interop)。 该代码的性能非常差。 子系统设计为在晚上生成文件。晚上不必担心性能。 创建一个函数以根据一组选定的参数从100个不同的可用文件中选择正确的文件。 由于存在物理文件,因此添加了归档系统来备份这些文件(没有理由存档。这些文件应即时生成)。 该系统不包含配置文件,而是具有硬编码的“服务器选择器”功能,该功能仅在运行代码的服务器上反映。 要支持和运行此服务,计划任务是必需的。 这归结为一个问题。原始代码的性能太差,无法在生产环境中运行。 解决了性能问题后,就不需要子系统和随后的归档系统,“文件选择器工厂功能”,硬编码故障点以及计划任务的维护及其增加的故障点。 如果您愿意,这是“级联失败”。最初的问题导致更多错误代码,更多错误解决方案和不必要的开销。是否有正式的反模式或通用术语来描述它?

3
观察者模式;知道*什么*改变了吗?
我创建了两个抽象类Subject和Observer,它们定义了经典的Observer模式接口。我从中派生出实现Observer模式的方法。观察者可能看起来像这样: void MyClass::Update(Subject *subject) { if(subject == myService_) { DoSomething(); } else if(subject == myOtherService_) { DoSomethingElse(); } } 很好,它告诉我谁更改了某些内容。但是,它没有告诉我发生了什么变化。有时这是可以的,因为我只是要查询主题以获取最新数据,但是其他时候我需要知道主题上发生了什么变化。我注意到在Java中,它们同时具有notifyObservers()方法和notifyObservers(Object arg)方法,以大概指定有关更改内容的详细信息。 就我而言,我需要知道是否有几个不同的动作中的一个发生在主体上,如果是特定动作,则需要知道与该动作相关的整数。 所以我的问题是: 传递通用参数的C ++方法是什么(就像Java一样)? 观察者甚至是最好的模式吗?也许某种事件系统? 更新 我找到了这篇文章,该文章讨论了如何对观察者模式进行模板化:使用模板实现主题/观察者模式。这让我想知道是否可以模板化参数。 我发现了这个关于模板参数模板化的堆栈溢出问题:基于模板的主题观察者模式-我应该使用static_cast还是dynamic_cast。但是,OP似乎有一个没有人回答的问题。 我可以做的另一件事是将Update方法更改为采用EventArg对象,如下所示: void MyClass::Update(Subject *subject, EventArg arg) { ... 然后为特定的参数数据创建EventArg的子类,然后将其投射回update方法中的特定子类。 更新2 还发现了一篇关于创建基于异步消息的c ++框架的文章;第2部分将具有主题讨论交流有关细节什么改变。 我现在正在认真考虑使用Boost.Signals。简单的时候使用我自己的观察者模式很有意义,但是模板化类型和参数开始变得复杂。我可能需要Boost.Signals2的线程安全性。 更新3 我还发现了一些关于观察者模式的有趣文章: 赫伯·萨特的观察家概论 在C ++中实现观察者模式-第1部分 实施观察者设计模式的经验(第2部分) 实施观察者设计模式的经验(第3部分) 但是,我已将实现切换为使用Boost.Signals,尽管出于我的目的可能有点blo肿,但它可以成功运行。可能有关膨胀或速度的任何问题都是无关紧要的。

5
敏捷,瀑布和需求变化
有没有人遇到过这样的问题,即定义为“敏捷”的项目因需求变更而超支?我正在进行一个开发项目,该项目在Sprint中运行了四个星期,但是这些Sprint之间总是存在变化。那么,它仍然被定义为敏捷吗?我觉得这有点像敏捷流程-敏捷流程的要求应在冲刺开始时定义,并在冲刺结束时进行审查。我说得对吗?请让我知道您的经历。

3
带有ORM的DDD业务逻辑应该去哪里?
我过去使用过MDA(模型驱动的体系结构)工具,我们通过UML进行建模,这会生成业务实体(我们的域模型)和ORM(映射等)。 该域上的许多业务代码和服务都是该模型的一部分,并且我们的存储库正在返回业务实体(因此,不可能切换到另一个ORM(不是我们想要的))。 但是,现在我正在开始一个项目,我想从DDD角度进行思考。 到目前为止,感觉好像我将业务逻辑放入域模型中,并通过存储库与ORM(无论选择哪种)一起使用。但是,如果我想继续在应用程序的ORM部分中使用MDA工具,则此处创建的模型将非常贫乏(即不包含任何业务逻辑)。同样,如果我将实体框架(.net)或NHibernate用于我的ORM,它也将是贫血模型。我不确定如果我刚刚使用NHibernate,您会将业务逻辑放在哪里。 我是否以这种方式正确思考,换句话说,使用DDD使用域中的所有业务逻辑,而仅使用ORM通过存储库进行持久化?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.