软件工程

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

11
单元测试不应该使用我自己的方法吗?
今天,我正在观看“ JUnit基础”视频,作者说,在程序中测试给定方法时,不应在此过程中使用其他自己的方法。 更具体地说,他正在谈论测试某种记录创建方法,该方法采用参数的名称和姓氏,并使用它们在给定表中创建记录。但他声称,在测试此方法的过程中,他不应使用其他DAO方法来查询数据库以检查最终结果(以检查记录是否确实由正确的数据创建)。他声称为此,他应该编写其他JDBC代码来查询数据库并检查结果。 我想我理解他的主张的精神:您不希望一种方法的测试用例取决于另一种方法(在本例中为DAO方法)的正确性,这是通过(再次)编写自己的验证来完成的/支持代码(应该更加具体和集中,因此代码更简单)。 但是,我内心的声音开始以诸如代码重复,不必要的额外努力之类的论点来抗议。在测试其他方法时只使用其中一些方法可以吗?如果其中一个没有按预期执行操作,则其自己的测试用例将失败,我们可以对其进行修复并再次运行测试电池。无需重复代码(即使重复的代码稍微简单一些)也无需浪费精​​力。 我对此有很强烈的感触,因为我最近编写了多个Excel - VBA应用程序(感谢Rubberduck for VBA进行了正确的单元测试),其中应用此建议将意味着很多额外的工作,而没有明显的好处。 您能否分享您对此的见解?

11
DRY是软件项目管理的敌人吗?
DRY是软件开发中最基本且被广泛接受的原则之一(请不要重复自己)。同样清楚的是,大多数软件项目都需要某种管理。 现在有哪些易于管理的任务(估算,计划,控制)?正确的重复性任务,正是按照DRY应该避免的任务。 因此,从项目管理的角度来看,最好通过将现有代码复制100次并根据需要对每个副本进行一些较小的改动来解决任务。在任何时候,您都确切知道您已经完成了多少工作,还剩下多少。所有的经理都会爱你。 相反,如果您应用DRY原理并尝试找到某种或多或少消除重复代码的抽象,则情况有所不同。通常情况下有很多可能性,您必须做出决定,进行研究,发挥创造力。您可能会在较短的时间内提出更好的解决方案,但是您也可能会失败。大多数时候,您无法真正说出还剩下多少工作。您是项目经理的噩梦。 我当然在夸张,但显然存在两难选择。我的问题是:决定开发人员是否过度使用DRY的标准是什么?我们如何找到一个妥协的解决方案?还是有一种方法可以完全克服这一难题,而不仅仅是找到折衷方案? 注意:此问题基于与我上一个主题相同的思想,即软件开发中的日常工作量及其对估计的影响,但我认为这使我的观点更加清楚,非常抱歉重复我的一遍:)。

9
干净的代码注释与类文档
我正在与新同事讨论有关评论的问题。我们俩都喜欢Clean Code,并且我完全可以避免内联代码注释,并且应该使用类和方法名称来表示它们的作用,这一点我完全满意。 但是,我非常喜欢添加小类摘要,以尝试解释类的目的和实际代表的内容,主要是为了使其易于维护单一职责原则模式。我也习惯在方法中添加单行摘要,以说明该方法应该执行的操作。一个典型的例子是简单的方法 public Product GetById(int productId) {...} 我添加以下方法摘要 /// <summary> /// Retrieves a product by its id, returns null if no product was found. /// </summary 我认为应该记录该方法返回null的事实。想要调用方法的开发人员不必打开我的代码即可查看该方法是否返回null或引发异常。有时它是接口的一部分,因此开发人员甚至都不知道正在运行哪个基础代码? 但是,我的同事认为,这类注释是“ 代码异味 ”,“注释始终是失败的”(Robert C. Martin)。 有没有一种方法可以表达和交流这些类型的知识而无需添加评论?由于我是Robert C. Martin的忠实粉丝,所以我有点困惑。摘要与注释相同,因此总是失败吗? 这不是有关在线注释的问题。

22
开发人员如何找到时间掌握最新技术?[关闭]
我是一名自由职业的Web开发人员,直到2004年左右,当我开始走上管理之路时,我决定再次尝试重新开发(特别是JavaScript和HTML5 Web /移动Web应用程序),我的确给人以真正的擅长这些技术和类似的快速发展技术除了学习新技能之外,还需要拨出一定的时间来投资以提高现有技能。 我现在就了解了,因为我重新开始学习时,学习曲线非常陡峭,但是看到那里有很多人-我看到的唯一的方法就是花大量的时间。 对于那些从事全职开发人员的工作,我想了解的是-在大多数情况下,与学习/研究相比,在办公室实际花费了多少时间来编写代码。我可以轻松地每天花费2-4个小时来掌握做事的最佳方法。 大多数全职工作的优秀开发人员是否在工作以外投入大量时间提高技能? 还是我正在查看所有这些完全错误的信息?

15
在技​​术面试中我应该给多少帮助?[关闭]
在许多技术采访中,我被要求表演或参加。我们提出被访者希望能够在纸上解决的逻辑问题和简单的编程问题。(我希望他们可以使用键盘,但这又是一个问题。)有时候,我感觉人们确实知道如何解决问题,但是他们因紧张或对该问题的第二次猜测而感到困惑(他们不是要把戏。 我从来没有听说我的老板有任何帮助或暗示。他只是感谢受访者的回答(无论好坏),然后继续讨论下一个问题。但是我对失败和紧张会导致您失望的兔子洞有所了解,以及它如何使您的思维瘫痪,我不禁想知道现在是否提供一点帮助,最终将帮助我们最终获得更有能力的程序员更多失败的采访。 我应该为那些困惑的受访者提供提示和帮助吗?
83 interview 

1
Unlicense有什么问题?
我经常听到我不应该使用Unlicense,因为有关将事物放入公共领域的问题。但是,我不明白为什么这对Unlicense来说是个问题。Unlicense试图将任何未经许可的内容放入公共领域,如果可行,那就太棒了!但是,Unlicense的作者了解到将某件事放入公共领域并不是那么简单,甚至可能是不可能的,因此Unlicense包含一个备用条款(第二段),该条款明确指出每个人都可以自由地做任何他们想做的事情。想要使用未经许可的软件。Unlicense甚至包含一个免责声明,其中包含通常的“该软件按原样提供”法律条款。 Unlicense是否不好,因为它很短并且没有定义“ unlicensor”,“ unlicensee”和圣诞老人​​是谁?如果是,那么MIT / BSD风格的许可证如何?通常认为它们是有效的,那么为什么没有许可证呢?是对带有许可许可备用条款(例如Unlicense,甚至是Creative Commons CC0,甚至是FUD)的公共领域豁免的反对,还是真的存在重大法律问题? 这是无证的全文: 这是发布到公共领域的免费且不受限制的软件。 任何人都可以以任何目的,商业目的或非商业目的,以源代码形式或作为已编译的二进制文件自由地复制,修改,发布,使用,编译,出售或分发此软件。 在承认版权法的司法管辖区中,本软件的作者将本软件的所有版权权益奉献给公共领域。我们为全体公众的利益和对我们的继承人和继承人的损害做出这一奉献。我们打算根据版权法,永久放弃本软件的所有当前和将来权利。 本软件按“原样”提供,不提供任何形式的明示或暗示担保,包括但不限于对适销性,特定目的的适用性和非侵权性的担保。无论出于与软件或软件的使用或其他处理有关,与软件有关的合同,侵权或其他形式的任何索赔,损害或其他责任,作者均不承担任何责任。 有关更多信息,请访问http://unlicense.org/
83 licensing  legal 

9
我可以编写代码…但是设计得不好。有什么建议么?[关闭]
我觉得我擅长一点一点地编写代码,但是我的设计确实很糟糕。问题是,我该如何改善设计,进而成为更好的设计师? 我认为学校在教授人们如何善于解决数学问题方面做得很好,但让我们承认一个事实,即在学校创建的大多数应用程序的长度通常约为1000-2000行,这意味着这大部分是学术活动并不能反映现实世界软件的复杂性-大约几十万到几百万行代码。 在这里,我认为,即使像topcoder / project euler这样的项目也不会有太大帮助,它们可能会提高您的数学问题解决能力-但您可能会成为一名学术程序员;对精美,干净的东西更感兴趣的人,对大多数应用程序程序员处理的日常琐事和毛茸茸的东西完全不感兴趣。 所以我的问题是如何提高我的设计技能?也就是说,设计中小型应用程序的能力是否会涉及几千行代码?如何学习设计技巧,以帮助我构建更好的html编辑器套件或gimp等图形程序?
83 design  skills 

8
返回魔术值,引发异常或在失败时返回false?
有时我最终不得不为类库编写方法或属性,对于该类库,没有真正的答案不是偶然,而是失败。无法确定,无法使用,无法找到,当前无法执行或没有其他可用数据。 我认为对于这种相对非异常的情况,有三种可能的解决方案可以指示C#4失败: 返回一个没有其他含义的魔术值(例如null和-1); 抛出异常(例如KeyNotFoundException); return false并在out参数中提供实际的返回值(例如Dictionary<,>.TryGetValue)。 所以问题是:我应该在哪种非例外情况下抛出异常?而且,如果我不应该抛出:什么时候返回在实现Try*带有out参数的方法时产生的魔术值?(对我来说,该out参数似乎很脏,要正确使用该参数还需要更多工作。) 我正在寻找实际的答案,例如涉及设计准则的答案(我对Try*方法一无所知),可用性(因为我向类库提出的要求),与BCL的一致性以及可读性。 在.NET Framework基类库中,使用了所有三种方法: 返回一个没有其他含义的魔术值: Collection<T>.IndexOf 返回-1, StreamReader.Read 返回-1, Math.Sqrt 返回NaN, Hashtable.Item 返回null; 抛出异常: Dictionary<,>.Item 抛出KeyNotFoundException, Double.Parse抛出FormatException; 要么 return false并在out参数中提供实际的返回值: Dictionary<,>.TryGetValue, Double.TryParse。 请注意,正如HashtableC#中没有泛型时创建的那样,它使用object,因此可以null作为魔术值返回。但是对于泛型,在中使用了例外Dictionary<,>,而最初没有TryGetValue。见解显然在改变。 显然,Item- TryGetValue和Parse- TryParse偶是有原因的,所以我认为抛出异常的非特殊的故障是在C#4 没有这样做。但是,Try*即使存在,方法也不总是存在Dictionary<,>.Item。

7
爬网时如何成为好公民?
我将要开发一些功能,这些功能将爬网各种公共网站并处理/聚合它们上的数据。没有什么比寻找电子邮件地址更危险的了-实际上,这实际上可能会为他们的网站带来更多流量。但是我离题了。 除了兑现外robots.txt,我是否应该遵循任何书面或不成文的规则或准则,以便(a)避免表现为恶意并可能被禁止,以及(b)对网站所有者/网站管理员没有任何问题? 我可以想到的一些示例可能无关紧要: 并行请求数 两次请求之间的时间 两次爬网之间的时间 避免潜在的破坏性联系(不想成为“ 末日蜘蛛” -但谁知道这是否实际) 但是,那实际上只是吐痰。有没有经过实践检验的智慧,可以广泛地适用于打算编写或利用蜘蛛的任何人?

12
弹性挡片的缺点是什么?[关闭]
看这里:关于制表符和空格的典型圣战。 现在看这里:弹性的制表符。解决了所有问题,并添加了一堆非常有用的新行为。 在制表符与空格讨论中是否甚至提到了弹性制表符?为什么不?弹性制表符的想法是否存在严重的缺陷,以至于没人能在流行的编辑器中实现它们? 编辑:我很抱歉过于强调“为什么他们没有提到”。那不是我真正想要的。这个问题甚至可能是个话题。我真正的意思是,这种做法最大的弊端是什么阻止了广泛采用明显有益的想法?(在一个理想的世界中,一切已经得到支持) (结果是,Microsoft Connect上已经有一个针对Visual Studio实现的弹性制表符的请求,在Eclipse中也有一个请求。此外,还有一个问题询问其他实现弹性制表符的编辑器)

13
注释掉的代码可以成为有价值的文档吗?
我写了以下代码: if (boutique == null) { boutique = new Boutique(); boutique.setSite(site); boutique.setUrlLogo(CmsProperties.URL_FLUX_BOUTIQUE+fluxBoutique.getLogo()); boutique.setUrlBoutique(CmsProperties.URL_FLUX_BOUTIQUE+fluxBoutique.getUrl()); boutique.setNom(fluxBoutique.getNom()); boutique.setSelected(false); boutique.setIdWebSC(fluxBoutique.getId()); boutique.setDateModification(new Date()); boutiqueDao.persist(boutique); } else { boutique.setSite(site); boutique.setUrlLogo(CmsProperties.URL_FLUX_BOUTIQUE+fluxBoutique.getLogo()); boutique.setUrlBoutique(CmsProperties.URL_FLUX_BOUTIQUE+fluxBoutique.getUrl()); boutique.setNom(fluxBoutique.getNom()); //boutique.setSelected(false); boutique.setIdWebSC(fluxBoutique.getId()); boutique.setDateModification(new Date()); boutiqueDao.merge(boutique); } 这里有一个注释行。但是我认为,通过使if和之间的区别显而易见,可以使代码更清晰else。颜色突出显示的差异更加明显。 这样的代码注释掉是个好主意吗?

6
“开发”分支的趋势逐渐消失
我注意到最近在GitHub上一些受欢迎的项目中发现了一些东西,没有develop分支。实际上,GitHub Flow指南也没有提及。根据我的理解,master应该始终保持完全稳定并反映生产。如果开发人员正在研究功能分支,然后master在完成后将其合并到一起,则意味着在一段时间内功能/修复将被合并到其中master,而master分支实际上比生产版本要新。 让团队从中创建功能/修复分支develop,并合并回该分支,然后在下一个版本完全准备发布时,develop将其合并master并创建标签,是否更有意义?想象一下,如果人们直接进入master,并且在生产中报告了一个错误,该错误由于master分支代码库已发生重大变化而变得难以修复。然后,开发人员只需告诉用户要等到下一个版本才能看到问题已解决。 编辑:此问题不同于“分支或不分支”。它专门解决了人们不再使用开发分支的问题以及造成这种情况的原因,因为长期以来,人们一直认为这是最佳实践。
82 git  github 

4
我应该培养什么技能才能成为开发/技术主管?[关闭]
我目前是一名专业程序员。我想扩展自己的技能,但我也想使自己的职业跃升为团队的开发负责人。我知道有很多东西要学习(这不会是一时的事情),但是我认为我很聪明,可以做到这一点,并且我可以应对挑战。 我敢肯定,这里的许多成员可能自己都经历过,现在已经成为成功的开发主管。不幸的是,即使我知道我想提高一些个人领域(知识的深度,知识的广度,技能集等),我也不确定如何开始这样的事情。 作为一名程序员,我应该采取哪些步骤来实现这一目标?我应该优先考虑什么?

11
如何确保我实际上在学习编程而不是简单地学习语言的细节?[关闭]
我经常听到一个真正的程序员可以在一周内轻松学习任何语言。有人告诉我,语言只是完成任务的工具。编程是必须学习和掌握的最终技能。 如何确保我实际上在学习编程而不是简单地学习语言的细节?以及我如何开发可应用于所有语言而不仅仅是一种语言的编程技能?

3
MariaDB和MySQL有什么区别?
MariaDB和MySQL有什么区别?我对两者都不是很熟悉。我主要是前端开发人员。 它们在语法上是否相似?这两种查询语言在哪里不同? 维基百科只提到许可之间的区别: MariaDB是MySQL数据库的社区开发分支,其推动力是由社区维护其在GPL下的自由状态,而不是由Oracle当前拥有的MySQL许可证状态的任何不确定性。

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.