软件工程

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

2
在Clojure中使用SICP代替Scheme
我是软件工程课程的大三学生,我提出了将SICP读给一位顾问的想法,以便对我们设计的所有软件背后的原理有更深入,更基本的了解。 他建议不要学习Scheme来完成本书(因为它不像Lisp的现代方言那么普遍),而应该使用Clojure进行练习。 这本已经很困难的书,如果我在更现代的Clojure中尝试该书的练习,那将如何工作?例如,我找不到任何实际的解决方案,他们为Scheme教的语法是不同的,等等。
11 clojure  scheme  sicp 


2
如何表示在节点和可以有选择地消失的边之间允许有多个边的图
我正在尝试找出用于建模一些假设的理想化网络使用情况的数据结构。 在我的方案中,许多互相敌对的用户都试图组成已知所有潜在连接的计算机网络。但是,一个用户需要连接的计算机可能与另一用户需要连接的计算机不同;用户1可能需要连接计算机A,B和D,而用户2可能需要连接计算机B,C和E。 在NCTM Graph Creator的帮助下生成的图像 我认为其核心将是无向循环图,其中节点表示计算机,边缘表示以太网电缆。但是,由于场景的性质,有一些不常见的功能可以排除邻接表和邻接矩阵(至少,没有进行不重要的修改): 边缘可能会限制使用;也就是说,如果一个用户获得了给定的网络连接,则其他任何用户都不能使用该连接 在该示例中,绿色用户可能无法连接到计算机A,但是红色用户已将B连接到E,尽管它们之间没有直接链接 在某些情况下,一对给定的节点将通过多个边连接 在该示例中,有两条独立的电缆从D到E,因此绿色和蓝色用户都可以直接连接这些计算机。但是,红色不再能建立这种联系 如果两台计算机通过一根以上的电缆连接,则每个用户最多只能拥有其中一根电缆 我需要在此图上执行一些操作,例如: 确定是否为给定用户连接了任何特定的计算机对 确定给定用户连接目标计算机的最佳路径 识别给定用户的最高延迟计算机连接(即最长路径而不分支) 我的第一个想法就是简单地创建所有边缘的集合,但这对于搜索来说是很糟糕的。我现在想做的最好的事情就是修改一个邻接表,以使列表中的每个项目不仅包含边长,还包含其成本和当前所有者。这是明智的做法吗?假设空间不是问题,那么创建图的多个副本(每个用户一个)而不是单个图是否合理?

5
C静态库不受欢迎吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 共享库有两个参数: 它有助于减少磁盘空间。 共享库更新后,取决于它的所有二进制文件都会更新。 共享库主要有一个缺点: 他们可以引入依赖地狱。 在台式计算机上,第一个优点实际上不再成立。如今,浪费磁盘空间已不是什么大问题。 拥有静态二进制文件将使我们能够获得更好的程序包管理器-我的意思是,依赖关系已经成为过去。添加程序就是添加二进制文件。最后是一个文件夹,让它处理其文件。删除程序就是删除该文件。依赖关系?走了 第二个优势仍然存在,但我认为台式机上静态二进制文件的优势胜过它。我的意思是,尽管具有共享库的优势,但即使是Go这样的新语言也可以编译所有二进制文件,这是因为它具有便利性。 既然共享库的主要优点之一不再重要,那么C静态库是否仍然不受欢迎?如果是这样,为什么?
11 c  compiler 

2
如何处理开源项目的增长?
我已经参与为开源项目提供一两年的支持,并且自从我开始以来,该项目就获得了很大的欢迎。该程序每周可下载超过100,000次,并且在其主要领域中有60%以上的人使用该程序,因此,我们很高兴看到人们非常喜欢使用该程序。 但是,问题在于开发和支持基础的增长速度并没有那么快,而且我们开始遇到一些增长难题。少数开发人员(尤其是主要开发人员)变得越来越瘦弱,技术支持志愿者开始精疲力尽。 到目前为止,在IRC上几乎束手无策,编写了该程序并为用户提供了帮助。没有501(c)(3)组织或LLC或类似机构。 目前,我们还没有一个非常正式的错误跟踪器或问题数据库(我们有一个专门讨论错误报告的类别的论坛),我承认,我们可以进行改进以使更多的开发人员加入。但是我想我的真正问题是,一个人如何从小型个人项目过渡到一个真实的事物?GIMP,FFmpeg,Blender等大男孩如何处理此过渡? 最重要的是,有没有办法为FOSS项目提供补偿?我想捐赠会有所帮助,但这只能走得很远……靠免费软件为生似乎很奇怪,但是如果程序要继续变得更好,我看不到我们如何在不补偿人们的情况下继续下去专职工作。 基本上,我们正在承受一些成长的痛苦,并且感觉“对我们的马匹来说太大了”。我们该怎么做才能管理这种过渡,而又不会因为一次做太多事情而感到疲倦?

4
我的体系结构的多重继承的替代方案(实时策略游戏中的NPC)?
编码实际上并不难。困难的部分是编写有意义,可读和可理解的代码。因此,我想找一个更好的开发人员并创建一些可靠的体系结构。 因此,我想为电子游戏中的NPC创建一个体系结构。这是一个实时战略游戏,例如《星际争霸》,《帝国时代》,《命令与征服》等。因此,我将拥有不同种类的NPC。一个NPC可以有一对多的能力,这些(方法): Build(),Farm()和Attack()。 例子: 工人可以Build()和Farm() 战士可以Attack() 公民可以Build(),Farm()和Attack() 渔民可以Farm()和Attack() 我希望到目前为止一切都清楚。 所以现在我有了我的NPC类型及其能力。但是让我们来谈谈技术/程序方面。 对于我不同种类的NPC,什么样的程序设计架构会很好? 好吧,我可以有一个基础课。实际上,我认为这是坚持DRY原则的好方法。因此,我可以WalkTo(x,y)在基类中使用类似的方法,因为每个NPC都可以移动。但是现在让我们来解决真正的问题。我在哪里实现我的能力?(记住:Build(),Farm()和Attack()) 由于这些能力将由相同的逻辑组成,因此为每个NPC(工人,战士,..)实施它们将是令人讨厌的/打破DRY原则。 好吧,我可以在基类中实现这些功能。这将需要某种逻辑来验证NPC是否可以使用X IsBuilder,... CanBuild,…… 能力。我想我想表达的很清楚。 但是我对这个想法不太满意。这听起来像一个功能过多的。肿基类。 我确实使用C#作为编程语言。因此,这里不能选择多重继承。意思是:拥有额外的基础类是Fisherman : Farmer, Attacker行不通的。

2
当不再存在缺少元数据的情况时,v1.5之前的SVN中的合并带来的不便现在是否已经过时?
我开始使用SVN,因此有很多消息来源说,与DVCS工具相比,SVN中的合并非常困难。在最近的问题,我能找到这里SE是从2012年开始。 有时会提到原因是v1.5之前的SVN没有元数据,但是SVN现在是1.8.9版本。 鉴于SVN现在比v1.5更加成熟,尤其是我们没有使用SVN 1.5,所以我们不会因为提到的元数据不足而受苦- 这些反对SVN的论点是否仍然有足够的有效性? 我知道DVCS有一种完全不同的方法,通常更可取,但是对于出于某些原因“必须”使用SVN的用户,合并不再是真正的“地狱”,对吗?

2
为什么F#Core定义通用数组类型?
我刚刚注意到FSharp.Core命名空间包括最多4维的通用数组类型,即Core。[] <'T>,Core。[,] <'T>等。C#和VB看起来做的很好使用System.Array-尽管我不清楚它们如何支持强类型的专用数组类型,例如int [],string []。 我想这将成为两个问题: C#如何基于非泛型System.Array支持强类型的专用数组类型,如int []? 鉴于C#可以做到这一点,为什么F#定义通用数组类型?
11 c#  .net  f# 

4
“ OOP隐藏状态”是什么意思?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 在cat-v.org上的许多反OOP咆哮中,我发现Joe Armstrong的一段话提出了一些反对OOP模型的异议,其中之一是: 异议4 –对象具有私有状态 国家是万恶之源。特别应避免具有副作用的功能。 尽管编程语言中的状态是不可取的,但在现实世界中,状态比比皆是。我对银行帐户的状态非常感兴趣,当我从银行存款或取款时,我希望银行帐户的状态能够正确更新。 考虑到现实中存在状态,编程语言应提供哪些设施来处理状态? OOPL说“隐藏程序员的状态”。状态只能通过访问功能隐藏和看到。常规编程语言(C,Pascal)说,状态变量的可见性由该语言的作用域规则控制。纯声明性语言表示没有状态。系统的全局状态包含在所有功能中,并且来自所有功能。诸如monads(用于FPL)和DCG(逻辑语言)之类的机制用于向程序员隐藏状态,以便它们可以“好像状态无关紧要”进行编程,但在必要时可以完全访问系统状态。 OOPL选择的“从程序员隐藏状态”选项是最糟糕的选择。他们没有揭露状态并试图找到最小化状态滋扰的方法,而是将其隐藏了起来。 这到底是什么意思?我几乎没有底层或程序方面的经验,主要是OOP,所以这可能解释了我对此有多么不熟悉。从更现代的角度来看,现在大多数面向对象的歇斯底里都通过了(至少据我所知),你们认为这种通过的准确性/相关性如何? 谢谢你的帮助。

1
招聘经理是否很难接受拥有“业务相似”个人应用程序但不是企业家的开发人员?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 大学刚毕业,我决定在等待找到软件工程师的同时构建自己的Web应用程序(Ease My Day)。 建立这个应用程式的原因: 在进入工作现场之前获得扎实的软件经验 提供解决常见问题的方法 找工作时不要坐着不做任何事情 这个应用程序是不是一个企业家试用,也不是商业销售。仍然在整个访谈中,我注意到我通过该应用程序进行的每5次访谈中有4次与业务混淆,并且被问到相同的问题: 您为什么要建立业务?为什么要停止应用程序?您想出售该应用程序吗? 知道我没有创办公司,也没有从此应用程序中赚钱。 难道谁采取主动行动,并希望考生手艺就在身边自己的应用事业红旗上招聘经理的雷达? 更新 @Kate Gregory要求 这是我在简历中描述的方式: 个人项目:Qc蒙特利尔的“轻松一天” SaaS应用程序开发人员。 链接:http : //www.easemyday.com Facebook:http : //www.facebook.com/EaseMyDay “轻松一天” BETA的主要目的是帮助日常营养/健康监测。 提供了超过6000种具有营养成分的食物的清单。用户可以添加他们的个人食品并发展食品数据库。 它允许用户指定自己的目标:减肥,增加体重,保持健康没有目标。 它允许用户使用应用程序的内置计算器来计算他们的日常需求(卡路里,蛋白质,碳水化合物,脂肪等)。如果用户已经知道自己的需求,则可以手动输入这些值。 用户可以通过以下方式监控食物摄入量:进餐,天数和/或周数。 它部署在Amazon AWS(带有RDS的EC2实例)上 “轻松的一天”解决了一项艰巨的任务;它是一个高效的平台,可将日常健康监控(过去是一项非常耗时的任务)转变为一项令人愉悦的活动,只需几秒钟即可完成。目前,它已在全球多个国家/地区使用。 语言/技术:....在这里,我解释使用的语言/技术/软件工程方法。

4
指针索引
我目前正在阅读一本书,标题为“ C的数字食谱”。在本书中,作者详细介绍了如果我们的索引以1开头(我不完全遵循他的论点,而这不是本文的重点),某些算法在本质上会更好地工作,但是C总是以0开头的数组索引为了解决这个问题,他建议在分配后简单地减小指针,例如: float *a = malloc(size); a--; 他说,这将有效地为您提供一个索引,该索引的索引从1开始,然后将被释放: free(a + 1); 据我所知,这是C标准未定义的行为。在HPC社区中,这显然是一本享有盛誉的书,所以我不想简单地无视他在说什么,但是对我而言,仅将指针减少到所分配的范围之外似乎是很粗略的。这是C中的“允许”行为吗?我已经使用gcc和icc对其进行了测试,这两个结果似乎都表明我没有担心什么,但我想绝对肯定。
11 c  pointers 

2
测试(确定性)算法有多个或难以证明正确的正确答案
我想前言本认为这个问题是相似的,但我的问题不涉及随机性,只是挑剔的决定,所以回答“使用已知的种子”并没有真正适用。同样,这个问题是相似的,但是我也不希望算法会失败-我只是不知道哪种方法正确。 这个问题是在测试图形算法时出现的。但绝不仅限于此。某些算法(例如A *)可以有多个正确答案。根据您的确切实现,您可能会得到几个答案中的任何一个,每个答案都是正确的。但是,这会使他们难以测试,因为您不知道它会提前吐出哪一个,并且手工计算答案非常耗时。 在我的特定情况下,我通过修改Floyd-Warshall使其吐出所有可能的最短路径来解决它,并花了一些时间进行测试。它具有本身就是一个好的功能的好处。然后,我可以根据FW已知的正确路径测试其他功能(如果返回的路径是FW为该开始/结束对返回的路径中的任何一条,那是正确的)。当然,由于FW的工作原理,这仅适用于密集图,但它仍然很好。 但是,这对于具有此特征的所有算法可能并不总是可行的。到目前为止,我想出的最佳答案是测试正确答案的特征,而不是正确答案本身。要返回最短路径算法,您可以对照已知的正确成本检查返回路径的成本,并确保路径有效。 此方法可行,但存在更多的正确性标准时,可能冒着无法正确验证所有内容的风险,尤其是在验证本身很复杂的情况下(例如,在存在正确算法的情况下,验证最小生成树是一个已知的难题;可能比构建MST本身),在这种情况下,您现在必须广泛测试测试代码。更糟:大概您必须构造一个MST来测试MST验证算法,因此您现在遇到了一个很好的方案,其中MST测试依赖于MST验证算法的工作,而MST验证算法测试依赖于MST生成代码的工作。 最后,有一种“便宜的方法”,它涉及观察输出,手工验证输出,然后对测试进行硬编码以测试刚刚验证的输出,但这并不是一个好主意,因为您可能每次都要修改测试稍微更改实现(这是自动化测试应该避免的)。 显然,答案取决于您在某种程度上要测试的确切算法,但是我想知道是否有“最佳实践”来验证具有几个确定的,确定性的“正确”输出的算法,但是这些精确的正确输出很难做到提前知道,可能事后甚至很难核实。

2
用不同的编译器创建的(C)目标文件是否与二进制兼容?
我了解C ++编译器彼此不兼容。但是,我无法在C上找到关于此主题的任何东西。我知道C标准为编译器提供了很多空间,使它们能够执行合适的事情,例如,他们认为合适:例如,大多数(所有?)数据类型的大小和对齐方式是实现定义的,除了一些最小的保证。因此,两个编译器(或同一编译器的两个版本)可能在许多细节上存在分歧。 我是否认为不能保证使用不同编译器编译的两个目标文件实际上可以正确链接是正确的吗?例如,一个目标文件中指针的大小可以是32位,而在另一个目标文件中则可以是64位。但是如果是这样,为什么C库有时会以预编译形式分发?是否期望我将使用与他们相同的编译器(例如gcc),或者使用某些事实上的标准来确保二进制兼容性?带有外语接口的其他语言如何确保在与C对象文件链接时事物能够正确对齐?
11 c  compiler 

2
编译时IOC
是否有人在编译时启动了一个要进行IOC的项目(可能使用Roslyn或Linq MethodInfo发出)? 到目前为止,我在IOC容器方面的经验非常好,排除了一些小问题 许多IOC容器启动缓慢,因为许多解析逻辑都在这里发生 通常很难确保可以解决,因为编译不再确保可以调用构造函数。 通常,IOC容器会增加运行时的开销(有些甚至不小,通常那些启动很快的容器运行缓慢) 在我看来,理想的解决方案是在构建链上添加一个编译步骤,该步骤添加一个Factory类而不是IOC。 有人做过吗?如果没有,为什么不呢?

5
学习调查错误[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 我什至不知道如何定义这个困难。这让我想起了几位准员工在我找到工作之前对我进行的测试。他们会在房间里拿一个物体,然后允许我提出问题以帮助自己确定该物体是什么(很像20个问题)。我非常擅长此事(不,我从来没有因为谦卑而获得高分),所以我以为我会非常擅长解决错误... 但是这是我最近发现的东西。在那种情况下,我真的很擅长,因为很容易看到房间里的所有东西,因此我可以用一些组成部分的概念来解决我的问题。本质上,我“知道我不知道的事”。但是在编程时,我遇到了很多情况,而这个问题对我来说是完全未知的。我知道它已损坏,但是我不知道它可能如何损坏。我遵循了所有说明,我对这项技术相当了解... 老实说,我觉得我很难想象可能出错的事情,因此我可以对其进行测试,并希望找到解决方案。 我该如何发展这项技能?我需要做些什么来帮助我有限的想象力提出可能破坏我的项目的方式?是否有一些练习(也许令人困惑?)可以使我对此有所改善?我知道最大的治愈方法可能只是经验...但是,我希望能帮助加快这一过程。一次呆呆地盯着我的电脑屏幕看几个小时甚至都不是一件有趣的事...

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.