软件工程

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

5
有效的团队会议
我是一个由8位程序员组成的团队的团队负责人,该团队由大约20名技术人员组成。他们正在从事一系列项目,这些项目还涉及我无法控制的其他团队的人员。我的组织没有进行适当的敏捷开发,他们对变更有些抵触,但是我一直在团队内部举行每日站立会议,我们都发现它们很有用,并且每个人都参与其中,并且在10-15分钟。我还会每周与每个团队成员进行个别交流,我们在其中更详细地讨论各种常规主题(技术性和非技术性),以及各种临时主题会议。 但是,我一直在努力的是每周的团队会议。它正在失去动力,我无法使人们保持兴趣。 我仍然想召开一个更长的会议,即使必须每两周一次或每月一次。目的是讨论站立会议期间无法完成的各种主题,因为它们需要更多时间。我的最新消息包括他们正在进行的每个当前项目的摘要(是否如期进行,各种延误等),方向,未来项目的任何变更,开发过程的变更等。但是,最终我的一次讲座,显然至少有两个人被划出了区域,其余的人至多有兴趣。 我试图通过让人们谈论他们的一周来使人们更加参与,但是与8个人一起花费的时间很长(部分是因为他们的很多工作并没有那么多),其余的团队大多数不在乎他们的同事正在做些什么(他们在站立时会获得较高的概述)。 因此,在这些会议上,至少有些人很无聊,而让我继续举办这些会议几乎让我感到尴尬。与我们精力充沛的上午站立会议形成鲜明对比。 关于我可以做些什么来使人们更加参与和更感兴趣,有什么建议吗?我如何让他们介绍他们的事情或开始涉及所有人的讨论,而不是我的独白?

3
编写编译器编译器-使用和功能简介
这是一系列问题的一部分,这些问题的重点是抽象项目的姐妹项目,该项目旨在以框架的形式抽象语言设计中使用的概念。姊妹项目称为OILexer,旨在从语法文件构造解析器,而不在匹配项上使用代码注入。 与这些问题相关的其他一些页面,与结构类型相关,可以在这里查看,以及在这里找到易用性。可以在此处找到与有关框架和适当发布位置的查询相关的元主题。 我现在要开始从给定的语法中提取解析树,然后是递归下降解析器,该解析器使用DFA识别前向路径(类似于ANTLR 4的LL(*)),所以我想我会打开它来获得洞察力。 在解析器编译器中,哪种功能比较理想? 到目前为止,这里是实现的简要概述: 范本 提前预测,知道在给定点上什么是有效的。 规则“非文字化”将规则中的文字取下来,并解析它们来自哪个标记。 非确定自动机 确定性自动机 简单的词法状态机,用于令牌识别 令牌自动化方法: 扫描-用于注释:注释:=“ / *” Scan(“ * /”); 减-对标识符有用:标识符:=减(IdentifierBody,关键字); 确保标识符不接受关键字。 编码-将自动化编码为基数N转换的X系列计数。 UnicodeEscape:=“ \\ u” BaseEncode(IdentifierCharNoEscape,16,4); 使用十六进制4转换以十六进制形式对Unicode进行转义。此与:[0-9A-Fa-f] {4}之间的区别是使用Encode进行的自动化将所允许的十六进制值集限制为IdentifierCharNoEscape的范围。因此,如果给它\ u005c,则编码版本将不接受该值。这样的事情有一个严重的警告:谨慎使用。最终的自动化可能非常复杂。 没有实现的是CST生成,我需要调整确定性自动化以继承适当的上下文才能使此工作正常进行。 对于感兴趣的人,我已经上传了T *y♯项目原始形式的漂亮印刷品。每个文件都应该链接到其他文件,我开始链接各个规则来遵循它们,但是这花了太长时间(自动化起来会更简单!) 如果需要更多上下文,请相应地发布。 编辑5-14-2013:我已经编写了代码,可以在给定语言下为状态机创建GraphViz图。 这是AssemblyPart的GraphViz有向图。语言描述中链接的成员在其相对文件夹中应具有rulename.txt,以及该规则的图。自从我发布示例以来,某些语言描述已更改,这是由于简化了语法。这是一个有趣的graphviz图像。

3
重构大型方法以确保我不会破坏任何内容时,会有什么帮助?
我目前正在重构大型代码库的一部分,而没有任何单元测试。我试图以残酷的方式重构代码,即试图猜测代码在做什么,什么更改不会改变它的含义,但是没有成功:它随机破坏了整个代码库的功能。 请注意,重构包括将旧版C#代码移动到更具功能性的样式(旧版代码未使用.NET Framework 3和更高版本的任何功能,包括LINQ),在代码可能会从中受益的地方添加了泛型,等等。 考虑到要花多少钱,我不能使用形式化方法。 另一方面,我认为至少要严格遵循“任何重构的遗留代码都应带有单元测试”的规则,无论它要花多少钱。问题在于,当我重构500 LOC私有方法的一小部分时,添加单元测试似乎是一项艰巨的任务。 什么可以帮助我了解哪些单元测试与给定的代码相关?我猜测对代码进行静态分析会有所帮助,但是我可以使用哪些工具和技术: 确切知道我应该创建什么单元测试, 和/或知道我所做的更改是否以与现在不同的方式影响了原始代码?

2
我的异步任务库应该安静地吞下异常吗?
我刚刚了解到.NET 4.5引入了对a内部异常Task处理方式的更改。即,它们被安静地压制。 这样做的官方理由似乎是“我们希望对没有经验的开发人员更加友好”: 在.NET 4.5中,任务比在.NET 4中具有更大的重要性,因为它们被支持在C#和Visual Basic语言中,成为语言支持的新异步功能的一部分。这实际上使Tasks脱离了经验丰富的开发人员的领域,进入了每个人的领域。结果,它也导致了关于异常处理的严格程度的一系列新折衷。 (来源) 我已经学会相信,.NET中的许多决定都是由真正知道自己在做什么的人做出的,并且通常在他们做出决定的背后有很好的理由。但是这个逃脱了我。 如果我正在设计自己的异步任务库,那么吞没框架开发人员看到的异常的吞咽异常有什么好处?
10 .net 

2
哪种代码更适合分支预测优化?
给定分支预测以及编译器优化的效果,哪种代码倾向于提供出色的性能? 请注意,bRareExceptionPresent表示不常见的情况。这不是逻辑的正常路径。 /* MOST COMMON path must branch around IF clause */ bool SomeFunction(bool bRareExceptionPresent) { // abort before function if(bRareExceptionPresent) { return false; } .. function primary body .. return true; } /* MOST COMMON path does NOT branch */ bool SomeFunction(bool bRareExceptionPresent) { if(!bRareExceptionPresent) { .. function primary …

4
在单元测试中,为什么要创建两次存储库?
前几天,我在阅读有关单元测试的内容时,看到了一些示例,人们在其中创建了一个存储库界面(即IExampleRepository),然后创建了真实的存储库(public class ExampleRepository : IExampleRepository)和一个用于单元测试的存储库(FakeExampleRepository : IExampleRepository)。 在中,IExampleRepository他们实现了与中相同的方法ExampleRepository,但是使用了不同的Linq查询。 确切的目的是什么?我认为对代码进行单元测试的一部分是确保一种方法正常工作吗?但是,当我使用两个完全不同的查询时,一个用于“真实”查询,另一个在测试中,该测试有多大意义?

3
开源,版权和普通错误修正
假设开发人员已为其封闭源商业应用程序开发了一个库。由于他们想回馈给开源社区,因此他们在GPL等标准下发布了该库,但是继续在自己的应用程序中使用它。由于它们拥有版权,所以很好。 现在,GPL版本的用户发现了一个错误,对其进行了修复并将修补程序提交给原始开发人员。据我了解,要在其封闭源应用程序中使用此错误修正,开发人员需要获得提交者的许可。如果提交者拒绝,则开发人员必须找到另一种方法来修复封闭源版本中的错误。 但是,如果错误修正本身真的不重要怎么办?像正确初始化变量还是检查空指针?给定错误描述,任何半熟练的程序员都可以在几分钟内找到并解决问题?此补丁仍受版权保护吗?还是原始开发人员可以在未经提交者同意的情况下在其封闭源应用程序中实施相同的修复程序? 注意:这确实是一个假设的场景,而不是那些“我的“朋友”有此问题”的问题

1
处理异步相互通信的最佳实践?
最近完成了一个处理信用卡处理的项目。我面临的困难之一是处理通知消息的延迟/可能失败。最复杂的示例是: 发送付款请求的外部系统 我的系统将该请求转换为对支付网关的请求 将用户发送到网关 等待用户执行付款 用户返回我的系统,但是一直被保留,直到系统收到成功/失败通知 根据故障将用户发送回外部系统 更加困难的事实是,一旦发送通知失败,网关将尝试每15分钟发送通知数小时。 我使用未决事务的数据库记录解决了它,然后从返回中加上成功的延迟侦听器(用于通知和事务处理)来检测返回的成功和失败... 相当困难! 但是,这一定已经解决了无数次,所以最佳实践是什么? 我看到我的未来将是编写所有这些系统之间的处理程序,并管理时间延迟和可能的网络故障,因此我希望遵循最佳实践。 书籍/文章推荐会很棒。 提前致谢!

10
用户故事水平太高且太概念化,管理层希望开发人员填补空白
我受雇于一家非常有才华的公司,真正的目的是从事XP。沟通很好,管理人员也可以进行富有建设性的讨论,但是由于时间紧迫,某些事情被认为是RUP,无法讨论。 目前,我对实施故事时需要进行的大量更改感到有些困惑。我相信其中许多发现(当然,这需要花费时间和精力)是故事编写者(客户,最终用户和产品所有者)的责任,而不是开发人员的责任。简而言之,用户故事太概念化,只是传达了基本意图,但缺乏足够的细节(特别是前提条件和后置条件,与其他故事的相关性,依赖关系等)。由于XP开发人员同时是设计师和分析师,因此开发人员可以自行决定填补空白。问题在于许多空白是在发现错误的假设进入评估时间和代码之后才发现的,因为注意到比最初预期的情况更加复杂。即使到那时,找到合适的东西来填补也要花费时间,在不同程度上,这被认为是与初始估计的偏差。 我正在寻找一种建设性的方式来将这些含义传达给管理层,而这种方式不会使我成为试图不必要地使事情变得复杂的人。我是新手,但我尚未建立起很高的信誉。 我们欢迎您的见识。 密切相关并且以某种方式给出了答案:开发人员可以期望多少有关用户故事的细节?

2
客户提出不合理的要求时该怎么办(从我的角度来看)
我是一名自由程序员,最近我完成了一个网站,一切正常,但是有一个用户向我的客户抱怨他无法登录。这个问题显然是一个cookie限制/旧浏览器(我不能不会自己创造问题,并且成百上千的用户都可以使用该网站) 现在我的客户说:我付钱给你做点东西,有人抱怨。所以您做的工作不正确。 在这种情况下我该怎么办?你们如何处理?

3
如何实现if()的惰性求值
我目前正在根据以下条件实现表达式评估器(单行表达式,如公式): 输入的表达式被标记化以分隔文字布尔值,整数,小数,字符串,函数,标识符(变量) 我实现了Shunting-yard算法(经过微调以处理具有可变数量的参数的函数)以消除括号并以后缀顺序将运算符以适当的优先级排序 我的调车场只是产生了一个(模拟的)令牌队列(通过数组,我的Powerbuilder Classic语言可以定义对象,但只有动态数组作为本机存储-不是真实列表,没有字典),我使用简单堆垛机 我的评估人员工作得很好,但我仍然缺少if(),我想知道如何进行。 使用分流后缀和基于堆栈的评估,如果我添加if()具有真假部分的另一个函数,则单个if(true, msgbox("ok"), msgbox("not ok"))消息将显示两条消息,而我只希望显示一条消息。这是因为当我需要评估一个函数时,它的所有参数都已经被评估并放置在堆栈中。 您能给我一些if()偷懒实现的方法吗? 我虽然将它们作为一种宏进行处理,但是在早期我还没有条件评估。也许我需要使用队列以外的其他结构来分别保存条件和true / false表达式?目前,表达式在评估之前已被解析,但我还计划将中间表示形式存储为一种预编译的表达式,以供将来评估之用。 编辑:经过一些问题后,我认为我可以构建表达式的树表示形式(AST而不是线性令牌流),从中我可以轻松地忽略自己的一个或另一个分支if()。

6
CoffeeScript和命名函数
在其他地方,关于CoffeeScript中命名函数的术语引起了争论。特别是有人提到这样的事情: foo = -> console.log("bar") 作为命名函数。但是,它的反对意见是CoffeeScript中的所有内容都是匿名函数,并且没有命名函数。确实是这样,CoffeeScript仅具有函数表达式,然后可以将其存储在变量中。但我认为这并不意味着将其称为命名函数是错误的。 如我所见,它是一个命名函数,因为它已被命名。没错,它不是一个命名函数,就像其他语言中的命名函数一样,但是我认为它足够接近以至于不宜将其称为命名函数。坚持认为否则似乎只是挑剔。 我是否在吃午餐,以为坚持认为这不是命名函数只是挑剔?

5
有没有办法将gcc用作库?
任何人都知道这样的解决方案: #include <stdio.h> #include <gcc.h> /* This .h is what I'm looking for. */ int main (void) { /* variables declaration (...) */ /* The following line is supposed to be equivalent to: * $ gcc main.c -o main */ results = gcc_compile_and_link("main.c", "main"); /* Now I want to use …
10 c++  c  gcc 

3
依靠隐式参数转换是否被认为是危险的?
C ++具有一项功能(我无法弄清楚它的正确名称),如果参数类型不是期望的参数类型,它将自动调用参数类型的匹配构造函数。 一个非常基本的示例就是调用一个std::string带const char*参数的函数。编译器将自动生成代码以调用适当的std::string构造函数。 我想知道,它是否像我认为的那样对可读性不利? 这是一个例子: class Texture { public: Texture(const std::string& imageFile); }; class Renderer { public: void Draw(const Texture& texture); }; Renderer renderer; std::string path = "foo.png"; renderer.Draw(path); 这样好吗 还是太过分了?如果我不应该这样做,我可以以某种方式让Clang或GCC发出警告吗?

1
我们自己的API的最佳数据结构
我处于为Stack Exchange网络编写Emacs主要模式的早期阶段; 如果您定期使用Emacs,最终将使您受益。 为了最大程度地减少对Stack Exchange API的调用次数(每个IP每天最多10000次),并成为一个负责任的公民,我想缓存从网络收到的信息并将其存储在内存中,等待再次被访问。我真的对存储此信息的数据结构感到困惑。 显然,这将是一个列表。但是,与任何数据结构一样,必须由存储什么数据以及如何访问它们来确定选择。我希望能够将所有这些信息存储在单个符号中,例如stack-api/cache。因此,stack-api/cache事不宜迟,这里列出了最近更新提出的一些要点: `(<csite> <csite> <csite>) <csite>会在哪里 (1362501715 . <site>) 至此,我们所要做的就是定义一个简单的关联列表。当然,我们必须更深入。 每个<site>都是API参数列表(唯一),后跟一个列表问题: `("codereview" <cquestion> <cquestion> <cquestion>) <cquestion>您猜对了,每个问题的最新更新时间都是一个问题: `(1362501715 <question>) (1362501720 . <question>) <question>是question结构和答案列表的缺点(同样,以其上次更新时间为准): `(<question-structure> <canswer> <canswer> <canswer> 和` `(1362501715 . <answer-structure>) 这个数据结构是可能最准确地描述为一棵树,但我不知道是否有更好的方法来做到这一点考虑的语言,的Emacs Lisp(这是不是所有的从Lisp的不同,你知道,爱在所有) 。明确的提示可能是不必要的,但它可以帮助我的大脑更好地围绕它。我敢肯定<csite>,例如,它将变成 (<epoch-time> <api-param> <cquestion> <cquestion> ...) 顾虑: 这样将数据存储在潜在的巨大结构中,是否会对系统的性能进行权衡?我想避免存储无关的数据,但是我已经做了我能做的,并且我认为数据集最初并没有那么大(对于正常使用),因为它只是人类可读文本,而且比例合理。(我正计划使用列表顶部的时间来收集旧数据;每个数据源都从其子级继承其最后更新时间,然后沿树向下继承。该剔除应在多大程度上进行:我不是当然。) 像这样存储数据是否会对必须使用的数据进行性能折衷?也就是说,设置和检索操作是否会受到列表大小的影响? 关于更好的结构,您还有其他建议吗?

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.