软件工程

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


4
什么构成一种编程语言?一种版权是一种编程语言?
我决定创建自己的编程语言,主要是为了娱乐。但是,我对这一切的法律方面感兴趣。 例如,您可以根据特定条款许可特定程序。但是,您如何许可语言?另外,我所指的不仅仅是语言(编译器和VM)的实现,而是标准本身。我所缺少的编程语言还有其他东西吗? 我想通过这种许可实现以下目标: 使其完全成为FOSS(一种语言甚至可以是FOSS,还是该实现可以是FOSS?) 建立自己作为作者的身份(您可以合法地成为语言的作者吗?还是仅仅是实现?) 做到这一点,以便要求使用我的语言的任何人都应将我归于我(MIT风格。请注意,尽管我只是在学习,但我对任何实际做到这一点的人都没有希望。) 我认为解决方案将是分别将我的语言的VM和编译器许可为“官方实现”,然后将设计文档许可为该语言本身。 我在这里到底想念什么?

3
事件源和持久性
我正在阅读事件源,并且对持久性有疑问。 我仍然可以拥有一个包含所有实体的数据库,对吗?还是应该在每次启动应用程序时重播事件以获取内存中每个实体的最新版本?似乎在大型系统上(如大量数据)上的浪费? 事件来源的意义在于,如果需要,我可以重播事件以填充数据存储区吗?(或分析数据)

2
什么是.NET Framework向后兼容?
我们使用MySQL数据库在.NET 4中开发Windows应用程序。当我们要部署该应用程序时,我们在客户端中安装.NET 4框架,然后在安装用于MySQL的.NET连接器时,它需要一个.NET Framework 3.5。但是.NET 4已经安装。.NET框架不向后兼容吗? 我们最终安装了两个.NET框架(3.5和4),它们的磁盘大小都不小。向后兼容到底意味着什么?

4
在单个敏捷工作项中处理“相关”工作
我是一个由4个开发人员组成的项目团队,其中包括我自己。我们一直在讨论如何处理单个工作项中出现的额外工作。 这些额外的工作通常是与任务稍有相关的事情,但并非总是必须达到项目目标(可能是一种观点)。示例包括但不限于: 重构工作项更改的代码 与项目更改的代码相邻的重构代码 重新设计票证周围较大的代码区域。例如,如果某个项目要更改单个功能,那么您意识到现在可以重做整个类以更好地适应此更改。 改进刚修改过的表单上的用户界面 当这笔额外的工作很少时,我们不在乎。问题是,当这项额外的工作导致项目的实质扩展超出了原始特征点估计时。有时,一个5分的物品实际上需要13个时间。在一种情况下,我们得到了13分,回想起来可能是80分或更高。 在我们的讨论中,有两种解决方案。 我们可以在同一个工作项中接受额外的工作,并将其记为错误估计。对此的论点包括: 我们计划在sprint末尾进行“填充”以解决此类问题。 始终使代码保持比发现的状态更好的形状。不要签入半途而废的工作。 如果我们将重构留给以后使用,则很难安排时间,并且可能永远无法完成。 您现在处于最佳的心理“环境”中来处理此工作,因为您已经在代码中深陷其中。最好是现在就解决它,并且比以后再丢失该上下文时更有效。 我们为当前工作项目划了一条线,并说额外的工作进入单独的工单。参数包括: 拥有单独的票证可以进行新的估算,因此我们不必对自己的真实情况撒谎,也不必承认我们所有的估算都是可怕的。 冲刺“填充”用于应对意想不到的技术挑战,这些挑战是完成票证要求的直接障碍。它不适用于仅“精打细算”的附带物品。 如果要安排重构,只需将其放在待办事项列表的顶部即可。 我们没有办法在估算中正确考虑这些内容,因为出现时似乎有些武断。代码检查者可能会说“那些UI控件(您实际上未在此工作项中对其进行修改)有些令人困惑,您也可以解决吗?” 这就像一个小时,但他们可能会说:“好吧,如果此控件现在与其他控件继承自相同的基类,为什么不将所有这些(几百行)代码都移到基类中并重新连接所有这些内容,级联的变化等?” 那需要一个星期。 它通过在票证中添加无关的工作来“污染犯罪现场”,从而使我们的原始特征点估计毫无意义。 在某些情况下,额外的工作会推迟检入,从而导致开发人员之间的阻塞。 我们中有些人现在说,我们应该决定一些截止日期,例如,如果其他物料少于2 FP,则将其放入同一票证中;如果更多,则将其设为新票证。 既然我们只需要几个月就可以使用敏捷,那么这里周围所有经验丰富的敏捷退伍军人对此有何看法?

4
长字符串数据库的最佳方法
我需要将问题和答案存储在数据库中。问题将是一到两个句子,但答案会很长,至少一个段落,甚至可能更多。 我现在知道要做的唯一方法是SQL数据库。但是,我觉得这不是一个好的解决方案,因为据我所知,这些数据库并未用于这种类型或大小的数据。这是正确的方法还是有更好的方法来存储此数据?有没有比存储原始字符串更好的方法?

6
如何记录业务规则
我想知道记录业务规则的正式和最常用的方法是什么?还有如何记录开发工件的UI规范(例如,记录表单字段以及按钮在表单,信息文本上的行为方式等)

3
微服务架构中的业务逻辑应该放在哪里?
由于我习惯于采用单片方法,因此仍在尝试围绕微服务架构 假设我们尝试构建一个极其简化的 Uber预订系统。为简单起见,我们假设我们有3个服务和客户端的网关API: ,,Booking 和我们有以下流程:DriversNotification 创建新预订时: 检查现有用户是否已有预订 获取可用驱动程序列表 发送通知给司机以领取预订 司机接机 假设所有消息传递都是通过http调用完成的,而不是通过类似kafka的消息传递总线来完成的。 因此,在这种情况下,我认为该Booking服务可以对现有预订进行检查。但是,谁应该得到可用驱动程序和通知的列表呢?我正在考虑在网关级别执行此操作,但是现在逻辑可以分为两个地方: Gateway -获取可用驱动程序列表+发送通知 Booking -检查现有预订 而且我很确定网关不是正确的选择,但是我觉得如果我们在Booking服务中使用它,它将变得紧密相连吗? 更复杂的是,如果我们有另一个项目想要重用预订系统,但又要有其自己的业务逻辑,该怎么办?这就是为什么我考虑在网关级别执行此操作,以便新项目网关可以将其自己的业务逻辑与现有逻辑分开。 我想的另一种做法是,每个项目都有自己的预订服务,该服务将与核心预订服务对话,但是我不确定这里最好的方法是什么:-)

5
实体框架的域驱动设计的陷阱
我研究的许多DDD教程都涵盖了理论。它们都有基本的代码示例(Pluralsight和类似代码)。 在网络上,也有人尝试创建涵盖EF的DDD的教程。如果您只是简短地学习它们-您很快就会发现它们彼此之间有很大的不同。有些人建议保持应用程序最小化,并避免在EF之上引入其他层(例如,存储库),其他人则决定生成额外的层,甚至通过注入DbContext聚合根甚至违反SRP 。 如果要提出基于意见的问题,我深表歉意,但是... 在实践中,实体框架是功能最强大且使用最广泛的ORM之一。不幸的是,您不会找到涵盖DDD的综合课程。 重要方面: 实体框架可立即使用UoW和存储库(DbSet) 使用EF,您的模型具有导航属性 与EF所有的车型都始终可用的关闭DbContext(它们被表示为DbSet) 陷阱: 您不能保证子模型仅受“聚合根”影响-您的模型具有导航属性,可以修改它们并调用dbContext.SaveChanges() 与DbContext您可以访问每一个模型,从而规避聚合根 您可以通过将ModelBuilderin 标记为字段来通过in OnModelCreating方法来限制对根对象的子对象的访问-我仍然不认为这是进行DDD的正确方法,而且很难评估这种情况将来可能导致什么样的冒险(非常怀疑) 冲突: 如果没有实现返回聚合的另一层存储库,我们甚至无法部分解决上述陷阱 通过实现额外的存储库层,我们将忽略EF的内置功能(每个DbSet都已经是仓库)并且使应用程序过于复杂 我的结论是: 请原谅我的无知,但基于以上信息-要么是实体框架 不足以用于域驱动设计,或者域驱动设计是不完善且过时的方法。 我怀疑每种方法都有其优点,但是我现在已经完全迷失了,对如何将EF与DDD调和一无所知。 如果我错了-请问至少有人能详细介绍一下如何使用EF进行DDD的简单说明(甚至提供不错的代码示例)吗?

2
域/持久性模型隔离通常会很尴尬吗?
我深入研究了域驱动设计(DDD)的概念,发现一些原则很奇怪,尤其是在域和持久性模型的隔离方面。这是我的基本理解: 应用程序层(提供功能集)上的服务从其执行功能所需的存储库中请求域对象。 该存储库的具体实现从为其实现的存储中获取数据 该服务告诉封装业务逻辑的域对象执行某些修改其状态的任务。 该服务告诉存储库保留修改后的域对象。 存储库需要将域对象映射回存储中的相应表示形式。 现在,鉴于以上假设,以下内容似乎很尴尬: 广告2: 域模型似乎加载了整个域对象(包括所有字段和引用),即使请求它的功能不需要它们。如果引用了其他域对象,则甚至可能根本无法完全加载,除非您同时加载这些域对象以及它们依次引用的所有对象,依此类推。想到了延迟加载,但是这意味着您开始查询域对象,这首先应该是存储库的责任。 鉴于此问题,加载域对象的“正确”方式似乎具有针对每种用例的专用加载功能。这些专用功能将仅加载其设计用例所需的数据。尴尬在这里发挥了作用:首先,我必须为存储库的每个实现维护大量的加载函数,并且域对象最终将null以其字段中携带的不完整状态结束。从技术上讲,后者应该不是问题,因为如果未加载值,则无论如何要求它的功能都不应要求该值。仍然很尴尬和潜在的危害。 广告3 .: 如果没有存储库的任何概念,领域对象将如何验证唯一性对构造的约束?例如,如果我想创建一个User具有唯一社会保险号(已给出)的新保险,则只有在数据库中定义了唯一性约束的情况下,最早的冲突将在要求存储库保存对象时发生。否则,User在创建新的社会保障之前,我可以寻找具有给定社会保障的a并报告错误(如果存在)。但是,约束检查将存在于服务中,而不存在于它们所属的域对象中。我刚刚意识到,域对象被很好地允许使用(注入)存储库进行验证。 广告5: 与让域对象直接修改底层数据相比,我认为将域对象映射到存储后端是一项工作量很大的过程。当然,将具体的存储实现与域代码脱钩是必不可少的前提。但是,确实付出了这么高的代价吗? 您显然可以选择使用ORM工具为您执行映射。这些通常需要您根据ORM的限制来设计域模型,或者甚至引入从域到基础结构层的依赖关系(例如,通过在域对象中使用ORM批注)。我也读过ORM引入了大量的计算开销。 对于NoSQL数据库(几乎不存在任何类似于ORM的概念),您如何跟踪域模型中的哪些属性发生了变化save()? 编辑:另外,为了使存储库访问域对象的状态(即每个字段的值),域对象需要显示其内部状态,这会破坏封装。 一般来说: 交易逻辑将流向何方?这当然是持久性特定的。一些存储基础架构甚至可能根本不支持事务(例如内存中的模拟存储库)。 对于修改多个对象的批量操作,我是否必须分别加载,修改和存储每个对象才能通过对象的封装验证逻辑?这与直接对数据库执行单个查询相反。 我希望对此主题进行一些澄清。我的假设正确吗?如果没有,解决这些问题的正确方法是什么?

2
为什么要使用`const foo =()=> {}`而不是`function foo(){}`
例如,在此Redux视频中,讲师始终使用以下语法 const counter = (state=0, action) => { ... function body here } 我只用“传统” function counter(state=0, action) { ... function body here } 实际上,这更短,而且更清晰。在页面的相当平坦且结构化的左侧边缘搜索单词“ function”要比在参差不齐的右侧边缘扫描一个小的“ =>”要容易。 除了之外this,尝试成为客观的而非观点,新语法有没有有用的区别或优势?

2
Cookie vs.会话vs jwt
我正在阅读Web应用程序中的身份验证/授权。有人可以确认/纠正我目前的知识吗? Cookies:在其早期版本中,具有唯一客户端的文本文件会标识与该客户端有关的所有其他信息(例如角色) 会话:只有唯一的客户端ID在文件中发送(也称为Cookie),其他所有内容都存储在服务器上 JWT:所有内容都存储在令牌中(也可以存储在文本文件中,也称为Cookie) 感谢您的任何反馈!

4
MVC和RESTful API服务
MVC非常简单。有一个模型,一个控制器和一个视图。当我们创建一个网站时,这一切都将作为一个整体' 客户端向服务器发送REST关键字请求->服务器将请求的URL与控制器操作相匹配->然后调用模型进行数据收集/处理,以获取结果->并将结果作为HTML页面(视图)返回给客户端。 如果我们正在谈论纯RESTful API Web服务该怎么办?然后,流程类似于“ 客户端向服务器发送REST关键字请求->服务器将请求的URL匹配到控制器操作->然后调用模型进行数据收集/处理,获得结果->并返回结果以JSON ' 返回给客户端。与以前相同,但是没有“视图” ...或者,可以将生成的JSON视为“视图”。从某种意义上讲,我们仅在利用MVC的MC部分。那是应该怎么做的?还是对于仅API服务而不是MVC还有其他更合适的模式吗?

1
我可以在封闭源代码项目中包含MIT许可的代码的一部分吗?
这可能是一个简单的是/否答案,但是我请您详细解释。 情境 我被要求在我的工作中扩展一个封闭源代码系统,该系统未获得任何许可的正式发布。我以为我已经学会了一次,那就意味着默认情况下所有权利都是保留的,但是我现在找不到源,所以如果我错了,请纠正我。 我在Github上找到了一个根据MIT许可发布的项目。它包含一个我感兴趣的类,用于完成请求的功能的某些部分。 如果有所作为,则要求我处理的应用程序当前不出售。它仅在内部用于简化操作,高度定制,并且没有市场价值。它是封闭源的唯一真实原因是,如果可以在开放源代码中发现漏洞,则可能暴露出与管理有关的端点暴露在Internet上。 我的理解 这个答案提醒我检查是否有版权保留条款,我很确定自己没有包含在MIT许可证中,因此如果我错了,请再次纠正我。 MIT许可证明确规定... 以上版权声明和本许可声明应包含在本软件的所有副本或大部分内容中。 ...因此,我知道该许可证需要逐字包含在我的项目中,但是我担心这实际上会根据MIT许可证释放整个项目-我无权这样做。 这个答案建议隔离Github项目代码,据我所知,它可以作为git子树完全完成。但是我担心这种情况有所不同,因为它涉及两个非常相似的开源许可证。 题 可以在我的超级项目根目录中获得许可证,如下所示: Foo项目的某些部分的版权由[MIT原始作者,年份]作为Bar项目的一部分拥有,并根据MIT许可提供。项目Foo的所有其他版权都由[您的姓名,年份]拥有。 是否有必要更具体地提及该项目的哪些确切“部分”属于MIT许可证? 免责声明 我完全理解,此处没有任何答案/评论将构成法律建议,但是如果我完全误解了某些内容,则可以打耳光。另外,这是我的第一个问题,如果我不认为这是这些问题的答案,那么请让我知道-真诚地感谢您对此问题适当地点的任何表示。

3
负载均衡器返回什么?
当用户点击负载均衡器并且负载均衡器确定要转发到哪个Web服务器时,接下来会发生什么?负载平衡器是否将请求及其所有数据转发到Web服务器,是否接收Web服务器的响应并将其返回给用户? 还是更像是重定向,负载平衡器实际上只是将所选服务器的IP地址返回给浏览器,而浏览器必须打开与给定服务器的新连接? 我的直觉是说不会是后者,因为那意味着所有Web服务器IP地址都是公开的,而且我认为出于安全原因,最好只将负载平衡器地址公开给公众。但是,我又不确定,因为如果您SSL termination在负载均衡器上启用,是否不需要通过重定向服务器重新建立SSL?

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.