软件工程

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

10
当我从事新工作时,如何在新地方不进行代码审查?
我新公司中的团队没有代码审查流程。 我来自必须进行代码审查的公司,因此,如果没有别人审查我提交的代码,我会感到不自在。 我坚信代码审查是一种提高质量并节省时间的方法,因为它可以尽早发现潜在的问题(请注意,我并不是在谈论结对编程)。 如何显示代码审查不是浪费时间,而是节省时间? 如果您有单元测试,可以跳过代码审查吗?

1
为什么数据库作为队列那么糟糕?[关闭]
我刚刚读了这篇文章,我很困惑。 假设有1个webapp和1个不同的应用程序充当“工作者”,它们共享同一个数据库。 哦,我说“分享” ..但是这篇文章警告了什么?: 第四,在应用程序(或服务)之间共享数据库是一件坏事。在其中放置无定形共享状态太诱人了,在您不知道它的情况下,您将拥有一个巨大的耦合怪物。 =>不同意。在某些情况下,不同的应用程序仍然是同一单元的一部分,因此,在这种情况下,“耦合问题”的概念毫无意义。 让我们继续:Web应用程序处理客户端HTTP请求,并可能随时更新某些聚合(DDD术语),从而生成相应的域事件。 工作人员的目标是通过处理所需的作业来处理那些域事件。 重点是: 事件数据应如何传递给工作人员? 正如阅读的文章所提倡的那样,第一个解决方案是使用RabbitMQ,它是一款出色的面向消息的中间件。 工作流程将很简单: 每当Web dyno生成事件时,它都会通过RabbitMQ发布该事件,从而为工作人员提供帮助。 缺点是,如果不处理潜在的发送失败或硬件问题,则无法保证提交汇总更新和事件的发布之间的即时一致性。这是另一个主要问题。 示例:发布事件可能没有成功进行汇总更新...导致事件代表域模型的错误表示。 您可能会争辩说存在全局XA(两阶段提交),但这不是适合所有数据库或中间件的解决方案。 那么,什么是确保这种即时一致性的好的解决方案?: IMO,将事件存储在数据库中,并且与聚合更新在同一本地事务中。 将创建一个简单的异步调度程序,并负责从数据库查询当前未发布的事件,并将其发送到RabbitMQ,后者再填充工作程序。 但是,为什么还要在webapp端并需要一个额外的调度程序:为什么在这种情况下需要RabbitMQ? 通过这种解决方案,在逻辑上似乎可以不需要RabbitMQ,尤其是因为数据库是共享的。 确实,无论如何,我们都看到即时一致性涉及从数据库进行轮询。 因此,为什么工人不直接对这次投票负责? 因此,我想知道为什么网络上有那么多文章在推广面向消息的中间件时几乎没有批评数据库排队。 文章摘录: 简单,使用正确的工具完成工作:这种情况正在引起消息传递系统的注意。它解决了上述所有问题;不再需要轮询,高效的消息传递,无需从队列中清除已完成的消息以及没有共享状态。 和即时的一致性,被忽略了吗? 综上所述,实际上无论情况如何,无论是否共享数据库,我们都需要数据库轮询。 我错过了一些批评观念吗? 谢谢

9
为什么在科学/工程中经常使用浮点数?
在研究浮点数的准确性时,我在一些地方看到了类似于 “ float和double是(设计 / 经常用于)工程和科学计算 “ 根据我的理解,浮点数和双精度数的强度是它们用于(良好但不是完美的)精度所使用的内存量。 我觉得我几乎从这个答案中得到了理解 “浮点数使您可以为连续数量建模” 我仍然不相信我的理解。工程学和科学听起来都像是您希望从计算中获得精确结果的领域,据我所知,浮点数不会给出。我也不确定我到底遵循什么“连续数量”。 有人可以进一步解释一下,也许举个例子吗?

8
在这里抛出异常是一种反模式吗?
代码审查后,我刚刚讨论了设计选择。我想知道您的意见是什么。 有一个此类Preferences,它是键-值对的存储桶。空值是合法的(这很重要)。我们希望某些值可能尚未保存,并且我们希望通过在请求时使用预定义的默认值对其进行初始化来自动处理这些情况。 讨论的解决方案使用以下模式(注意:显然,这不是实际的代码-出于说明目的而进行了简化): public class Preferences { // null values are legal private Map<String, String> valuesFromDatabase; private static Map<String, String> defaultValues; class KeyNotFoundException extends Exception { } public String getByKey(String key) { try { return getValueByKey(key); } catch (KeyNotFoundException e) { String defaultValue = defaultValues.get(key); valuesFromDatabase.put(key, defaultvalue); return defaultValue; } …


9
如何命名既执行任务又返回布尔值作为状态的方法?
如果有办法 bool DoStuff() { try { // doing stuff... return true; } catch (SomeSpecificException ex) { return false; } } 它应该被称为IsStuffDone()吗? 用户可能会误解这两个名称:如果名称是DoStuff()为什么它返回布尔值?如果名称IsStuffDone()不明确,则该方法是执行任务还是仅检查其结果。 这种情况有约定吗?还是一种替代方法,因为这被认为是有缺陷的?例如,在具有输出参数的语言(如C#)中,可以将布尔状态变量作为1传递给方法,而方法的返回类型为void。 编辑:在我的特定问题中,异常处理不能直接委托给调用者,因为该方法是接口实现的一部分。因此,调用者不必负责处理不同实现的所有异常。它不熟悉那些例外。但是,调用者可以处理自定义异常,如npinti的answer和comment中StuffHasNotBeenDoneForSomeReasonException建议的那样。

1
我非常了解JavaScript,但是我炸毁了编码面试[关闭]
因此,我目前正在寻找担任前端开发人员的新职位。我非常了解JavaScript,并且可以在闭包,库里开发,原型继承,设计模式,应用程序性能和总体前端体系结构方面颇具诗意。但是,我仍然最终轰炸了求职面试。(仅供参考,我面试的大部分工作都是使用某种MVC框架构建SPA) 通常,编码测试只是我从未专业接触过的小代码片段。喜欢写一个函数来解决某种数学问题。除了一手握住手机试图让一个陌生人看到您的屏幕并看着您键入的每个字符的继承笨拙之外,我只是通常在现实世界中看不到这种东西。 这是我所缺乏的一套严肃技能吗?还是面试官在问我无关的问题。我想我应该进行函数式编程和算法印章工作,但是我没有在网络上(或印刷版中)找到许多好的资源有任何建议吗?

10
即使对象污染了其子类的API,也可以使用强制转换的对象吗?
我有一个基础课,Base。它有两个子类,Sub1和Sub2。每个子类都有一些其他方法。例如,Sub1has Sandwich makeASandwich(Ingredients... ingredients)和Sub2has boolean contactAliens(Frequency onFrequency)。 由于这些方法采用不同的参数并且做的事情完全不同,因此它们是完全不兼容的,我不能仅使用多态来解决此问题。 Base提供了大多数功能,并且我有大量的Base对象集合。但是,所有Base对象都是a Sub1或a Sub2,有时我需要知道它们是什么。 执行以下操作似乎是个坏主意: for (Base base : bases) { if (base instanceof Sub1) { ((Sub1) base).makeASandwich(getRandomIngredients()); // ... etc. } else { // must be Sub2 ((Sub2) base).contactAliens(getFrequency()); // ... etc. } } 因此,我想出了一个避免这种情况的策略。 Base现在有以下方法: boolean isSub1(); Sub1 asSub1(); Sub2 asSub2(); …

2
适配器模式和代理模式之间的区别?
据了解,适配器模式正在为我们感兴趣的实际对象创建一个包装对象,只是一个间接的层次,它提供了灵活性。灵活性在于,如果更改了真实对象的接口,那么我们将更改指向真实对象的包装器接口,而使客户端暴露的接口保持不变。 该代理模式是相同的,与每一个代理包装只提供真实对象的功能一致的子集的区别。当我们努力使“一门课为一个目的”超出我范围时,为什么这会有用。 我正确理解了吗?

6
HTTP API是否应该始终返回正文?
关于HTTP API响应是否有某种标准? 看完这篇演讲后,我开始怀疑。我们正在工作中开发公共HTTP JSON API,并且在不需要严格要求时不返回任何内容(例如,当/ OK或相应的4XX或5XX代码返回PUT到/ resource / {id}时仅返回200),但是没有JSON正文) 我们应该返回{"success":true}像他们在上面的链接中讨论的那样的泛型,还是可以返回“ void”主体并使用http响应代码处理所有内容?
33 rest  api-design  http 

3
与纯文本标记语言(例如Microsoft Word)相对,使用开发过程遇到哪些障碍?[关闭]
我目前是政府承包商的实习生,并且(令人讨厌的不可避免)感觉到Word是软件开发过程中的实际标准。 它的二进制格式使我很难像以前在代码库上进行协作的方式在文档上进行协作。使用纯文本标记(使用LaTeX,Markdown,ReStructured Text 等语言))可以使diff友好的文档与开发人员的正常工作流程配合使用。对于不支持该语言的注释(例如Markdown),有许多现有的解决方案允许基于代码库的协作注释(例如GitHub,Bitbucket),可以轻松地将其应用于包含标记的其他纯文本文件。 我了解与技术不熟练的管理人员合作的必要性,需要对所有内容都使用某种图形界面,但是大多数这些格式都存在此类界面。例如,LaTeX有一种名为“ LyX”的“叉子”,可将图形前端放入纯文本形式的类似LaTeX的语法中。尽管该文件在编辑时主要是图形化的,但仍是差异友好的。(它甚至还具有Word样式的注释。)这些解决方案中的许多都可以代替Word使用,并且绝大多数是免费的或开源的。 但是,我们甚至将Word用于我们自己的内部文档,其他人看不到。我们在大部分职业中都使用文本进行工作-为什么文档如此特别?除了琐碎的“我们没有更好的东西,现在我们被困在这里”之外,还必须有支持这种决定的理由。在使用纯文本文档代替其他口语化(且功能上可能不够强大的文档)的方法来代替纯文本文档时,软件开发过程会面临哪些挑战? 由于原因会有所不同,因此应该分别针对这两个紧密相关的场景进行回答。 从一开始就使用纯文本文档 随着时间的推移迁移到纯文本文档

5
分而治之算法–为什么不分成两个以上的部分?
在快速排序和合并排序等分而治之算法中,通常将输入(至少在介绍性文本中)分成两部分,然后递归处理两个较小的数据集。对我来说,如果这两个部分花费的时间少于处理整个数据集的一半,这将使解决问题更快。但是,为什么不将数据集分为三部分呢?四个?n? 我猜想将数据拆分为许多子集的工作不值得,但是我缺乏直觉,无法看到一个应该在两个子集处停止。 我也看到了很多有关3向快速排序的参考。什么时候更快?实际使用什么?

3
在ASP.NET MVC中对控制器进行单元测试是否有真正的价值?
我希望这个问题能提供一些有趣的答案,因为这是困扰我一段时间的问题。 在ASP.NET MVC中对控制器进行单元测试是否有真正的价值? 我的意思是,在大多数情况下(而且我不是天才),我的控制器方法即使在最复杂的情​​况下也是如此: public ActionResult Create(MyModel model) { // start error list var errors = new List<string>(); // check model state based on data annotations if(ModelState.IsValid) { // call a service method if(this._myService.CreateNew(model, Request.UserHostAddress, ref errors)) { // all is well, data is saved, // so tell the user …


6
我想编写一个“最终洗牌”算法来对我的mp3集合进行排序
我正在寻找伪代码建议,以避免标题和艺术家重复的方式对mp3文件进行排序。我听低吟的歌手-弗兰克·辛纳屈(Frank Sinatra),托尼·贝内特(Tony Bennett),埃拉·菲茨杰拉德(Ella Fitzgerald)等歌唱旧唱片。每位歌手都录制许多相同的歌曲-《飞向月球》,《今夜的样子》,《星尘》等。我的目标是安排歌曲(或订购播放列表),并在歌手和歌曲名称之间留出最大的空间。因此,如果我有2000首歌曲,而Ella有20首,我想每100首歌曲只听一次她。如果有10位歌手演唱《飞向月球》,我希望每200首歌曲中听到一次。当然,我想结合这两个要求来创建我的“最终洗牌”。 我知道这是一个相当广泛的问题。我尚未开始对其进行编程,因此我只是在寻找采用一种好的方法的建议。关于均匀间隔其他歌曲属性,我实际上还有一些其他要求,但这里不再赘述。 首先,我正在修改在这里找到的代码,以处理mp3文件和读取ID3标签。 我编写了一个小应用程序,使用下面的parsifal回答可以满足我的需求。我还在这里写了一个后续问题。感谢您的所有好评!

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.