软件工程

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

3
构建自动化与部署自动化与持续集成
我想变得更高效,我想高效地使用操作工具。 考虑到这一点,我想了解有关持续集成的更多信息,但是似乎有很多不同的事情要涉及到。 我实际上在工作中使用Jetbrains套装(IntelliJ,WebStorm ...),所以我想继续使用它们,并且我想使用TeamCity,它似乎是一个不错的工具,带有许多用于持续集成的插件。 我的问题是我不知道它们之间有什么区别: 楼宇自动化(TeamCity是这种软件):我知道我们可以使用远程VCS存储库来构建应用程序,这很棒,但是这样做的主要目的是什么?在执行此操作时,什么样的信息很重要?实际上,我已经知道我的软件是否在本地构建,而我的团队也是如此。那么,在不部署自动化的情况下使用它的目的是什么? 部署自动化(TeamCity似乎并不容易做到) 持续集成(似乎是上述两者的结合) 持续交付(这到底是什么?为什么它与持续集成不同?) 您能帮我多了解一点吗?

1
我不小心检查了某人的整个项目。有任何可接受的拉取请求的方式吗?
我在github上找到了一个很棒的项目,该项目具有有用的中央功能,但是在“抛光”错误处理,日志记录,配置和设置方面比较粗糙。该项目五年没有动,只有几百行代码。仍然足够有用,足以吸引大量观察者和少量叉子。 使用时需要添加特定的内容,但在此之前我进行了一些清理。然后,我变得有点痴迷于工程师,在一周的时间里,我最终添加了一个日志记录系统,大量的日志记录,一个自动设置,将代码之外的配置纳入外部配置文件(以及读取它们的代码),加上我发现的几个错误修正。 我确实认为我所做的所有更改都是合理/良好的,并且是听众需要使用的内容。但是有很多提交,几乎与原始回购的提交一样多(避免使用数量来保持一般性)。此外,git blame显示我已经触及了这个(小的!)代码库的几乎每一行。我不是在寻求对该项目的控制,也不是寻求我所做的一切功劳。但是给定选择之后,我希望看到我的更改合并在一起,以便每个人都可以从中受益,而不是隐藏在我不知名的github上。 我以前从未提交过请求请求,但我知道它们应该很小并且易于查看。但是,我在这里进行了很多变革性的更改。 我的提交非常干净,因为我倾向于仔细地进行历史记录。但是它们很难分离成多个分支/拉取请求,因为其中很多必须建立在自身之上。例如,配置外部化建立在一些准备工作的清理上,并且安装程序的一部分存在以填充这些配置,日志记录是由安装程序中创建的外部配置启用和配置的,等等。我非常愿意尽我所能使这种大药丸变得更可口,我只是不知道那会是什么。我可以分开进行两次提交,但是大修仍然很大。 那么,如果他们不小心检修某人的项目该怎么办? 我是否应该只上课不要这样做,并将自己的更改保留在自己的叉子上?我是否应该提出拉取请求,然后看看会发生什么?我应该在描述中花一堆字来解释自己吗?我应该以某种方式呈现吗?

5
短路评估何时不好?
为了更清楚一点,我声明我已经花了很多时间使用不同的语言。但是直到现在它要么一直使用它,要么根本不支持它。 现在,我可以从需要VB.net的项目开始工作,并且我看到它在AND和ANDALSO方面提供了两种方式。第一个不会短路,第二个会短路。 因此,这使我想知道为什么?像这样进行设置似乎意味着人们经常想切换模式。但是我认为在任何情况下使用短路都是一件坏事。 我知道这很可能会涉及更多选项,因此,如果我需要将其放在其他地方,只需告诉我在哪里。 尽管我希望至少有一个正式的答案,但是关于为什么有两个选择总比总要做短路更好的原因。

3
使用严格类型输入时docblock类型提示是否多余
我有一个相当大的私有代码库,它已经发展了大约十年。我没有使用phpDocumentor,但是由于使用docblock节已经成为开源项目中的标准,所以我也为存储库中的所有公共方法采用了编写docblock的方法。大多数块仅包含一个小的描述以及所有参数和返回类型的类型提示。 随着静态分析的到来,这些类型提示已帮助我找到了很多不一致之处和可能的错误。最近,我已经使用PHP的typehints将整个代码库(现在在PHP7.2上运行)转换为具有所有参数和返回值的类型提示。现在我在想...这些docblock typehints是否多余?它需要进行大量工作,以使所有docblock与不断变化的代码保持同步,并且由于它们不添加任何新信息,我想知道完全删除它们是否更好。 一方面,即使有多余的内容,删除文档也感觉很糟糕。在另一种情况下,我真的很想打破已经重复进行提示的“不要重复自己做”的日常类型提示内容。
12 php  comments 

5
修改通过引用传递的对象是不好的做法吗?
过去,我通常会在创建/更新对象的主要方法中对对象进行大部分操作,但是最近发现自己采用了另一种方法,我很好奇它是否是不好的做法。 这是一个例子。假设我有一个接受User实体的存储库,但是在插入该实体之前,我们调用一些方法以确保其所有字段都设置为所需的值。现在,不是调用方法并从Insert方法中设置字段值,而是调用一系列准备方法,这些方法在对象插入之前对其进行成形。 旧方法: public void InsertUser(User user) { user.Username = GenerateUsername(user); user.Password = GeneratePassword(user); context.Users.Add(user); } 新方法: public void InsertUser(User user) { SetUsername(user); SetPassword(user); context.Users.Add(user); } private void SetUsername(User user) { var username = "random business logic"; user.Username = username; } private void SetPassword(User user) { var password = "more …

3
在Docker容器中运行开发环境是否有好处?
我主要在Windows上使用Visual Studio进行开发。问题是一段时间后Windows陷入困境,我面临着需要重新安装Windows的麻烦。同样,切换到新机器也是一个问题。 重新安装Windows很麻烦,因为我的开发环境有很多依赖项(例如,额外的MSBuild配置文件,VS扩展,npm,Java等)。我不认为我会一个人拥有复杂的系统,而将其设置为备份至少可能需要一天的时间。 我没有真正使用过Docker,但是从理论上讲,这听起来像我可以在Windows容器中设置我的开发环境,然后随身携带它(例如,复制到我的笔记本电脑中,放入新的Windows安装中),这应该很轻松。 我要描述的可能吗?是否存在性能,可靠性等缺点?其他陷阱?
12 docker 

1
保持逻辑和物理架构图的更新
在任何涉及具有多个开发人员的分布式系统的软件开发项目中,拥有逻辑和物理体系结构图是最佳实践,但是以我的经验,这些图总是在项目开始时就得到很好的维护,但是在项目发布时不会得到更新维护阶段就开始了。 对于具有很多分布式过程的复杂项目,由于没有人知道所有的知识,因此即使在最初发布之前,这些图也往往会很快变得过时或不准确。 在这种背景下,我想向社区提出以下问题: 拥有准确且最新的逻辑和物理架构图有多重要? 是否有任何工具和流程可以帮助他们保持最新状态? 谁应该负责使它们保持最新状态?系统管理员,开发人员和质量检查团队如何贡献力量?

2
如果其中一项失败,您如何设计更新多个微服务的软件?
我是否可以使用设计模式或实践来帮助出现故障或停机的服务,而其他服务却保持稳定? 如果我有三个微服务,其中两个很好,又在POST中间死了怎么办?有两个将获得POST,而一个则不会。我认为我无法进行交易,因为我正在将请求发送给服务。 我该如何设计?我不想在各种数据库中孤立数据。

6
Scrum-在Sprint之外工作的开发人员
Scrum团队 3 x开发人员 2个测试仪 1 x自动化测试分析师 我们不是一个多功能的团队,因为开发人员不进行测试,测试人员也不进行开发。我相信这是问题的根本原因。 我们目前进行两周的冲刺。 冲刺开始时,每个人都很忙,开发人员开始开发工作,而测试人员正在准备测试(编写测试用例等)。 一旦测试人员完成了准备工作,他们现在正在等待开发工作完成,或者开发工作已经完成,开发人员正在等待反馈/错误。 开发人员在这里发痒,开始处理积压中当前冲刺之外的项目。这产生了一种奇怪的影响,即我们总是在当前的Sprint中开发下一个Sprint。对我来说,这感觉不对。 从管理层的角度来看,他们宁愿开发人员做工作,也不愿坐在办公桌前不做任何事情,但与此同时,我觉得Scrum团队的目标和重点应该完全放在当前的sprint上。我希望我们的团队是多功能的,但不幸的是这是无法实现的。测试人员没有进行开发工作所必需的技能,并且大多数开发人员都认为测试在他们之下。 这是Scrum中的问题吗?有针对这个的解决方法吗?Scrum仅与多功能团队一起工作吗? 如果可能的话,我想知道其他人的经验:)
12 agile  scrum 

4
当需要大量输入数据时,如何在微服务架构中使用规则引擎?
现在的情况 我们正在微服务架构中实现(现在正在维护)在线购物Web应用程序。 要求之一是,企业必须能够对客户添加到购物车中的商品应用规则,以自定义其体验和最终订单。很显然,必须建立业务规则引擎,并且为此我们实现了一个特定的“微服务”(如果仍然可以这样)。 在过去的一年中,此规则引擎变得越来越复杂,需要越来越多的数据(例如购物车的内容以及用户信息,他的角色,他的现有服务,一些账单信息等)才能计算这些规则。 目前,我们的shopping-cart微服务正在从其他微服务收集所有这些数据。即使部分资料已由所使用shopping-cart,大部分时间主要还是用来提供规则引擎。 新要求 现在,需要其他应用程序/微服务来重用规则引擎以实现类似的需求。因此,在当前情况下,他们将必须传输相同类型的数据,调用相同的微服务并构建(几乎)相同的资源才能调用规则引擎。 照原样继续,我们将面临几个问题: 每个人(称为规则引擎)都必须重新实现对数据的获取,即使他们自己不需要数据也是如此。 对规则引擎的请求很复杂; 继续朝这个方向发展,我们将不得不在整个网络上传输许多请求的数据(想想μsA调用μsB调用规则引擎,但是A已经有了规则引擎需要的一些数据); shopping-cart 由于所有数据的获取而变得巨大; 我可能会忘记很多…… 我们怎样做才能避免这些麻烦? 理想情况下,我们将避免为规则引擎增加更多的复杂性。我们还必须确保它不会成为瓶颈-例如,某些数据的获取速度相当慢(10 s甚至更多),因此我们实施了预提取,shopping-cart以便在调用规则之前数据更有可能存在引擎,并保持可接受的用户体验。 一些想法 让规则引擎获取所需的数据。这将增加它的复杂性,违反了单一责任原则(甚至更多……); 在规则引擎获取数据之前实施代理μs; 实施规则引擎调用的“数据获取程序”μs,以一次获取其所需的所有数据(复合查询)。

2
面向Java初学者的RESTful服务的结构
就Java Web开发技能而言,我相对较新。我有一个项目,根据我对API的了解,我认为该项目可以很好地成为RESTful服务的候选人。我正在尝试了解应该如何构造的详细信息,但在谷歌搜索和阅读已有资料方面并没有真正涉足。我希望根据我对该主题的知识和假设,这篇文章能够带来一些验证和/或重定向。 我目前的假设是我的RESTful服务将具有以下结构: 数据库数据(SQL)。 一个ORM(我使用的是相对不受欢迎的ORM,称为CPO,但是对于大多数人来说,它只会被Hibernate取代)。 一个Java管理器类,其方法与ORM进行对话以获得数据 一个Java控制器类,用于处理请求映射,并用于@ResponseBody通过HTTP谓词来指导/处理URL和如何处理数据的动作(http://mysite.com/computers/dell可能GET带有单词“ dell”的请求URL中的参数是一个参数,该参数将返回有关Dell计算机的信息的JSON数组)。 该服务应使用Spring Boot进行,或者以某种方式能够独立存在并且独立于任何其他应用程序。 现在假设以上内容是正确的,那么我将(在非常基本的水平上)拥有一个RESTful服务,任何应用程序都可以使用该服务来使用和使用数据。 所以说我有了我的Web应用程序。假设我正在制作一个有关计算机硬件信息的Web应用程序,而我正在使用Spring来构建此Web应用程序。这是我的假设: 作为JSP,我会有很多看法,而这些JSP包含HTML,CSS和JavaScript。JavaScript将根据需要处理对此应用程序控制器的AJAX调用(如下)。 该Web应用程序还将拥有自己的控制器来处理应用程序的URL请求和路由,然后该控制器将使用该ModelAndView对象或类似的东西与RESTful服务的控制器“对话”,获取正在传递的任何数据,然后将该数据传递回视图(JavaScript,JSP等)进行显示。 我在这里吗?我知道RESTful服务也有一个身份验证方面,但是从概念上讲我还不存在(我的项目将在专用网络中使用,因此此时安全性不是优先事项)。 非常感谢任何见解,批评,知识,反馈或澄清。

1
为什么在服务器和客户端之间共享接口是一个坏主意?
当我发现一种在HTTP服务器与其客户端之间共享接口的方法时,我正在阅读Spring Cloud Netflix文档。他们将这个示例用于微服务,尽管没有理由不能将其扩展到通用HTTP通信: // The shared interface, in a common library public interface UserService { @RequestMapping(method = GET, value = "/users/{id}") User getUser(@PathVariable long id); } // The controller, on the server @RestController public class UserResource implements UserService { } // The same interface used for the client @FeignClient("users") public …

5
如果“存储库模式”对于现代ORM(EF,nHibernate)过大,那么更好的抽象是什么?
我最近阅读了很多关于将存储库模式与功能强大的ORM(例如Entity Framework)一起使用的争论,因为它结合了类似存储库的功能以及工作单元功能。 另一个反对在单元测试之类的情况下使用该模式的论点是,存储库模式是一种泄漏抽象,因为更通用的实现利用了IQueryable。 反对使用存储库模式的论点对我来说很有意义,但是建议的替代抽象方法通常更令人困惑,并且看起来像问题一样矫kill过正。 吉米·鲍嘉(Jimmy Bogards)的解决方案似乎既要吹散抽象,又要介绍自己的体系结构。 https://lostechies.com/jimmybogard/2012/10/08/favor-query-objects-over-repositories/ 另一个不必要的存储库示例....但是使用我的体系结构! http://blog.gauffin.org/2012/10/22/griffin-decoupled-the-queries/ 另一个... http://www.thereformedprogrammer.net/is-the-repository-pattern-useful-with-entity-framework 我还没有找到一种明显的替代或替代方法,而该替代方法本身并不具有更多的体系结构,因此可以替代“过于复杂”的存储库模式。

4
为什么对OOP的基本概念没有一致的定义?
我对编程非常陌生,并且从不同来源阅读\听到不同的约定有些困惑: 面向对象的编程有4个或5个概念吗? 作为新手,我了解以下5个概念: 抽象化 遗产 封装形式 多态性 模块化 那么,为什么找不到更“严格”的定义,这些概念似乎有几种排列方式呢?

2
在主服务器上启动请求请求或执行本地合并提交是否更好?
我使用GitHub已经有一段时间了,通常我会先推送功能分支,然后启动我自己合并的Pull Request。我发现它帮助我跟踪合并分支的位置。 但是最近我越来越多地阅读了有关Git的工作原理,我意识到我可以在合并分支时使用merge-commits进行引用。 因此,将功能分支合并到master中时,我该怎么办:在master上 执行merge-commit,然后将其推送到上游,或者在本地分支中推送并启动Pull Request? 我已经阅读了两人团队的请求介绍-合并我自己的请求吗?并且请告诉我工作,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.