软件工程

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

4
我是否过早优化?
我目前处于C ++中基于组件的体系结构的设计阶段。 我当前的设计包括以下功能的使用: std::vector的,共std::shared_ptrs个以容纳组件 std::dynamic_pointer_cast std::unordered_map<std::string,[yada]> 组件将代表类游戏软件所需的各种项目的数据和逻辑,例如图形,物理,AI,音频等。 我到处都读到高速缓存未命中会影响性能,因此我进行了一些测试,这使我相信确实会降低应用程序的速度。 我还无法测试上述语言功能,但据说在许多地方,这些功能会花费很多,因此应尽可能避免。 由于我正处于架构的设计阶段,并且这些将包含在设计的核心中,因此,现在我应该设法设法避免使用它们,因为如果有性能,以后很难对其进行更改问题? 或者我只是在做过早的优化而陷入困境?

2
Apollo-11:使用包含替代链接器
最近被数字化并转换为仓库,原始的Apollo 11指导计算机源代码已可以在Github上查看。 在MAIN.agc中,回购作者评论说他们 将巨大的整体源代码拆分为更小,更易于管理的块,即单独的源文件。 稍后,作者指出 可能会合理地问,为什么要通过包含的方式连接成千上万行源代码,而不是简单地单独组装源文件,然后将它们链接以形成可执行文件。答案是原始的开发团队没有链接器。 我知道链接器是什么,我理解它们的意思,但我从未听说过“通过包含的方式加入”(就ASM而言)。 这是什么意思?考虑到链接器在编程中起着很大的作用,我很好奇链接器被“包含方式”替代的含义以及它是如何工作的。

1
将Redux中的原理应用于OO语言是否有意义?
Redux本质上是函数式编程,这很有意义。当我回到另一个项目中的非JavaScript OOP语言时,我想应用相同的原理,例如单个状态对象,作用于该状态部分的缩减器,用于修改状态的语义动作的业务层。 我的项目是C ++,我想知道尝试在设计应用程序中应用功能化,redux风格的方法是否有意义。对于这个应用程序,性能并不是至关重要,但是可维护性是至关重要的。 这样设计我的应用程序会遇到什么困难? 我应该补充一点,这不是GUI应用程序。再考虑一下,由于在应用程序状态更新中没有直接的视觉效果,因此redux在非GUI应用程序中的优势有所减少。

2
功能语言的二维棋盘游戏的数据结构
我正在用功能编程语言Elixir 创建一个简单的MiniMax实现。因为有很多完美知识的游戏(井字游戏,四连冠,西洋跳棋,国际象棋等),所以此实现可能是为任何这些游戏创建游戏AI的框架。 但是,我面临的一个问题是如何以功能语言正确存储游戏状态。这些游戏主要处理二维游戏板,其中经常执行以下操作: 阅读特定板位的内容 更新特定板位置的内容(返回新的移动可能性时) 考虑连接到当前位置的一个或多个位置的内容(即下一个或上一个水平,垂直或对角线位置) 考虑任何方向上多个连接位置的内容。 考虑整个文件,等级和对角线的内容。 旋转或镜像电路板(以检查对称性,以提供与已经计算出的结果相同的结果)。 大多数功能语言都使用链接列表和元组作为多元素数据结构的基本构建块。但是,这些似乎对这项工作非常不利: 链接列表具有O(n)(线性)查找时间。另外,由于我们无法在板上进行一次扫描来“扫描和更新板”,因此使用列表似乎非常不切实际。 元组具有O(1)(恒定)查找时间。但是,将电路板表示为固定大小的元组将使得很难遍历等级,文件,对角线或其他类型的连续正方形。此外,Elixir和Haskell(这是我所知道的两种功能语言)都缺乏读取元组的第n个元素的语法。这将使得不可能编写适用于任意尺寸电路板的动态解决方案。 Elixir具有内置的Map数据结构(而Haskell具有Data.Map),该结构允许O(log n)(对数)访问元素。现在,我使用一个地图,其中x, y以位置表示键的元组。 这是“可行的”,但是以这种方式滥用地图是错误的,尽管我不知道确切的原因。我正在寻找一种以功能性编程语言存储二维游戏板的更好方法。

6
静态类型在更大的项目中真的有什么帮助?
在脚本编程语言网站的首页上进行好奇时,我遇到了这段话: 当系统太大而无法控制时,可以添加静态类型。 这让我记住,在许多静态的,已编译的语言(例如Java)和动态的,解释性语言(主要是Python,因为它使用较多,但它是大多数脚本语言之间共享的“问题”)之间的宗教战争中,静态地抱怨之一打字语言对动态打字语言的拥护者认为,它们不能很好地扩展到较大的项目,因为“有一天,您会忘记函数的返回类型,而必须查找它,而使用静态打字语言时,一切被明确声明”。 我从不理解这种说法。老实说,即使您声明了函数的返回类型,在编写了许多行代码之后,您也可能会忘记它,而您仍然必须返回到使用的搜索功能声明它的行。您的文本编辑器进行检查。 另外,当函数使用声明时type funcname()...,type您将不得不在调用该函数的每一行中进行搜索,因为您只知道funcname,而在Python之类的代码中,您只会搜索def funcname或function funcname只发生一次,在声明。 而且,使用REPL可以很容易地测试一个函数是否具有不同输入的返回类型,而对于静态类型的语言,您需要添加一些代码行并重新编译所有内容才能知道所声明的类型。 因此,除了知道函数的返回类型显然不是静态类型语言的强项之外,静态类型在更大的项目中真的有什么帮助?

6
边缘案例的验收标准
我是敏捷团队的产品负责人。我在进行PO验收测试时,通常会记下一些极端情况的注释。对于我来说,发现一些东西然后将其传回给开发人员并不罕见。当我拒绝他的故事时,我正从一位开发人员那里退缩。他说这是不公平的,因为我没有详细说明极端情况以及程序在接受标准中应如何回应,因为他倾向于仅针对我在故事中描述的内容进行编码。我鼓励他问我,因为他在编写代码时碰到了任何极端情况,但是他认为思考极端情况,我的事不是我的工作,我应该为下一个冲刺创造新的故事。 在我的辩护中,直到故事实现后,我才知道他的故事设计,因此很难遍历所有可能性(配置将存储在数据库还是属性文件中?)。为了简单起见,可以说我们有一个故事要为计算器应用添加除法。在理想的SCRUM世界中,我是否有责任在接受标准上添加“零分手处理”,还是他应该在开发过程中认真研究这些情况,以使应用程序不会在5/0上崩溃?需要明确的是,在这种情况下,如果应用程序在5/0时硬崩溃,我将不接受,但如果它记录日志,打印DIV0或其他任何方式来处理错误,则我将通过。不会崩溃

3
研究时应该遵循哪种软件方法?
我通常会分析实验数据,尽管我有一个大致的步骤计划,但可能需要根据实验的具体细节或后面的问题进行调整。我通常是唯一的一种编码。 我看了维基百科,但不确定要使用哪种方法,部分是因为我从未使用过任何方法,部分是因为我有时只是探索数据,看其外观,而其他时候我只想找到答案。(并且因为我不太希望测试或在代码上具有一定的素质) 一两个小时后,系统提示我问这个问题,因为发现r函数table依赖于向量的顺序,而不是要与之进行比较的元素名称。然后,尽管我应该在使用某些模拟数据的地方测试行为和功能。但是我在其他分析之后使用表格导致信息不足,因此我无法遵循测试驱动的开发方法(如果我理解正确的话)。但是,我觉得通过改进项目的处理方式,我可以提高效率,除了可以更快地发现错误之外,还可以找到错误的内容和方式,以防万一我对结果有所怀疑,所以请不要仅仅关注这个例子的错误。 哪种软件方法最适合研究? 我基本上是在问如何确保质量和时间进度以及保持研究的特异性。 我的工作方式示例: 一位生物学家想到了一个问题,并且知道进行一项实验会获得感兴趣的数据(即,两种条件下的基因表达水平),然后她/他进行了实验并从10个人/小鼠/大鼠中收集了样本。现在,我必须使用现有的库和测试(或实施新的测试)来分析那10个样本的数据,但要考虑到生物学家所考虑的问题(即,一种基因比另一种基因表达更多的基因)。其结构与先前的实验相同(涉及6种条件和另一只动物),但统计检验,规范化,数据结构可能会发生变化。因此,我通常会复制以前的版本,并使其适应当前的需求。

3
用REST的话来说,资源和表示之间有什么区别?
我对REST的理解使得可以将服务操作建模为状态的表示,并使用HTTP从一种状态转换为另一种状态。直到最近,当我阅读Jimmy Bogard的这篇文章时,我一直将资源理解为服务端状态的代表,我知道他是一个受到社区尊重的聪明的开发人员/架构师。引用该帖子的特定声明 表示形式有所不同–它描述了资源的当前状态(在请求时)。 这让我感到困惑。关于该主题的普遍看法是什么?
9 rest  api  api-design 

1
C语言中C ++模板类型API的惯用包装
我正在包装一个C ++ API,该API提供对C函数中的数据存储(Hazelcast)的访问,以便也可以从仅C代码中访问数据存储。 用于Map数据结构的Hazelcast C ++ API如下所示: auto map = hazelcastClient->client->getMap<int, string>(mapName); map.put(key, value); 它使用key和和的模板类型value。由于C中没有可用的模板,因此我考虑为该getMap<T, U>方法的每种特殊化创建包装函数。也就是说,对于每种C类型。虽然我知道有signed和unsignedC型的版本,我很好限制API仅支持int,double,float,char *为key和value。 所以我写了一个小脚本,可以自动生成所有组合。导出的函数如下所示: int Hazelcast_Map_put_int_string( Hazelcast_Client_t *hazelcastClient, const char *mapName, int key, char *value, char** errptr ); int Hazelcast_Map_put_int_int( Hazelcast_Client_t *hazelcastClient, const char *mapName, int key, int value, char** errptr ); ... 生成功能get,set,contains与所有可能的组合key和value种类增加了代码的数量相当多,虽然我觉得生成的代码是一个好主意,它具有创造某种代码生成的基础设施增加了额外的复杂性。 我可以想象的另一个想法是C中的一个泛型函数,如下所示: int …
9 c++  c  api-design 

1
在GPL许可的项目中使用MIT许可的代码该怎么办?
我正在做一个个人项目,我正在计划根据GNU Affero GPL进行许可。但是,我发现确实想利用MIT许可的一些代码,但是我不确定该如何处理许可。 其余代码将在GNU Affero下获得,只是我使用的源文件和头文件,这些文件是MIT许可的。 我在这里已在程序员上阅读了有关MIT / GPL代码协同工作的Q,以及关于MIT下使用GPL库以及其他几种软件的SO的Q,但我仍不清楚我应该如何处理许可。 据我所知,我所要做的就是将MIT许可证留在库中,并在许可证文件中包含有关两个不同许可证及其适用于什么代码的注释,对吗?

4
如何清楚定义边界上下文的边界
经过一个月左右的阅读和研究DDD,我决定开始自己的项目,并使用这些有限的上下文创建DDD。 客户群 产品展示 命令 开票 每个有界上下文都有其余的API作为表示层,域层,持久层。 到目前为止,代码运行顺利,但是来自一个单一的世界,我仍在尝试找出以下内容: 当我想创建一个新客户时,发出新发票,创建我想要的新订单,例如访问国家列表。我要: a)在每个卑诗省创建一个国家列表 b)创建一个国家BC-> API并使用它来获取可用国家的列表 c)使用第三方API并通过每个BC中的反腐败层提取数据 当使用反腐败层或适配器层与第三方API集成时,我的域模型中必须包含哪些数据?例如,如果我想将zendesk API与Client BC集成在一起。我是否仅需要我域中的ticketID,还是必须从Zendesk中提取要在Client BC中访问和使用的所有数据? 如果我的MVC应用程序实际上是从API(我的受限上下文的表示层)获取数据的,那么我很难清楚地定义每个BC的边界。这是否意味着经过适当设计的BC可以为单个MVC控制器提供服务,而无需使用其他API?

1
为复杂的工作时间表建模
我遇到了一个现实世界的问题,我试图代表并实现自动化。我已经将其简化并抽象为以下内容: 有n个工作地点(P1,P2,...,Pn)。 每个位置Pn都有一个密钥Kn。 有m个工人(W1,W2,...,Wm)。 为了在Pn工作,工人必须持有Kn。 每个密钥既可以由工作人员持有,也可以留在交易所E中。 工人可以随时到交易所旅行,以拿起一些无人认领的钥匙或放下一些钥匙以供其他人使用。 现在,必须严格执行外部工作计划。例如: 2016-04-21 W1必须在P6工作 2016-04-21 W2必须在P3工作 **需要交换钥匙** 2016-04-22 W3必须在P3工作 2016-04-22 W2必须在P6工作 任何数量的工人都可能必须在其计划的某个时间在Pn工作,尽管从来没有在同一天 我们知道: 所有键的起始位置,包括工作人员或E 每个工人必须履行的未来工作指令 因此,我正在努力为整个情况建模。您能提出我应该考虑的数据结构和算法,以便掌握它并开始优化每个工人的交易所旅行吗? 我要最小化的是去E的行程总数。第二个目标是确保没有工人进行不成比例的行程。 提前致谢!!

5
为什么不允许使用返回类型进行重载?(至少使用常用语言)
我不了解所有编程语言,但很明显,通常不支持考虑到方法的返回类型(假设其参数具有相同的数字和类型)而重载方法的可能性。 我的意思是这样的: int method1 (int num) { } long method1 (int num) { } 这并不是编程的大问题,但在某些情况下,我会对此表示欢迎。 显然,如果没有区分所调用方法的方法,这些语言将无法支持它,但是其语法可能像[int] method1(num)或[long] method1(num)这样简单。这样,编译器将知道哪个将被调用。 我不知道编译器是如何工作的,但这看起来并不难,所以我想知道为什么通常不会实现这样的事情。 为什么不支持类似的原因是什么?

2
缩时摄影的最佳压缩算法
我有一个包含约9,000张JPEG照片(约30 Gb)的文件夹,我想以某种压缩方式对其进行存档。我了解到,压缩JPEG通常不是很有效,但是这些照片是间隔拍摄的帧,因此大多数图像之间有很多共性。在这种情况下,我是否可能获得比正常情况更多的文件大小减少?是否有一种特殊的(通用)压缩算法在这种情况下可能会做得特别好?

4
微服务和共享库
我们正在设计基于独立微服务(通过RabbitMq总线连接)的系统。该代码(至少对于第一个组件而言)将以python(python2和python3)编写。我们已经有一个实现某些业务逻辑的整体应用程序,我们希望将其重构为微服务并进行扩展。让我担心的一个问题是: 在不同的微服务之间共享代码的最佳方法是什么。我们具有通用的帮助程序功能(数据处理,日志记录,配置解析等),多个微服务必须使用这些功能。 微服务本身将被开发为单独的项目(git存储库)。通用库也可以作为一个独立项目开发。如何在微服务之间共享这些库? 我看到几种方法: 围绕每个微服务所需的库版本进行复制,并根据需要进行更新 将通用库发布到内部PyPi,并将这些库列为微服务需求中的依赖项 将库存储库包含为git子模块 在决定如何进行之前,我想阅读更多有关建议的方法,最佳实践和过去的经验。您有什么建议或链接吗?

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.