软件工程

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

6
您是否在代码注释中写标题?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 我正在浏览我写的一些旧代码(在大学一年级),发现我以前在代码的各个部分之前都写过注释标题。像这样的东西(这是来自“大富翁”游戏): /*Board initialization*/ ...code... /*Player initialization*/ ...code... /*Game logic starts here*/ /*Displaying current situation*/ ...code... /*Executing move*/ ...code... /*Handle special event*/ ...code... /*Commit changes, switch to next player*/ ...code... 如果代码非常清晰,这可能是多余的,并且可以说是不必要的,但是当我浏览文件时,即使我几乎不看实际的代码,我也以为我知道发生了什么,这让我感到非常惊讶。在某些情况下,我绝对可以认为这很合适,所以我想知道-您这样做吗?您认为这是个好主意吗?还是太多?

10
保存应用程序设置的最佳方法
在Windows中,默认方式是注册表。这使您可以区分系统范围设置和每个用户设置。 在Unix中,应将/ etc文件夹中的文本文件用于系统范围的设置(每用户设置的约定是什么?)。 许多新程序(尤其是为便携式设计的程序)都使用XML文件。 存储非BLOB设置的最佳方法(和位置)是什么? 我们应该遵循每个系统默认值还是拥有统一的解决方案? 最好的便携式方法是什么?

4
什么时候是合适的时间加入程序员的开源项目?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 编程的大多数新手都是从基础项目开始的,而从基础项目开始的。大多数C ++程序员都花一些时间进行谜题和竞赛,但这并不总是有用的。有时您必须花一些时间在实际项目上。对于缺乏经验的指导者和同伴,他们无法看您的代码并提出建议,而对于新手来说,开始您自己的开源项目可能是一个自学问题。开源项目可以解决此问题,有些项目可能最适合新程序员。此外,每个人在某个时候都是新手。因此,我将尝试从初学者的角度提出这个问题。 在问这个问题之前,我曾尝试过一些关于堆栈溢出的问题,例如“我如何加入并达到最低要求,以及如何参与开源以及什么级别的编程等”。但这在技能自我评估方面无济于事。如何找出来?我如何检查加入开放源代码项目需要什么,我真的对庞大的源代码等感到满意。 我的问题是什么时候可以考虑加入开源编程?我的意思是,您将如何测试自己是否准备承担开源项目的重担?您将如何测试自己,看是否可以与版本控制/其他程序员/严格的计划等配合使用?

4
如何管理范围蠕变?
我们通常会在最后一刻收到企业的要求,要求实施一项额外的功能。项目经理通常负责将这些请求过滤为“必须具备”或“必须具备”,但是在某些情况下,企业希望将所有这些功能压缩到一个发行版中。有什么好方法可以拒绝企业吗?可以采取哪些步骤来停止或最小化示波器的蠕变?

9
如何防止深凹痕?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 3年前关闭。 我可以采取什么步骤和措施来防止代码中的深缩进?


7
在将团队转换为TDD以实现全面覆盖之后,编写所有可能的测试用例是一个好主意吗?
假设我们有一个大型企业级应用程序,而没有任何单元/功能测试。由于非常紧迫的期限,因此在开发过程中没有测试驱动的开发过程(我知道我们永远不能在不确定的情况下承诺任何紧迫的期限,但是已经完成了!) 既然所有的截止日期都过去了,事情变得平静了,每个人都同意将我们转变成一个富有成效的基于TDD / BDD的团队...是的! 现在的问题是关于我们已经拥有的代码:(1)停止大多数开发并从头开始编写所有可能的测试用例还是可以的,尽管一切都可以很好地进行(尽管!)。 ?或(2)最好等待一些不好的事情发生,然后在修复过程中编写新的单元测试,或者(3)甚至忘记以前的代码,而只为新代码编写单元测试,并将所有内容推迟到下一个主要重构中。 有几个好的,如相关的文章这一个。考虑到我们的时间非常有限,还有许多其他项目/作品正在等待我们,我仍然不确定是否值得为此进行投资。 注意:这个问题正在解释/想象开发团队中一个完全尴尬的情况。这与我或我的任何同事无关;这只是一个假想的情况。您可能会认为这种情况永远都不会发生,否则开发经理会造成这种混乱!但是无论如何,已经完成了。如果可能的话,请不要仅仅因为您认为这永远不会发生而投票。

2
多层体系结构:应该在哪里实施错误记录\处理?
我目前正在重构具有多层体系结构的大型子系统,并且正在努力设计一种有效的错误记录\处理策略。 假设我的架构包含以下三层: 公共接口(即MVC控制器) 域层 资料存取层 我的困惑源是我应该在哪里实施错误日志记录\处理: 最简单的解决方案是在顶层(即Public Interface \ MVC Controller)实现日志记录。但是,这感觉不对,因为这意味着将异常遍历不同的层,然后将其记录下来。而不是将异常记录在源头。 从源头记录异常显然是最好的解决方案,因为我掌握了最多的信息。我的问题是,如果不捕获所有异常,就无法在源头捕获每个异常,并且在域/公共接口层中,这将导致捕获已被下面的层捕获,记录和重新抛出的异常。 另一种可能的策略是#1和#2的混合使用。因此,我在最有可能引发异常的层上捕获了特定异常(例如,SqlExceptions在数据访问层中捕获,记录和重新抛出异常),然后在顶层记录了任何其他未捕获的异常。但是,这还需要我在顶层捕获并重新记录每个异常,因为我无法区分已记录\处理过的错误与未记录过的错误。 现在,显然这是大多数软件应用程序中的问题,因此必须有一个解决该问题的标准解决方案,以使异常在源头被捕获并记录一次。但是我自己却看不到该怎么做。 请注意,该问题的标题与“ 在多层应用程序中记录异常 ”非常相似,但是该帖子中的答案不够详细,不足以回答我的问题。

7
机器学习应用于代码开发
我的背景是机械工程,所以请原谅我对此领域的无知。 我真的很喜欢编程和软件开发。另外,最近,我强烈推荐由斯坦福大学教授吴国安(Andrew Ng)教授的免费在线机器学习(ML)课程。链接到这里。 我听说这位教授说很难找到ML永远不会影响的领域。 题 所以我的问题是,迄今为止在将机器学习应用于代码开发方面进行了哪些研究?调试如何? 如果可能,请包括资源/资源/科学论文。 我没有运气搜索,因为经常搜索ML 和软件开发(或编程)最终导致ML应用程序的软件开发(或编程)的结果。

6
如何为多态类创建GUI?
假设我有一个测试构建器,以便老师可以为测试创建很多问题。 但是,并非所有问题都相同:您有多项选择,文本框,匹配项等等。这些问题类型中的每一个都需要存储不同类型的数据,并且对于创建者和应试者都需要不同的GUI。 我想避免两件事: 类型检查或类型转换 我的数据代码中与GUI有关的所有内容。 在最初的尝试中,我最终获得了以下课程: class Test{ List<Question> questions; } interface Question { } class MultipleChoice implements Question {} class TextBox implements Question {} 但是,当我去显示测试时,我不可避免地会得到如下代码: for (Question question: questions){ if (question instanceof MultipleChoice){ display.add(new MultipleChoiceViewer()); } //etc } 这感觉像是一个非常普遍的问题。是否有一些设计模式可以让我在避免上面列出的项目的同时提出多态性问题?还是多态性首先是错误的想法?

4
开发ASP.NET应用程序时值得使用CQRS / MediatR吗?
我最近一直在研究CQRS / MediatR。但是,我越深入,就越不喜欢它。也许我误会了一些东西。 因此,它声称可以将您的控制器简化为 public async Task<ActionResult> Edit(Edit.Query query) { var model = await _mediator.SendAsync(query); return View(model); } 完全符合瘦控制器指南。但是,它忽略了一些非常重要的细节-错误处理。 让我们看一下Login新MVC项目中的默认操作 public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null) { ViewData["ReturnUrl"] = returnUrl; if (ModelState.IsValid) { // This doesn't count login failures towards account lockout // To enable password failures …

3
编译目标到底是什么?
我一直在听这个词,所有的google搜索都引导我找到有关编译器的文章。我只是想了解术语“编译目标”的含义:| 更新:提供一些背景信息:我听说它说Web程序集是其他语言(例如C,C ++,Rust等)的编译目标。
17 compiler 

2
为什么Linux / BSD中没有通用批处理系统调用?
背景: 系统调用开销比函数调用开销大​​得多(估计范围为20-100x),这主要是由于上下文从用户空间切换到内核空间再返回。内联函数通常可以节省函数调用开销,并且函数调用比syscall便宜得多。可以说,开发人员希望通过尽可能多地在一个系统调用中进行内核内操作来避免一些系统调用开销。 问题: 这已经创造了很多(多余的?)系统调用像sendmmsg() ,的recvmmsg()还有CHDIR,开放,lseek的和/或类似的符号链接组合:openat,mkdirat,mknodat,fchownat,futimesat,newfstatat,unlinkat,fchdir,ftruncate,fchmod,renameat,linkat,symlinkat,readlinkat,fchmodat,faccessat,lsetxattr,fsetxattr,execveat,lgetxattr,llistxattr,lremovexattr,fremovexattr,flistxattr,fgetxattr,pread,pwrite等... 现在,Linux已添加copy_file_range(),显然将读取lseek和写入syscall组合在一起。变成fcopy_file_range(),lcopy_file_range(),copy_file_rangeat(),fcopy_file_rangeat()和lcopy_file_rangeat()只是时间问题...但是由于涉及2个文件而不是另外X个调用,因此它可能变成X ^ 2更多。好的,Linus和各种BSD开发人员不会放任不管,但我的观点是,如果有一个批处理syscall,那么所有这些(大部分?)都可以在用户空间中实现,并且可以减少内核复杂性而无需增加太多如果libc方面有任何开销。 已经提出了许多复杂的解决方案,其中包括某种形式的特殊syscall线程,用于非阻塞syscall到批处理syscall。但是,这些方法以与libxcb和libX11几乎相同的方式为内核和用户空间增加了相当大的复杂性(异步调用需要更多的设置) 解?: 通用批处理系统调用。这将减轻最大的成本(多模式切换),而不会具有与专用内核线程相关的复杂性(尽管以后可以添加功能)。 socketcall()系统调用中的原型基本上已经有了良好的基础。只需将其从采用参数数组扩展为采用返回数组,指向参数数组的指针(包括系统调用号),系统调用数和标志参数即可,如下所示: batch(void *returns, void *args, long ncalls, long flags); 一个主要的区别是,为了简单起见,参数可能全部都需要用作指针,以便先前的syscall的结果可以被后续的syscall使用(例如open(),read()/中使用的文件描述符write()) 一些可能的优点: 更少的用户空间->内核空间->用户空间切换 可能的编译器开关-fcombine-syscalls尝试自动进行批处理 异步操作的可选标志(返回fd立即观看) 在用户空间中实现将来的组合syscall功能的能力 题: 实现批处理系统调用是否可行? 我是否缺少一些明显的陷阱? 我是否高估了收益? 对我来说,麻烦实施批处理系统调用是否值得(我不在Intel,Google或Redhat工作)? 我之前已经修补了自己的内核,但不愿处理LKML。 历史表明,即使某些东西对“普通”用户(没有git写访问权限的非公司最终用户)广泛有用,它也可能永远不会在上游被接受(unionfs,aufs,cryptodev,tuxonice等)。 参考文献: FlexSC:具有少异常系统调用的灵活系统调用调度 通过专用用户和内核CPU避免系统调用开销


2
对Web应用程序使用单独的API和UI服务器的好处
在工作中,我们已经开发了将近两年的大型内部应用程序;我最近才刚加入该项目,有些架构使我有些困惑,所以我希望这里的人可以在我问建筑师这些同样的问题之前提供一些建议(这样我可以与他们进行有见地的讨论)。 如果下面的内容过长,我深表歉意,我只想在问我的问题之前,先对系统的外观有一个很好的了解:) 设置系统的方式是,我们有一个主要的Web应用程序(asp.net,AngularJS),该应用程序主要只是聚合来自其他各种服务的数据。因此,基本上,它是AngularJS应用程序的宿主。实际上,有一个MVC控制器引导客户端,然后每个其他控制器都是WebAPI控制器。 这些控制器处理来自客户端的调用,这些控制器始终部署到仅托管Web应用程序的主机上。我们目前有4个这样的盒子。 但是,这些调用最终会路由到另一组WebAPI应用程序(通常是每个业务领域,例如安全性,客户数据,产品数据等)。所有这些WebAPI也会一起部署到专用盒中。我们也有四个这样的盒子。 除了一个例外,我们组织的任何其他部门均未使用这些WebAPI。 最后,这些WebAPI对“后端”服务进行了另一组调用,这些服务通常是遗留在各种ERP系统和数据存储(我们无法控制)之上的传统asmx或wcf服务。 我们应用程序的大多数业务逻辑都在这些WebApi中,例如转换旧数据,对其进行汇总,执行业务规则以及通常的事情类型。 我感到困惑的是,在WebApplication和为其提供服务的WebAPI之间进行这样的分离可能带来什么好处。由于没有其他人在使用它们,因此我看不到任何可伸缩性的好处(即,再放入4个API盒来处理增加的负载是没有意义的,因为API服务器上的负载增加必然意味着Web服务器上的负载增加-因此,Web服务器与Api服务器的比例必须为1:1) 我也看不到必须进行额外的HTTP调用的任何好处浏览器=> HTTP => WebApp => HTTP => WebAPI => HTTP =>后端服务。(我的问题是WebApp和WebAPI之间的HTTP调用) 因此,我目前正在寻求将当前的WebAPI从单独的解决方案迁移到WebApplication解决方案中的单独项目,并在它们之间使用简单的项目引用,并使用一个部署模型。因此,它们最终将成为类库。 在部署方面,这意味着我们将有8个“全栈” Web框,而不是4 + 4。 我看到的新方法的好处是 性能提高,因为Web应用程序和WebAPI服务器之间的序列化/反序列化周期减少了 在Web应用程序和WebApi服务器的传出和传入边界上,根据DTO和映射器可以删除(即无需维护/测试)的大量代码。 具有更好的能力来创建有意义的自动集成测试,因为我可以简单地模拟后端服务并避免中间层HTTP跳转带来的混乱。 所以问题是:我错了吗?我是否错过了将WebApplication和WebAPI框分开的一些基本“魔术”? 我研究了一些N-Tier架构材料,但似乎找不到任何可以为我们的情况带来具体好处的东西(因为据我所知,可伸缩性不是问题,这是一个内部应用程序,因此WebAPI应用程序的安全性不是问题。) 而且,如果我将系统重组为建议的设置,那么在收益方面我将损失什么?

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.