软件工程

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

4
升级时无法修补开源软件吗?
最近,我在集成到应用程序中的开源软件包中遇到了一个令人讨厌的(已确认)错误。根据公共问题跟踪工具,此错误已在该软件的最新版本中得到解决。 有时您需要该错误修复程序来避免对特定模块进行昂贵的重构,但是由于技术和/或政治原因,您将无法升级到最新版本。 在检查所做的代码更改时,此修复程序似乎很简单,我认为可行的选择是自己修补代码并重新编译我当前批准的软件版本,但是批评者希望证明这种情况几乎总是一个坏主意。这是有风险的,并且会带来麻烦的复杂性。 在他们眼中,因为此代码更改仅由我们完成,仅供我们使用,所以它必须是代码库的一部分,这意味着,与其将开源软件作为第三方依赖项引入,我们还必须将其作为一个新项目引入并纳入将其自动构建到我们的构建过程中。 对我来说,我认为这是错误的做法,因为我们会将他们的代码从其源代码控制存储库中提取到我们的代码中,并且在此之前发生的任何代码更改背后,我们都失去了历史。同样,对于需要进行如此小的代码更改而言,这似乎太复杂了。 在这种情况下执行上述操作会不好吗?如果是这样,那么当开源需要改变但仅出于内部利益而改变时,理想的情况是什么?

3
二叉树前后遍历的有用性
这可能很幼稚,但是我想知道,它是所有遍历类型的二叉树(普通树,排序树和平衡树)的上下文: 深度优先预购 深度优先 深度优先后继 广度优先 预购和后购商品的实际用途是什么?我的意思是,是否存在某种类型和/或配置的二叉树,其中前顺序和/或后顺序遍历将比其他两个具有(某些)优势? AFAICS,二进制树的某些类型和配置对于顺序和广度优先的二进制树可能具有一定的优势: 对于平衡二叉树,与深度优先相比,任何深度优先遍历将使用较少的内存存储空间(例如,对于6或7个节点的平衡二叉树,高度为2,因此任何深度优先遍历将需要存储最大值为在任何给定时间有2个节点,而最后一级有3个或4个节点,因此广度优先遍历在某个点最多需要存储3个或4个节点。在这种情况下,使用有序遍历将占用最少的内存,并以其自然顺序访问节点。 对于不平衡的二叉树,如果它接近最坏情况的插入方案,则与深度优先遍历相比,广度优先遍历将减少占用的内存。因此,在这种情况下,广度优先提供了优势。顺序遍历又具有按其自然顺序访问值的优点。 但是,我无法想到在遍历前后都比其他两个更有利的情况。

2
从被测系统中提取类时,应该重构单元测试吗?
我写的这个类做了几件事(也许这违反了单一责任原则)。我现在该项目的其他部分需要意识到一块是逻辑的,我要揭露它是提取的一类了我原来的被测系统的方式。 我期望无需更改任何测试代码即可执行此操作,但是当我完成操作时,您可能会说该测试不再是单元测试。它将测试原始类和我提取的类。换句话说,我将有一个测试用例,但有两个系统正在测试中。 完成后是否应该重构测试代码?IE:创建一个ExtractedClassTest并将所有相关测试从OriginalClassTest移入其中?这似乎有点冒险:我可能会在此过程中失去一些覆盖面,它可能不像移动测试那样简单,并且我最终会重写一些我知道曾经可以使用但无法再使用的测试代码,等等 另一方面,如果按原样保留OriginalClassTest,则可以看到这是测试维护问题。找到ExtractedClass的测试在哪里会有些混乱。您的第一印象将是它不存在。随着时间的推移,随着大量生产代码的重构,这可能会成为一个严重的问题。 我是TDD的新手,所以我需要专家的建议。谢谢!

2
我的小型软件库应该避免使用其他库吗?
我刚刚发布了一个小的Java库,其中仅提供了几个类和方法。自从我使用Maven构建项目以来,我立即使用了几个第三方库来实现我的目标,特别是: commons-lang3(用于一些通用的Java东西) slf4j-api(用于记录) commons-io(用于一小部分文件,我认为一次读取一个文件) 我不希望我的图书馆在别人眼中显得appear肿。我是否应该尝试摆脱对这些库的依赖以最大程度地减少占用空间?在将来考虑使用更多类型的库时,最好避免使用哪种类型的库?
13 java  libraries  maven 

4
费尔南多·科巴托(Fernando J.Corbató)的“受限语言”
Fernando J.Corbató 在1990年的图灵奖演讲中列出了复杂系统不可避免地会失败的原因。在他的结论中,他提出了一些减少故障可能性的建议。他列举了一个想法如下: [U]使用约束语言进行设计或综合是一种强大的方法。通过不允许程序员或设计师表达不相关的想法,可能出现的错误的范围变得更加有限。 他所说的“受限语言”是什么意思? 一会儿我考虑了约束编程。但是,约束编程是关于限制程序的解决方案空间。它是赋予程序员权力的工具。Corbató所指的功能似乎实际上限制了程序员,或者至少使她更倾向于编写简短代码。 我的第二个想法是他指的是保守的编程语言。Corbató因在1960年代和1970年代所做的工作而获得了图灵奖。据我了解,他处理了很多打孔卡。我从未见过打孔卡,所以我当然不知道如何编程,但是我可能会猜到打孔卡编程非常自由。我怀疑类型检查,静态分析等概念根本不存在。因此,Corbató可能是指限制开发人员犯下愚蠢错误的语言概念吗?似乎也不是这样。安全检查和数据建模与简洁性无关,当他提到“不允许...无关紧要的想法”时,这似乎就是他所谈论的话题。


6
为了深刻理解我的技巧(编程),我应该掌握哪些编程概念?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 从重要性的角度出发,如果可能的话,可能的话,了解编程的最重要基础是什么。算法,迭代,递归等? 请注意,我放在哪里等是我的问题所在。我最近在互联网上看到一则帖子,说10个程序员中有9个无法喘息! http://www.codinghorror.com/blog/2007/02/why-cant-programmers-program.html 我想对自己实际上在编程时要完成的工作有深刻的了解,并对我可以使用的基本工具进行详尽的理解。基本上,我希望能够用风的所有颜色绘画。

4
强调否定
我只是在编写带有相当长的属性名称的if语句,并且遇到了这个问题。 假设我们有一个if语句,如下所示: if(_someViewModelNameThatIsLong.AnotherPropertyINeedToCheck == someValue && !_someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant) { //Do something } 第二个属性是布尔类型,像 if(boleanValue == true) 有没有更好的方法来强调否定然后放在!前面。在我看来,在阅读代码时可以很容易地对此进行监督,并且可能会导致调试问题

3
使用单元测试讲故事是个好主意吗?
因此,我有一段时间前编写的身份验证模块。现在,我看到了自己的错误并为此编写了单元测试。在编写单元测试时,我很难想出好名字和好地方进行测试。例如,我有类似的东西 需要Login_should_redirect_when_not_logged_in 需要登录时登录_通过_登录_登录 Login_should_work_when_given_proper_credentials 就个人而言,即使看起来“适当”,我还是觉得它有点丑陋。我也难以通过仅扫描测试来区分测试(我必须至少读取两次方法名称才能知道失败了)。 因此,我认为也许不编写纯粹测试功能的测试,而是编写一组涵盖场景的测试。 例如,这是我想出的一个测试存根: public class Authentication_Bill { public void Bill_has_no_account() { //assert username "bill" not in UserStore } public void Bill_attempts_to_post_comment_but_is_redirected_to_login() { //Calls RequiredLogin and should redirect to login page } public void Bill_creates_account() { //pretend the login page doubled as registration and he made an …

2
“特征蠕变”一词从何而来?
Wikipedia上有一篇有关“功能蠕变”的文章,但没有说明起源。一个谷歌搜索只会导致一些模糊的文章提出了术语称“伯爵富”,但没有太大的备份对这一索赔。2001年有一本关于该主题的迪尔伯特漫画,但这种语气似乎暗示该词已存在。或多或少地由以下事实证实:Google的结果早于2000年。但是,很难找到确切的原产地证明。 那么,如果有的话,谁创造了“特征蠕变”一词呢?它从何而来?

4
与服务器生成的前端应用程序相比,Web应用程序中的客户端/服务器体系结构有哪些优势?
在我们公司中,我们需要在嵌入式Linux平台上构建Web界面。我看到2种选择:您使用一种在服务器端生成HTML和JavaScript的技术(认为JSP,Grails,但它是使用C ++并生成HTML / JavaScript的某种东西),或者您创建了HTML5“客户端”与JSON或XML生成后端对话的应用程序。 我觉得Web应用程序当前倾向于与后者配合使用,但是这样做有什么好处(项目的开发人员选择前者,主要是基于他们比C语言和HTML和Java脚本了解得多的事实)

2
如何在多核处理器上编程线程分配?
我想试验多核处理器上的线程,例如创建一个程序,该程序使用由两个不同处理器内核执行的两个不同线程。 但是,我不清楚线程在哪个级别分配给不同的内核。我可以想象以下情形(取决于操作系统和编程语言的实现): 线程分配由操作系统管理。线程是使用OS系统调用创建的,如果进程恰巧在多核处理器上运行,则OS会自动尝试在不同的内核上分配/调度不同的线程。 线程分配由编程语言实现管理。将线程分配给不同的内核需要特殊的系统调用,但是当我使用该语言的标准线程实现时,编程语言标准线程库会自动处理该问题。 线程分配必须明确编程。在我的程序中,我必须编写明确的代码来检测有多少个内核可用,并使用例如库函数将不同的线程分配给不同的内核。 为了使问题更具体,假设我已经在Windows或Linux上用Java或C ++编写了多线程应用程序。在多核处理器上运行时,我的应用程序会神奇地看到并使用多个内核吗(因为所有内容都由操作系统或标准线程库管理),还是我必须修改代码以了解多个内核?

4
数据库历史记录表/跟踪表
目前,我想构建一个跟踪/历史记录表,如下所示: PrimaryKey-ID OtherTableId-fk fieldName-其跟踪的字段名称 旧值 新价值 用户名 CreateDateTime 因此,基本上,我希望有一个表可以跟踪另一个表的历史记录,并使用新值和旧值存储更改后的字段的列名。我的问题是,有人可以戳破这个漏洞吗?另外,最简单的方法是确保仅将其跟踪表中的列名输入到fieldName列中?目前,我的选择是在要构建的服务中包含一个枚举,或者创建另一个状态表并使fieldName成为fk。还有更好的主意吗? 修改 目标:我们目前只跟踪2个字段。一个字段将显示在网页上以显示历史记录,而另一个字段将仅由一个部门访问,并且他们有权访问他们可以查询的数据库视图。他们将只查询这一字段,以获得有关谁更改了字段以及更改内容的信息。这就是我们想要在数据库字段定义表列的位置而不是具有表记录历史记录的精确副本的地方进行设置的原因。我们只希望跟踪两个字段,以便将来增加或删除字段。 谢谢!
13 database  sql  tracking 

2
我可以在商业网站上使用GPL许可的JavaScript吗?
我正在寻找正在开发的网站上的一些上传功能的plupload。现在plupload已获得GNU GPLv2许可,这意味着所有衍生软件也应获得GPL许可(对吗?)。因此,我通过Minifier运行plupload,单个缩小的js文件将违反许可,并且在请求时,我必须使页面的所有源可用(对吗?)。 我很好奇: 无需开源代码就能使用plupload API? 许可证是否以某种方式排除了缩小的代码? 另请参阅:https : //stackoverflow.com/questions/3213767/minified-javascript-and-bsd-license
13 licensing 

3
如何在我的开源项目中隐藏机密数据?
我有一个开源项目,可以将文件上传到多个文件主机中的DropBox。现在,我正在抓取DropBox的屏幕。要使用他们的API,我必须对他们提供给我的SECRET KEY进行硬编码,以进行OAuth身份验证。但我担心,如果任何人都可以清楚地看到该密钥,它就不会是秘密的。 恶意软件的人有可能使用我的密钥将病毒上传到用户的帐户(已经允许访问我的应用程序),该帐户会传播到他们的PC(如果启用了桌面同步)和其他人的PC(如果他们有共享文件夹)等等。:O 我发现这个未解决的问题与我的问题相同。 但是我想大体上知道在公开源代码项目中如何隐藏机密数据。 我有一个主意。 源代码中是否有占位符,例如“ <SECRET KEY HERE>”,并且仅在构建要发布的二进制文件时才占位?(y!) 有什么体面的主意吗?

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.