软件工程

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

4
在Git中备份MySQL数据库是一个好主意吗?
我正在尝试改善应用程序的备份情况。我有一个Django应用程序和MySQL数据库。我读了一篇文章,建议在Git中备份数据库。 一方面,我喜欢它,因为它将使数据和代码的副本保持同步。 但是Git是为代码而不是数据而设计的。因此,它会做很多额外的工作来使MySQL每次提交都转储,这并不是必须的。如果我在存储文件之前先对其进行压缩,那么git还会对文件进行区分吗? (转储文件当前未压缩为100MB,压缩后为5.7MB。) 编辑:代码和数据库模式定义已经在Git中了,它确实是我现在担心备份的数据。
57 database  git  mysql  django 

7
伪影是什么意思?
字典将工件定义为: 人工制品,人工制品[ˈttɪˌfækt] n 人为的或定型的东西,例如工具或艺术品,尤其是考古学感兴趣的对象 任何人造的东西,例如虚假的实验结果 (生命科学与相关应用/生物学)细胞学一种在死亡,固定,染色等组织中可见的组织,通常在活组织中不存在的组织 这个词artifact经常出现在软件开发,软件开发周期,工作量估算等中。但是在这种情况下,以上定义对我而言没有意义。 有人可以举一些软件行业的例子来解释这个词吗?

3
您可以更改根据MIT许可证分发的代码,然后根据GPL许可证重新分发吗?[关闭]
是否有可能更改Chili插件的代码(该软件的最新发布时间为2008年7月,并且已获得MIT许可),然后又根据GPL对其进行了许可? 据我所知,对新代码以相同许可证进行许可没有任何限制。真的是这样,还是有最少的变更? 就我而言,我将更改在CMS中执行的普通Javascript代码中的jQuery插件。这基本上意味着: 该代码将不使用“ ChiliBook”命名空间。 该函数将不会以方式调用$($element).chili(),而是以方式调用GlobalObject.ChiliHighlighter.process($jquery_element),其中“ GlobalObject”是CMS中使用的JavaScript对象。 该代码将允许其他模块更改GlobalObject.ChiliHighlighter对象,以添加自GlobalObject.ChiliHighlighter.process()定义功能时调用的功能。 作为替代方案,由于我正在使用的存储库允许我在不再维护代码时包括未根据GPL 2或更高许可授权的代码,是否可以认为该插件不再维护,因为其最新版本是在三年前发布的?

7
是否有“ nor”的关键字或运算符?
是否有一个等于nor的运算符?例如,我最喜欢的颜色既不是绿色也不是蓝色。 该代码将等效于: // example one if (color!="green" && color!="blue") { } // example two if (x nor y) { // x is false and y is false }
56 operators 

5
如果参数在语法上正确但违反业务规则,是否应该返回HTTP 400(错误请求)状态?
假设我有一个采用整数作为参数的REST端点: /makeWaffles?numberOfWaffles=3 在这种情况下,我希望数字是正数,因为我不能将华夫饼的数量设为负数(而请求0个华夫饼是浪费时间)。所以我想拒绝任何不包含正整数的请求。我还想拒绝超过某个最大整数的请求(现在说的是MAX_INTEGER)。 如果有人请求华夫饼的数量为非正数,我应该返回HTTP 400(错误请求)状态吗?我最初的想法是:对我来说,这不是有效的数字,无法完成请求。但是,RFC并未将业务规则作为抛出该规则的理由: 400(错误请求)状态代码表示服务器由于某些原因(例如格式错误的请求语法,无效的请求消息框架或欺骗性的请求路由)而被视为客户端错误,因此服务器无法处理该请求。 业务规则不属于这三个示例中的任何一个。从语法上讲,它是正确的,并且具有正确的框架,并且不是欺骗性的请求路由。 如果参数在语法上正确但违反业务规则,那么我应该返回HTTP 400(错误请求)状态吗?还是有更适合返回的身份?
56 api-design  http 

4
是否有充分的理由在64位计算机上运行32位软件而不是64位?
是否有充分的理由提供针对现代台式机的任何32位版本以及64位版本的任何软件,这些台式机在64位硬件上运行现代64位操作系统? 看来64位软件会更高效,并在需要时允许更高的内存使用率,等等。Apple甚至在手机上使用64位处理器,即使它们只有1-2 GB RAM,也远低于4 GB。 32位CPU的限制。

6
虚假代码重复
通常的本能是删除您在代码中看到的所有代码重复。但是,我发现自己处于一种重复的幻象之中。 为了更详细地描述这种情况:我正在开发一个Web应用程序,并且大多数视图基本上是相同的-它们显示用户可以滚动并从中选择的项目列表,包含所选项目的第二个列表以及“保存” ”按钮以保存新列表。 在我看来,这个问题很容易。但是,每个视图都有其自己的怪癖-有时您需要重新计算某些内容,有时您必须存储一些其他数据,等等。这些我通过在主逻辑代码中插入回调挂钩来解决。 有这么多,它是越来越少维护的,因为我需要为所有基本功能提供回调的观点之间的微小差异,主要逻辑开始看起来像回调调用的一个巨大的序列。最后,我没有节省任何时间或代码,因为每个视图都有自己执行的代码-全部在回调中。 问题是: 差异是如此之细,以至于代码在所有视图中看起来几乎都是相似的, 有这么多的差异,当你看细节,代码是不是有一点相像 我应该如何处理这种情况? 具有完全由回调调用组成的核心逻辑是否是一个好的解决方案? 还是我应该复制代码并降低基于回调的代码的复杂性?

5
您如何估算主要用于解决问题的任务的时间?
虽然有经验的开发人员可以相对容易地估计出在解决了代码所解决的模式和问题时需要花多长时间来实施代码,但是当最终目标得到了很好的理解时,如何才能做出正确的估计呢?实施是95%的理论/问题解决方案,并且实施量很少? 我的工作通常由完成明确目标的任务组成,但是我必须找到实现该目标的方法,直到我理解解决方案为止,它尚不清楚可能存在哪些其他障碍。更具体地说,我经常研究代码生成或自动代码操作工具。解决方案完全解决并完善工具后,它将非常快速地直接完成实际更改的95%。但是,我没有任何方法来估计可能需要解决多少其他问题才能使生成或分析工具处理无法预料的边缘情况。 出于计划目的,我的公司希望更好地了解将花费多长时间,但是由于我不知道在解决解决方案的每个步骤时可能还会遇到多少其他问题。我不确定如何才能给出更好的估计。

5
为什么很少使用反向调试?[关闭]
gdb 在2009年(使用gdb 7.0)中实现了对反向调试的支持。直到2012年我才听说过它。现在,我发现它对于某些类型的调试问题非常有用。我希望我以前听说过。 如果我错了,请纠正我,但我的印象是该技术仍然很少使用,并且大多数人都不知道它存在。为什么? 您是否知道在任何编程社区中普遍使用反向调试? 背景资料: Stackoverflow:反向调试如何工作? gdb使用术语“反向调试”,但是其他供应商使用其他术语来表示相同或相似的技术: Microsoft将其称为IntelliTrace或“历史调试” 有一个称为Omniscient Debugger的Java反向调试器,尽管它可能不再在Java 6中工作 还有其他Java反向调试器 OCaml的调试器(ocamldebug)将其称为时间旅行
56 debugging 

6
何时在.Net中使用弱引用?
我个人没有遇到过需要在.Net中使用WeakReference类型的情况,但是普遍的看法似乎是应该在缓存中使用它。乔恩·哈罗普博士给了反对缓存使用在WeakReferences在他的一个很好的案例回答到这个问题。 我也经常听到AS3开发人员谈论使用弱引用来节省内存占用,但是根据我的交谈,似乎增加了复杂性,而不一定实现预期的目标,并且运行时行为是不可预测的。如此之多,以至于许多人只是放弃了,而是更加谨慎地管理内存使用/优化其代码以减少内存占用(或权衡更多的CPU周期和较小的内存占用)。 乔恩·哈罗普(Jon Harrop)博士在回答中也指出.NET弱引用不是软的,并且在gen0上有激进的弱引用集合。根据MSDN,较长的弱引用使您有可能重新创建对象but the state of the object remains unpredictable.! 考虑到这些特征,我想不出弱引用有用的情况,也许有人可以启发我?

14
保持编程语言向后兼容与修复其缺陷
首先,是一些上下文(您大多数人仍然知道的东西): 每种流行的编程语言都有明显的演变,大多数时候都以其版本标记:您拥有Java 5、6、7等,PHP 5.1、5.2、5.3等。发布新版本可提供新的API,修复错误,添加新功能,新框架等。总而言之:很好。 但是该语言(或平台)的问题呢?如果某种语言存在问题,开发人员要么避免使用(如果可以的话),要么学习忍受它。 现在,这些语言的开发人员从使用它们的程序员那里得到了很多反馈。因此,随着时间(和版本号)的流逝,这些语言中的问题将慢慢但必定会消失,这是有道理的。好吧,不是真的。为什么?向后兼容,这就是原因。但是为什么会这样呢?请阅读以下内容,了解更具体的情况。 我可以解释我的问题的最好方法是使用PHP作为示例: PHP被成千上万的人所喜爱和憎恨。所有语言都有缺陷,但是显然PHP是特殊的。查看此博客文章。它有很多所谓的PHP缺陷列表。现在,我不是PHP开发人员(尚未),但是我通读了所有内容,并且确定列表中的很大一部分确实是真正的问题。(并非全部,因为它可能是主观的)。 现在,如果我是积极开发PHP的人之一,那么我肯定会一一解决这些问题。但是,如果这样做,则依赖于该语言特定行为的代码将在新版本上运行时中断。用两个词概括一下:向后兼容。 我不明白的是:为什么要保持PHP向后兼容?如果我发布了修正了所有这些问题的PHP版本8,就不能在上面发出一个大警告:“不要在该版本上运行旧代码!”? 有一种叫做过时的东西。我们拥有它好多年了,而且行得通。在PHP的背景下:看看这些天来人们如何积极地劝阻这些mysql_*功能的使用(推荐使用mysqli_*PDO和PDO)。弃用工程。我们可以使用它。我们应该使用它。如果它适用于函数,为什么不适用于所有语言? 假设我(PHP开发人员)这样做: 启动新版本的PHP(假设8),并修复所有这些缺陷 新项目将开始使用该版本,因为它会更好,更清晰,更安全等。 但是,为了不放弃旧版本的PHP,我会不断发布更新,修复安全问题,错误等。这出于我未在此处列出的原因是有道理的。这是常见的做法:例如,看看Oracle如何继续更新MySQL 5.1.x版,即使它主要关注5.5.x版。 大约3或4年后,我停止更新PHP的旧版本并使其消失。很好,因为在这3或4年中,无论如何大多数项目都会改用PHP 8。 我的问题是:所有这些步骤是否合理?会很难吗?如果可以做到,那为什么不做呢? 是的,缺点是您破坏了向后兼容性。但这不是值得付出的代价吗?有好处的是,在3到4年内,您将拥有一种可解决90%问题的语言。它的名字将确保它的流行。 编辑:好的,所以当我说3或4年内人们将转向假设的PHP 8时,我没有正确表达自己的意思。我的意思是:3或4年内,如果人们开始使用PHP 8,他们将使用PHP 8。新项目。


8
如何证明或反对“上帝的物体”是错误的?
问题摘要: 长话短说,我继承了代码库和不允许更换的开发团队,使用God Objects是一个大问题。展望未来,我想让我们重构事情,但是我从那些想与God Objects一起做所有事情的团队中得到了回击,“因为它更容易”,这意味着我将无法重构。我以多年的开发经验为后盾,我是受雇来了解这些事情的新老板,等等,第三方离岸公司的销售代表也是如此,现在这是在执行层和我的会议上现在是明天,我想投入大量技术弹药以倡导最佳实践,因为从长远来看,我认为这对于公司而言会便宜得多(而且我个人认为这是第三方所担心的)。 我的问题是从技术角度讲的,我知道它的长期稳定性,但是我在超短期和6个月期限方面遇到了麻烦,尽管我“知道”我无法通过引用和引用的资源来证明这一点。一个人(罗伯特·C·马丁,又名鲍勃叔叔),因为我被告知要从一个人那里获得数据,而只有一个人(罗伯特·C·马丁)的论点不够好。 题: 我可以直接引用一些本领域知名专家的资源(标题,出版年份,页码,报价),这些资源明确表示对“上帝”对象/类/系统的这种使用不好(或很好,因为我们正在寻找)技术上最有效的解决方案)? 我已经做过的研究: 我在这里有很多书,并且已经搜索了它们的索引以查找单词“ god object”和“ god class”的使用。我发现奇怪的是它几乎从未使用过,例如我所拥有的GoF书的副本就从未使用过(至少根据我面前的索引),但是我在下面的两本书中找到了它,但是我想要更多我可以用。 我在Wikipedia页面上检查了“上帝对象”,并且该页面当前是一个存有很少参考链接的存根,因此尽管我个人同意它说,但在个人经历被认为无效的环境中,我没有太多用处。被引用的书也被认为太老了,无法被我在讨论这些技术要点的人们接受,因为他们提出的论据是:“曾经被认为是不好的,但没人能证明它,而现在的现代软件则说:”上帝“对象很好用”。我个人认为这句话是不正确的,但无论事实如何,我都想证明事实。 在罗伯特·C·马丁(Robert C Martin)的“ C#中的敏捷原理,模式和实践”(ISBN:0-13-185725-8,精装本)的第266页中,它指出:“每个人都知道,神的阶级是个坏主意。我们不想将系统的所有智能集中到单个对象或单个功能中。OOD的目标之一是将行为划分和分布到许多类和许多功能中。” -然后继续说有时还是最好还是使用上帝课程(以引用微控制器为例)。 在罗伯特·C·马丁(Robert C Martin)的“清洁代码:敏捷软件技巧手册”第136页(仅此页面)中,谈到了“上帝的阶级”,并称其为违反“阶级应该很小”规则的主要例证。从第138页开始,他使用了“单一责任原则”。 我遇到的问题是,我所有的参考文献和引用都来自同一个人(Robert C. Martin),并且来自同一个人/来源。有人告诉我,因为他只是一个观点,所以我不使用“上帝类”的愿望是无效的,并且未被接受为软件行业的标准最佳实践。这是真的?从技术的角度来看,我是在努力遵循鲍勃叔叔的教导做错事情吗? 上帝对象和面向对象的编程与设计: 我对这一点的思考越多,我就越会在学习OOP时学到更多,而且从来没有明确指出过。它对良好设计的暗含是我的想法(请随意纠正我,因为我想学习),问题是我“知道”这一点,但不是每个人都知道,因此在这种情况下,它不被视为有效的论证,因为当实际上大多数人在统计上都不了解它时,我实际上将其称为普遍真理,因为从统计学上讲大多数人都不是程序员。 结论: 我不知所措,想获得最好的附加结果来引用,因为他们提出了技术要求,并且我想知道真相并能够像真正的工程师/科学家一样被引用证明事实,即使由于我对使用神物的经验,我对神物有偏见。任何帮助或引用将不胜感激。

7
为什么面对std :: string会有这么多的字符串类?
在我看来,许多更大的C ++库最终都创建了自己的字符串类型。在客户端代码,你要么必须使用从库中一个(QString,CString,fbstring等,我相信任何人都可以仅举几例)或保持标准型和一之间进行转换的库使用(其中大部分时间涉及至少一份)。 那么,是否存在某种特定的功能缺陷或某些错误之处std::string(就像auto_ptr语义不好一样)?它在C ++ 11中有变化吗?
56 c++ 

9
英特尔编译器真的比微软编译器好吗?[关闭]
多年前,当我发现英特尔销售与Visual Studio兼容的编译器时,我感到很惊讶。我特别针对C / C ++和出色的诊断工具进行了尝试。但是,代码根本就没有那么多计算量来注意到差异。唯一的印象是:英特尔真的为我真正做到了,哇,令人难以置信的纳秒分辨率的出色工具。但是审判结束了,团队从未认真考虑过购买。 根据您的经验,如果许可成本无关紧要,那么哪个供应商是获胜者? 引发一场圣战不是一个广泛或模糊的问题或动机。这种问题是关于两个非常明显的工具。没有人喜欢工具有任何神秘或惊奇之处。在最佳与最佳之间做出选择始终是痛苦。我也了解草总是绿色的说法。我想听听所有的“假设”故事。 如果Intel仅针对本月的芯片升级进行本地优化,而并非每个硬件目标都能像Microsoft编译的那样正常工作,该怎么办?如果目标是AMD硬件,而一切都会毫无原因地降低速度,该怎么办?或者,另一方面,如果英特尔的硬件拥有如此众多的机会,而微软的编译器编写者却太慢而无法采用,并且从未在编译器中实现它,该怎么办?如果两者完全相同,实际上是将单个代码库包装到两个不同的盒子中并由某个第三方商店授权给这两个供应商,该怎么办? 等等。但是有人知道一些答案。
56 compiler 

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.