软件工程

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

5
关于Web开发角色的服务器,我需要了解什么?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 6年前关闭。 我知道这听起来可能有点含糊,所以我将尝试进一步解释... 在从事自营开发人员多年之后,我现在正在寻找商业Web开发人员。我对服务器和托管的唯一经验是通过FTP上传并使用CPanel / WHM。我要使用的角色是Web开发PHP,MySQL,HTML,CSS类型角色,但是在最近的采访中,有人问我有关在服务器上进行设置的问题,我不知道在说什么...这不理想! 在不了解更多信息的情况下,很难解释我到底想学什么,但是基本上,这只是我作为Web开发人员应该知道的服务器元素?如果您是Web开发人员,除了上载文件之外,您还可以处理服务器吗?Web开发团队是否经常设置诸如Subversion(SVN)和版本控制系统之类的东西,这就是他们所说的吗?

1
元循环解释器,虚拟机和提高的性能之间有什么关系?
我已经在网上阅读了有关元循环解释器(包括SICP)的信息,并且研究了一些实现的代码(例如PyPy和Narcissus)。 我已经阅读了很多有关两种语言的文章,它们充分利用了元循环评估Lisp和Smalltalk。据我了解,Lisp是第一个自托管的编译器,而Smalltalk具有第一个“真正的” JIT实现。 我尚未完全了解的一件事是,那些解释器/编译器如何才能获得如此出色的性能,或者换句话说,为什么PyPy比CPython更快?是因为反射吗? 而且,我的Smalltalk研究使我相信JIT,虚拟机和反射之间存在联系。诸如JVM和CLR之类的虚拟机允许进行大量的类型自省,我相信它们可以在实时(我想是AOT)编译中大量使用。但是据我所知,虚拟机有点像CPU,因为它们具有基本的指令集。虚拟机是否有效,因为它们包含类型和参考信息,从而可以实现与语言无关的反映? 我之所以这么问,是因为现在许多解释型语言和编译型语言都将字节码用作目标(LLVM,Parrot,YARV,CPython),并且传统的VM(例如JVM和CLR)已经获得了令人难以置信的性能提升。有人告诉我它与JIT有关,但据我所知,自从Smalltalk和Sun自己的Self从事Java以来​​,JIT并不是什么新鲜事物。我不记得过去的VM表现特别出色,JVM和.NET之外的非学术类VM并不多,而且它们的性能绝对不如现在好(我希望可以提出这一主张,但我想从个人经验谈起)。 然后突然之间,在2000年代末,情况发生了变化,甚至对于既定的语言,也出现了许多具有良好性能的VM。是否发现了有关JIT实现的信息,该信息使几乎每个现代VM的性能都飙升了?可能是纸还是书?

2
功能编程和状态算法
我正在用Haskell学习函数式编程。同时,我正在研究自动机理论,由于两者看起来很融洽,所以我正在编写一个小型库来玩自动机。 这就是让我问的问题。在研究评估状态可达性的方法时,我想到了一个简单的递归算法效率不高,因为某些路径可能共享某些状态,而我可能最终不只一次评估它们。 例如,在这里,评估可达性的摹从一个,我必须排除˚F双方同时检查通过路径d和Ç: 因此,我的想法是,在多个路径上并行工作并更新排除状态的共享记录的算法可能很棒,但这对我来说太过分了。 我已经看到,在某些简单的递归情况下,可以将状态作为参数传递,这就是我在这里要做的,因为我向前传递了要避免循环的状态列表。但是是否有一种方法也可以向后传递该列表,例如将其与canReach函数的布尔结果一起返回到元组中?(尽管这有点强迫) 除了示例案例的有效性之外,还有哪些其他技术可用来解决此类问题?我觉得这些必须足够普遍,以至于必须有解决方案,例如fold*or 会发生什么map。 到目前为止,阅读learningyouahaskell.com并没有发现任何内容,但考虑到我还没有接触过monad。 (如果有兴趣,我将代码发布在codereview上)

2
免费午餐结束了吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 在2005 年发表的著名的《免费午餐结束》中,Herb Sutter预测了并发编程革命与面向对象革命一样大。这场革命真的发生在2005年-2013年吗? 本文的重点: 处理器制造商已经没有足够的空间来使用大多数传统方法来提高CPU性能。他们没有提高时钟速度,反而转向超线程和多核体系结构。 如果应用程序要充分利用CPU吞吐量的增长,它们将越来越需要并发。 “哦,性能无关紧要,计算机只会保持更快的速度”这句话是错误的。 效率和性能优化将变得越来越重要,而不是更少。那些已经可以进行大量优化的语言将会找到新的生命。那些不需要的人将需要找到竞争的方法,变得更加高效和乐观。预计对面向性能的语言和系统的需求将长期增长。 编程语言和系统将越来越被迫处理并发问题。我们迫切需要比今天的语言提供更高级别的并发编程模型。

2
许可范围内基于ServiceStack的解决方案的未来
我只是希望有人澄清一下以下问题,正如Demis Bellot在几周前宣布ServiceStack即将商业化一样。请参考下面的链接。 https://plus.google.com/app/basic/stream/z12tfvoackvnx1xzd04cfrirpvybu1nje54 (请注意,当我说ServiceStack或SS时,我指的是所有相关的SS库,例如ServiceStack.Text等。) 如果我今天已经有使用ServiceStack开发的解决方案,即使我不将SS二进制文件升级到商业发行版,也必须在SS投入商业使用后购买许可证吗? SS的先前版本(商业许可之前)是否将始终是开源的,并且使用与以前相同的许可? 如果我今天(在获得商业许可之前)在Github上购买SS,那么在SS投入商业运营后再坚持这一做法是否违法? 如果对问题2的回答是“是”,那么在SS投入商业运营后,我仍然能够在不担心商业许可的情况下派生以前的版本吗?

6
当任务涉及多个人时,如何处理Scrum任务烧毁?
在我的公司中,单个任务永远不可能由一个人完成。将有单独的人进行质量检查和代码审查每个任务。这意味着每个人将针对每个任务给出完成所需时间的估计。 问题是,我应该如何处理掉?如果我将小时数汇总在一起,请假设以下估计: 10小时-开发时间 4小时-质量检查 4小时-代码审查。 任务估计= 18小时 在每天结束时,我要求用“剩下多少时间才能完成”来更新任务。但是,每个人通常只考虑自己的部分。他们应该标记剩余的工作量,然后再添加工作量估计吗?你们好吗? 更新 为了澄清一些事情,在我的组织中,一个故事中的每个任务都需要3个人。 有人来制定任务。(进行单元测试等) 负责审核任务的质量检查专家(他们主要进行集成和回归测试) 技术负责人进行代码审查。 我认为没有错误的方法或正确的方法,但这是我们的方法……而且这种情况不会改变。我们会以团队的形式尽可能地完成故事的最小层面。在开发完成之前,您实际上无法测试某些项目是否可行,并且您也无法查看代码的质量……因此,您可以做的最好的事情就是将这些内容分解为较小的逻辑切片,以便可以测试最基本的功能。尽可能早地进行审查。 我对以这种方式工作的人的问题是,当以这种方式设置他们时,如何烧掉“任务”。除非一个任务有它自己的子任务(JIRA不允许)...我不确定每天完成跟踪“剩下的事情”的最佳方法。
12 agile  scrum 

4
如何学习实现一半功能的正确方法?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 我领导一个开发团队,我想尽可能多地发布我们的产品(连续交付)。 在许多情况下,我们必须实施比发布之间的时间花费更长的时间才能实现的功能。我仍然希望人们每天提交他们的代码(持续集成)。 很多时候,实现新功能需要更改现有功能,并且即使新功能尚未完成,现有功能当然仍然需要工作。 如果开发人员使用正确的方法,则他们可以仔细调整现有功能,而上述所有都不是问题。 但是,正确的方法实际上是什么?我自己的编程知识告诉我如何处理每个案例,但是我需要了解更多信息,还需要一些阅读材料,我可以阅读并推荐团队成员阅读。或任何其他学习正确方法的方法都可以。 这就是问题所在。如何确保团队成员学习实现一半功能的正确方法? 我搜寻了自称对此有策略的人,但还没有找到,只是人们对此主题写了一些随机的想法。也许我没有使用正确的搜索词,或者也许没有人对此做出任何权威性的指导。

3
是否可以将高级语言编译为可读的C ++?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 C ++从许多方面来说都是一门伟大的语言,但是如果没有IDE编写某些东西特别麻烦。作为VIM用户,如果我可以使用更高级的语言,使我能够使用S-Expressions以及可能的类似Lisp的宏编写C ++,这将非常有趣,从而可以生成简洁的代码,同时避免重写相同的模式再三,一而再再而三。 我已经问过freenode并测试了一些想法,例如使用ECL和Bigloo等编译器编译Lisp-> C,但是没有一个生成特别干净的C代码。 在这个问题上有什么作品吗?

4
阻止开发人员在DVCS上提交错误的分支
问题 我在一个大约有10个开发人员的软件项目中,我们通过Mercurial共享源代码。每个版本都有一个开发和生产分支。在项目进行过程中,我们反复从一个分支(即v1)获取源代码,以进入补丁和维护分支以获取早期版本的软件(即v2)。 如果我们没有注意到代码进入错误的分支,则这将导致花费时间来撤消错误的提交,或者导致错误的代码(可能是非QAd)到达并部署在错误的分支中。 我们的分支和合并设计/方法 v1-test v1-patch1 v1-patch2 ^---------^-----------^ v1-prod / / \ \ -----------------------/ \ \ v1-dev \ \ \ --------------------------\ v2-dev \ \ \ ^-------^------------- v2-prod v2-test v2-patch1 因此,我们将在发布开发分支上工作,直到它准备就绪为止,然后将其分支到一个测试/ UAT /生产分支,在此完成所有发布和维护。标签用于构建该分支的发行版。在测试v1时,将为v2建立一个分支,并且开发人员将开始开发新功能。 趋于发生的事情是,开发人员将由于v2-dev分支而提交的工作提交到v1-dev或v1-prod中,或更糟糕的是,他们将v2-dev合并到v1-prod中(或类似的错误)。 我们告诉大多数开发人员不要访问-prod分支,但是代码仍然会潜入。一组更高级的开发人员“照看” -prod分支。 应该注意的是,尽管v2才刚刚开始开发,但v1中可能仍然有一些相当大的补丁程序可以解决问题。即v1可能不仅获得了奇怪的小补丁。 到目前为止我们尝试过的 有一个单独的-prod分支,带有网守。-prod分支应通过其名称发出警告,并且大多数开发人员不必永远都位于该分支中。这并没有真正减轻问题。 在开发人员中提高了对此问题的意识,以使他们更加警惕。再次,这不是很成功。 我认为开发人员承诺使用错误分支的可能原因 过于复杂的分支机构设计 在多个分支并行发展中。(该项目确实表现出使用雪崩模型的症状。) 开发人员对DVCS的了解不够充分 我读过的与某些问题相关的问题 我读过这个问题上不承诺到错误的分支,我觉得对于视觉线索的答案可能会有所帮助。但是,我并不完全相信,我们所遇到的问题不是更根本问题的征兆。 通过视觉线索,我们可以轻松地将它们合并到命令行中,但是大约有一半的团队使用Eclipse,我不确定如何合并视觉线索。 题 我们可以使用什么方法,以软件,项目管理或治理的形式来减少(理想地停止)错误的分支,从而占用我们的时间或弄脏我们已部署的代码? 对于我认为可能会做出上述贡献的原因的具体评论,将不胜感激,但这不应该限制您的答复。

1
在自由软件开发中,公司在错过最后期限时应受到什么样的处罚?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 我在和一个联合开发人员聊天。 他有一个客户想要确保他按时交货。客户希望对错过的最后期限产生影响。 虽然我不从事自由职业,但我无法给出答案。 所以,我的问题是: 如果您错过交付期限(除了被解雇),您(自由职业者)会与您的客户达成什么协议?

9
设计继承如何导致额外的费用?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 所以,我想继承一个sealed class在CSHARP,结果被烧毁。除非您有权访问源,否则无法解封。 然后,我想到了“为什么sealed甚至存在?”。4个月前。尽管阅读了很多有关内容的文章,但我还是不知道,例如: 乔恩·斯凯特(Jon Skeet)的愿望是:“ 类在.NET中默认为封闭的。 ” 比继承更偏爱组成? “您不应该密封所有课程(...)” 您如何模拟密封课程? 从那以后我一直试图消化所有这些,但是对我来说太过分了。最终,昨天我再次尝试了。我再次扫描了所有这些文件,还有更多: 为什么一个班级应该不是“抽象”或“最终/密封”之外的任何东西? 在超过15年的编程时间中,我第一次听说SOLID时,是从已经链接的问题的答案中得出的,显然我四个月前都没有读过它 最后,经过深思熟虑,我决定根据新标题对原始问题进行大量编辑。 在老问题过于宽泛和主观的。基本上是在问: 旧标题中:使用密封的一个很好的理由 在正文中:如何正确修改密封类?忘记继承?使用成分? 但是现在,理解(我昨天没做过)所有事情sealed都在阻止继承,我们可以并且确实应该在继承上使用组合,我意识到我需要的是实际示例。 我想我的问题是(实际上一直都是)Mindor先生在聊天中向我提出的建议:继承设计如何导致额外的成本?
12 c#  inheritance 

4
我将如何设计一个接口,以使其清楚哪些属性可以更改其值,哪些属性将保持不变?
我在有关.NET属性的设计问题。 interface IX { Guid Id { get; } bool IsInvalidated { get; } void Invalidate(); } 问题: 此接口具有两个只读属性,Id和IsInvalidated。但是,它们本身是只读的事实本身并不能保证它们的值将保持不变。 可以说,我的意图是要清楚地表明…… Id 表示一个常量值(因此可以安全地缓存),而 IsInvalidated可能会在IX对象的生存期内更改其值(因此不应缓存)。 我如何修改interface IX以使该合同足够明确? 我自己尝试的三种解决方案: 该界面已经过精心设计。调用方法的存在Invalidate()使程序员可以推断出类似名称的属性的值IsInvalidated可能会受到它的影响。 仅在方法和属性的命名类似的情况下,此参数才成立。 通过事件增强此接口IsInvalidatedChanged: bool IsInvalidated { get; } event EventHandler IsInvalidatedChanged; …Changed事件的存在IsInvalidated表明该属性可能会更改其值,而事件的类似事件的缺失Id则表明该属性不会更改其值。 我喜欢这种解决方案,但其中很多其他的东西可能根本就不会使用。 IsInvalidated用以下方法替换属性IsInvalidated(): bool IsInvalidated(); 这可能太微妙了。可以暗示每次都会重新计算一个值-如果它是一个常数,则不需要。MSDN主题“在属性和方法之间选择”对此有这样的说明: 在以下情况下,请使用方法而不是属性。[…]每次调用操作都会返回不同的结果,即使参数没有更改。 我希望得到什么样的答案? 我对解决该问题的完全不同的解决方案最感兴趣,并给出了它们如何击败我的上述尝试的解释。 如果我的尝试在逻辑上有缺陷或具有尚未提及的重大缺点,以致仅剩一种解决方案(或没有解决方案),我想听听我哪里做错了。 如果缺陷很小,并且在考虑了多个解决方案后仍然存在,请发表评论。 至少,我希望获得一些反馈,以了解哪种是您首选的解决方案,以及出于何种原因。
12 c#  design  .net  properties 

1
修改对象的__dict__以设置其属性是否被视为Pythonic?
我有一个从数据库(或其他来源,例如MongoDB,CSV文件等)中找到的行中夸大对象的类。要设置对象的属性,它会执行类似self.__dict__.update(**properties)或的操作obj.__dict__.update(**properties)。 这被认为是Pythonic吗?这是我应该继续使用的好模式,还是这种不好的形式?
12 python 

5
如何将我的思想从C ++迁移到C#
我是一位经验丰富的C ++开发人员,我对语言非常了解,并且已经大量使用了其某些特定功能。另外,我了解OOD的原理和设计模式。我现在正在学习C#,但是我无法停止无法摆脱C ++心态的感觉。我将自己与C ++的优势紧密联系在一起,以致于我无法缺少某些功能。而且我在C#中找不到任何好的解决方法或替代方法。 有什么好的做法,设计模式,成语是在C#不同于C ++的角度可以建议?如何获得一个完美的C ++设计,而不是C#中的笨拙? 具体来说,我找不到一种很好的C#方式来处理(最近的示例): 控制需要确定性清除的资源(例如文件)的生命周期。这很容易using掌握,但是当资源的所有权正在转移时[...在线程之间]如何正确使用它呢?在C ++中,我只使用共享指针,并让它在适当的时候处理“垃圾回收”。 不断为特定泛型的重写功能而苦苦挣扎(我喜欢C ++中的部分模板专门化之类的东西)。我应该放弃使用C#进行通用编程的任何尝试吗?也许泛型是有目的的,除了特定领域的问题外,使用C并不是C#风格? 类似宏的功能。虽然通常是个坏主意,但对于某些问题领域,没有其他解决方法(例如,对语句的条件评估,例如只应运往Debug版本的日志)。没有它们意味着我需要放置更多if (condition) {...}样板,并且在触发副作用方面仍然不尽相同。

3
是否可以有效地表示具有不变状态的对象图的突变?
我正在练习在C ++中使用不可变对象。我的个人目标是用不可变图序列表示通用对象图(在堆中)。 构建多版本图本身并不难。问题是性能。蛮力版本控制需要图形的完整副本,这是不可接受的。 我试图共享不变的节点。但是在这种情况下,我遇到了一个新问题。参考。对其他对象的引用必须在整个图中进行更新。每次派生新图版本时,都需要访问所有节点。并且这会使带有引用的节点发生变异,因此也应该派生它们(通过复制)。性能不会比暴力复制更好。 据我所能想象,没有真正有效的方法来表示具有不变状态的对象图的突变。因此,我希望对此有所想法。 是否可以用不变状态有效地表示对象图的变化?

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.