软件工程

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

3
在大型软件项目中,如何衡量实践中的复杂性?
在大学中,在我们的算法课程中,我们学习如何精确计算实际使用的各种简单算法(例如哈希表或快速排序)的复杂性。 但是现在在一个大型软件项目中,当我们想使其更快时,我们所要做的只是看各个部分-那里有一些嵌套循环,可以用更快的哈希表代替,这里的慢速搜索可以通过更花哨的技术-但我们从未计算过整个流程的复杂性。 有什么办法吗?还是在实践中人们只是使用快速算法依靠“本地”来使整个应用程序更快,而不是全局地考虑整个应用程序? (因为在我看来,要证明如果您堆积大量已知非常快速的算法,那么最终还是会得到一个整体快速的应用程序。) 我之所以这样问,是因为我的任务是加快别人编写的大型项目的速度,其中许多算法正在交互并处理输入数据,因此我不清楚在单一算法上更快地完成单一算法的影响。整个应用程序。

2
i,j = 1真的令人误解吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 关于在一个内衬中进行多个变量初始化的普遍争论是: 考虑例如int i,j = 1; 这可能会导致某些人错误地认为两个变量都已初始化 我们可以争辩说,某人应该足够了解他的语言的语法,不要对此有所误解。另一个说法可能是,随着开发人员学习了太多的语言,我们可能会在语言之间的特殊性之间犯错误。 但是对于这种非常特殊的情况,我想知道以下内容是否甚至存在一种语法i,j = 1初始化两个变量的语言? 如果不是,则该参数不适用。

2
IComparable接口是否过时/“有害”?
IComparable 仅以一种方式工作 假设您有一Employee堂课。在一个视图中,您要显示所有Employees按名称排序的视图-在另一个视图中按地址显示。您将如何实现?不使用IComparable,至少不是以任何惯用的方式。 IComparable 逻辑错误 通过调用使用该接口.Sort()。在显示Customer按名称排序的视图中,根本没有代码暗示如何进行排序。 另一方面,Customer该类假设如何使用它-在这种情况下,它将在按名称排序的列表中使用。 IComparable 隐式使用 与替代方案相比,很难看到在何处使用了比较逻辑,或者根本看不到。假设您使用标准IDE,并从Customer课堂开始,我将不得不 搜索所有引用 Customer 查找列表中使用的那些引用 检查这些列表是否曾经拜访过.Sort()它们 更糟的是,如果删除IComparable仍在使用的实现,则不会收到任何错误或警告。您将得到的唯一一件事就是在所有难以理解的地方出现错误的行为。 这些问题加在一起,加上需求不断变化 我之所以开始考虑这一点,是因为它对我来说是错的。我已经IComparable在我的应用程序中愉快地使用了两年了。现在,需求发生了变化,事物需要以两种不同的方式进行分类。已经注意到,遍历上一节中描述的步骤并不是一件有趣的事情。 问题 这些问题使我认为IComparable不如IComparer或.OrderBy(),以至于看不到任何其他替代方案无法更好地解决的有效用例。 使用IComparer或LINQ 总是更好吗,还是这里没有我看到的优点/用例?
11 c#  sorting  comparison 

3
如何开始将Git用于来自不同服务器的不同代码库?
背景:最近,我在公司继承了一组项目,并且我试图解决一些基本问题,如如何处理。就是说,以前的开发人员(不再在公司工作)没有使用任何形式的源代码控制,只编写了很少的文档,并且实际上并没有任何好的开发过程。 因此,现在我有了三台服务器,这些项目的价值(开发,暂存,生产)由大多数网站和应用程序以及为我们使用的第三方应用程序和API构建的工具组成,直至存储SQL脚本和其他内容。我的第一个想法是在进行更改和修复之前将所有这些信息都放入Git,但是我很难确定最好的方法。 先前的许多开发都是直接在生产服务器上完成的,这在每个服务器的代码库之间造成了鸿沟。目前尚不清楚所有差异在何处-我看到生产方面的错误修复未保留在开发/阶段中,还有开发中尚未转移到阶段/生产中的新功能。 问题:对我来说,组织这些活动并将其移至Git的最佳方法是什么?我将如何构造我的存储库/分支以适应代码中的差异? 我考虑过从生产服务器代码的克隆中继续进行开发,并将开发/登台代码库保留为历史参考。考虑到我对开发/暂存代码一无所知,这可能是一个起点吗?我可以简单地为每个网站,工具,脚本集等创建生产服务器的存储库,为现有的dev / staging代码创建分支,任何新的开发都将从生产服务器的代码库中分支。这有意义吗?

2
在进行游戏开发时,软件测试是否有所不同?
我在阅读本文对一般和游戏开发软件开发之间的差异,作者提出了一些好点的关于软件测试,并指出,例如,该 ...游戏开发人员不愿使用自动化测试,因为面对游戏设计师不断变化的创意需求,这些测试迅速过时。 因此,这种阅读使我想到,当我们处理/测试游戏时,在软件测试中还有哪些其他方面应该与众不同或特别?有人对此有经验吗,或有人听到过有关此事的其他信息?

2
单元测试以测试域对象的创建
我有一个单元测试,如下所示: [Test] public void Should_create_person() { Assert.DoesNotThrow(() => new Person(Guid.NewGuid(), new DateTime(1972, 01, 01)); } 我声称这里创建了一个Person对象,即验证不会失败。例如,如果Guid为null或生日早于01/01/1900,则验证将失败并且将引发异常(意味着测试失败)。 构造函数如下所示: public Person(Id id, DateTime dateOfBirth) : base(id) { if (dateOfBirth == null) throw new ArgumentNullException("Date of Birth"); elseif (dateOfBith < new DateTime(1900,01,01) throw new ArgumentException("Date of Birth"); DateOfBirth = dateOfBirth; } 这是测试的好主意吗? 注意:我遵循经典方法对单元模型进行单元测试(如果有)。

5
在故事中应该考虑个人能力吗?
我对故事估计的理解是,应该像想象中的普通开发商那样估计故事的大小,这有点像法律上的“合理旁观者”概念。也就是说,如果您必须这样做,则不应该估计故事的大小。 举个例子:在我之前的工作中,我是一个团队的成员,而我是最自信的Ruby开发人员。我的队友通常会估计与Ruby有关的故事要比我估计的要大得多,并带有诸如“好吧,我不知道X在Ruby中如何工作,所以这需要我很多年。” 我反对这一观点的原因是,冲刺计划是团队能力发挥作用的地方。那是正确的说法,“由于大多数任务都是基于Ruby的,而且我们只有一名强大的Ruby开发人员,因此我们的Sprint容量将比平时低一些”。在估计期间将此因素考虑在内会使该方面加倍。 我会很乐意回答任何权威性的参考文献,但是简单的意见也将是很好的。
11 agile  estimation 

5
如何设计例外
我正在努力解决一个非常简单的问题: 我现在正在服务器应用程序上工作,我需要为异常创建一个层次结构(某些异常已经存在,但是需要一个通用框架)。我什至如何开始这样做? 我正在考虑遵循以下策略: 1)出了什么问题? 有人问,这是不允许的。 要求进行某些操作,这是允许的,但由于参数错误而无法使用。 有人问,这是允许的,但是由于内部错误,它不起作用。 2)谁在发起请求? 客户端应用 另一个服务器应用程序 3)消息处理:在处理服务器应用程序时,这全都与接收和发送消息有关。那么,如果发送消息出错了怎么办? 这样,我们可能会得到以下异常类型: ServerNotAllowedException ClientNotAllowedException ServerParameterException ClientParameterException InternalException(如果服务器不知道请求来自何处) ServerInternalException ClientInternalException MessageHandlingException 这是定义异常层次结构的非常通用的方法,但恐怕我可能缺少一些明显的案例。您是否对我不涉及的领域有想法,是否知道此方法的任何缺点,或者是否有更一般的方法来解决此类问题(在后一种情况下,在哪里可以找到它)? 提前致谢
11 design  c++  exceptions  stl 

1
在创建帐户期间,最好自动生成密码并将其发送给用户,还是让用户创建自己的密码?
今天,在与一位同事讨论我们正在研究的网站的“创建帐户”页面时出现了这个问题。 我同事的意见是,我们应该使注册尽可能快速和无缝,因此,我们只需要向用户询问他的电子邮件,然后剩下的就好了。 我同意这个意图,但是对此有一些担忧: 由于我们生成了密码,因此我们有责任确保密码足够安全 以我的经验,当遇到难以理解的密码时,用户可能会将其写下来 没有写下密码的用户很可能会忘记它。这意味着他们必须定期要求输入新密码,这对任何人都不好玩 但是,考虑到用户创建的密码的一般质量,以及太多的人倾向于对所有事物使用相同的密码(“发声者”)的事实,我可以看到为他们生成强密码的意义。 我仍然为此感到痛苦。我们正在商人网站上工作,用户可以选择保存其信用卡详细信息,因此使用最安全的方法显然非常重要。

1
为什么CharSequence不定义contains(CharSequence)?
这适用于Java SE和Android,因为合同是相同的。 Java SE的CharSequence文档 适用于Android的CharSequence文档 CharSequence没有定义contains(CharSequence)方法。我似乎找不到原因,并且包括它非常有用,可以防止需要调用CharSequence#toString()以检查字符序列。 例如,在Android中,用户被迫致电Editable#toString()查看它是否包含字符序列(尽管是Editable实现)CharSequence,但如果CharSequence定义可以避免contains(CharSequence)。 这种设计选择背后的想法是什么?是潜在的监督,还是有设计原因?

5
内存管理语言的参考计数模式?
Java和.NET都为你管理内存美妙的垃圾收集器,方便的方式快速释放的外部对象(Closeable,IDisposable),但只有当他们是由一个单一的对象所拥有。在某些系统中,可能需要由两个组件独立消耗资源,并且仅在两个组件都释放资源时才释放资源。 在现代C ++中,您可以使用来解决此问题,shared_ptr当所有shared_ptr都被销毁时,它将确定性地释放资源。 在面向对象的,不确定的垃圾收集系统中,是否有任何记录的,经过验证的模式来管理和释放昂贵的资源,这些资源没有一个所有者?

2
大型公司如何进行持续整合?
在我的公司中,通常不做任何中间构建来检查每个功能/错误修正分支如何在dev中合并。每天只有一次构建,这总是会引发很多测试失败和构建错误。有人告诉我,为超过1000个开发人员的每次合并进行构建都是不合理的。 因此,我搜索了在拥有那么多开发人员或更多开发人员的公司(Microsoft,Facebook)中如何配置CI,却一无所获。也许内部人士可以告诉我呢?

1
有什么直觉可以支持在Haskell中将Maybe构造函数称为“ Just”?
像这样的可选类型的直觉Maybe Int是:要么没有 Int(因此Nothing存在),要么有一些 Int。那里有东西。 对我来说,我们将类型构造器称为“负数”情况是有意义的Nothing,因为这恰好意味着-那里没有Int。但是,为什么在重点在于实际存在的东西的情况下使用“ 只是 ”一词呢? 对我来说,“ Just”一词的含义是它所描述的事物少于替代事物。与实际存在的事物相反 例如, 你今晚有事吗? B:没有;我只是待在家里看电视。 答:您是否调查过房屋周围令人毛骨悚然的鬼声? B:是的,事实证明它实际上只是一只猫头鹰。 显然,我缺乏这种命名选择所基于的直觉。它是什么?因为对我来说,Just字样与它在Maybe类型中的用法相反。

7
在枚举中具有特殊值“ ALL”是一种好习惯吗
我正在微服务环境中开发一项新服务。这是一个REST服务。为了简单起见,假设路径为:/ historyBooks 此路径的POST方法将创建一个新的历史记录。 假设一本历史书涵盖了一个或多个历史时期。 为简便起见,我们假设我们只有以下人类历史时代: 古 后古典 现代 在我的代码中,我想用来表示它们enum。 方法的主体(有效负载)为JSON格式,并且应包含字段名称eras。此字段是era本书涵盖的值列表。 身体可能看起来像: { "name": "From the cave to Einstein - a brief history review", "author": "Foo Bar", "eras": ["Ancient", "Post Classical", "Modern"] } 在此特定服务中,业务逻辑是: 如果输入中未提供任何时代,则认为本书涵盖了所有时代。 在API审查中,提出了一个建议:为ERAS枚举 包含另一个值ALL,以明确表明已覆盖所有时代。 我认为它有一些优点和缺点。 优点: 显式输入 缺点: 如果提供了列表中的两项,请说ALL和Ancient-从应用程序中获取什么?我想这ALL应该覆盖其他值,但这是新的业务逻辑。 如果我运行查询,对于涵盖特定时代的图书,我将如何代表涵盖所有时代的图书?如果ALL还用于输出(使用相同的逻辑),则用户有责任将其解释ALL为["Ancient", "Post Classical", "Modern"]。 我的问题 我认为拥有新事物ALL比根本没有造成更多的混乱。 你怎么看?您是否要添加此ALL值或不使用它而保留API?
11 rest  api  json  enum 

8
统一编程和数据库查询
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 2年前关闭。 考虑一下面向对象的编程语言(如C ++或Java)的通用教程:创建一个简单的订单处理系统,其中的对象代表帐户,订单,项目等(或多或少的等效对象)。完全具有直觉意义,但餐桌上的大象认为它不是真实的,因为它们是内存中的对象。在实际系统中,帐目,订单等实际上并没有真正存在于内存中,而是存在于数据库中,而内存表示只是它们的短暂镜像。 您可以自己编写很多代码来读取和写入数据库,但这是如此乏味且容易出错,实际上没有人这样做。 每个人最终都使用ORM,但是它们本身就存在问题,以至于著名的论文称它们为“我们行业的越南”。 我认为这不是对象和关系之间的不匹配,而是编程语言和数据库之间的不匹配,因为它们是彼此不了解的独立事物。猜想:解决方案是使用一种既是编程语言又是数据库查询语言的语言,这又将要求语言运行时也是数据库,而JIT编译器也必须是查询优化器。 这就是我所看到的问题的摘要。我的问题是,有没有人, 实际上建立了这样一个统一的系统 尝试过但未能建立这样的统一系统 关于如何构建这样的主题,或者为什么或为什么不这样做,写了很多实质性的文章 提出解决问题的替代方法?

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.