软件工程

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

1
Django中的单元测试
我真的很难为一个大型Django项目编写有效的单元测试。我具有相当好的测试覆盖范围,但是我已经意识到,我一直在编写的测试绝对是集成/验收测试,而不是单元测试,而且我的应用程序中有关键部分没有得到有效测试。我想尽快解决此问题。 这是我的问题。我的模式是深层的关系,并且非常注重时间,这给我的模型对象带来了很高的内部耦合和很多状态。我的许多模型方法都是基于时间间隔进行查询的,而在带有auto_now_add时间戳的字段中,我有很多事情要做。因此,以如下所示的方法为例: def summary(self, startTime=None, endTime=None): # ... logic to assign a proper start and end time # if none was provided, probably using datetime.now() objects = self.related_model_set.manager_method.filter(...) return sum(object.key_method(startTime, endTime) for object in objects) 一种方法如何测试这样的东西? 这是我到目前为止的位置。在我看来,应该对单元测试目标的参数进行一些模拟行为by key_method,是否summary正确地过滤/聚合以产生正确的结果? 模拟datetime.now()很简单,但是我如何模拟其余的行为呢? 我可以使用固定装置,但是我听说过使用固定装置构建数据的利弊(可维护性差是我的主意)。 我也可以通过ORM设置数据,但这可能是有局限性的,因为那时我还必须创建相关的对象。而且ORM不允许您auto_now_add手动处理字段。 模拟ORM是另一种选择,但是模拟深度嵌套的ORM方法不仅棘手,而且ORM代码中的逻辑也从测试中被模拟出来,而模拟似乎使测试真正依赖于内部和内部依赖。被测功能。 最难破解的螺母似乎是这样的功能,它们位于几层模型和较低级别的功能上,并且非常依赖于时间,即使这些功能可能并不十分复杂。我的总体问题是,无论我如何看待它,我的测试看起来都比它们要测试的功能复杂得多。

3
受聘期间开始咨询-利益冲突[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 4年前关闭。 首先,我不寻求法律意见。这有点TL; DR,但我在底部有一个摘要,我在解释这一切,以便人们可以提供有见地的建议。 情况 我需要解释我的现状,以解释为什么我决定走自己的路线。由于当地经济不景气,最近有人要求我找到另一份工作。我没有被解雇,但原因是我现在的雇主不再有能力负担我的全职工作。 我找了一段时间的工作,但周围的工作很少,尤其是对于我所处的水平,我不想再找一份我不会发现挑战或享受的工作。 我目前的职位是让我担任架构师和软件经理。绝大多数工作是内部工作,但我为雇主做一些外部咨询。 我的决定 我决定独自出任顾问/承包商。我已经安排了相当多的工作。但是,当我建立自己的企业时,我需要赚钱养家。最终的结果是使某些产品货币化,但是产品开发需要时间。 问题 我目前的雇主为我提供了兼职工作。它们主要是零售业务,尽管由于我的工作已经广泛地进入了网络工作(主要是基于CMS的站点),而在较小程度上,我是编程的。这是在咨询的基础上进行的,内部项目。还有一个非常庞大的IT支持业务。尽管非常重视(基本)Web开发,但是软件开发在很大程度上是辅助的。如果我离开的话,软件开发在很大程度上将停止。 利益冲突 如果我担任兼职角色,则需要写一份有关利益冲突的合同。我将见律师寻求法律建议,但是我需要知道允许自己做什么。 TL; DR 作为顾问和一家兼职软件公司,我可以考虑在合同中定义以下领域以允许自己进行操作: 当我为他们工作时,我会被他们雇用,并且不会公开或透露我自己的业务详细信息 在工作以外,我不会追求他们的客户提供服务 当我没有被他们雇用时,他们将不会拥有我生产的任何东西的任何权利 如果现有客户通过自己的研究来接近我,那将是公平的游戏 如果他们有客户要离开,那么我有权为他们工作,或者接近他们或者让他们接近我 您能想到我错过的其他方面与我的律师联系吗? 我想让自己的事业发展壮大并保护自己。 恰当的例子-他们的一位客户告诉我,他们要我做他们的工作,而这是不请自来的。

1
释放现有项目的完整重写的正确礼节是什么?
我是开源世界的新手。我正在从事的项目位于Github上。(仅供参考)我正在处理的项目是Plex Media Server的插件。我计划将插件提交给Plex,以便将其包含在他们的“应用程序商店”中。现在我的问题。 刚开始时,我发现了一个较旧的半废弃插件,可以满足我的要求,但效果不佳。我首先为该回购做贡献。我立即被选为拥有该回购协议全部权利的协作者,因为当前所有者说他太忙了,无法再使用它了。但是,当我开始更深入地研究代码时,我意识到它是徒劳的。现有的代码库很糟糕,没有有效的方法来修复它。我最终只是从头开始。我在新插件中使用的唯一代码是我最初提交的代码。 现在该项目已准备好发布。但是,我不确定如何执行此操作。我看到的选择如下: 创建一个新的仓库,而忽略现有仓库。我不确定我是否应该提到以前的仓库和它的贡献者。我没有使用任何代码/资源,而是创建了一个全新的代码库。尽管该插件执行的功能与旧的相同,但它以全新的方式和更有效的方式进行了操作。 我分叉现有的存储库,删除现有的代码,然后提交新代码。我真的是Git的新手,所以我不确定这是否可行。 我将对现有回购的更改提交给我,看看当前的贡献者怎么说。 在这三个选项中,我强烈倾向于第一个。但!我是开源的新手,我想确保自己按照正确的礼节做事。我不想让我的第一个项目浮出水面,成为一场灾难。选项2听起来不错,但是我不确定是否应该这样做。我不确定历史记录和差异会如何工作。我们最多只谈论500-1000行代码。因此,这不是一个庞大的代码库。 感谢您提供的任何输入!

2
“可能”和“不太可能”宏的使用量太多了?
通常称为likely和的unlikely宏可帮助编译器了解if通常是要输入还是要跳过的。使用它可以带来一些(而不是很小的)性能改进。 我最近开始使用它们,我不确定应该多久使用一次此类提示。我目前将其与错误检查ifs 配合使用,通常将其标记为unlikely。例如: mem = malloc(size); if (unlikely(mem == NULL)) goto exit_no_mem; 看起来还可以,但是错误检查if经常发生,因此使用了所述宏。 我的问题是,是不是太有likely和unlikely宏的每个错误的检查if? 当我们在这里时,他们经常在其他什么地方使用? 在我当前的用法中,它位于从实时子系统进行抽象的库中,因此程序可以在RTAI,QNX和其他程序之间移植。也就是说,大多数功能都很小,可以直接调用一个或两个其他功能。许多甚至是static inline功能。 因此,首先,它不是我可以描述的应用程序。“识别瓶颈”是没有意义的,因为它是一个库,而不是一个独立的应用程序。 其次,有点像“我知道这不太可能,我不妨告诉编译器”。我没有积极尝试优化if。

2
“撤消打字”应该如何表现?
我正在实现一个包含撤消/重做堆栈的Java应用程序。我注意到有些应用程序(例如Mac OS X上的TextEdit)允许您在键入一些文本后从“编辑”菜单中选择“撤消键入”。我也想在我的应用程序中实现这种功能,但是我很难找到有关其行为方式的准则。 经过反复试验,关于TextEdit的“撤消键入”行为的最佳猜测是: 当用户键入一个新字符(或键入删除键)时,如果一个字符位于“撤消”堆栈的顶部,则将其合并到上一个“撤消键入”项中,除非发生以下情况之一 用户至少闲置15秒后继续输入内容,请务必创建新的“撤消键入”项目 用户长时间输入并满足某些条件后,请务必创建一个新的“撤消键入”项目(无法确定这是基于时间还是基于字符计数)。 选择任何文本然后删除或覆盖文本时,始终创建一个新的“撤消键入”项目(选择文本,不进行更改,然后返回到原始插入点并继续键入不会触发此操作) 在实践中,Apple的策略似乎行得通(至少在我键入时对我有效),但是正如最后一点所指出的那样,我实际上还无法弄清楚规则。另外,似乎其他程序遵循不同的规则,例如Microsoft Word。Google尚未为任何“撤消键入”实施提供明确的规则列表,而且我还没有遇到任何应如何操作的最佳实践。那么它应该如何表现呢?还是仅仅取决于程序员的想法? 编辑:只是为了澄清,我现在对实现细节不感兴趣。对于是否存在权威的参考文献(例如最佳实践或用户界面文档)进行描述或对如何在多种产品中实现的描述,我尤其感到好奇。

4
是否有创建文件格式的正确方法?
我正在为使用C#.NET编写的应用程序构建专有文件格式,以存储保存的信息,甚至可能存储项目资源。是否有关于如何执行此操作的标准?我只是将Serialize对象变成二进制文件,然后创建一个标头,该标头将告诉我如何解析文件。这是一个不好的方法吗?

2
函数式反应式编程-Fay的表达能力够吗?
因此,我正在做一个相当参与的javascript / html客户端,其中包含许多ajax调用和其他涉及回调机制的事情。我很高兴为此目的使用Fay。我知道榆树。尝试了一下,喜欢FRP元素。现在,我想知道在Fay中是否可能有类似的结构。 此时,Fay中是否有FRP的具体示例? 一些相关技术: 箭,JavaScript中的箭状玻璃钢 FlapJax,另一个javascript替代方案 Bacon.js,javascript中的FRP 一种可能的解决方案,使用培根。带演示。

3
LINQ适用于哪些问题域?
每次我在C#的Stack Overflow上看到一个问题时,都会看到至少一个或两个答案可以解决LINQ问题。通常,声誉很高的人似乎像专家一样使用LINQ。 所以我的问题是,LINQ应该用于哪个问题域? 还要注意:是否有避免使用的目的?数据集的大小是否会影响LINQ查询的性能?

6
与实施系统本身相比,我们花费更多的时间来执行功能测试,这是否正常?
基本上,我们有三个主要项目,其中两个是Web服务,另一个是Web应用程序。尽管我对使用功能测试覆盖尽可能多的Web服务感到满意(所有三个项目都有其适当的单元测试),但针对Web应用程序的功能测试却需要花费大量开发人员的时间来实现。我所说的很多意思是实现包含单元测试的功能所花费的时间是两倍,有时甚至更多。 经理的政策是测试我们添加的每个功能,即使对业务不重要(即新的CRUD)也是如此。 我确实同意测试所有Web服务功能,因为很难对其进行手动测试,而且此测试运行速度很快,并且不需要太多的实现。 那么,花更多的时间编写功能测试,而不是编写系统代码,单元测试和修复QA标签,有什么价值?这正常吗?我们不应该只为关键功能编写功能测试,而让质量检查人员在没有关键功能的情况下进行回归测试吗? 注意:我们不是在开发医疗软件或NASA软件,或没有那么重要的工具。

4
如何避免在单独项目中出现特征蠕变?
因此,我有一个程序要追溯到2011年,直到2012年为止,但最后一个版本是2011年12 月。我一直在积极地研究它,但是特征蠕变吸引了它丑陋的头,现在它充满了许多未完成的特征。 不好的部分是,随着我实现一项功能,一个新的功能应运而生。为了避免将来出现功能蠕变,我该怎么做,以便实际上可以在一年内发布它? 该项目基于iOS,过去每个iOS版本更新都有发行版本,但最后一个版本是5.1(2011)。我希望能够恢复到稳定的发布周期,但是事实证明这太困难了。

10
如何在不使用可变变量的情况下编写有用的Java程序
我正在阅读一篇有关函数式编程的文章,作者在其中指出 (take 25 (squares-of (integers))) 请注意,它没有变量。实际上,它只具有三个功能和一个常数。尝试在Java中写整数平方而不使用变量。哦,也许有一种方法可以做到,但是它当然是不自然的,而且读起来也不如我上面的程序那么好。 用Java可以实现吗?假设您需要打印前15个整数的平方,是否可以在不使用变量的情况下编写for或while循环? Mod通知 这个问题不是代码高尔夫球比赛。我们正在寻找可以解释所涉及概念的答案(理想情况下,无需重复先前的答案),而不仅是针对另一段代码。

5
如何将ASCII字符串压缩为更少的字节?
我正在使用具有唯一协议的嵌入式设备,该协议会将消息发送到其他设备,并且正在开发一个应用程序来解析发送的数据包。每个数据包携带8个字节。协议定义为第一个字节为标头,其余7个字节为数据。 他们正在尝试传递特定的ID字符串,但ID字符串的长度为8个字符(ASCII),因此它不能容纳7个字节。 我的同事告诉我的是,他们将把原始字符串的8个ascii字节转换为整数(十进制),并向我发送4个字节。他们告诉我,我应该能够从4个字节中获取原始字符串。在这方面,我很难缠头。 因此,如果您有一个像“ IO123456”这样的ID字符串,那么它就是ASCII中的0x49 0x4f 0x31 0x32 0x33 0x34 0x35 0x36 ?我错过了什么吗?还是我的同事误会了?我知道这是一个非常棘手的问题,但对我而言,这没有任何意义。
12 strings  ascii  byte 

2
在RESTful API中实现命令模式
我正在设计HTTP API,希望使其尽可能地具有RESTful风格。 有些动作的功能会散布在一些资源上,有时需要撤消。 我以为自己,这听起来像是命令模式,但是我如何将其建模为资源呢? 我将介绍一个名为XXAction的新资源,例如DepositAction,它将通过这样的方式创建 POST /card/{card-id}/account/{account-id}/Deposit AmountToDeposit=100, different parameters... 这实际上将创建一个新的DepositAction并激活它的Do / Execute方法。在这种情况下,返回201 Created HTTP状态表示操作已成功执行。 之后,如果客户希望查看操作细节,则可以 GET /action/{action-id} 我猜应该阻止Update / PUT,因为此处不相关。 为了撤消操作,我想到了使用 DELETE /action/{action-id} 实际上将调用相关对象的Undo方法,并更改其状态。 假设我只对一次“撤消”感到满意,而无需重做。 这种方法可以吗? 有什么陷阱,不使用它的原因吗? 从客户的观点看是否明白?

3
应该通过自动UI测试来测试哪些功能?
最近,我们有一位顾问告诉我们,如果某个功能只能通过自动UI测试(例如Selenium,编码UI)进行测试,则存在基础架构问题。虽然这种说法可能有点极端,但它与测试金字塔的思路相同,因为UI测试应占整个自动化测试套件的一小部分。 那么,哪些类型的功能应该进行自动UI测试?具有令人信服的体系结构的系统是否仍具有只能通过UI测试才能验证的功能,或者这些测试应仅用作一组单元和服务测试的“备份”?

1
在Java 8中删除功能类型的原因
我一直试图理解为什么JDK 8 Lambda专家组(EG)决定不在Java编程语言中包括新的函数类型。 在邮件列表中,我找到了一个讨论删除函数类型的话题。 许多语句对我来说是模棱两可的,这可能是由于缺乏上下文,在某些情况下,是因为我对类型系统的实现了解有限。 但是,我相信我可以安全地在此站点中提出几个问题,以帮助我更好地理解它们的含义。 我知道我可以在邮件列表中提出问题,但是该线程很旧,并且所有决策都已制定,因此我很可能会被忽略,尤其是看到这些人已经推迟了他们的计划。 在支持删除功能类型并支持使用SAM类型的回答中,Brian Goetz说: 没有修复。关于修正函数类型的实用性有很长的篇幅。如果不进行具体化,函数类型将受到阻碍。 我找不到他提到的话题。现在,我可以理解,结构函数类型的引入可能暗示着Java(通常是名义上的类型)系统中的某些复杂性,我无法理解的是参数化SAM类型在具体化方面有何不同。 难道他们都没有受到相同的修复问题吗?有谁知道功能类型在参数化方面与参数化SAM类型有何不同? 格茨在另一条评论中说: 有两种基本的键入方法:标称方法和结构方法。名词的标识基于其名称;结构类型的标识基于其组成(例如“ int,int的元组”或“ int到float的函数”。)大多数语言大多选择名词性或结构性;除了“边缘”外,没有多少语言能够成功地混合名义和结构类型。Java几乎完全是名义上的(有一些例外:数组是结构型的,但是在底部总是有名义上的元素类型;泛型也有名义上的和结构上的混合,实际上这是许多源代码的一部分)人们对泛型的抱怨。)将结构类型系统(函数类型)嫁接到Java上 标称类型的系统意味着新的复杂性和边缘情况。函数类型的好处值得吗? 那些拥有实施类型系统经验的人。您知道他在这里提到的这些复杂性或极端情况的任何例子吗? 老实说,当我认为像Scala这样完全基于JVM的编程语言支持结构类型(如函数和元组)时,即使存在底层平台的验证问题,我也对这些指控感到困惑。 不要误会我的意思,我并不是说功能类型应该比SAM类型更好。我只想了解他们为什么做出这个决定。

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.