软件工程

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

4
开发人员向产品所有者提出功能建议是正常的吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 5年前关闭。 我最近刚开始担任开发人员,之前曾担任系统管理员。 我对使用敏捷功能的软件开发团队的理解是,“我们需要实现什么”沟通主要发生在从产品所有者到开发人员的一个方向上。开发人员可以向产品所有者表达对技术债务的担忧,但是提出功能构想不应该是他们的主要职责之一。 我工作的公司有不同的看法。对于他们来说,开发人员不仅应该向自己团队的产品所有者提出建议,还应该向其他团队的产品所有者提出建议,如果他们认为他们可以为该团队的产品做出贡献。我们的想法是我们都是一个大团队<company name>,所有开发人员都应利用他们的专业知识来推广他们认为有用的功能。 缺少更好的词,这样的方法是否“正常”?我是不是太被动了,我应该采取主动并开始将想法推向产品所有者吗?相反,公司是否完全错了,我应该在其他地方找工作吗?

4
我们如何从汇编到机器代码(代码生成)
有没有一种简单的方法可以可视化将代码组装到机器代码之间的步骤? 例如,如果您在记事本中打开有关二进制文件的文件,则会看到机器代码的文本格式表示形式。我假设您看到的每个字节(符号)都是对应的ascii字符,因为它是二进制值? 但是我们如何从汇编程序转换为二进制程序,幕后发生了什么?

4
可迭代和可枚举之间有区别吗?
许多语言似乎具有非常相似的结构,称为可迭代或可枚举。这些是可以迭代或枚举的结构,在我看来,它们极为相似。这些单词是同义的还是可迭代的和可枚举的之间存在细微的语义差异,这证明了术语的选择是正确的?

4
为什么招聘与编译器相关的工作如此困难?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 6年前关闭。 上周,我和一些同事在三所主要大学(两所在美国,一所在英国)参加了招聘会,我们试图(没有很大的成功)招聘几个编译器职位,从实习到入门级,对于我们的团队来说更高级。 令我们惊讶的是,当被问到他们感兴趣的学生时,与我们交谈的80%的学生回答“我想构建Ansroid应用程序”的行很长。(还有20%是“ iPhone应用程序”!)有些人甚至公开表示,他们并不“想要构建一个编译器,...,这很无聊”。他们说,我引用了。 那么,如今吸引(年轻吗?)“开发人员”的移动应用又是什么呢?同样,为什么编译器对他们来说是一个“无聊”的话题?(我不一定认为这两个是互斥的。一个人当然可以为手机构建编译器,但这并不重要。) 如果有的话,我们该怎么做才能吸引更多的人才,甚至只是感兴趣的候选人?

2
快速标签搜索算法
问题如下。 有一组简单实体E,每个实体都有一组附加的标签T。每个实体可以具有任意数量的标签。实体总数接近1亿,标签总数约为5000。 因此,初始数据如下所示: E1 - T1, T2, T3, ... Tn E2 - T1, T5, T100, ... Tk .. Ez - T10, T12, ... Tl 初始数据很少更新。 我的应用以某种方式在标签上生成逻辑表达式,如下所示: T1&T2&T3 | (T5&!T6) 我需要计算与给定表达式匹配的实体数量(注意-不是实体,而是数量)。当然,这可能并不完全准确。 我现在得到的是一个简单的内存中表查找,使我在单个线程上有5-10秒的执行时间。 我很好奇,有什么有效的方法来处理这些东西吗?您会推荐哪种方法?有一些通用的算法或数据结构吗? 更新资料 根据要求进行一些澄清。 T对象实际上是较短的常量字符串。但这实际上并不重要-我们总是可以分配一些ID并对整数进行运算。 我们绝对可以对它们进行排序。

8
什么是常见的代码审查过程,什么被认为是不好的?
我的公司最近开始进行正式的代码审查。流程是这样的:您提交到github中,请求拉取请求,代码将由大约三个人审阅,然后,如果全部通过,则代码会进入。 这个过程看起来很公平,但是进行代码审查的三个人似乎并不公平。我注意到,当我将代码放入代码中进行审查时,我得到的注释介于100-200之间。对我来说,最高的一次是300条评论。当然,您会认为这是很大的更改,但是对于少于50行的代码(包括单元测试),这也可能是非常小的更改。所有评论都被认为是“必须做的”,并且没有争议。 考虑到这一点,我的主要问题是,这似乎有点过头了。我与该小组进行了交谈,他们基本上告诉我,仅仅因为我在php中拥有多年的开发经验并不意味着我是“开发人员”。当然,这似乎比没有伤害更大。我还注意到,在小组中,他们似乎没有产生太多评论,大多数时候,他们忽略或以其他方式忽略了其他评论或建议,即使有什么问题也很少接受它为有效。 所以我的问题是,这是否公平?还是普通的?

2
有状态库顶部的无副作用界面
在约翰·休斯(John Hughes)的采访中,他谈到了Erlang和Haskell,他对在Erlang中使用有状态的库有以下看法: 如果要使用有状态的库,通常会在其之上构建无副作用的接口,以便随后可以在其余代码中安全地使用它。 他是什么意思?我试图考虑一个例子,但是我的想象力和/或知识使我失望。

5
“全团队” C ++功能?
在C ++中,异常之类的功能会影响整个程序:您可以在整个程序中禁用它们,或者需要在整个代码中对其进行处理。正如有关C ++ Report的著名 文章所述: 与直觉相反,编码异常的困难部分不是显式的抛出和捕获。使用异常的真正困难部分是编写所有中间代码,以使任意异常可以从其抛出站点传播到其处理程序,安全地到达并且不会破坏程序的其他部分。 由于甚至new抛出异常,因此每个函数都需要提供基本的异常安全性 -除非它仅调用保证不抛出异常的函数- 除非您在整个项目中完全禁用异常。 因此,异常是“整个程序”或“整个团队”的功能,因为使用它们的团队中的每个人都必须理解它们。据我所知,并不是所有的C ++功能都像那样。 一个可能的例子是,如果我没有模板但不使用它们,我仍然可以编写正确的C ++,或者我不会吗?我什至可以调用sort整数数组,并享受其惊人的速度优势。C qsort(因为未调用任何函数指针),而又不会冒bug的风险-是否?看来模板不是“全团队”。 是否还有其他C ++功能会影响代码而不直接使用它们,因此是“整个团队”?我对C中没有的功能特别感兴趣。 更新:我特别要寻找的功能是没有需要您注意的语言标记。我得到的第一个答案是const-正确性,它也是一个完整的团队,因此每个人都需要学习它。但是,AFAICS仅在调用标记为的函数时才会对您产生影响const,并且编译器将阻止您在非const对象上调用它,因此您可以向Google寻求帮助。除非有例外,否则您什至没有得到。而且,它们总是在您使用后立即使用new,因此异常更加“阴险”。但是,由于我不能客观地表述这一点,因此我将不胜感激任何全团队功能。 更新2:我应该写一些类似“ C ++特定功能”的文章,而不是C ++功能,以排除适用于大量主流编程语言的多线程之类的东西。 附录:为什么这个问题是客观的(如果您想知道的话) C ++是一种复杂的语言,因此许多项目或编码指南都试图选择“简单的” C ++功能,并且许多人尝试根据大多数主观标准来包括或排除某些功能。有关此问题,请按此定期关闭。 相反,在上面,我(尽可能精确地)定义了“整体”语言功能是什么,提供了一个示例(例外),以及有关C ++文献的大量支持证据,并要求使用C ++的整体团队功能毫无例外。 您是否应该使用“整个团队”功能,或者是否使用相关概念可能是主观的,但这仅意味着该问题的重要性像往常一样是主观的。

3
泛型如何实现?
从编译器内部角度来看,这是一个问题。 我对泛型感兴趣,而不是模板(C ++),所以我用C#标记了问题。不是Java,因为AFAIK两种语言的泛型在实现上有所不同。 当我查看不带泛型的语言时,它非常简单,您可以验证类定义,将其添加到层次结构中就可以了。 但是如何处理泛型类,更重要的是如何处理对它的引用?如何确保每个实例的静态字段都是奇异的(即每次解析通用参数时)。 假设我看到一个电话: var x = new Foo<Bar>(); 是否将新Foo_Bar类添加到层次结构? 更新:到目前为止,我仅找到2条相关的帖子,但是即使它们在“如何自己做”的意义上也没有涉及太多细节: http://www.jprl.com/Blog/archive/development/2007/Aug-31.html http://www.artima.com/intv/generics2.html
16 c#  generics 

1
了解访客模式
我有一个代表GUI控件的类层次结构。像这样: Control->ContainerControl->Form 我必须实现一系列算法,这些算法可以与处理各种任务的对象一起使用,并且我认为“访客”模式将是最干净的解决方案。让我们举个例子,该算法创建对象层次结构的Xml表示。使用“经典”方法,我可以这样做: public abstract class Control { public virtual XmlElement ToXML(XmlDocument document) { XmlElement xml = document.CreateElement(this.GetType().Name); // Create element, fill it with attributes declared with control return xml; } } public abstract class ContainerControl : Control { public override XmlElement ToXML(XmlDocument document) { XmlElement xml = base.ToXML(document); // …

2
DDD有界的上下文和域?
我一直在一个相对复杂的应用程序中,该应用程序具有10多个数据库表(聚合,实体/值对象)并应用DDD。此时,它似乎基本上是DDD-Lite,这意味着有应用程序/域服务,域模型(实体,值对象)和存储库。 我拿起一本书《实现DDD》,他首先提到的是DDD-Lite和Bounded Contexts和Domain Events缺失,这是开始DDD时常见的第一个错误。 目前,我已经尝试通过聚合关系来组织域模型,并使用名称空间进行演示。 我没有看到与将域模型项目划分到单独的有界上下文中有关的好处/缺点(尚未)。也许稍后会变得很明显,但我希望获得有关绑定上下文(以及可能绑定到子域等的一些现实生活)的反馈。


3
为什么不在Prolog中编写规则引擎?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 6年前关闭。 从我对Prolog的了解来看,似乎很适合为应用程序设计规则引擎。但是,我不相信我曾经见过用Prolog编写的规则引擎。Prolog是否存在一些固有的限制(例如,糟糕的垃圾回收算法),以防止其用于构建规则引擎?

1
功能性中间形式的缺点
我正在为类似于JavaScript的语言编写优化器,并且需要选择一个中间代码表示形式。如今,显而易见的/典型的选择是静态单一分配(SSA)。 但是,C语言中的Modern Compiler Implementation也讨论了功能中间形式,这基本上意味着对中间表示使用纯功能(仅在局部变量方面是纯函数,堆数据仍然是可变的,而在CPS方面则是可变的,只是简单的let块和尾调用)。在易于推理方面具有一些优势。 大概这不是理所当然的,或者每个人都已经在使用这种表示形式了,所以我的问题是,功能性中间形式与SSA相比有哪些缺点?

2
开放源代码软件转变为封闭源代码软件有哪些影响?
如果公司采用许可许可的开放源代码应用程序,然后通过重新设计应用程序的广泛部分,添加新功能并应用错误修复程序,从中开发封闭源代码应用程序... 忽略任何许可证要求... 过渡是如何发生的,可以采取什么措施防止过渡,而不仅仅是选择不同的许可证? 公司的(道德或社会)责任是什么?(例如:回馈开源项目将是道德上要做的事情) 如果开放源代码版本和封闭源代码版本均可用,那么竞争对这两种产品有何影响? 过去是否有成功或失败的公司或产品的实例?社区对这些项目的态度是什么?

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.