软件工程

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

5
为什么我看到这么多没有状态的可实例化类?
我在C ++和Java世界中看到许多没有任何状态的可实例化类。 我真的不知道为什么人们这样做,他们只能在C ++中使用带有自由函数的名称空间,或者在Java中使用具有私有构造函数和仅静态方法的类。 我能想到的唯一好处是,如果您以后决定在某些情况下需要不同的实现,则不必更改大多数代码。但这不是过早设计的情况吗?当/如果合适的话,以后可以将其变成一堂课。 我搞错了吗?如果我不将所有内容都放入对象(即实例化类)中,这不是OOP吗?那么,为什么在C ++和Java的标准库中有如此多的实用程序名称空间和类? 更新: 在以前的工作中,我当然已经看过很多这样的例子,但是我一直在努力寻找开放源代码的例子,因此也许毕竟不是那么普遍。不过,我想知道人们为什么这么做,以及这种做法有多普遍。

4
外行术语是什么图
计算机科学中的图是什么,它们的用途是什么?从外行的角度来看最好。 我已经阅读了维基百科的定义: 在计算机科学中,图是一种抽象数据类型,旨在从数学上实现图和超图概念。 图数据结构由一组有限的(可能是可变的)有序对集合(称为边或弧)组成,这些对对称为某些实体,称为节点或顶点。就像在数学中一样,边(x,y)被称为指向x或从x指向y。节点可以是图结构的一部分,也可以是由整数索引或引用表示的外部实体。 但我正在寻找一个不太正式,更容易理解的定义。

1
Haskell记录的进度如何?
最近,我再次迷失了Haskell记录的问题,尤其是字段名称的唯一性。(这很痛苦...) 我已经读过SPJ和Greg Morrisett的Haskell记录提案,但是最近一次更新是在2003年。SPJ和Mark Jones撰写的 另一篇名为《 Haskell的轻量可扩展记录》的论文甚至更老:它来自1999年Haskell研讨会。 现在,我想知道为Haskell提供新记录的过程是否取得了任何进展。 有人对此有所了解吗?有人可以指点我进一步阅读吗?

4
托管语言与编译语言的区别?
当人们试图区分编译语言和托管语言时,我感到困惑。从经验中,我了解到大多数人认为编译语言是C,C ++,而托管语言是Java,C#(显然还有更多,但这些只是少数示例)。但是,两种语言之间的核心区别到底是什么? 我的理解是,无论您使用哪种语言,任何程序本质上都被“编译”为低级机器代码,然后对其进行解释,这也使得托管语言成为编译语言的子集(也就是说,所有托管语言都是编译语言,但不是相反)吗?

8
一个成熟的敏捷团队是否需要任何管理?
在最近对Scrum进行激烈辩论之后,我意识到我的问题是我认为管理对于完全敏捷的团队来说是非常不必要和多余的活动。我相信成熟的敏捷团队不需要管理或任何非技术性的决策过程。在我看来(显然犯了错误)的眼中,唯一合适的,能够管理一支成熟的开发团队的人就是他们的教练(他是技术上最胜任的,具有适当沟通能力的同事)。我无法想象Scrum大师如何为这样的团队做出贡献。 作为一名经验丰富的开发人员,当团队中有一名教练时,我不是一个经验丰富的开发人员,但却善于计划生产周期,因此我很难在Scrum和经理中实现和理解这些东西的价值。那有什么意思?没有发展技能的人到底如何管理一支技术含量高的团队?也许这里的管理意味着其他? 我认为管理是浪费时间,是不成熟的副产品。以我的理解,一个成熟的团队完全可以自我管理。显然,我错了,因为很多伟大的人都说了相反的话,但我无法说服自己。

2
为什么Javascript使用JSON.stringify而不是JSON.serialize?
我只是想知道“ stringify”与“ serialize”。对我来说,它们是同一件事(尽管我可能错了),但是根据我过去的经验(主要是使用asp.net),我使用Serialize()并且从未使用过Stringify()。 我知道我可以用Javascript创建一个简单的别名, // either JSON.serialize = function(input) { return JSON.stringify(input); }; // or JSON.serialize = JSON.stringify; http://jsfiddle.net/HKKUb/ 但是我只是想知道两者之间的区别以及为什么选择stringify。 出于比较目的,这是在C#中将XML序列化为字符串的方法 public static string SerializeObject<T>(this T toSerialize) { XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType()); StringWriter textWriter = new StringWriter(); xmlSerializer.Serialize(textWriter, toSerialize); return textWriter.ToString(); }
18 javascript 

1
编写框架时的依赖注入/ IoC容器实践
我在许多项目中都为.Net使用了各种IoC容器(Castle.Windsor,Autofac,MEF等)。我发现它们往往经常被滥用,并鼓励许多不良行为。 是否有用于IoC容器的既定实践,特别是在提供平台/框架时?作为框架编写者,我的目标是使代码尽可能简单和易于使用。我宁愿写一行代码来构造一个对象,而不是十行甚至两行。 例如,我注意到了一些代码气味,并且对以下内容没有好的建议: 构造函数的大量参数(> 5)。创建服务往往很复杂;尽管所有组件很少是可选的(除了可能在测试中),所有依赖项都是通过构造函数注入的。 缺乏私人和内部阶级;这可能是使用C#和Silverlight的特定限制,但是我对如何解决它感兴趣。如果所有的类都是公共的,很难说框架接口是什么。它使我可以访问我可能不应该接触的私人部件。 将对象生命周期耦合到IoC容器。手动构造创建对象所需的依赖项通常很困难。对象生命周期通常由IoC框架管理。我见过大多数班级都注册为Singletons的项目。您缺乏明确的控制,还被迫管理内部(与上述要点有关,所有类都是公共的,因此您必须注入它们)。 例如,.Net框架具有许多静态方法。例如DateTime.UtcNow。很多次,我都将这种包装和注入作为构造参数。 依赖于具体的实现使我的代码难以测试。注入依赖关系会使我的代码难以使用-特别是在类具有许多参数的情况下。 如何提供可测试的界面以及易于使用的界面?最佳做法是什么?

6
什么时候比解决特定情况更偏爱通用解决方案
在编程中,我们经常面临选择:单独覆盖每个可能的用例,或解决一般问题: 很明显,解决当前问题的速度更快,但是创建一个通用的解决方案将在将来节省时间。 我怎么知道什么时候最好尝试覆盖一个有限的案例列表,或者建立一个通用的系统来覆盖所有可能性?

7
在面试过程中(作为被访者)问技术问题[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我想知道人们是否已经向面试官询问了一些技术问题。这样说:“好吧,您问了我很多技术问题,现在,您介意我问您一些问题吗?如果我要加入您的公司,我们将紧密合作,并确保我尊重我。我的同事们的技能,就像他们尊重我的……”。 听起来不是很自大吗?我很想知道您的意见或经验(当然是作为受访者或采访者)。 PS:一次性帐,因为我不希望认识我的人知道我正在准备面试。
18 interview 

8
Python编码标准与生产力
我为一个大型人道主义组织工作,开发了一个项目构建软件,该软件可以通过加快食品分配来在紧急情况下挽救生命。许多NGO迫切需要我们的软件,而我们比原计划晚了几周。 在这个项目中让我担心的一件事是,我认为过分注重编码标准。我们使用python / django编写并使用PEP0008版本,并进行了各种修改,例如,行长最多可以达到160个字符,并且如果可能的话,所有行都应该走那么长,导入之间没有空行,仅适用于某些种类的换行规则类,我们必须使用很多模板,即使它们不是解决问题的最佳方法等。 一位核心开发人员花了一周的时间重写系统的主要部分以满足当时的新编码标准,并丢弃了过程中的几套测试,因为重写意味着它们“无效”。我们花了两个星期来重写所有丢失的功能,并修复错误。他是首席开发人员,他的话语具有影响力,因此他说服了项目经理这些标准是必要的。初级开发人员按照他们的指示做。我觉得项目经理对所有这些都有强烈的认知失调感,但是尽管他不确定要做什么,但还是非常赞同。 今天,我遇到了严重的麻烦,因为我忘记在关键字参数中的逗号后加上一些空格。在Skype通话期间,我确实被其他两个开发人员和项目经理大喊大叫。就我个人而言,我认为编码标准很重要,但同时我们也认为我们浪费了大量时间来沉迷于它们,当我口头表达这时,它引起了人们的愤怒。我被视为团队的麻烦制造者,一个正在寻找失败者的替罪羊。自从引入编码标准以来,团队的生产力已显着下降,但这只会加剧这种痴迷,即首席开发人员只是将我们不遵守标准归咎于缺乏进步。他认为,如果我们不遵守约定,我们将无法阅读彼此的代码。 这开始变得粘滞。现在,我正在尝试修改各种脚本(autopep8,pep8ify和PythonTidy)以尝试匹配约定。我们还对源代码运行pep8,但是对我们的标准有很多隐式修改,以至于很难跟踪它们。首席开发人员简单地挑出了pep8脚本没有拾取的错误,并在下一次站立会议中向我们大喊。每周都有新的编码标准增加,迫使我们重写现有的,有效的,经过测试的代码。谢天谢地,我们仍然有测试,(我还原了一些提交,并修复了一堆他删除的提交)。 一直以来,满足截止日期的压力越来越大。 我认为一个基本问题是,首席开发人员和另一个核心开发人员拒绝信任其他开发人员来完成工作。但是如何处理呢?我们无法完成工作,因为我们正忙于重写所有内容。 在软件工程团队中,我从未遇到过这种动态。我对他们是否遵守编码标准提出质疑吗?是否还有其他人遇到过类似情况,他们如何成功处理?(我不是在讨论人们只是找到实际解决方案的讨论)

11
为什么使用System.out.println()这么糟糕?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 当然,对错误消息或警告使用日志记录框架非常有用。但是有时候如果我想在短时间内尝试一些新的东西,我会使用System.out.println()。 使用System.out.println()进行快速测试真的很糟糕吗?

6
多重继承是否违反单一责任原则?
如果您有一个从两个不同的类继承的类,这是否意味着您的子类自动(至少)自动做2件事,每个超类都做一件? 我相信,如果您有多个接口继承,也没有什么区别。 编辑:明确地说,我认为如果子类化多个类违反了SRP,则实现多个(非标记或基本接口(例如,可比较)接口)也违反了SRP。

3
为什么C ++中的箭头运算符不只是*。的别名?
在c ++中,*运算符可以重载,例如使用迭代器,但是箭头(->)(。*)运算符不适用于重载*运算符的类。我认为预处理器可以轻松地用(* left).right替换->的所有实例,这将使迭代器更易于实现。->与众不同是不是有实际的原因,还是仅是语言/设计者的特殊性?
18 c++  operators 

8
以图形方式布置GUI是否应视为“作弊”?
我有一个朋友,我的编程经验略多。我们谈论的是我们使用的所有不同编程技术,而Interface Builder也在讨论中。 作为的,除了我所教自己没有编程背景下,我个人认为,IB和它所有的功能(IBOutlets,IBActions)我的技术水平的帮助编码器(和所有的技能水平,对于这个问题),在更短的时间他们的完整的项目。 他对IB的看法有点热情。他认为,使用Interface Builder的编码人员在“作弊”,因为他们不必手工布置接口。 题: 使用GUI构建器布置界面元素是否应该被认为是“作弊”(因为大多数程序最初都要求通过手工编写界面布置界面)?为什么?

5
P = NP的影响是什么?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 7年前关闭。 我正在准备测试,但找不到以下问题的明确答案:证明PTIME = NPTIME有什么影响。我检查了维基百科,它刚刚提到它将“对数学,人工智能,算法等产生深远影响”等。 有人可以给我答案吗?

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.