软件工程

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

13
我的简历中应该列出多少技能?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 5年前关闭。 我是维护程序员,并且每月(如果不是每天)使用大量技术。例如,我有以下几种语言的能力(显然不是专家): Java(包括J2EE) C# VB6 ASP经典版 当我开始撰写简历时,应该列出哪些技术?列出所有内容似乎毫无意义,甚至是一个问题。当我阅读履历表时,我不喜欢阅读大量的技术。我应该列出几个,应该如何选择?
9 resume 

3
Clang / LLVM准备好迎接黄金时间了吗?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 可以使用Clang代替gcc吗?您对此有何经验?还有哪些不利条件? 编译的性能比gcc好得多,但是关于执行它时生成的代码的性能呢? 有没有好的工具可以在Linux或Windows上运行作为前端(IDE)? 编辑:我的意思是C编译器。C ++还不是很好。

11
丢失源代码有多严重?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 如果软件公司将源代码丢失给他们出售的一种产品,那么用您可以向外行解释的话,这有多严重?“重大过失”一词会否太过强烈?还是“严重的无能”?显然没有人被杀,但是难道不如人们因入狱而造成的经济疏忽那么严重吗? 编辑: 假设这不是磁盘驱动器崩溃,自然灾害或类似情况的情况。只是他们放错了地方。

4
重命名方法可以保留封装吗?
我正在阅读此页面,了解何时需要使用getter / setter,并且OP提供了以下代码示例: class Fridge { int cheese; void set_cheese(int _cheese) { cheese = _cheese; } int get_cheese() { return cheese; } } void go_shopping(Fridge fridge) { fridge.set_cheese(fridge.get_cheese() + 5); } 该接受的答案状态: 顺便说一句,在你的榜样,我会给类Fridge的 putCheese()和takeCheese()方法,而不是get_cheese() 和set_cheese()。这样您将仍然具有封装。 如何封装从对get / set重命名它来保存putCheese()/ takeCheese()你显然获取/设置一个值,那么为什么不干脆把它作为对get / set? 在相同的答案中,它还指出: 拥有getter和setter方法本身并不会破坏封装。破坏封装的方法是自动为每个数据成员(Java术语中的每个字段)添加一个getter和setter,而无需考虑任何问题。 在这种情况下,我们只有一个变量,cheese并且您可能想将奶酪拿回冰箱,所以在这种情况下,一对get / set是合理的。

7
对于非关键任务而言,端到端和集成测试值得吗?
众所周知,端到端和集成测试成本很高。当然,如果我们开发应用程序,如果出现问题,人们可能会因此丧命,这是值得的投资。但是,在错误不是世界末日的应用程序中,完全跳过E2E测试和集成测试并在出现问题时制定备份计划会不会更便宜?像手动测试用户故事+单元测试+使用静态类型的语言是否足够? 例如,如果某个网上商店丢失了订单,他们可以改为免费发送该商品+道歉。最终用户可能会更开心,这样公司总体上可以节省金钱。 我想我的问题是,总体而言,集成测试和E2E测试的成本是多少?节省多少钱?有没有办法对此进行风险/成本计算?
9 testing  qa  pricing  risk 

1
“ TILT”在评论中是什么意思?
我正在阅读Robert C. Martin的Clean Code,该短语TILT在某些代码示例中莫名其妙地出现。示例(顺便说一下,它是在Java中): ... public String errorMessage() { switch (status) { case ErrorCode.OK: // TILT - Should not get here. return ""; case ErrorCode.UNEXPECTED_ARGUMENT: return "Unexpected argument"; case ErrorCode.MISSING_ARGUMENT: return "Missing argument"; ... } ... 从上下文来看,我猜测是TILT指定一个无法访问的状态,并且仅包含该状态以满足编译器的要求(例如,在上面的代码中,TILT出现这种ErrorCode.OK情况是因为如果状态为OK,则不会出现错误消息),但是我不确定。 有人知道TILT代表/意味着什么吗?

5
最佳实践-如果在函数调用周围进行包装,而在函数处于保护状态时添加早退出
我知道这可能是非常特定于用例的,但是我发现自己经常想知道这一点。是否有一般首选的语法。 我不是在问函数中最好的方法是什么,我是在问应该早退还是应该不调用函数。 如果在函数调用周围包装 if (shouldThisRun) { runFunction(); } 具有if(保护)功能 runFunction() { if (!shouldThisRun) return; } 如果多次调用此函数,则后一种选项显然有可能减少代码重复,但是有时在此处添加它会带来错误,因为那样您可能会丢失该函数的单一职责。 这是一个例子 如果我有一个updateStatus()函数,该函数仅更新某些事物的状态。如果状态已更改,我只希望状态更新。我知道代码中状态可能发生变化的地方,也知道其他地方可能发生了变化。 我不确定它是否只是我自己,但是检查此内部函数感觉有点脏,因为我想使该函数尽可能保持纯净-如果我调用它,则希望状态得到更新。但是我无法说出将电话包裹在支票中的几个更好的地方,我知道它可能不会改变。

5
太多的抽象使得代码难以扩展
我在代码库中感觉到太多抽象(或者至少是处理它)时遇到了问题。代码库中的大多数方法已被抽象为采用代码库中最高的父级A,但是此父级的子级B具有新属性,该属性会影响其中某些方法的逻辑。问题在于这些属性无法在那些方法中检查,因为输入被抽象为A,而A当然没有此属性。如果我尝试创建一个新的方法来不同地处理B,则会被调用以进行代码复制。我的技术负责人的建议是创建一个使用布尔参数的共享方法,但是这样做的问题是,有些人将其视为“隐藏的控制流”,其中共享方法具有的逻辑对于将来的开发人员可能并不明显。 ,并且即使需要添加将来的属性,即使将其分解为较小的共享方法,该共享方法也会变得过于复杂/复杂。这也增加了耦合,降低了凝聚力,并且违反了我团队中有人指出的单一责任原则。 本质上,此代码库中的许多抽象有助于减少代码重复,但是当使它们采用最高抽象时,这会使扩展/更改方法变得更加困难。在这种情况下我该怎么办?尽管其他人不能就他们认为的好事达成共识,但我还是要怪罪于我,这最终伤害了我。

9
棋类的继承与组成
快速搜索此堆栈交换显示,通常认为合成比继承更灵活,但与往常一样,它取决于项目等,并且有时继承是更好的选择。我想制作一个3D象棋游戏,其中每个棋子都有一个网格,可能有不同的动画等等。在这个具体的例子中,似乎您可以为两种方法都辩护,我错了吗? 继承看起来像这样(使用适当的构造函数等) class BasePiece { virtual Squares GetValidMoveSquares() = 0; Mesh* mesh; // Other fields } class Pawn : public BasePiece { Squares GetValidMoveSquares() override; } 当然遵循“是”原则,而构图看起来像这样 class MovementComponent { virtual Squares GetValidMoveSquares() = 0; } class PawnMovementComponent { Squares GetValidMoveSquares() override; } enum class Type { PAWN, BISHOP, //etc …

3
我是否仍需要使用定点数来保证计算机在数学运算中获得相同的结果?
有人告诉我,大多数现代计算机遵循相同的浮点标准,这是否意味着如果输入相同,对于给定的数学运算,它们都将获得相同的浮点答案? 我之所以问是因为我正在研究在网络上制作RTS游戏,并且同步数百个单位的位置听起来是一种不好的方法。 因此,如果我仅发送输入,则需要确保所有客户端通过从这些输入运行模拟来获得相同的结果。 我读到较旧的RTS游戏使用定点算法,但是我不知道现代计算机是否都遵循相同的标准?我还被告知,尽管不精确,但对于相同的输入,浮点数的结果是确定的(我想这意味着遵循相同标准的任何计算机都会得到相同的不精确结果吗?)。 即使计算机遵循相同的浮点标准,仍然存在偏差吗? 我用C#编写游戏,但不确定是否重要,以为我还是会提到它。

1
为什么称为软件配置管理(SCM)?
当我想到软件配置时,我想到的是运行时读取的文件-该文件将包含服务器可能使用的端口,是否使用加密以及各种资源的路径之类的内容。 当我第一次遇到“软件配置管理”时,我以为它只意味着配置文件的管理,但是我很快意识到SCM工具不仅涉及配置文件,还涉及软件代码,软件可执行文件/二进制文件以及资源。 那么,为什么要使用术语“软件配置管理”?“软件管理”会更广泛吗?还是我对被认为是“配置”的东西缺乏了解?

4
重构-只要所有测试都通过,简单地重写代码是否合适?
我最近看了RailsConf 2014的“ All Little Little”。在这次演讲中,Sandi Metz重构了一个包含大型嵌套if语句的函数: def tick if @name != 'Aged Brie' && @name != 'Backstage passes to a TAFKAL80ETC concert' if @quality > 0 if @name != 'Sulfuras, Hand of Ragnaros' @quality -= 1 end end else ... end ... end 第一步是将函数分解为几个较小的函数: def tick case name when 'Aged …

2
存储库模式与DAL对象创建
据我了解,IRepository应当包含CRUD。然后,我们继承了这个IRepository在我们的其它接口,如IProduct和落实IProduct具体类ProductRepository,用类似的方法GetAllProducts(),Top5Products()。 我们也可以对n层架构进行同样的操作。像,创建DAL Class Library并在它定义一个类Product以类似的方法GetAllProducts(),Top5Products()。 在这两个DAL.Product和Repo.ProductRepository我们初始化类DB Context的Entity Framework和查询我们的相关数据。 呼叫是在两个相似Repo.ProductRepository或DAL.Product从方法BLL 鉴于这些相似之处,我的问题是Repos有什么好处?我可以使用的多层架构与做同样的轻松得多(Controller,BLL Class Library,DAL Class Library)。

3
为什么在函数式编程中不鼓励使用赋值运算符或循环?
如果我的函数满足以下两个要求,我相信Sum 返回给定条件下列表项的总和的函数,其中项在给定条件下的评估结果为true,这称为纯函数,不是吗? 1)对于给定的一组i / p,无论何时调用函数,都将返回相同的o / p 2)它没有任何副作用 public int Sum(Func<int,bool> predicate, IEnumerable<int> numbers){ int result = 0; foreach(var item in numbers) if(predicate(item)) result += item; return result; } 范例: Sum(x=>x%2==0, new List<int> {1,2,3,4,5...100}); 我之所以问这个问题,是因为我几乎每时每刻都在建议人们避免使用赋值运算符和循环,因为它是命令式编程风格。那么上面的示例在函数编程的上下文中使用循环和赋值运算符会出错吗?

6
当Dijkstra写关于关注点分离的文章时,他是否打算进行代码模块化?
首先,我阅读了摘自Edsger W. Dijkstra 1974年的论文“关于科学思想的作用”: 让我尝试向您解释,我的品味是所有明智思维的特征。就是说,一个人出于自己的一致性而愿意独立地深入研究其主题的一个方面,一直都知道一个人只在其中一个方面中占据一席之地。我们知道一个程序必须是正确的,我们只能从那个角度研究它;我们也知道它应该是有效的,可以这么说,我们可以在另一天研究它的效率。在另一种情况下,我们可能会问自己,是否这样做:为什么,该程序是理想的。但是,通过同时处理这些各个方面,则无济于事!这就是我有时所说的“关注点分离”,即使不是完全可能,据我所知,这是有效地整理思想的唯一可用技术。这就是我所说的“将注意力集中在某个方面”的意思:这并不意味着忽略其他方面,这只是正视这个事实,即从该方面的观点来看,另一方面是无关紧要的。它同时是一轨和多轨。 我看到关注点的现代分离正在谈论将代码模块化。但是,阅读上面的引用后,我理解这是一次将您的注意力集中在一项特定的任务上,而不是将精力集中在其他方面。在我看来,这并不意味着必须将代码分成模块化的块。 也就是说,在您面前有一个代码,即在一个文件中的所有文件都包含视图,存储库,控制器,事件处理,工厂等概念。 作为一个简短的示例,下面是一些具有数据访问权限并查看(输出)的代码: $sql = "SELECT * FROM product WHERE id = " . db_input($id); $row = db_fetch_array(db_query($sql)); <option value="<?=$row['id']?>"<?= $row['ver'] == $row['ver'] ? ' selected="selected"' : '' ?>>Version <?=$row['ver']?></option> 使用现代的OO,我可以使用Repository模式将数据访问放在其自己的文件中,View代码可以进入其自己的文件模板,并且可以将它们连接在一起以通过控制器(或Action或Request Handler)进行通信,并且我可以添加一个工厂来创建和连接各种依赖项。我可以有一个定义这些工厂的配置文件。当然,这与单一文件的一切相去甚远。 我关于关注点分离的问题是这样的:阅读Dijkstra的报价,我有一个想法,即他不一定意味着关注点分离是“代码的模块化分离(到文件或它们自己的函数/方法/等)中”,而且他的意思还在于让人们将注意力集中在程序的某个方面,而不用专心于其他重要但目前尚未考虑的方面,而无论它们是否在代码中物理上分开。 那么为什么我们要负担物理模块化代码分离和设计模式呢?不管代码的结构如何,仅将精力集中在一个方面是否足够? 我不是在谈论编写最可怕的意大利面条代码,然后只考虑它的一个方面,这很可能是一种负担。但是最后,我要解决的是,当不需要在精神上专注于某个方面时,为什么要执行物理代码分离,为什么要将代码拆分为分离的文件或块(方法)? 关注点分离应该仍然是一种心理锻炼,而不是身体锻炼吗? 换句话说,编程的精神(专注)和物理(纸上代码)方面是否应该脱节?

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.