软件工程

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

5
解释还是编译:有用的区别?
在这里,有关解释型和编译型语言工具的问题很多。我想知道区别实际上是否有意义。(实际上,问题通常是关于语言的,但是他们实际上是在考虑那些语言的最流行实现)。 今天,几乎没有任何实现被严格解释。即几乎没有人解析并一次运行一行代码。另外,编译成机器代码的实现也越来越不常见。编译器越来越多地将目标对准某种虚拟机。 实际上,大多数实施都集中在相同的基本策略上。编译器生成字节码,该字节码通过JIT解释或编译为本地代码。它实际上是传统的编译和解释思想的结合。 因此,我问:如今,解释的实现和编译的实现之间是否有有用的区别?



2
重命名开放源代码分叉的礼节是什么?
我想在Github上使用TestNG Java测试框架(Apache 2许可),以便我可以添加/更改一些次要的东西以满足我的需要。 我的所有更改都不太可能会在主项目中获得批准,也不太可能其他人会使用我的fork。这绝不是对主要项目的竞争。 现在,在命名方面,我想更改工件名称(testng-mycompany)或版本(6.8.mycompany),以便与我的Maven存储库中的正式版本没有混淆。这会被认为是不良的礼节吗?如果是,区分叉子的最佳方法是什么?

9
运算符前后的换行符[关闭]
尽管Sun的Java代码约定建议将换行符放在操作员之前,但许多其他准则也对此表示反对。我看不出任何明显的利弊,因此使用其中一种样式相对于另一种样式是否有优势? String longVarName = a + b + c + d + e + f; 与 String longVarName = a + b + c + d + e + f;

3
可选参数或重载的构造函数
我正在实现DelegateCommand,当我要实现构造函数时,我想到了以下两种设计选择: 1:具有多个重载的构造函数 public DelegateCommand(Action<T> execute) : this(execute, null) { } public DelegateCommand(Action<T> execute, Func<T, bool> canExecute) { this.execute = execute; this.canExecute = canExecute; } 2:只有一个带有可选参数的构造函数 public DelegateCommand(Action<T> execute, Func<T, bool> canExecute = null) { this.execute = execute; this.canExecute = canExecute; } 我不知道使用哪个,因为我不知道这两种建议的方式都有哪些优点/缺点。两者都可以这样称呼: var command = new DelegateCommand(this.myExecute); var command2 = …

8
方法:为另一个开发人员编写单元测试
我当时在考虑软件开发和编写单元测试。我有以下想法: 假设我们有一对开发人员。每对负责一部分代码。一对中的一个实现了一个功能(编写代码),第二个为此编写了单元测试。测试是在代码之后编写的。以我的想法,他们互相帮助,但工作却分开。理想情况下,它们将处理两个相似大小的功能,然后交换以进行测试准备。 我认为这个想法有一些好处: 测试是由某人编写的,可以看到更多有关实施的信息, 工作应该比配对编程要快一些(同时具有两个功能), 测试和代码都有负责的人, 代码至少要经过两个人的测试,并且 也许搜索正在测试您的代码的人编写的代码中的错误将为编写更好的代码和避免偷偷摸摸的行为提供特殊动机。 在代码和测试开发之间添加另一个开发人员进行代码审查也许也是个好主意。 这个想法有什么弊端?它已经被描述为某种未知的方法论并用于软件开发吗? PS。我不是专业的项目经理,但是我对项目开发流程有所了解,并且知道一些最受欢迎的方法-但是这个想法对我来说并不熟悉。

6
将个人Python项目变成可发布的库
我是一名学者,而不是程序员,并且我有多年编写供自己使用的Python程序以支持我的研究的经验。我的最新项目可能对我和其他许多人都有用,并且我正在考虑将其作为开源Python库发布。 但是,从运行中的个人项目到可以被其他人轻松安装和使用的库,似乎有许多障碍需要克服。这个问题是关于我应该开始着手公开发布的第一步。 目前,我只有一个git存储库,其中包含使用该库以及该库本身的代码,并且我将git用作紧急撤消按钮,以防万一发生任何问题。所有这些对于单个用户都可以正常工作,但是如果我要释放它,显然不合适。我要结束的地方是我的库位于单独的存储库中,并且可以由其他人使用来安装pip,并且具有稳定的API。 一旦我想发布它,学习使用setuptools等可能就不那么困难了-我的问题是知道如何工作才能达到这一点。 所以我的问题是,为了开始准备供公众使用的Python库项目,应该采取的第一步步骤是什么?我应该如何重组我的目录结构,git仓库等,以便开始努力公开发布该库? 更一般而言,如果首次尝试使用已知有帮助的资源,那将非常有帮助。指向最佳实践和避免错误的指针等也将非常有帮助。 需要澄清的是:当前的答案是按照“如何使我的Python库成为其他人可以使用的好库?”的方式来解决一个问题。这很有用,但是与我要提出的问题不同。 我目前正处于发布项目的漫长旅程的开始。我的实现的核心工作正常(并且工作得很好),但是我对即将进行的大量工作感到不知所措,并且我正在寻找有关如何进行流程导航的指导。例如: 我的库代码当前已耦合到我自己的使用它的特定于域的代码。它位于子文件夹中,并且共享相同的git存储库。最终,需要将其制作成一个独立的库并放入其自己的存储库中,但是由于我不知道如何做,所以我一直在拖延。(既不是如何在“开发模式”下安装库以使我仍然可以对其进行编辑,也没有如何使两个git仓库保持同步。) 我的文档字符串很简洁,因为我知道最终我将不得不使用Sphinx或其他工具。但是这些工具似乎并不容易学习,因此这成为一个主要的子项目,我一直推迟进行。 在某些时候,我需要学习使用setuptools或其他工具来打包它并跟踪依赖项,这非常复杂。我不确定现在是否需要这样做,并且该文档对于新用户来说绝对是个迷宫,因此我决定以后再做。 我从来不需要进行系统的测试,但是我肯定会对此项目进行测试,因此,我必须(i)了解足够的测试知识,以了解哪种方法适合我的项目;(ii)了解哪些工具可用于我选择的方法;(iii)学习使用我选择的工具;(iv)为我的项目实施测试套件等。这本身就是一个项目。 我可能还有其他事情要做。例如,jonrsharpe发布了一个有用的链接,其中提到了git-flow,tox,TravisCI,virtualenv和CookieCutter,我以前从未听说过。(该帖子来自2013年,所以我还必须做一些工作来找出仍有多少钱。) 当您将所有这些放在一起时,这是一项巨大的工作,但是我敢肯定,如果我坚持不懈地完成工作,那么我就可以完成所有工作,而且我不着急。我的问题是知道如何将其分解为可管理的步骤,一次可以完成。 换句话说,我要问的是我现在可以采取哪些最重要的具体步骤,以便最终获得可发布的产品。如果我有空闲的周末,我应该关注哪些事情?哪一个(如果有的话)可以与其他人孤立地完成,这样我至少可以完成一个步骤而无需做整个事情?学习这些东西最有效的方法是什么,这样我仍然有时间专注于项目本身?(请记住,所有这些本质上都是一项业余项目,而不是我的工作。)我是否真的不需要做任何事情,从而为自己节省了大量时间和精力? 非常感谢所有答案,但是我特别欢迎关注这些项目管理方面的答案,尤其是对现代Python开发的引用。

7
常数值可以随时间改变吗?
在开发阶段,某些变量需要在同一运行中进行固定,但可能需要随时间进行修改。例如boolean,使用信号通知调试模式,因此我们可以在程序中执行通常不会执行的操作。 在常量中(例如,final static int CONSTANT = 0在Java中)包含这些值是否不好?我知道常量在运行时保持不变,但是在整个开发过程中,除了计划外的更改之外,常量也应该保持不变吗? 我搜索了类似的问题,但没有找到与我完全匹配的任何内容。
28 const  constants 

4
在开发过程中使用#ifdef在不同类型的行为之间切换
在开发过程中使用#ifdef在不同类型的行为之间进行切换是一种好习惯吗?例如,我想更改现有代码的行为,我有几个想法如何更改行为,并且有必要在不同的实现之间切换以测试和比较不同的方法。通常,代码更改很复杂,并且会影响不同文件中的不同方法。 我通常会介绍几个标识符并执行类似的操作 void foo() { doSomething1(); #ifdef APPROACH1 foo_approach1(); #endif doSomething2(); #ifdef APPROACH2 foo_approach2(); #endif } void bar() { doSomething3(); #ifndef APPROACH3 doSomething4(); #endif doSomething5(); #ifdef APPROACH2 bar_approach2(); #endif } int main() { foo(); bar(); return 0; } 这样就可以在不同的方法之间快速切换,并且仅用一份源代码即可完成所有操作。是发展的好方法还是更好的做法?

2
SQL Server中的NoSQL
这个问题与SQL和NoSQL之间的区别无关。我正在寻找一些目前对我来说实际上毫无意义的理由(可能是由于我缺乏理解或欣赏)。 我们从头开始使用MVC5,Entity Framework 6代码和SQL Server 2008开始了一个新项目。当架构师检查数据库架构时,声明应该删除所有外键和其他此类约束,因为这是“业务逻辑”,并且应该在应用程序代码的业务层中应用。 我的观点是,外键构成数据/引用完整性的一部分,并不能真正模仿业务逻辑。我将业务逻辑视为控制引用什么/何时/如何/为什么应用引用的过程和验证。我可以理解唯一的约束可以说是业务流程,但是对我而言,这只是逻辑的补充,并构成完整性的一部分。 第二个论点是目标是对数据采用NoSQL方法。我发现这确实是不寻常且不合常规的:考虑到使用SQL Server 2008,报告的需要,数据无法扩展到TB级以及缺乏对诸如Mongo,Raven等技术的考虑。 有人遇到过这种情况吗?为什么有人在为参考数据设计的SQL Server中采用NoSQL方法而不想要外键?
28 sql  sql-server  nosql 

6
为什么不能检查互斥锁是否已锁定?
C ++ 14似乎省略了一种检查an是否std::mutex被锁定的机制。看到这样的问题: https://stackoverflow.com/questions/21892934/how-to-assert-if-a-stdmutex-is-locked 有几种解决方法,例如通过使用; std::mutex::try_lock() std::unique_lock::owns_lock() 但是这些都不是特别令人满意的解决方案。 try_lock()如果当前线程已锁定互斥锁,则允许返回假阴性,并且具有未定义的行为。它也有副作用。owns_lock()需要unique_lock在原始的基础上进行构造std::mutex。 显然我可以自己动手,但我宁愿了解当前界面的动机。 std::mutex::is_locked()对我来说,检查互斥对象状态的能力似乎并不神秘,因此我怀疑标准委员会故意忽略了此功能,而不是疏忽大意。 为什么? 编辑:好的,也许这个用例并不像我预期的那么普遍,所以我将举例说明我的特殊情况。我有一个分布在多个线程上的机器学习算法。每个线程异步运行,并在完成优化问题后返回到主池。 然后锁定主互斥锁。然后,该线程必须选择一个新的父代来从其变异后代,但只能从当前没有其他线程正在优化的后代的父代中选择。因此,我需要执行搜索以找到当前未被另一线程锁定的父母。由于主线程互斥锁已锁定,因此互斥锁的状态不会在搜索过程中发生变化。显然,还有其他解决方案(我目前正在使用布尔标志),但是我认为互斥锁为该问题提供了一种逻辑解决方案,因为它存在于线程间同步的目的。
28 c++ 

7
如何有效地监控代码审查?
我怀疑主要代码审查会掩盖我的团队。太多的代码审阅合并而没有任何注释。 在我看来,没有评论就没有代码评论。 作为团队的领导者,我如何才能正确地监视我的团队正在执行正确的代码审查过程,以及如何帮助他们最大化过程的收益? 更新资料 以为人们可能想知道任何更新。我尝试了很多在这里给出的建议。大多数已经在使用中。有些帮助。但是,问题仍然存在-当我不看时,有些人不断收到错误代码。 我发现代码审查监视没有提供给我的团队工具以使他们的代码从一开始就更好的帮助。 因此,我添加了一个名为“ jscpd”的库来检测复制粘贴。复制粘贴时构建失败。这立即消除了一个问题。 接下来,我们将尝试代码气候。 我还要对旧代码审查进行一次人工审查,每次冲刺需要半天。我正在将todos 转换为问题/票证-我发现人们正在写它们,但以后再也不会处理它们。我还将与整个团队开会,以在适当时检查代码。 总的来说,我们在朝着正确的方向前进。

8
如何反对降低传统代码库的质量标准?[关闭]
我们这里有一个庞大的遗留代码库,其中包含您无法想象的错误代码。 现在,我们定义了一些质量标准,并希望在全新的代码库中实现这些标准,而且还可以通过触摸旧代码来实现。 而且,我们使用Sonar(代码分析工具)来执行这些操作,而Sonar已经有数千次违规。 现在开始讨论降低对遗留物的侵犯。因为它是遗产。 讨论是关于可读性规则。像它可以有多少个嵌套的ifs / for..。 现在,我该如何反对降低传统代码的编码质量?

3
内核模式Web服务器:明智的优化还是安全的噩梦?
我正在阅读一个黑客新闻主题,其中一个用户发布了2011年的链接,解释说IIS比大多数其他(* nix)Web服务器要快得多。另一位用户回答,解释说IIS通过拥有名为HTTP.sys的内核模块而获得了这一优势。据我所知,2015年大多数其他流行的Web服务器都没有这样做。 我永远都不想写一个内核模式的Web服务器,因为我永远不相信自己让它摆脱安全漏洞(在较低防护等级下运行不会那么严重)。 从软件工程师(相对于Web服务器的客户)的角度来看,以内核模式运行是否是明智的性能决策?是否可以在应用程序开发中减轻安全隐患,以使内核模式服务器成为消费者的纯利?

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.