软件工程

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

9
不编写单元测试是合理的,因为它们往往会在以后被注释掉,或者因为集成测试更有价值?
我正在与一位同事讨论单元/集成测试,他提出了一个有趣的案例来反对编写单元测试。我是大型单元测试(主要是JUnit)的支持者,但是我很想听听其他人的看法,因为他提出了一些有趣的观点。 总结他的观点: 当发生重大代码更改时(新的POJO集,主要应用程序重构等),单元测试往往被注释掉而不是重新编写。 最好将时间花在涉及用例的集成测试上,这会使范围较小的测试变得不那么重要。 有这个想法吗?尽管集成测试听起来至少有价值,但我仍在进行单元测试(因为我一直认为它会产生改进的代码)。

6
开发人员为什么不使安装在Windows上自动进行?[关闭]
这与“ 开发人员为什么不在linux上创建安装向导? ” 相反,但很有趣,但让我认为“自动安装是自然的方式。为什么他们使用向导?”。 所以这是反问题: 我确定这与懒惰无关,但我无法理解为什么开发人员,甚至主要是面向消费者的应用程序,都不会进行完全不麻烦的全自动安装。相同的应用程序通常会在Linux上自动安装,那么为什么不使用Windows和Mac OS? 这种趋势是否有任何技术原因,还是仅仅是惯例?
35 windows 

2
第一种ATM编程语言
最初的ATM机执行自动提款机之类的任务,它们是离线机器,可以处理浸渍有Carbon和6位PIN码的打孔卡。 一张卡的最大提款额为10磅,每张卡只能一次性使用-ATM吞咽卡! 当我查看编程语言的时间轴时,1967年在伦敦安装了第一台ATM ,在那十年之前有很多编程语言。我也不知道硬件,但是它是用哪种编程语言编写的?(还使用了哪些硬件?) *我没有找到John Shepherd-Barron(70年代ATM发明者)的详细传记 更新资料 我发现了这张照片,这张照片取自于1972年在伊朗的一家报纸。 翻译的PS: 右边显示Rad-lon先生(如果拼写正确),Barros的经理(如果拼写正确)国际教育学院,以及计算机亭专家Jim Sutherland先生。 在本文的其余部分中,这些被称为“自动计算机亭”的ATM随本moto进行了广告宣传: Rad-lon先生(如果拼写正确)将其卡放到自动计算机亭的一个特定位置,并在10秒钟后提取现金。 另外两个问题是: 1-这些自动提款机有多快?(当年10秒内退出) 2-我在Internet上没有找到任何有关“自动计算机亭”的文字,这是有效的还是在那个时候被称为计算机?

6
初始化孩子对其父母的引用的最佳方法是什么?
我正在开发一个对象模型,它具有许多不同的父/子类。每个子对象都有对其父对象的引用。我可以想到(并且已经尝试过)几种初始化父引用的方法,但是我发现每种方法都有明显的缺点。给定以下所述的方法,哪一种是最好的,哪一种是更好的。 我不会确保下面的代码可以编译,因此如果代码在语法上不正确,请尝试查看我的意图。 请注意,尽管我并不总是显示任何参数,但我的一些子类构造函数确实会接受参数(而不是父参数)。 调用方负责设置父级并添加到同一父级。 class Child { public Child(Parent parent) {Parent=parent;} public Parent Parent {get; private set;} } class Parent { // singleton child public Child Child {get; set;} //children private List<Child> _children = new List<Child>(); public List<Child> Children { get {return _children;} } } 缺点:为消费者设置父级过程分为两个步骤。 var child = new …

7
频繁的复杂合并冲突是问题的征兆吗?
在我们的团队中,我们使用Git作为源代码控制。我们有几个几乎独立的代码区域,但是有一些重叠。最近,我们一直在讨论使用源代码管理的工作流程和方法。当我使用功能分支工作流进行升级时,出现的一个抱怨是人们经常遇到复杂的合并冲突,而他们无法正确解决。复杂地说,我的意思是“解决方法不明显”。鉴于此,正在更加积极地使用其他工作流程,例如基于“拉底”的工作流程。 作为功​​能分支方法的倡导者,我并没有真正抱怨过。是的,您必须保持本地要素从master或任何地方分支最新,但这是我所看到的唯一真正的问题。我在想,如果您的合并总是很复杂并且可能会产生辅助影响,那么这更多是团队合作问题,而不是Git问题。 我认为正确吗?复杂的合并冲突是好事还是坏事的征兆?

6
Lisp仍然具有其他编程语言未采用的任何特殊功能吗?
Lisp仍然具有其他编程语言未采用的任何特殊功能吗? Lisp是指所有Lisp编程语言的整体。有人告诉我Lisp多么惊人,并且知道许多语言都受到Lisp的启发。但是Lisp是否仍然具有任何其他语言无法完成的专有设计功能? 我问这个问题的原因是,最近,我自己是一名业余程序员,所以我开始学习Clojure只是为了好玩,结果是我发现了很多与Lisp相关的帖子和​​评论,但只说了一件事:“ Lisp是独一无二的”,但其他现代编程语言已经采用并窃取了Lisp的许多想法,例如条件,递归和作为一等公民的功能。甚至元编程也可以用多种语言完成。 我错过了什么吗?“ Lisp还是不一样”吗? 或我很幸运,因为其他现代语言从Lisp窃取了所有的好东西,因此不必深入研究Lisp的括号,而“ Lisp是不同的”。

5
创建另一个类的ClassCollection是一个好习惯吗?
可以说我有一Car堂课: public class Car { public string Engine { get; set; } public string Seat { get; set; } public string Tires { get; set; } } 可以说,我们正在建立一个有关停车场的系统,我将使用很多Car类,因此我们建立了一个CarCollection类,它可能有一些类似的方法FindCarByModel: public class CarCollection { public List<Car> Cars { get; set; } public Car FindCarByModel(string model) { // code here return new Car(); …

12
编写代码方法论的逐渐转变是否会影响系统性能?我应该在乎吗?
TD; DR: 关于我在问的问题有些困惑,所以这是问题背后的驱动思想: 我一直希望这个问题是什么。我本来可能说得不太好。但是其意图一直是“ 模块化,分离,松散耦合,解耦,重构的代码 ”,其本质明显比“ 整体式单一单元,在一个地方完成所有工作,一个文件,紧密耦合的 ”代码慢。剩下的只是我当时或现在或以后会遇到的细节和各种表现形式。在某种程度上,它肯定较慢。就像无碎片磁盘一样,您必须从任何地方拾起碎片。慢一点 当然。但是我应该在乎吗? 问题不在于... 与微优化,过早优化等无关。这与“优化这一部分或死亡”无关。 之后怎么样了? 它涉及随着时间而出现的有关编写代码的总体方法,技术和思考方式: “将此代码作为依赖项注入到您的类中” “每个班级写一个文件” “将视图与数据库,控制器,域分开”。 不要编写意大利面同质的单个代码块,而是编写可以协同工作的许多单独的模块化组件 它是关于在十年内当前在大多数框架中看到和倡导的代码的方式和样式,这些框架是在大会上倡导的,并且是通过社区传播的。这是思维方式从“整体块”到“微服务”的转变。随之而来的是机器级别的性能和开销,以及一些程序员级别的开销。 原始问题如下: 在计算机科学领域,我注意到编程方面的思维方式发生了显着变化。我经常遇到这样的建议: 编写较小的函数式代码(这种方式更具可测试性和可维护性) 将现有代码重构为越来越小的代码块,直到大多数方法/函数只有几行长并且很清楚它们的目的是什么(与更大的整体块相比,它创建了更多函数) 编写只做一件事的函数-关注点分离等(通常会在堆栈上创建更多函数和更多帧) 创建更多文件(每个文件一个类,用于分解目的的更多类,用于诸如MVC,域架构,设计模式,OO等层的目的,这会创建更多文件系统调用) 与“旧”或“过时”或“意大利面条”编码实践相比,这是一个变化,在常规编码实践中,您的方法跨越2500行,并且大型类和上帝对象可以完成所有工作。 我的问题是这样的: 当涉及到机器代码,1和0,汇编指令以及HDD盘片时,我应该完全担心我的类完全分离的OO代码以及各种重构的小型函数和方法也会生成额外的开销? 细节 尽管我对ASM到底如何处理OO代码及其方法调用以及DB调用和编译器调用如何转换为在HDD磁盘上移动执行器臂的方式并不太熟悉,但我确实有一些想法。我假设每个额外的函数调用,对象调用或“ #include”调用(在某些语言中)都会生成一组额外的指令,从而增加代码量并增加各种“代码接线”开销,而无需添加实际的“有用”代码。我还认为可以在ASM实际上在硬件上运行之前对其进行良好的优化,但是优化也只能做很多事情。 因此,我的问题是-与“包含一个大方法,其中包含一个大方法一切都放在一个整体文件中”,由于这种开销? 为清楚起见,更新: 我假设采用相同的代码并将其拆分,重构,解耦为越来越多的函数,对象以及方法和类将导致越来越多的参数在较小的代码段之间传递。因为可以肯定的是,重构代码必须保持线程运行,并且这需要传递参数。与单个整体类或方法相比,更多的方法,更多的类或更多的Factory Method设计模式导致传递更多信息位的开销更大。 有人说(引用待定),所有代码中多达70%是由ASM的MOV指令组成的-向CPU寄存器加载适当的变量,而不是进行实际的计算。就我而言,您可以使用PUSH / POP指令来加载CPU时间,以提供各种代码之间的链接和参数传递。您编写的代码段越小,所需的“链接”开销就越大。我担心这种联系会增加软件的膨胀和减慢速度,我想知道我是否应该关注这一点,以及是否要关注(如果有的话),因为现在和将来的下一代程序员都在为下个世纪构建软件,则必须使用和使用使用这些做法构建的软件。 更新:多个文件 我现在正在编写新代码,正在逐渐替换旧代码。特别是我注意到旧的类之一是〜3000行文件(如前所述)。现在,它已成为位于各个目录中的15-20个文件的集合,包括测试文件,不包括我用来将某些东西绑定在一起的PHP框架。还有更多文件。对于磁盘I / O,加载多个文件比加载一个大文件要慢。当然,并非所有文件都已加载,它们是根据需要加载的,并且存在磁盘缓存和内存缓存选项,但我仍然相信,这loading multiple files需要比loading a single file内存更多的处理工作。我将其添加到我的关注中。 更新:依赖注入所有内容 过一会儿再说。我认为我的问题被误解了。也许我选择误解了一些答案。我并不是在谈论微优化,因为一些答案已经被挑出来了(至少我认为我所说的关于微优化的说法是用词不当),而是整体上“重构代码以放松紧密耦合”的动向。 ,在代码的每个级别。我是最近从Zend Con来的,这种风格的代码一直是公约的核心和核心内容之一。从视图中解耦逻辑,从模型中解脱视图,从数据库中解脱模型,并且如果可能的话,从数据库中解耦数据。依赖-注入所有内容,有时意味着只添加什么都不做的接线代码(函数,类,样板),但可以用作接缝/勾点,在大多数情况下,很容易使代码大小加倍。 …

2
MVCS-模型视图控制器存储
我最近决定开始学习iOS开发,为此,我一直在阅读iOS编程:The Big Nerd Ranch Guide。在这本书中,作者描述了一种设计模式MVCS-Model-View-Controller-Store,其基本思想是,由于许多应用程序使用多个外部数据源,因此将请求逻辑保留在控制器中可能会变得非常混乱。建议将所有请求逻辑从控制器中移出并移到单独的对象中。 简而言之,引用这本书 Model-View-Controller-Store将请求逻辑放入一个单独的对象中,我们将此对象称为存储(图28.4)。使用存储对象可以最大程度地减少冗余代码,并简化获取和保存数据的代码。最重要的是,它把处理外部资源的逻辑转移到了一个清晰且目标明确的类中。这使代码更易于理解,也易于维护和调试,并与团队中的其他程序员共享。 和 关于异步存储的一个很酷的事情是,即使很多对象在处理一个请求上做了很多工作,但请求的流及其响应却在控制器中的一个位置。这给我们带来了易于阅读且易于修改的代码的优势。 我想了解更多关于这种模式的信息,并想看看其他人可能要说些什么,但是在网上搜索时,我唯一能找到的参考是同一本书(这种模式也许以其他名字叫吗?)。 在我看来,作者的逻辑似乎很有意义,而且似乎是常规MVC模式的逻辑扩展,但这也许是因为我实际上对MVC模式没有太多的经验(除了涉足iOS开发之外,我还拥有带有骨干 .js的已使用MVV (也就是说,如果您将其视为MVC)。 我希望也许有更多经验的人可以阐明我所缺少的MVCS模式是否存在任何明显的缺陷/问题。

9
在生产服务器上开发
今天,我因在生产服务器上开发应用程序而大喊大叫。报价,“ 在生产服务器上发展是不能接受的-永远! ” 这是情况。 我建立了一个开发实例: http://example.com:3000 生产实例为: http://example.com 我完成了所有开发工作http://example.com:3000,当客户对更改感到满意时,我将其移至http://example.com。 我正在使用的应用程序是一个旧的Ruby on Rails应用程序,我不得不说一开始,我确实尝试在本地设置开发环境,但是我永远无法使其运行。经过一段时间的尝试,我放弃了并决定在生产服务器上进行开发。 再说一次,我是白痴吗?大概是这样,但是我从事Web开发已有两年了,而且从未遇到过这种情况。谁是正确的,为什么?

6
Git友好的电子表格格式?[关闭]
我们正在尝试将项目文档流程从Google文档移至一组自托管的Git存储库。 文本文档对Git足够友好,因为我们通常不需要任何精美的格式,因此我们仅将所有内容转换为multimarkdown,并可以在复杂情况下嵌入LaTeX。 但是电子表格的故事大不相同...是否有一种类似于版本控制系统的扩展格式(最好与Markdown一样易于阅读)? “友好格式”:Git与格式兼容(不适用于XML),并且生成易于理解的差异(可以进行涉及外部工具的额外配置)。 显然,Markdown风格允许建立静态表,但我希望能够使用诸如此类的东西SUM()(请注意CSV也存在相同的问题。)没有所见即所得的功能,但是可以提供不错的编辑器/工具支持很好 更新:请仅提供Linux友好的答案。没有MS Office资料。

9
算法比编程语言重要吗?
在当前(2013年)的Google Code Jam竞赛中,与仅使用40行代码即可解决同一问题的Python人员相比,C ++和Java人员花费了200多行代码。 Python不能直接与C ++和Java相提并论,但是我认为冗长程度的差异可能会对算法的效率产生影响。 与选择语言相比,知道正确的算法有多重要?能否以更好的方式(使用相同的算法)以C ++或Java来实现出色实现的Python程序,这是否与某些编程语言的自然冗长性有关?
35 java  c++  algorithms  python 

10
如果是单元测试,那么开发人员应该负责除单元测试之外的其他测试吗?
我目前正在从事一个相当大的项目,并且我已经使用JUnit和EasyMock相当广泛地进行了单元测试功能。我现在对我应该担心的其他类型的测试感兴趣。作为开发人员,我有责任担心诸如功能测试或回归测试之类的事情吗?是否有很好的方法将这些以可用的方式集成到Maven / Ant / Gradle等工具中?这些是否更适合测试人员或BA?我还缺少其他有用的测试类型吗?
35 testing 

4
如何切换到C ++ 11?
我已经用C ++编程了一段时间了,但是大多数事情都围绕着C ++的低级功能。我的意思是主要使用指针和原始数组。我认为这种行为被称为将C ++与类一起使用。尽管如此,我最近才第一次尝试C。我很惊讶地发现C#和Java之类的语言如何在便捷的标准库类(如字典和列表)中隐藏这些细节。 我知道C ++标准库也有许多容器,例如矢量,映射和字符串,而C ++ 11仅通过具有std :: array和ranged循环来增加了它。 我如何最好地学习如何利用这些现代语言功能以及哪些功能适合哪些时间?如今,C ++中的软件工程大部分都不需要人工进行内存管理吗? 最后,我应该使用哪个编译器来充分利用新标准?Visual Studio具有出色的调试工具,但即使VS2012似乎也具有糟糕的C ++ 11支持。
35 c++  c++11 


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.