软件工程

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

3
使用BDD时如何使用单元测试?
我试图了解BDD。我读过一些文章,据我了解,BDD是TDD的“下一步”。我之所以这么说是因为我发现两者非常相似,并且正如我在本文中所读到的那样,BDD是TDD的改进。太好了,我真的很喜欢这个主意。 我没有想到一个实用的观点:有一个.feature文件,BA将在其中写入系统将具有的所有预期行为。作为一名学士学位,他不知道系统的构建方式,因此我们将编写如下内容: +方案1:帐户已入帐+ 鉴于该帐户已贷记 而且卡是有效的 而且分配器中有现金 当客户要求现金时 然后确保帐户已借记并确保已分配现金 并确保卡已归还 好的,这很不错,但是系统中的许多部分都可以进行协作,以便可以实现(例如Account obj,Dispenser obj,Customer obj等)。在我看来,这就像一个集成测试。 我想进行单元测试。我如何测试检查分配器是否有钱的代码?还是分配了现金?还是该帐户在需要时借记? 如何将单元测试与“ BA创建”测试混合?
17 unit-testing  bdd 

4
为什么UTF-8在其编码中浪费了几位
根据Wikipedia的文章,UTF-8具有以下格式: 首码尾码字节字节1字节2字节3字节4 点点使用 U + 0000 U + 007F 1 0xxxxxxx U + 0080 U + 07FF 2 110xxxxx 10xxxxxx U + 0800 U + FFFF 3 1110xxxx 10xxxxxx 10xxxxxx U + 10000 U + 1FFFFF 4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx x表示该位用于选择代码点。 这在每个连续字节上浪费了两位,而在第一个字节上浪费了一位。为什么未对UTF-8进行以下编码? 首码尾码字节字节1字节2字节3 点点使用 U + 0000 U + …

4
为什么在Java中没有“仅子类”访问修饰符?
在Java中,方法有四个可用的访问修饰符: public -任何类都可以使用此方法。 protected -同一包中的类和任何包中的子类都可以使用此方法。 private -只有此类可以使用此方法。 no modifier (“包私有”)-只有同一包中的类才能使用此方法。 经常发生的事情是,我想在超类中拥有所有子类都可以使用的有用方法。但是其他类访问此方法没有任何意义,从某种意义上说,它将破坏封装。 因此,我必须在超类publicor中声明这些有用的方法protected,这至少在包中将它们公开给所有其他类。即使它们仅打算由子类使用。 有没有理由subclasses-only在Java中没有访问修饰符?对我来说似乎很奇怪。我想念什么吗? 同样,subclasses-only当您只想将变量公开给子类时,访问修饰符也很有用。在我身上发生的事情很多。

2
从外部文件加载或不加载用于单元测试的数据
在进行单元测试时,我经常会辩论自己要馈入的数据量,并期望从被测单元中回来,我应该将它们包含在实际的测试文件中。 我不断努力的权衡是: 如果测试的很大一部分(以代码量计)由输入和输出数据组成,那么似乎很难实际读取测试,但是我可以很容易地看到实际的输入和输出。 如果我从文件中加载测试数据,则可以轻松地对可能的数据输入进行一堆测试,轻松地将测试数据重复用于多个测试,但是我必须离开源代码来查看另一个文件,以查看输入的确切含义。 。 其中之一是反模式吗?

2
如何编写HTTP服务器?
如标题所示,我想编写一个HTTP服务器。我的问题是,我该怎么做?我知道这听起来很笼统,而且太“高级”,但是有一种疯狂的方法。我认为,这个问题的答案应该与语言无关。含义,无论我使用哪种语言(例如C,C ++,Java等),答案都应该相同。我对这应该如何工作有一个大致的了解: 打开端口80上的套接字。 等待客户提出请求。 阅读请求(即此人想要页面“ contact-us.html”)。 查找并阅读“ contact-us.html”。 发送html标头,然后发送“ contact-us.html”的内容 完成 就像我说的那样,我相信这是过程,但是我不确定100%。这使我想到了问题的核心。一个人如何或在哪里找到此信息? 如果我不想只写HTTP服务器怎么办,如果我不想写FTP服务器,聊天服务器,图像查看器等怎么办?一个人如何找到创建可用的HTTP服务器所需的确切步骤/过程? 一位同事告诉我有关html标头的信息,所以没有他我再也不会知道这一点。他还说了一些有关将每个请求移交给新线程的内容。是否有一些有关工作原理的大书?是否有使用HTTP服务器所需的一些手册? 我尝试谷歌搜索“ HTTP服务器如何工作”,但我只能找到针对普通百姓的答案,而不是针对希望对HTTP服务器进行编程的人。

3
BackgroundWorker与异步/等待
我是C#开发的新手,希望创建一个响应更快的UI。在我的初步研究中,我看到了两种实现此目的的方法: 与BackgroundWorker类结合使用多线程。 较新的异步/等待修饰符。 更新意味着更好吗?两种方法有什么区别?如果我想创建一个新项目,如何选择哪种方法? 编辑:也许我应该指定。我正在创建一个Windows Forms应用程序,其中所有必需的数据都将保存/加载到本地磁盘上。我还将与多个USB设备通信。

4
用于事件日志指标的数据体系结构?
我的服务具有大量正在进行的用户事件,因此我们想做一些事情,例如“ 从日期D开始计数事件类型T的发生”。 我们正在尝试做出两个基本决定: 存储什么?存储每个事件与仅存储聚合 (事件日志样式)记录每个事件并在以后对它们进行计数。 (时间序列样式)每天存储一个汇总的“ 日期D的事件E数” 数据存储在哪里 在关系数据库(尤其是MySQL)中 在非关系(NoSQL)数据库中 在平面日志文件中(通过,通过网络集中收集syslog-ng) 什么是标准做法?在哪里可以找到有关比较不同类型系统的更多信息? 额外细节: 事件流总数很大,每天可能有数十万个条目 但是我们目前的需求只是计算其中的某些类型的事件 我们不一定需要实时访问原始数据或聚合结果 恕我直言,“将所有事件记录到文件中,稍后对其进行爬网以过滤和聚合流”是一种非常标准的UNIX方式,但是我的Rails-y同胞似乎认为除非在MySQL中,否则什么都不是真实的。

3
为什么这样叫“ kill”命令?
为什么决定将kill命令称为“ kill”? 我的意思是,是的,该实用程序通常用于终止进程,但实际上可以用于发送任何信号。 有点混乱吗?也许有一些历史原因。 我所知道的man kill是该命令出现在版本3 AT&T UNIX中。

4
在C#方法中声明返回变量与直接返回值
在关于返回变量的辩论中,团队中的某些成员更喜欢将结果直接返回给调用者的方法,而另一些成员则更喜欢声明一个返回变量,然后将其返回给调用者(请参见下面的代码示例) 后者的论点是,它允许正在调试代码的开发人员在方法返回给调用者之前找到方法的返回值,从而使代码更易于理解:对于以菊花链方式进行的方法调用,尤其如此。 是否有关于哪种方法最有效的准则和/或是否有其他原因导致我们应采用一种风格而不是另一种风格? 谢谢 private bool Is2(int a) { return a == 2; } private bool Is3(int a) { var result = a == 3; return result; }

2
编译器如何工作?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 注意:令我感到惊讶的是,以前从未有人问过它,如果有,我在搜索中找不到它。 我去过很多网站,读过很多文章,也听过很多解释。他们中的大多数都是好人,但是他们要么太宽泛,要么太过复杂,甚至简直就是坏。所以我的问题是,编译器如何工作? 如果这是一个困难而广泛的问题,请告诉我。但是,如果没有,请回答问题。
17 compiler 

2
Joel考试的最新情况?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 6年前关闭。 我想说服我的合作伙伴,我们应该有一个规范,并且应该在编写新代码之前修复错误。我应该参考Joel考试吗?您是否认为Joel测试是最新的?我认为没有规范是不好的项目管理。您是否同意Joel测试?你能加些东西吗?它没有提到例如开源。

7
数据库索引遵循的最佳实践
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 有哪些DO和DONT使用索引来提高数据库性能? DO应该是应该创建索引的情况,或者是与索引相关的,可以提高性能的技巧。 如果不应该创建索引,或者其他可能影响性能的索引相关操作,则不要使用DONT。


2
命令在CQ [R] S模型中应该有多精细?
我正在考虑一个项目,我们基于WCF的SOA的迁移部分转移到服务总线模型(可能nServiceBus),并使用一些基本的发布-订阅实现命令查询分离。 我对SOA甚至服务总线模型都不陌生,但我承认直到最近,我的“分离”概念还仅限于常规数据库镜像和复制。尽管如此,我还是被这个想法所吸引,因为它似乎提供了最终一致的系统的所有好处,同时又避免了许多明显的缺点(最明显的是缺乏适当的交易支持)。 我从Udi Dahan那里读了很多关于该主题的书,他基本上是 ESB体系结构的专家(至少在Microsoft世界中是这样),但是他说的一件事确实让我感到困惑: 当我们获得更大的实体并在其上具有更多字段时,我们也将有更多的参与者与这些相同的实体一起工作,并且在任何给定时间某些事物触及它们的某些属性的可能性更高,从而增加了并发冲突的数量。 [...] CQRS的核心要素是重新考虑用户界面的设计,以使我们能够掌握用户的意图,因此,使客户成为首选对象对于用户而言是与指示客户已搬家或已获得客户不同的工作单元。已婚。如上所述,使用类似Excel的UI进行数据更改不会捕获意图。 -Udi Dahan,澄清了CQRS 从引文中描述的角度来看,很难与这种逻辑争论。但这似乎与SOA背道而驰。SOA(实际上是一般的服务)应该处理粗粒度的消息,以便最大程度地减少网络震颤,这还有许多其他好处。 我认识到,当您拥有分布良好,消息队列良好且没有RPC负担的系统时,网络颤抖就不再是问题,但是完全消除该问题似乎并不明智。Udi几乎似乎在说,每个属性更改(即字段更新)都应该是它自己的命令,很难想象一个用户可能像传统上那样经常更新数百或数千个组合的实体和属性。网络服务。 给定良好的高度参数化查询,表值参数或对临时表的批量插入,SQL Server中的一次批处理更新可能花费一秒钟的时间;一次处理所有这些更新很慢,很慢,而且OLTP数据库硬件是所有扩展/扩展中最昂贵的。 有什么办法可以调和这些相互竞争的问题?我是否以错误的方式思考?这个问题在CQS / ESB领域是否有众所周知的解决方案? 如果不是,那么如何确定命令中粒度的“正确级别”呢?是否有一些“标准”可以用作起点(类似于数据库中的3NF),并且仅在仔细分析表明潜在的显着性能优势时才偏离标准? 或者,尽管各种专家表达了一些强烈的意见,这可能只是其中的一种吗?

4
如何采用敏捷方法开发固件/嵌入式系统软件?
我一直想知道如何在大型复杂的嵌入式系统软件(超过100位工程师)中应用敏捷方法。固件开发具有一些独特的特性,这些特性使敏捷开发变得困难(例如,直到开发周期的后期才提供硬件;一旦产品发布,就无法轻松更新固件;等等。) 这种开发的规范是详尽的文档和艰苦的同行评审。您无法获得简单的代码修复,例如重命名没有2-3个签名的变量。(我有点夸张,但这很典型。此外,很多人确实选择捷径,而项目经理甚至批准了捷径,尤其是在面临严格的市场期限的情况下。) 我想听听有关在固件开发项目中采用敏捷方法的任何技巧或指导。

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.