软件工程

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

3
当我们可以在C ++中将接口用于相同目的时,PImpl模式有什么意义?
我看到很多在C ++中使用PImpl惯用语的源代码。我假设它的目的是隐藏私有数据/类型/实现,因此它可以消除依赖关系,然后减少编译时间和标头包含问题。 但是C ++中的interface / pure-abstract类也具有此功能,它们也可以用于隐藏数据/类型/实现。为了让调用者在创建对象时只看到接口,我们可以在接口的头中声明一个工厂方法。 比较为: 费用: 接口方式的成本较低,因为您甚至不需要重复公共包装器函数的实现void Bar::doWork() { return m_impl->doWork(); },您只需要在接口中定义签名即可。 很好理解: 每个C ++开发人员都可以更好地理解接口技术。 性能: 接口方式的性能并不比PImpl成语差,两者都需要额外的内存访问。我认为性能是一样的。 以下是伪代码来说明我的问题: // Forward declaration can help you avoid include BarImpl header, and those included in BarImpl header. class BarImpl; class Bar { public: // public functions void doWork(); private: // You …

9
如何将敏捷开发推销给(瀑布式)客户
我们的开发部门确实希望执行更多的敏捷项目,但是在吸引客户方面存在问题。许多客户想要预算和截止日期。当我们的竞争对手提出基于瀑布的固定期限和固定价格时,很难在敏捷项目上出售客户。我们知道他们的固定号码不好,但是客户不知道。因此,我们最终对客户不利,因为我们无法确定价格或期限,但我们的竞争对手可以。 因此,如何使您的销售人员成功销售使用敏捷开发方法的项目或使用此类方法开发的产品?我发现的所有信息似乎都集中在项目管理和开发人员上。
49 agile 

1
为什么Go中有“新功能”?
我仍然对为什么要new加入Go 感到困惑。 当您要实例化结构时,您可以 t := Thing{} 您可以通过执行以下操作获取指向新实例的指针 t := &Thing{} 但是也有这种可能性: t := new(Thing) 最后一个似乎与其他语言有些异。&Thing{}就像new(Thing)它一样简洁明了,它仅使用您经常在其他地方使用的结构。当您将其更改为&Thing{3}或时, 它也可以扩展&Thing{Feets:7}。 在我看来,使用补充关键字1代价很高,它使语言更加复杂,并增加了您必须了解的内容。它可能对新手来说掩盖了实例化一个结构的背后。 它还使另一个保留字。 那么背后的原因是new什么?有时有用吗?我们应该使用它吗? 1:是的,我知道它不是语法级别的关键字,您可以对其进行阴影处理,但这并不会改变它对于合理的开发人员来说是保留字的事实。
49 go 

4
使用Github和Heroku时如何处理敏感数据?
我还不熟悉Git的工作方式(想知道Linus之外是否还有人;)。 如果使用Heroku托管应用程序,则需要在Git存储库中检查代码。如果您从事开源项目,则更有可能在Github或其他Git主机上共享此存储库。 有些事情不应该在公共仓库中检查;数据库密码,API密钥,证书等...但是这些东西仍需要作为Git存储库的一部分,因为您使用它将代码推送到Heroku。 如何使用该用例? 注意:我知道Heroku或PHPFog可以使用服务器变量来规避此问题。我的问题更多是关于如何“隐藏”部分代码。
49 git  github  heroku 

7
为什么分号和逗号在for循环中互换?
在许多语言中(从C到JavaScript的广泛列表): 逗号,分隔参数(例如func(a, b, c)),而 分号;分隔顺序指令(例如instruction1; instruction2; instruction3)。 那么,为什么要使用相同的for循环语言来反转此映射: for ( init1, init2; condition; inc1, inc2 ) { instruction1; instruction2; } 而不是(对我来说似乎更自然) for ( init1; init2, condition, inc1; inc2 ) { instruction1; instruction2; } ? 当然,for(通常)不是一个函数,但是参数(即init,condition,increment)的行为更像指令序列的函数的参数。 是由于历史原因/惯例造成的,还是in ,和;in循环互换的合理依据?

12
如何处理有关WCF与Web API的技术争论?
我现在正在管理一个由15名开发人员组成的团队,而我们在选择技术时陷入了困境,该团队被分为两个完全相反的团队,就WCF与Web API的使用进行了辩论。 支持Web API使用的团队A提出了以下原因: Web API只是编写服务的现代方式(Wikipedia) WCF是HTTP的开销。这是TCP,Net Pipes和其他协议的解决方案 由于[DataContract]和[DataMember]以及这些属性,WCF模型不是POCO SOAP不像JSON那样可读性强 与JSON(通过HTTP传输)相比,SOAP是网络的开销 没有方法重载 支持WCF使用的团队B说: WCF支持多种协议(通过配置) WCF支持分布式事务 WCF有许多很好的例子和成功案例(虽然Web API仍然很年轻) 双工非常适合双向通讯 这场辩论仍在继续,我现在不知道该怎么办。我个人认为,我们应该仅在正确的使用位置使用工具。换句话说,如果我们想通过HTTP公开服务,则最好使用Web API,而在TCP和Duplex方面则要使用WCF。 通过搜索互联网,我们无法获得可靠的结果。支持WCF的职位很多,但相反,我们也发现有人对此表示抱怨。我知道这个问题的性质听起来可能有争议,但是我们需要一些好的提示来决定。我们处于一个偶然地选择技术可能会让我们后悔的时机。我们想睁大眼睛选择。 我们的用法主要用于Web,我们将通过HTTP公开我们的服务。在某些情况下(例如5%到10%),我们可能需要分布式事务。 我现在应该怎么办?如何以建设性的方式处理这场辩论?
49 wcf  decisions  web-api 

10
什么时候“适当的”编程不再重要?
我在业余时间一直在开发一款Android游戏。它使用的是libgdx库,因此为我完成了很多繁重的工作。 在开发过程中,我不小心为某些过程选择了数据类型。我使用哈希表是因为我想要一些接近关联数组的东西。可读键值。在其他地方要实现类似的目的,我使用向量。我知道libgdx具有vector2和vector3类,但是我从未使用过它们。 当我遇到奇怪的问题并在Stack Overflow上寻求帮助时,我看到很多人只是在技术上“合适”另一个问题时就对使用某种数据类型的问题进行了讨论。就像使用ArrayList一样,因为它不需要定义的范围,而与使用新的已知边界重新定义int []一样。甚至像这样琐碎的事情: for(int i = 0; i < items.length; i ++) { // do something } 我知道它每次迭代都会评估item.length。但是,我也知道项目永远不会超过15到20个项目。因此,我是否应该在每次迭代中评估items.length? 我进行了一些测试,以查看应用程序使用我刚刚描述的方法相对于正确方法的性能,并按照教程进行操作,并使用社区建议的确切数据类型。结果:一样。平均45 fps。我打开了手机和银河标签上的每个应用程序。没有不同。 所以我想我对您的问题是:是否不再需要适当的门槛?可以说-“只要完成工作,我不在乎?”


9
关于“告诉,不要问”如何被认为是好的面向对象的解释
这篇博文已在Hacker News上发表,并有几篇推荐。来自C ++的大多数示例似乎与我所教的内容背道而驰。 例如示例2: 坏: def check_for_overheating(system_monitor) if system_monitor.temperature > 100 system_monitor.sound_alarms end end 与好: system_monitor.check_for_overheating class SystemMonitor def check_for_overheating if temperature > 100 sound_alarms end end end C ++中的建议是,您应该更喜欢自由函数而不是成员函数,因为它们会增加封装性。两者在语义上是相同的,那么为什么更喜欢可以访问更多状态的选择呢? 范例4: 坏: def street_name(user) if user.address user.address.street_name else 'No street name on file' end end 与好: def street_name(user) user.address.street_name end …

9
Linux上用于C ++和C开发的IDE的比较:KDevelop,Eclipse,NetBeans,CodeBlocks和Anjuta
我想指出您在Linux上使用全尺寸IDE的经验。 我个人主要与一起工作vim,但是其他程序员希望看到一个真正的IDE。因此,在以下情况下,我想听听您对不同IDE的个人看法以及它们之间的比较: C ++,也许还有一些C开发(不是Java,Python和其他东西) 服务器端编程(无需GUI开发) 在Linux上工作而不是“跨平台”开发。 需要考虑的意见: 它的稳定性如何?如果IDE崩溃,则不需要它。 使用舒适。 强大的调试功能。 与各种构建系统集成 大型项目(数十万行代码的项目)的可伸缩性 我曾经使用过KDevelop,它是一个非常不错的IDE,似乎KDevelop 4是一个巨大的进步。似乎还有许多人宁愿使用Netbeans和Eclipse。
49 c++  ide  linux 

11
自动化测试的缺点是什么?
这个站点上有许多问题,可以提供有关自动测试可以带来的好处的大量信息。但是我没有看到代表硬币另一面的东西:缺点是什么?生活中的所有事情都是折衷方案,没有万灵药,因此,一定有一些正当理由不进行自动化测试。这些是什么? 以下是我提出的一些建议: 给定功能需要更多的初始开发时间 需要团队成员更高的技能水平 增加工具需求(测试执行者,框架等) 遇到失败的测试时,需要进行复杂的分析-该测试是由于我的更改而过时还是在告诉我我做错了? 编辑 我应该说我是自动化测试的坚定支持者,并且我不希望这样做。我想了解缺点是什么,所以当我去公司提出理由时,我看起来好像并没有扔下一个想象中的银弹。 另外,我明确地是不希望有人对我的上述示例提出异议。我确实认为必须存在一些不利因素(所有因素都需要权衡),我想了解它们是什么。

21
多年未完成学位的经验?[关闭]
我目前在实习期间,为一家出色的软件开发公司工作。我一直打算通过大学进入这个阶段,获得足够的学术经验以及当年的学位,然后尝试获得全职编程工作而无需完成我的学位。我从很早就决定了这一点,因为我从未真正喜欢过整个大学环境。我上大学的时候非常不开心,现在我就读大学很开心,我真的不知道我是否可以回去。 我的问题是,如果我在入职一年后申请其他工作,并且不因未完成学业而受到惩罚,您认为公司会接我吗? 我想在这一天结束时,我不想回首我的生活,并认为“上帝,为什么没有我只花一年以上不快乐有一份自己喜欢的”,但我知道,即使我拿到学位,我仍然没有编程工作就可以毕业,这让我比什么都更加担心。

13
重新创建/开源您先前为另一家公司编码的程序是否合法
在我之前的工作中,我创建了一个通用的仪表板来自动化任务,事实证明它非常有用-当然,我以前的老板拥有我在那工作时编写的所有代码。现在,我不再在那里了,从内存中重新创建仪表板并将代码开源对我来说合法吗?如果我确实重新创建它,则代码(也许2k-3k行)可能与原始代码几乎相同,因为我的记忆力非常好,并且倾向于遵循我通常的编码风格和命名约定。 编辑:更多背景知识-这是一个相当通用的软件,仅由一家全球性公司中的一个小型团队(<10)在内部使用。“公司”甚至都不知道这个系统,因为它是我主动创建的。它基于python / django构建。几乎相同的意思是,例如django模型将具有相同的名称/字段,视图将使用类似的查询来返回相同的对象集。

10
我不想签署的NDA的法律问题[关闭]
我的现任雇主已给我一份保密协议(NDA),以供我签署,我不想签署。它的开放性令人难以置信,我认为这应该是我三周前签署的初次雇用协议的条件。 该文档以“包括但不限于”和“直接或间接”的形式包含许多定义。 同样,它指出: 我同意任何违反合同的行为都会对公司造成无法弥补的损害(我同意违反行为可能会对公司造成损害,但不一定造成无法弥补的损害)。 如果将来要对文档进行任何修改,并且我拒绝签署该修改条款,因为我将违反其条款。 在公司任职期间,我开发的所有东西都是其财产(忽略说我在自己的时间上发展的,是否与我的工作完全不同,是我自己的)。 在公司终止工作后,我将被要求继续在那里工作以协助其软件的完善,这样,在我受雇后的一年中,我将不被允许在该公司直接或间接地执行与我的工作直接或间接相关的任何工作。公司结束了(我是否不能在一年内设计软件?)。 如果公司决定因违反合同而起诉我,我同意不为自己辩护,并且文件中的所有条款都将转移给任何未经我同意购买我工作的公司的公司。 简而言之,他们将合法拥有我一生,并可能以他们认为合适的任何理由绝对摧毁我。 我可以使用任何法律论据来捍卫自己免于签订合同吗?例如,NDA不是我最初的雇用协议的一部分,还是该文件是故意摘要和含糊不清的事实,以使他们可以随意填写空白? 该公司将其全部源代码托管在一个使用可公开访问的SCM的站点上,并且极大地使用了开源软件-我有机会接触合法地被视为“商业秘密”或“机密信息”的信息”,“我身材苗条,为什么我需要签署保密协议?我不相信那里的许多员工实际上在签下NDA之前就花了一些时间来了解NDA,并且知道其中一些人没有。 该协议的条款在软件工程界中是否司空见惯?

15
如何处理耗时超过一个冲刺的重构?
我使用的代码库超过50万行代码。迫切需要重构。已经确定了重构工作将比正常的两周冲刺花费更长的时间。正如我在本网站上的其他答案所建议的那样,这些不能分解成较小的任务。产品需要在迭代结束时工作,并且部分重构将使系统处于无法使用的状态,因为项目之间的依赖关系非常糟糕。那么解决这一障碍的最佳方法是什么?我再次提到,将其分解成较小的部分不是一个选择,这已经完成了。 更新:人们似乎需要解释为什么这不能适合2周的冲刺。冲刺中涉及的不仅仅是编写代码。我们的政策是没有测试就没有代码。该策略并不总是存在,并且代码库中的很大一部分都没有。另外,我们的某些集成测试仍然是手动测试。问题不在于重构本身如此之大。事实是,小的更改会影响系统的许多部分,因此我们需要确保这些部分仍然可以正常运行。 因为我们有每月的修补程序,所以我们不能推迟或延长冲刺。因此,经过sprint的更改无法停止将其他工作添加到此修补程序中。 重构与重新设计:仅仅因为我们的开发过程效率不足,无法在两周的周期内完成此重构,所以不能保证将其重命名为重新设计。我想相信,随着我们流程的改进,将来我们可以在两周的周期内完成完全相同的任务。这里讨论的代码很长时间都不需要更改,并且相当稳定。现在,随着公司的发展方向变得更加适应变化,我们希望代码库的这一部分与其余部分一样具有适应性。这需要重构。根据这里的答案,很明显,在正常的sprint的时间范围内缺少必要的脚手架来进行此重构。 回答: 我将采用科宾·马奇(Corbin March)首次提出的分支与合并方法,以便我们可以更多地了解这些问题领域以及如何识别缺失的测试。我认为,向前迈进,我们应该采用Buhb建议的方法,确定缺少测试的区域并先实施这些区域,然后再进行重构。这将使我们能够保持正常的两周冲刺周期,就像这里的许多人一直在说的那样,重构应该总是如此。

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.