软件工程

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

13
我们如何使单元测试快速运行?
在项目中,我们已经进行了将近一千次测试,并且人们花了很长时间才停止在进行检入之前运行它们的麻烦。充其量,他们运行与所更改代码段相关的测试,而最糟糕的是,它们仅在未经测试的情况下检入。 我认为这个问题是由于以下事实导致的:解决方案已增长到120个项目(我们通常会做很多较小的项目,这只是我们第二次正确进行TDD),并且构建+测试时间已增长到大约两三分钟在较小的机器上。 我们如何减少测试的运行时间?有技巧吗?假装更多?少假装?也许在运行所有测试时不应该自动运行较大的集成测试? 编辑:作为对几个答案的回应,我们已经使用CI和构建服务器,这就是我知道测试失败的方式。问题(实际上是一种症状)是我们不断收到有关构建失败的消息。大多数人会执行部分测试,但并非全部。关于测试,它们实际上做得很好,对所有东西都使用伪造品,根本没有IO。
40 c#  unit-testing  tdd  nunit 

7
您何时更改主要/次要/补丁程序版本号?
可能重复: 您使用什么“版本命名约定”? 您是在发布前还是发布后立即更改主要/次要/补丁版本号? 示例:您刚刚向世界发布了1.0.0(真是!)。但是,等等,不要庆祝太多。1.1.0将在六周内发布!因此,您可以修复错误并重新构建。那叫什么建筑?1.1.0.0或1.0.0.xxxy(其中xxxy是1.0.0的内部版本号递增)? 请记住,您可能有100个要加入1.1.0的功能和错误。所以最好将其命名为1.0.0.xxxy,因为您距离1.1.0还差得远。但另一方面,另一个开发人员可能正在开发2.0.0,在这种情况下,您的构建可能会更好地命名为1.1.0.0和他的2.0.0.0,而不是分别是1.0.0.xxxy和1.0.0.xxxz。
40 versioning 

9
在变量作用域(全局是全局的)之前,程序员做了什么?
因此,我不得不处理看似古老的语言(称为PowerOn),在这里我有一个主要方法,一些用变量定义变量的数据类型,并且具有不返回类型的子过程(本质上是无效方法)的能力也不接受任何争论。 这里的问题是,一切都是全球性的。 我已经读过这些类型的语言,但是大多数书都带有这样的方式:“好吧,我们过去常常用马和马来骑,但是现在,这是一辆汽车,所以让我们学习如何使用THAT!” 那些日子,我们将永远不会重生。”我必须承认,思想正在努力思考范围和范围之外的问题。 好吧,我在这里。我试图弄清楚如何最好地管理几种开放方法中的全局变量。是的,即使是for循环的迭代器也必须全局定义,我发现自己在代码的不同部分进行了回收。 我的问题:对于那些有这种类型经验的人,程序员如何在全球竞争环境中处理大量变量? 我感觉这只是一个心理杂耍技巧,但是我想知道是否有任何已知的方法。
40 scope 

3
使用Python的“ PEP-302新导入挂钩”的经验[关闭]
我是Ruby(CRuby)的开发人员之一。我们正在开发Ruby 2.0版本(计划于2012年2月发布)。 Python具有“ PEP302:新导入挂钩”(2003年): 该PEP建议添加一组新的导入挂钩,以更好地自定义Python导入机制。与当前的导入钩子相反,可以将一种新型的钩子注入到现有方案中,从而可以对如何找到模块以及如何加载模块进行更精细的控制。 我们正在考虑将类似于PEP302的功能引入Ruby 2.0(CRuby 2.0)。我想提出一个可以说服Matz的建议。当前,CRuby只能以标准方式从文件系统加载脚本。 如果您对PEP 302有任何经验或考虑,请分享。 例: 这是一个很棒的规格。无需更改。 差不多不错,但是有这个问题... 如果我可以回到2003年,那么我会将规范更改为...


1
在GitHub上没有请求的情况下从派生的仓库中提取更改?
我是社交编码社区的新手,不知道在这种情况下如何正确进行: 我几周前创建了一个GitHub Repository。有人分叉了该项目,并做了一些我要做的小改动。我很高兴有人分叉我的项目并花时间将其添加到项目中。我想将所做的更改放入我自己的代码中,但有两个问题。 1)我不知道如何通过git从派生的仓库中获取更改。 我的理解是,有一种简单的方法可以通过请求请求合并更改,但似乎分叉者必须发出该请求? 2)在没有拉取请求的情况下拉入更改是否可以接受?这与第一个有关。我将代码搁置了几个星期,然后回来发现我接下来要进行的工作是由其他人完成的,并且不想只复制他们的代码而不给他们以某种方式的认可。即使没有明确要求您进行变更,也不应存在吗?这是什么礼节 我可能会对此有所考虑,但在此先感谢您的投入。我对黑客社区还很陌生,但是我想尽我所能!
40 git  github  etiquette 

6
没有许可证的开放源代码……我可以分叉吗?
几年前,有人创造了很多很棒的脚本。但是它们没有更新很长时间,现在不再需要工作(目标平台已更新,需要一些更改)。 他尚未获得任何许可证的释放。我想修复该错误(当前,许多目标用户无法使用它),并将其发布在GitHub上,最好是在公共领域风格的OSS许可下发布。我想知道法律后果是什么? 我已经发送了一封电子邮件给作者,但是(假设)他没有回复我的电子邮件。 在以下两种情况下,我们应该做什么: 如果脚本发布在私人网站上(没有任何源代码控制)。 如果脚本发布在GitHub上(没有任何许可提示)。 但是,可以清楚地看到,它似乎是开源的,意在使用/修改/以任何方式使用。

4
REST-通过Accept标头与扩展进行内容协商之间的权衡
我正在设计一个RESTful API。我们知道我们想为任何给定资源返回JSON和XML。我一直在想我们会做这样的事情: GET /api/something?param1=value1 Accept: application/xml (or application/json) 但是,有人为此使用扩展名,就像这样: GET /api/something.xml?parm1=value1 (or /api/something.json?param1=value1) 这些方法的权衡是什么?未指定扩展名时最好依靠accept标头,但在指定扩展名时依靠荣誉标头吗?这种方法有缺点吗?

8
现代的OO语言可以与C ++的数组存储性能竞争吗?
我只是注意到,我至少有点熟悉的每种现代OO编程语言(基本上只是Java,C#和D)都允许协变量数组。也就是说,字符串数组是对象数组: Object[] arr = new String[2]; // Java, C# and D allow this 协变量数组是静态类型系统中的一个漏洞。它们使得可能在编译时无法检测到的类型错误,因此必须在运行时检查对数组的每次写入: arr[0] = "hello"; // ok arr[1] = new Object(); // ArrayStoreException 如果我进行大量阵列存储,这似乎会降低性能。 C ++没有协变数组,因此不需要进行此类运行时检查,这意味着不会降低性能。 是否进行了任何分析以减少必要的运行时检查次数?例如,如果我说: arr[1] = arr[0]; 有人会说这家商店不可能倒闭。我敢肯定,我还没有想到其他很多可能的优化方法。 现代编译器实际上是在进行这类优化吗?还是我不得不忍受这样一个事实,例如Quicksort总是执行O(n log n)不必要的运行时检查? 现代的OO语言是否可以避免因支持协变量数组而产生的开销?
40 c#  java  c++  d 

9
如果“以身作则”无效,该怎么办?[关闭]
我已经在一家大公司(拥有8000多名员工)工作了将近2年,而在我完成学习课程后才被录用。 这里的每个人都必须每天处理遗留代码,这些遗留代码通常设计得很糟糕并且充满了骇客。首先,我保持低调,尽量不要批评太多。但是,从目前的情况来看,这种情况已经变得很难适应,而且似乎没有人愿意改进/替换我们使用的工具。 更明确地说,我们有: 过时的源代码控制工具(Visual SourceSafe) 普通的旧makefile,仅支持完全重建 .def 所有现有体系结构必须手动维护的文件 整体头文件和包含很少文件的项目(但每个头文件都有大约3000行代码,有时需要处理非常不同的任务) 不使用“新”语言工具(std::string不是新语言,但除我以外没有人使用它) 几个月前,我决定通过设计一个新的编译环境来对此做一些事情。我可以使增量构建可靠地工作,更快的编译时间,更好的结构化项目,自动.def文件生成。我什至还创建了一个从Git到Visual SourceSafe的桥梁。 我向几位同事和我们的老板展示了我的成就,但没人关心。他们都像“嗯...人们现在已经习惯那样做了。我们为什么要改变事情?” 我建议的更改是为了使我们能够从旧系统到新系统的一个软过渡而设计的。每个改进都可以单独安全地应用。 我什至试图让我的一些同事参与到变更中。但是到目前为止,还没有成功。 您是否已经遇到过类似情况?如果“以身作则”无效,该怎么办?

9
为什么在大多数现代编程语言中对合同设计的支持如此有限?
我最近发现了按合同设计(DbC),发现这是一种非常有趣的编写代码的方式。除其他外,它似乎提供: 更好的文档。由于合同是文件,因此不可能过时。此外,由于合同明确规定了例程的功能,因此有助于支持重用。 更简单的调试。由于程序在合同失效时立即停止执行,因此错误不会传播,并且可能会突出显示违反的特定断言。这在开发和维护期间提供了支持。 更好的静态分析。DbC基本上只是Hoare逻辑的一种实现,应该应用相同的原理。 相比之下,成本似乎很小: 额外的手指打字。由于必须明确说明合同。 进行一些培训以使自己习惯于写合同。 现在,首先熟悉Python,我意识到实际上可以编写前提条件(只针对不适当的输入抛出异常),甚至可以使用断言再次测试某些条件。但是,如果没有一些最终被认为不是Python风格的额外魔术,就不可能模拟“旧”或“结果”之类的某些功能。(此外,有一些库提供支持,但最终我感觉使用它们是错误的,因为大多数开发人员没有这样做。)我假设所有其他语言都存在类似的问题(当然,除外) ,埃菲尔)。 我的直觉告诉我,缺乏支持一定是由于某种拒绝做法的结果,但是在线搜索并没有取得丰硕的成果。我想知道是否有人可以弄清楚为什么大多数现代语言似乎提供的支持很少?DbC有缺陷还是过于昂贵?还是由于极限编程和其他方法而过时?

14
一般而言,编程或计算机科学都与算法有关吗?
作为一名研究生,我发现越来越有声望的公司(例如Google,Facebook,Microsoft等)将算法问题放入他们的测试和面试中。我申请过的一些创业公司也询问了算法。我想知道对于这些公司的软件开发人员来说,算法流畅性是否最重要? 如果答案是肯定的,那么有效学习和实践算法的最佳方法或资源是什么?我似乎对解决大多数教科书或网站中似乎过于复杂的问题没有兴趣。尽管很容易理解基本算法(如quicksort,bubblesort等),但我发现很难记住它并以后再使用。 谢谢。 P / S:如果您问我喜欢什么,它正在构建优秀的软件,以创新方式解决用户的问题。我想这并不一定意味着该软件必须非常复杂。

16
具有直观的并发编程抽象的现代编程语言
我对学习并发编程感兴趣,重点是应用程序/用户级别(而不是系统编程)。我正在寻找一种现代的高级编程语言,该语言提供用于编写​​并发应用程序的直观抽象。我想专注于提高生产率并隐藏并发编程复杂性的语言。 举个例子,我不认为用C,C ++或Java编写多线程代码是一个好选择,因为恕我直言,我的工作效率降低了,而且它们的编程模型也不直观。另一方面,提高生产率并提供更直观抽象的语言(例如Python和多处理模块,Erlang,Clojure,Scala等)将是不错的选择。 根据您的经验,您会推荐什么?为什么? 编辑:谢谢大家的有趣的回答。很难尝试得出结论,因为有很多不错的候选人:Erlang,Clojure,Scala,Groovy以及Haskell。我以最有说服力的论据对答案进行了投票,但是在决定选择哪个候选人之前,我将尝试所有好的候选人:)

12
我如何说服我的雇主在不卖空自己的情况下聘请其他开发商?[关闭]
我是一家小公司中唯一的开发商。我已经慢慢进入这里开发了;直到大约4个月前,我有50-75%的时间花在了运营上。现在,我有50-75%的时间都花在了开发上,其余的时间则分配给了运营部门和各种IT人员。我经常每周要工作50多个小时。 我继承了许多业务所依赖的一些编写不佳的应用程序(它们以前由两个人维护)。保持它们正常运行,在新的较小的应用程序上工作,我的其他职责已经花了我所有的时间。 为了具有可伸缩性,现有软件需要大量的重构和附加功能。以前,我没有幸去开发正确编写或架构的软件。这项任务的复杂性远远超出了我以前做过的任何事情(这是我大学毕业后的第一份工作。)我知道在这里的许多人对自我学习/学习抱有极大的热忱,但这超出了我的专业知识我不会对我的雇主或我自己有任何帮助,试图独自解决它。 我对自己的经验很直截了当,过去曾提到过可能有必要雇用另一位经验更丰富的开发人员……如果有的话,只是在我们成长和成长的过程中,任何人都要花时间有更多的软件要开发和维护。我知道聘请另一名开发人员将使我受益匪浅。找人学习并跳出想法会很棒。StackOverflow非常适合用于确定解决单个编码问题或概念的方法,但不能替代特定于某个业务领域的更广泛或更重要的讨论。当最近在不经意的交谈中提到雇用其他开发人员时,他们似乎并不认为这很重要或必要。 tl; dr:当前的补丁程序工作和其他职责已经占用了我所有的时间,需要完成的现有应用程序工作超出了我的技能范围,我几乎没有时间去计划新产品。最初,雇主似乎不愿雇用其他开发商。 我该如何“出售”雇用另一名开发人员而又听起来不像我懒惰或无能(我想以为自己都不是!)? 编辑:只是想澄清一下,我对采取任何敌对行动来证明观点毫无兴趣(例如,休假以示假,如果我不在身边,他们会被搞砸了。)我很漂亮满足于在这里工作,并认为自己应该得到应有的报酬,甚至加班费也是如此,这就是为什么我现在还没有考虑新工作的原因。就是说,我接受了“不再加班”的答案-即使我不介意付出太多的努力,这样做也没有给任何人任何好处(容易出错,容易使自己精疲力竭),而且这确实站不住脚在短期内远不及长期。在与主管讨论此事时,我会强调这一点,并且可能会建议兼职雇用承包商,这是一种在财务上更可口的初始方法。

11
C ++在现实世界中有没有例外的情况?[关闭]
在何时使用C上的C和C上的C ++?有一个声明WRT。编码大小/ C ++异常: 杰里的答案(除其他外): (...)使用C ++生成真正微小的可执行文件往往会更加困难。对于非常小的系统,无论如何您几乎不会编写很多代码,而额外的(...) 我问为什么会这样,杰里对此回答: 最主要的是C ++包含了异常处理,这(至少通常是)为可执行文件的大小增加了一些最小值。大多数编译器将允许您禁用异常处理,但是当您执行此操作时,结果将不再是C ++。(...) 在技​​术的现实世界中,我对此并不怀疑。 因此,我有兴趣(纯粹出于好奇)从现实世界的示例中听到,在该示例中,一个项目选择C ++作为语言,然后选择禁用异常。(不仅在用户代码中“不使用”异常,而且在编译器中将其禁用,这样您就不能引发或捕获异常。)为什么一个项目选择这样做(仍然使用C ++而不是C,但是没有)例外)-(技术上的)原因是什么? 附录:对于那些希望详细说明答案的人,很高兴详细说明如何处理无例外的含义: STL集合(vector,...)无法正常工作(无法报告分配失败) new 不能扔 建设者不能失败
40 c++  exceptions 

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.