软件工程

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

11
在代码审查中,审查者是否应始终提出解决方案?[关闭]
在检查代码时,我通常会尝试就如何解决问题提出具体建议。但是由于人们可以花费有限的时间进行审阅,因此这种方法并不总是能很好地工作。在这些情况下,如果开发人员自己提出解决方案,我会发现效率更高。 今天,我回顾了一些代码,发现一个类显然设计得不好。它具有许多仅分配给某些对象的可选属性,而对其他对象则留空。解决此问题的标准方法是拆分类并使用继承。但是,在这种特定情况下,这种解决方案似乎使事情变得过于复杂。我本人并未参与此软件的开发,也不熟悉所有模块。因此,我没有足够的知识来做出特定的决定。 我多次经历的另一个典型案例是,我发现一个明显毫无意义甚至误导的函数,类或变量名,但我自己却无法提出好名。 因此,通常来说,作为审阅者,可以说“此代码存在缺陷是因为...,是否有所不同”,还是您必须提出一种特定的解决方案?



16
如何将自己推销为软件开发人员?[关闭]
我已经注意到,这是我们这样的技术领域的年轻人中经常遇到的问题。 在我们职业生涯的初期,我们根本不知道如何将自己推销给我们的雇主,而随机的#57人(他是一名程序员,但在技术上不如您好)最终得到加薪或晋升,因为他比您更懂得交流和推销自己。许多人可能已经看到这种情况在过去发生了,并且肯定会在未来发生更多。 除了列出您知道的所有编程语言和库之外,您认为在进行工作面试或要求加薪时需要指出什么样的技能/能力(技术性或其他性质)?

17
为什么单元测试失败被视为不好?
在某些组织中,显然,软件发布过程的一部分是使用单元测试,但是在任何时间点,所有单元测试都必须通过。例如,可能会有一些屏幕以绿色显示所有通过的单元测试-这应该很好。 就我个人而言,出于以下原因,我认为不应该这样: 它提出了这样的想法,即代码应该是完美的,并且不应该存在错误-在现实世界中,对于任何大小的程序,这肯定是不可能的。 考虑将失败的单元测试是不利的。或者肯定会提出很难修复的单元测试。 如果在任何时间点所有单元测试都通过了,那么在任何时间点都没有软件状态的大图。没有路线图/目标。 它阻止了在实现之前预先编写单元测试。 我什至建议即使发布单元测试失败的软件也不一定是坏事。至少您会知道该软件的某些方面存在局限性。 我在这里想念什么吗?为什么组织希望所有单元测试都能通过?这不是生活在梦想世界中吗?难道这实际上并不能阻止对代码的真正理解吗?


5
为什么Java根本没有优化尾递归?
据我所读:原因是因为在继承时,要确定要实际调用的方法并不容易。 但是,为什么Java至少没有对静态方法进行尾递归优化并强制使用正确的方法来用编译器调用静态方法? 为什么Java根本不支持尾递归? 我不确定这里是否有任何困难。 关于建议的副本,如JörgW Mittag 1所述: 另一个问题是关于TCO的,这个是关于TRE的。TRE比TCO简单得多。 此外,另一个问题询问JVM对希望编译为JVM的语言实现施加哪些限制,该问题询问Java,这是不受JVM限制的一种语言,因为JVM规范可以通过以下方式更改:设计Java的人 最后,JVM中甚至没有关于TRE的限制,因为JVM确实具有方法内GOTO,这是TRE所需的全部 1 添加了格式以标注点。

17
设计一种架构,认为可以将用户界面类替换为命令行界面,这是一个好主意吗?
在第25页的“代码完成”中,据说可以用命令行轻松替换常规用户界面类是一个好主意。 知道其测试优势,它可能带来什么问题呢? 这项额外的工作真的能为Web和移动项目带来回报吗?中小型项目呢?相同的规则适用吗?如果这会使您的设计更复杂怎么办?

10
如何激励同事编写单元测试?[关闭]
我们正在研究已经生产大约5年的大型产品。该代码库在工作。效果不是很好,但是可以正常工作。新功能投入生产并通过少量质量检查进行了测试。错误已修复,等等。但是除我以外,没有人在编写单元测试。没有人通过编写单元测试来确保所有特殊错误(测试用例)再也不会发生,从而利用“跟踪”错误的能力。 我已经和管理层谈过了。我已经和开发人员谈过了。我已经与整个公司的所有人进行了交谈。每个人都说:“是的,我们必须编写更多的单元测试!” 那是大约一年前。从那时起,我就开始引入预提交代码审查(Gerrit)和持续集成(Jenkins)。 我举行了一些有关单元测试的会议,还展示了编写单元测试的好处。但是似乎没有人对此感兴趣。 问题1:如何激励我的同事编写单元测试? 问题2:如何保持动力以遵循我的个人代码质量标准?(有时真的很令人沮丧!) PS:一些令人沮丧的事实(在1年内达成): 单元测试总数:1693 总“示例单元测试”:大约50 由我完成:1521 编辑:我期望太多了吗?这是我的第一个工作地点,我正在努力做到最好。 编辑2:根据所有答案,我为自己做了一个小清单。我已经与两位开发人员私下交谈过,我们进行了坦诚交谈。 其中一位告诉我,就像Telastyn所说的那样,他对单元测试真的很不满意。他说他想变得“更专业”,但是他需要一个启动。他还说,我们与所有开发人员(9-11岁左右)进行的单元测试会议很好,但是太拥挤了。嗯 一些批评家给我,但我会从中学到东西。(请参阅以下有关tdd kata会议的回答!) 另一位表示他对编写单元测试不感兴趣。他认为自己的工作足以应付他的薪水。他不想付出更多的努力。我非常无语。典型的9-5岁的“工人”。 下周,我将与其他开发人员交谈。 感谢您的出色回答(到目前为止!)和支持。我真的很感激!我学到了很多东西,非常感谢!

18
如何解释一个外行人为什么在深层次编码时不应该打扰开发人员?[关闭]
如果您只考虑我问题的第二部分,“为什么开发人员在深层次的编码时不应该打扰开发人员”,聪明人已经讨论了很多次。Heck,甚至是SO的联合创始人Joel Spolsky,都写了一篇博客文章,内容涉及“进入区域”和“被淘汰出区域”,以及为什么在参加复杂活动时平均需要15分钟才能达到生产力,与软件开发相关的任务。所以我认为原因已经确立。 我感兴趣的是如何向不了解Bean的人解释所有这些(我的意思是软件开发)。如何告诉妻子,工作场所记账的风趣人物或每隔30分钟用“ Wazzzzzzup?”在Skype上对您执行ping操作的老朋友,所有中断对您工作的影响比对您的影响要深得多。他们花费了您30分钟的时间。显然,除非您想成为空白凝视或友善虐待的目标,否则您无法用“我必须在我的短期记忆中混用很多变量名”这样的句子来解释它。 我希望能够以一种可以使他们清楚理解的方式向非开发人员解释所有这些内容,而不会令人反感,精英化或过于技术化。 编辑:感谢大家的深刻见解。我接受了EpsilonVector的回答,因为他的类比最接近我的原始需求。“入睡”的解释既不是冒犯性的,也不是技术性的,几乎任何人都可以与之相关,入睡或在区域内时受到干扰的后果非常相似:您会感到沮丧,并且会“失去” 15-20分钟时间。

12
为什么C不被视为“面向对象”语言?
C似乎有自己的准对象,例如“结构”,可以将其视为对象(以我们通常认为的高级方式)。 而且,C文件本身基本上是单独的“模块”,对吗?那模块不是也像“对象”吗?我对为什么C(看上去与C ++如此相似)为何被视为低级“过程”语言感到困惑,而C ++却是高级“面向对象”语言。 *编辑:(澄清)为什么和在哪里,画线,什么是“对象”,什么不是?

19
TDD为什么起作用?[关闭]
如今,测试驱动开发(TDD)规模很大。我经常在Programmers SE和其他场所将它推荐为解决各种问题的解决方案。我不知道为什么行得通。 从工程角度来看,这使我感到困惑,原因有两个: “编写测试+重构直到通过”方法看起来令人难以置信的反工程。例如,如果土木工程师使用该方法进行桥梁建造,或使用汽车设计师作为汽车制造商,则他们将以很高的成本重塑桥梁或汽车,结果将是没有经过深思熟虑的体系结构而造成的混乱。“重构直到通过”准则通常被视为忘记建筑设计并做任何必要的工作以符合测试的要求。换句话说,测试而不是用户来设置需求。在这种情况下,我们如何保证结果中的良好“缺陷”,即最终结果不仅是正确的,而且是可扩展的,健壮的,易于使用的,可靠的,安全的,安全的等。这就是架构通常要做的。 测试不能保证系统正常运行。它只能表明它没有。换句话说,测试可能会向您显示如果系统未通过测试,则该系统包含缺陷,但是通过所有测试的系统并不比未通过测试的系统安全。测试覆盖率,测试质量和其他因素在这里至关重要。在民用和航空航天业中,已经报道了“绿色”结果给许多人带来的错误安全感觉,这是极其危险的,因为它可能被解释为“系统还不错”,而当它真正意味着“系统还不错时”。作为我们的测试策略”。通常,不检查测试策略。或者,谁来测试测试? 总而言之,我更关心TDD中的“驱动”位而不是“测试”位。测试完全可以;我没有得到的是通过设计来驱动设计。 我想看到一些答案,这些答案包含了为什么软件工程中的TDD是一种好的做法以及为什么我上面解释的问题与软件无关(或不足够相关)的原因。谢谢。
92 testing  tdd 

3
是否有一个术语供未实现的代码使用,供他人填写?
有时,在编程工作中,会生成样板,在初级程序员要执行的任务周围放置导轨,等等,碰巧会给程序员显示未实现的代码,并告诉他们“填空”。例如,可能会编译但失败的单元测试,或带有空方法的类声明。 这种做法有一个通用术语吗?

14
我如何才能避免总是觉得自己完全从头开始重建程序,会做得更好呢?[关闭]
我已经学到了大量的编码,但是,它始终处于科学环境(不是计算机科学)中,完全是自学成才,没有任何人可以指导我正确的方向。因此,我的编码之旅一直很……混乱。我现在已经注意到,无论何时构建某种类型的程序,最终我都知道如何能够更加优雅,高效,灵活,易于管理地完成它。在某些情况下,我实际上回过头来重新构建了东西,但是通常这实际上是不可行的。尽管到目前为止我的大多数程序都相对较小,但是每次创建东西时都完全重写大型程序似乎很笨拙。 我只是想知道,这是正常的经历吗?如果没有,您如何防止这种情况发生?我已经尝试过预先计划一些事情,但是直到开始编写一些代码之前,我似乎无法真正预见到一切。

15
我们是否应该从一开始就设计代码以启用单元测试?
目前,我们的团队正在争论是否修改代码设计以允许单元测试是代码的味道,或者在什么程度上可以做到而又没有代码的味道。之所以如此,是因为我们只是刚刚开始实施几乎所有其他软件开发公司中都存在的实践。 具体来说,我们将提供一个非常薄的Web API服务。它的主要职责将是整理Web请求/响应并调用包含业务逻辑的基础API。 一个示例是我们计划创建一个将返回身份验证方法类型的工厂。我们不需要它继承一个接口,因为我们不希望它有任何具体类型。但是,要对Web API服务进行单元测试,我们需要模拟该工厂。 从本质上讲,这意味着我们要么设计Web API控制器类以接受DI(通过其构造函数或设置器),这意味着我们正在设计控制器的一部分,只是为了允许DI并实现我们原本不需要的接口,或者我们使用第三方框架(如Ninject)可以避免以这种方式设计控制器,但是我们仍然必须创建一个接口。 团队中的某些人似乎不愿意仅仅为了测试而设计代码。在我看来,如果您希望进行单元测试,则必须做出一些妥协,但是我不确定他们的担忧如何得到缓解。 需要明确的是,这是一个全新的项目,因此,它并不是真正地修改代码以进行单元测试。这是关于将要编写的代码设计为可单元测试的。

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.