软件工程

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

6
什么是故事积分的最佳解释是什么?
我们在这里开始使用Story Points进行敏捷开发,但是我很难解释,也找不到任何明确的答案。我能做的最好的事情是指向其他站点(例如http://blog.mountaingoatsoftware.com/tag/story-points),并对它们的含义进行一些模糊的概括。我正在寻找一些使用示例的良好解释,这些示例将对其他使用示例有所帮助。有没有很好的资源可以解释故事要点?

6
为什么好的程序员被称为忍者?[关闭]
忍者程序员是如何定义的?如果只是经验丰富的开发人员,那么真的没有更好的方法来形容吗?忍者听起来像是一种幼稚的营销策略,旨在以自负的幻想吸引开发商。还是我错过了什么?我特别想知道使比较有效(除了凉爽因素之外)的程序员需要Ninja的哪些素质? 我确实找到了这篇文章,该文章在忍者特征和敏捷开发之间进行了很好的比较。但是,我想听听使用Ninja这个词进行招聘的人及其背后的动机。 更新:论点两边都提出了几点要点。我试图在我的博客文章中总结这些内容。我选择JB的答案作为可接受的答案,因为它总结了进行比较的所有有效原因。


8
为什么.Net书籍为什么谈论堆栈与堆内存分配?
似乎每本.net书籍都在谈论值类型与引用类型,并使其指向(通常是错误地)存储每种类型(堆或栈)的状态。通常,它在前几章中介绍,是一些非常重要的事实。我认为认证考试甚至都涵盖了它。为什么(初学者).Net开发人员堆栈与堆甚至重要?您分配的东西就可以了,对吧?
36 .net 

11
编写最少的代码以通过单元测试-不作弊!
在进行TDD并编写单元测试时,如何在编写要测试的“实现”代码的第一次迭代时抵制“作弊”的冲动? 例如: 让我们需要计算一个数字的阶乘。我从一个单元测试开始(使用MSTest),例如: [TestClass] public class CalculateFactorialTests { [TestMethod] public void CalculateFactorial_5_input_returns_120() { // Arrange var myMath = new MyMath(); // Act long output = myMath.CalculateFactorial(5); // Assert Assert.AreEqual(120, output); } } 我运行此代码,但由于该CalculateFactorial方法甚至不存在而失败。因此,我现在编写代码的第一次迭代以实现被测方法,并编写通过测试所需的最少 代码。 问题是,我一直很想写以下内容: public class MyMath { public long CalculateFactorial(long input) { return 120; } } 从技术上讲,这是正确的,因为它确实是“作弊”,因为它实际上甚至没有尝试执行计算阶乘的功能,尽管它确实是进行特定测试通过(变为绿色)所需的最少代码。当然,现在重构部分成为“编写正确的功能”的练习,而不是真正的实现重构。显然,添加具有不同参数的其他测试将失败并强制进行重构,但是您必须从该测试开始。 因此,我的问题是,如何在“编写最少的代码以通过测试”同时又保持其功能与您实际试图实现的精神之间取得平衡?
36 unit-testing  tdd 

30
在纸上打印代码是否常见?[关闭]
我喜欢将代码行保持在80个字符以内,因为: 我不必进行任何水平滚动; 我知道如果超出此限制,该行可能太复杂了;和 它可以很好地打印在纸上。 关于后者,我只遇到了几个实际打印出代码以供查看的人(我就是其中之一)。那么打印代码有多普遍?

10
我应该使用switch语句还是if ... else链较长?
通常,当我听说switch语句时,将它推迟以替换长if ... else链。但是似乎当我使用switch语句时,我正在写更多的代码,而如果...否则我会写。您还遇到其他问题,例如将所有调用的所有变量都保持在同一范围内。 这是一些代表我通常编写的流程的代码(感谢diam) String comment; // The generated insult. int which = (int)(Math.random() * 3); // Result is 0, 1, or 2. if (which == 0) { comment = "You look so much better than usual."; } else if (which == 1) { comment = "Your work is up …

8
Linq是否对.NET程序员产生麻木的作用?
大约一年前,当人们开始问如何使用jQuery检索查询字符串等绝对疯狂的事情时,我们很多人开始在jQuery中看到这种现象。库(jQuery)和语言(JavaScript)之间的区别显然已被许多程序员所忽略,并导致在不必要的地方编写了许多不合适的,费解的代码。 也许这只是我的想象,但我发誓我开始看到人们要求使用Linq做类似疯狂的事情的问题数量激增,例如按一定顺序查找范围。我无法克服Linq扩展对于解决该问题有多么不恰当,但更重要的是,作者只是认为理想的解决方案将涉及Linq而没有实际考虑(据我所知)。似乎我们正在重复历史,滋生了无法分辨语言(C#/ VB.NET)和库(Linq)之间区别的新一代.NET程序员。 是什么导致这种现象?只是炒作吗?喜tend倾向?Linq是否已经获得了魔术般的声誉,在这里您不必说出正确的咒语,而不必实际编写代码?我对这些解释不满意,但我真的想不出其他任何东西。 更重要的是,这确实是一个问题吗?如果是,那么帮助这些人开悟的最佳方法是什么?

3
集成测试是否要重复所有单元测试?
假设我有一个函数(用Ruby编写,但每个人都应该理解): def am_I_old_enough?(name = 'filip') person = Person::API.new(name) if person.male? return person.age > 21 else return person.age > 18 end end 在单元测试中,我将创建四个测试以涵盖所有场景。每个Person::API对象都将使用带有stubbed方法male?和的模拟对象age。 现在谈到编写集成测试。我认为不应再嘲笑Person :: API。因此,我将创建完全相同的四个测试用例,但不模拟Person :: API对象。那是对的吗? 如果是,那么编写单元测试的意义何在?如果我可以编写使我更有信心的集成测试(因为我在处理真实对象,而不是存根或模拟对象)?

3
使用peek()修改流元素是否是反模式?
假设我有一个事物流,并且想在流中“丰富”它们,我可以使用peek()它,例如: streamOfThings.peek(this::thingMutator).forEach(this::someConsumer); 假设在代码的这一点上对事物进行变异是正确的行为-例如,该thingMutator方法可以将“ lastProcessed”字段设置为当前时间。 但是,peek()在大多数情况下,它的意思是“看起来,但不要碰”。 是使用peek()到发生变异流元素的反模式或不明智的? 编辑: 另一种更常规的方法是转换消费者: private void thingMutator(Thing thing) { thing.setLastProcessed(System.currentTimeMillis()); } 到返回参数的函数: private Thing thingMutator(Thing thing) { thing.setLastProcessed(currentTimeMillis()); return thing; } 并map()改用: stream.map(this::thingMutator)... 但这会引入敷衍的代码(return),但我不认为它会更清晰,因为您知道peek()返回的对象相同,但是map()乍一看并不清楚它是同一类对象。 此外,使用peek()lambda可以突变,但是map()您必须构建火车残骸。比较: stream.peek(t -> t.setLastProcessed(currentTimeMillis())).forEach(...) stream.map(t -> {t.setLastProcessed(currentTimeMillis()); return t;}).forEach(...) 我认为peek()版本更清晰,lambda也很明显是变异的,因此没有“神秘的”副作用。同样,如果使用方法引用,并且该方法的名称明确暗含了突变,则该名称也很明显。 就个人而言,我不会回避使用peek()变异-我觉得这很方便。

3
重用合并的分支,好的做法?
当前,每次必须向应用程序中添加新功能时,我都会创建一个新分支。 功能完成并可以正常工作后,我将其与master分支合并。 但是稍后,当我需要更新此功能(如改进)时,创建一个新分支会更好还是还是需要使用master重新建立以前的分支,然后进行更新然后再次合并? 例如,我在Ruby on Rails应用程序中有一个名为modelling-member的分支。稍后,我需要向成员模型添加一些属性(在此分支中创建)。我该怎么办?使用母版对该分支进行基础设置,更新模型并再次合并,还是只是创建一个新分支?
36 git  branching 



5
是否有关于重写软件成功/失败率的实际案例研究?
我已经看到多篇关于应用程序重写的文章,这些都是不好的,人们在Programmers上的经历,以及Joel Spolsky编写的关于该主题的文章,但没有确凿的证据或案例研究。除了Joel给出的两个示例以及此处的其他一些帖子外,您如何处理不好的代码库,以及如何根据实际研究决定如何处理它? 就目前的情况而言,我知道有两个客户端都具有旧的遗留代码。他们一直之以鼻,因为正如其中之一发现的那样,重写是一场灾难,这很昂贵,而且实际上并不能有效地改善代码。随着重写者迅速发现,该客户具有一些非常复杂的业务逻辑。 在这两种情况下,这些都是关键任务应用程序,可为公司带来大量收入。试图重写的人认为,如果将来某个时候不对旧版软件进行升级,它们将陷入困境。对我来说,这种风险需要进行研究和分析,以确保成功的道路。 是否有实际的案例研究对此进行了调查?我不希望尝试大量重写,而无需根据实际研究了解一些最佳实践,陷阱和成功。 后果: 好的,经过更多搜索,我确实找到了三篇有关案例研究的有趣文章: 重写或重用。他们对转换为Java的Cobol应用程序进行了研究。 另一个是关于软件重用:开发人员的经验和看法。 重用或重写关于维护与重写成本的另一项研究。 我最近找到了另一篇有关该主题的文章:The Great Rewrite。在那儿,作者似乎遇到了一些主要问题。随之而来的是通过使用建议的新技术堆栈并测量开发人员将其拿起的速度来进行原型制作的想法。这全都是重写的序幕,我认为这是个好主意!

1
btree和rtree索引有什么区别?
我在MySQLWorkbench上注意到,您可以在进行工程前设计之前选择如何存储索引。存储类型为: BTREE 实时树 杂凑 经过研究,我发现了一些非常重要的信息,因此我正在寻找有关这些信息之间的区别和/或为什么应该选择一个而不是另一个的实用信息。 另外,我以前从未选择过存储类型,因此我假设MySQL正在选择默认存储类型(BTREE?)

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.