软件工程

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

4
在MVC上,几个视图可以具有相同的控制器,还是一个视图必须具有一个唯一的控制器?
在围绕MVC设计项目的体系结构时遇到一些问题。(这是一个C ++ / Marmalade SDK项目,我没有使用任何特定的MVC框架,而是创建了一个。) 在几篇文章中(例如在史蒂夫·伯贝克(Steve Burbek)的原始文章中),我一直在阅读“ MVC triad”的概念,这使我感到困惑,因为我从字面上理解了这个概念。当我第一次阅读它时,看起来应用程序是围绕“ MVC triad”单元构建的(我应该为每个UI单元构建一个单元),但是我发现这相当不灵活,我认为这并不是打算使用MVC的方式。然后,进一步研究该问题,我发现了控制器和视图紧密耦合的几个示例,即一对一关系-TextEditView具有TextEditController。 但是,当我回到项目时,发现使用一个控制器(按“逻辑单元”,如AddElementController)和该特定控制器的多个视图可能会很有用。 我显然在考虑类似AddElementController之类的东西,它应该具有某种选项卡式UI。我是否应该具有一个具有AddElementTabView的AddElementController以及用于选项卡的几个AddImageView,AddSoundView等?还是每个选项卡视图都应该有一个不同的“子控制器”? 总而言之,关于MVC模式(不是X框架对此模式的特殊理解/实现),为一个控制器拥有多个视图是否正确,还是每个视图都应具有其特定的控制器? 另外,在控制器上保留一些状态信息是否正确还是应该是无状态的(意味着状态应该放在某些非域状态模型上)? 在此先感谢所有。


5
编程语言中的“功能的本机支持”是什么意思?
我经历了这样的一行:“ PHP没有对Unicode的本机支持”。我还读到Python对Unicode具有本机支持。现在,您可以utf8_encode()在PHP中调用一个函数以将字符串编码为Unicode,并且可以unicode()在Python中使用一个函数将字符串转换为unicode。那么原生支持Unicode是什么意思呢?同样,某些语言对并发具有本地支持,而某些语言则没有对本地支持。那是什么意思 X语言本身支持功能Y

4
开发人员可以期望多少有关用户故事的细节?
我所体验到的敏捷开发的最大缺点是,不参与开发的人们专注于这样的口头禅:用户故事(3-10个理想人日)不应包含超过1-3个句子,例如: 作为客户,我可以使用自由文本搜索,以便找到所需的产品。 给出这句话,项目经理希望我作为开发人员致力于估算并开发故事。他们认为敏捷开发意味着他们必须提供给开发人员的此类语句。 我不会责怪他们,因为关于敏捷开发的著名文献给人以这样的印象,即它实际上是可行的。在“ Planning XP”中,每个故事我都用自然语言阅读了大约2页,但这就是事实。因为“工作软件”比“综合文档”更受青睐,所以似乎通常避免使用此主题。 当然,现实是,如果开发人员有机会这样做,则与客户的访谈会提出一长串客户对故事的要求清单: 我们需要布尔运算符,例如AND和OR。 我们需要所有的模糊搜索。 我们需要按单词和短语进行搜索。 我们不想找到符合标准X,Y和Z的产品。 我们要对结果进行排序。哦,顺便说一句,用户可以在带有选项a,b和c的组合框中选择排序标准。 所以您看到我不是在谈论技术细节,软件设计甚至实施细节。这是纯粹的要求。我们交谈的时间越长,客户就越能意识到他们想要的东西很多。 但是,我经常发现自己处于这种情况,即没有提供此类信息或以次充好方式。我既不可能进行面试,也没有可能进行面试的人为我提供面试的结果。 有时,经理甚至会提出“我们希望进行Lucene搜索”之类的技术细节,但他们不想考虑是否只想查找产品名称或产品描述。有时我认为他们只是懒惰;) 对我来说,这是我工作的项目中的头号问题(电子商务Web应用程序,每个项目500-2000人日)。我已经足够频繁地解决了这个问题,并且经理们意识到大多数开发人员对此情况都有疑问。但是他们认为开发人员实在是太“完美主义者”了。他们似乎对开发人员“总是希望指定所有内容”感到恼火。 由于缺乏公认的数字,因此很难争论。每个人都知道迭代应该持续多长时间。但是没有人能说出估计和发展一个故事需要多少需求。 你有参考吗?

7
Scrum如何适应学术环境?
我目前正在与我所在大学的一位教授合作,为我学院提供的软件工程和Capstone设计课程开发新课程。 直到最近,这两个课程都只使用瀑布模型,因此,学生们大部分时间都在写冗长的报告。在我施加很大压力之后,我的教授决定在上学期将Scrum纳入软件工程课程。 本学期的前半段仍然是瀑布式的,学生们撰写了40页的设计报告和软件规格文档。学期中,所有团队都必须发布其应用程序演示。那时,课程切换到Scrum,进行了两个为期3周的冲刺。现在,我们正在尝试找出如何完全消除瀑布并创建完全基于Scrum的课程。 不幸的是,我们在Scrum和学生之间遇到了一些不兼容性: 对于学生来说,每天召开Scrum会议几乎是不可能的。即使在上课期间,由于教授通常是在讲课,所以学生召开Scrum会议也不方便。 由于学生缺乏经验,因此无法准确地预测要花费多长时间,因此很难估计积分/小时。 Scrum与全职,位于同一地点的开发人员最适合,但学生都不是。学生最多每周奉献15至20个小时的课程,组织工作会议可能非常困难。团队最多可以有10个学生(并且总是有一两个懒人)。 教授们渴望文档!我还没有听说过Scrum的任何报告,只有积压的工作量和燃尽图(我不确定这是否足以使学者安心)。 学生通常认为敏捷的意思是“立即跳入并开始编码而无需回头”。这导致了一些可以想象的最可怕的代码。因此,我正在寻找一种方法来执行适当的设计,而不需要50页的文档或一堆UML图。 鉴于这些问题,您如何看待我和我的教授如何使Scrum在学术环境中发挥作用(并且我们一开始甚至应该为Scrum烦恼)?此外,教导瀑布模型是否仍然有价值? 预先感谢您的任何反馈!

5
Monkeypatching是否被视为良好的编程习惯?
我一直在印象中,monkeypatching属于快速和肮脏的hack类别,而不是标准的良好编程习惯。虽然我不时使用修复第三方库的小问题,但我认为这是临时性的修复,因此我会向第三方项目提交适当的补丁程序。 但是,我已经将该技术用作主流项目中的“常规方法”,例如在Gevent的gevent.monkey模块中。 Monkeypatching是否已成为主流,正常且可接受的编程实践? 另请参阅:杰夫·阿特伍德(Jeff Atwood)的“ Monkeypatching for Humans”

3
聚合根何时应包含另一个AR(何时不包含)
首先让我为这篇文章的长度道歉,但是我真的很想在前面传达尽可能多的细节,所以我不会浪费您的时间在评论中来回走动。 我正在按照DDD方法设计应用程序,并且想知道我可以遵循什么指南来确定聚合根是否应该包含另一个AR,或者是否应该将它们保留为单独的“独立” AR。 以一个简单的“时钟”应用程序为例,该应用程序允许员工在一天之内或每天进行自我计时。用户界面允许他们输入员工ID和PIN,然后对其进行验证并检索员工的当前状态。如果该员工当前正在上班,则UI会显示一个“ Clock Out”按钮。相反,如果它们没有被计时,则按钮显示为“ Clock In”。该按钮采取的操作也对应于员工的状态。 该应用程序是一个Web客户端,它调用通过RESTful服务接口公开的后端服务器。我在创建直观,易读的URL时的第一步是产生了以下两个端点: http://myhost/employees/{id}/clockin http://myhost/employees/{id}/clockout 注意:在验证员工ID和PIN并在标头中传递表示“用户”的“令牌”后,才使用它们。这是因为存在一种“经理模式”,允许经理或主管调入或调出另一名员工。但是,为了便于讨论,我试图使其保持简单。 在服务器上,我有一个提供API的ApplicationService。我对ClockIn方法的最初想法是: public void ClockIn(String id) { var employee = EmployeeRepository.FindById(id); if (employee == null) throw SomeException(); employee.ClockIn(); EmployeeRepository.Save(); } 这看起来很简单,直到我们意识到员工的时间卡信息实际上是作为交易列表维护的。这意味着每次调用ClockIn或ClockOut时,我不会直接更改Employee的状态,而是将新条目添加到Employee的TimeSheet中。Employee的当前状态(已计时或未计时)是从TimeSheet中的最新条目得出的。 因此,如果我使用上面显示的代码,则我的存储库必须认识到Employee的可持久属性没有更改,但是在Employee的TimeSheet中添加了新条目并执行到数据存储的插入。 另一方面(这是帖子的最终问题),TimeSheet似乎既是聚合根又具有身份(员工ID和期间),我可以轻松地实现与TimeSheet.ClockIn相同的逻辑(员工ID)。 我发现自己正在辩论这两种方法的优点,并且如开篇所述,想知道我应该评估哪种标准以确定哪种方法更适合该问题。

4
用C ++编写构建脚本是否有意义?
我正在使用CMake生成我的项目IDE / makefile,但是我仍然需要调用自定义“脚本”来操纵我的编译文件甚至生成代码。 在以前的项目中,我一直在使用Python,而且还可以,但是现在在我正在处理的两个非常大的项目中管理很多依赖项时遇到了严重的麻烦,因此我想尽可能减少所有地方的依赖项。 有人建议我使用C ++编写我的构建脚本,而不是为此添加语言依赖。项目主题本身已经使用C ++,所以我可以看到几个优点: 要构建整个项目,只需要一个C ++编译器和CMake,就没有其他必要了(所有其他依赖项都是C或C ++); C ++类型的安全性(使用现代C ++时)使一切变得更容易“正确”; 它也是我所熟悉的语言,因此即使我能够编写一些不错的Python代码,也可以更轻松地使用它。 潜在的执行速度提升(但我认为这不会真正被察觉); 但是,我认为可能会有一些缺点,并且由于我尚未尝试,所以不确定真正的影响: 编写代码的时间可能会更长(也就是说,我不确定,因为我在C ++中足够高效,可以编写可以快速工作的东西,因此对于该系统来说,编写它不会太长)(编译时间不应在这种情况下是一个问题); 我必须假定我将作为输入阅读的所有文本文件都在UTF-8中,我不确定可以在运行时使用C ++轻松地对其进行检查,并且该语言不会为您进行检查。 C ++库比脚本语言更难管理。 我缺乏经验和前瞻性,所以也许我没有优势和劣势。所以问题是:为此使用C ++是否有意义?您有报告的经验吗,您是否看到了可能重要的优点和缺点?

3
为什么我们最好使用一流的收藏?
根据The ThoughtWorks Anthology中Jeff Bay (RTF)的对象健美操规则第4条规则,建议一个人应该“ 使用一流的收藏集 ”。 规则4:一流的收藏 该规则的应用很简单:任何包含集合的类都不应包含其他成员变量。每个集合都包装在自己的类中,因此与集合相关的行为现在有了归属。您可能会发现过滤器成为此新类的一部分。同样,您的新类可以处理诸如将两个组连接在一起或将规则应用于该组的每个元素的活动。 从中我可以理解的是,我们应该使用一个单独的类来包装该集合,并使用添加,删除该集合的数据的方法。 并且我们需要它,以便我们确定什么数据类型进入集合,什么结果出来。 如果我们使用通用集合(在适用的语言中),是否需要遵循此规则? 如果我没有重要意义,请澄清。

6
如何确定“代码改进”的优先级和严重性?
我们的错误跟踪系统中有“优先级”和“严重性”字段。我们将严重性定义为“它如何影响用户”,将优先级定义为“它如何影响产品”。 我的问题是关于如何按照严重性和优先级对“代码改进”任务进行分类。假设改进不会改变任何行为,而是使其成为“更好的代码”。我们预计总体上将获得长期的维护改进,但是很难量化。 当我们将定义用于优先级和严重性时,除非您在图片中引入一些难以预测的长期收益,否则代码改进将使这两个值均达到最低值。因此,这意味着代码改进是一项艰巨的任务,切勿尝试。 但是,我认为不断改进和重构代码至关重要,因为: 软件开发本身就是一个持续的学习过程,如果不对代码进行改进,就无法做得更好。 团队应该为自己的代码感到自豪。 未来的维护将花费更少的时间,从长远来看,节省的费用将是可观的。 还是您认为不应创建此类任务,而只能在“按需”,“与错误关联时”执行此类改进?即使它与错误相关联,这也不是代码审查的讨论重点,例如“为什么您要在结构上进行如此大的改变?”。

5
用于存储数以千万计的对象以进行查询的高效方法,每秒可以插入大量插入?
这基本上是一个日志记录/计数应用程序,它在p2p聊天网络上统计数据包的数量并统计数据包的类型等。这相当于在5分钟内大约有4-6百万个数据包。并且因为我仅对此信息进行“快照”,所以我仅每5分钟删除5分钟之前的数据包。因此,此收藏集中的物品数量上限约为10到1200万。 因为我需要与不同的超级对等方建立300条连接,所以每个数据包都可能尝试插入至少300次(这可能就是为什么将此数据保存在内存中是唯一合理的选择)的可能。 目前,我一直在使用字典来存储此信息。但是由于我要存储的项目太多,所以我遇到了大对象堆的问题,并且随着时间的推移,内存使用量不断增长。 Dictionary<ulong, Packet> public class Packet { public ushort RequesterPort; public bool IsSearch; public string SearchText; public bool Flagged; public byte PacketType; public DateTime TimeStamp; } 我尝试使用mysql,但是它无法跟上我需要插入的数据量(在检查以确保它不是重复的时候),而那是在使用事务时。 我尝试了mongodb,但是该CPU的使用非常疯狂,并且没有保持任何状态。 我的主要问题是每5分钟出现一次,因为我会删除所有早于5分钟的数据包,并对该数据进行“快照”。当我使用LINQ查询来计算包含某种数据包类型的数据包的数量时。我还对数据调用了一个distinct()查询,在该查询中,我从键值对的键中剥离了4个字节(IP地址),并将其与键值对的值中的requestingport值组合在一起,并使用该值来获得不同数量的所有数据包的对等体。 该应用程序当前的内存使用量徘徊在1.1GB左右,并且在调用快照时,它甚至可以使使用量翻倍。 现在,如果我有大量的ram,这将不是问题,但是目前运行此虚拟机的vm仅限于2GB的ram。 有什么简单的解决方案吗?

8
与解释型编程语言相比,shell脚本有何优势?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 (我不确定这是否是一个适当的问题) 就像用编写的脚本一样,Shell脚本bash可以完成许多工作。他们可以调用Unix程序,输出其输出,将I / O从文件重定向到文件,控制流,检查文件是否存在等。 但是现代编程语言(例如python和ruby)也可以做这些事情。而且,它们(我认为)更具可读性和可维护性。 bash享有广泛的采用。但是许多发行版也安装了python解释器。 那么shell脚本的好处是什么?如果我能写python,ruby还是perl值得学习bash?

7
使用C而不是Assembly有哪些优点/缺点?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 我目前正在研究电信和电子领域的工程学,我们已经从微处理器编程的汇编程序迁移到了C语言。我怀疑这是个好主意。与汇编相比,C有哪些优缺点? 我看到的优点/缺点是: 优点: 我可以说C语法比汇编器语法更容易学习。 使用C可以更轻松地制作更复杂的程序。 学习C比学习汇编器更有效率,因为围绕C的开发工作比汇编器要多。 缺点: 汇编器是比C更底层的编程语言,因此它非常适合直接对硬件进行编程。 暗示您可以使用内存,中断,微寄存器等的灵活性更高。
15 c  low-level  assembly 

2
程序运行时如何调试/更改Java代码?
我刚刚看了一段视频,显示Notch(以Minecraft闻名)如何在其运行时调试和更改Minecraft。他暂停游戏,更改代码中的某些内容,然后取消暂停游戏,使更改立即生效,而无需重新启动程序。 这是如何运作的?使用哪种技术来实现这一目标?
15 java  debugging 


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.