软件工程的理论

12

在我的职业生涯中,我接触到两种广泛的理论:物理理论和教育/管理理论:

物理理论在适当条件下要么正确,要么错误,由物理世界来判断。

教育/管理理论看起来像物理理论,但它们缺乏严格的测试。最好的情况是,它们可以提供解决问题的新思路。多个理论是有用的,因为其中一种可能会以正确的方式引导您。

作为一个软件工程的业余学习者,似乎有很多关于软件工程的理论(如敏捷编程、测试驱动设计、模式、极限编程等)。我应该把这些理论视为类似于物理学的理论还是教育/管理类的理论呢?

或者,我已经误解了软件工程,发现自己处于“不甚正确”的位置吗?


经济/政治/社会学理论怎么办?更糟糕的是:心理学理论。这些理论是如此不可证伪,以至于它们创造了学派。但我不认为它们是“教育/管理”相关的。 - Javier
心理学中有很多理论都是基于严谨的实验,因此可以自信地应用于所有新生心理学专业(正常测试池)。也有很多只是毫无根据的猜测。不要归咎于所有心理学家。 - David Thornley
@Javier 是的。软件工程理论通常比经济学和心理学更实用和有用。我为心理学家感到难过,因为这个游戏(人类思维)如此困难,但答案可能会在某一天得到,所以值得。作为学术努力,经济学似乎几乎没有意义。 - Mike G
12个回答

22

软件工程最终关乎心理学,即人类如何管理复杂性。因此,软件工程原则更像是教育和管理理论,而不是物理原理。

一些软件工程有坚实的数学基础:O(n log n)排序比O(n^2)排序更快等。但大多数软件工程涉及如何思考软件。如何组织事物以使维护者不会变疯,预测什么可能会改变什么不会,防止和检测人为错误等。这是心理学或社会学的一个分支。


非常棒的帖子!我完全同意。 - Syntax
良好的描述,除了软件工程不是心理学或社会学的一部分,尽管成功的软件工程师会使用这两者来使他的项目受益。 - Dima Malenko
我同意这里的大部分观点,但我认为与算法时间复杂度相关的概念和理论完全属于计算机科学领域,而不是试图高效地设计软件系统。我同意 @DimaMalenko 的看法,它肯定不是心理学的一个分支,但可以从中获益。 - Mike G
1
“O(n log n)排序比O(n^2)排序更快”让我们不要助长这个神话。在渐近意义下,O(n log n)排序只是比O(n^2)排序更快。对于小问题,冒泡排序可能比任何O(n log n)排序算法都要快。 - user824425
一些组织软件的原则具有可衡量的好处。例如,我们可以证明,如果某个程序以某种方式组织,那么对程序进行某些更改会影响代码中的许多地方。程序的模块化不仅仅是心理作用;确实存在某些功能的责任集中在程序的某些部分而不是遍布整个程序;这不仅仅是某人的感觉。 - Kaz

4

我认为适当的理论分裂是那些“更难”的科学(可以有证明)和那些主要是定性答案且很少有证明的软性话题。

对我来说,软件主要是关于语言和沟通的,这是一个主要是定性和主观的话题。偶尔我们会涉及到算法和其他“硬”领域,在那里有证明和严格的形式化存在。所以,请提供两种翻译。


我同意你的分割方式(+1),只是不认同你对于绝对科学的定义。我认为只要它基于科学方法(其中“真相”会随着证据而改变),就可以成为绝对科学。在数学意义上的证明并不存在于绝对科学中。 - Allain Lalonde

3

毫无意义。

所有的软件工程“理论”似乎都只是关于特定事物的建议,以尝试看看它们是否能让你和你的团队更加高效。即使可以像科学理论一样设置它们为可证伪的,也没有什么意义。这并不是说学习它们没有价值--相反,你应该尽可能熟悉它们,并尝试弄清楚在哪种团队和环境下它们可能会更有效。但要小心:避免教条主义和认为有万能药。


问题起因于术语的不当使用。 - Javier
是的,有些术语被误用了,但问题仍然有效。 - rz.
找出何时需要帮助可以通过科学方法来完成,这可能是一件有用的事情。 - David Thornley

3
我不会把敏捷编程、测试驱动设计、模式、极限编程等称为“理论”,它们是方法论或工作风格。 它们并没有提出任何主张。

1
他们做出了一种隐含的断言。"遵循这种范例将会改善<某事>"。 - rz.
1
他们提出了一个非常明确的断言,这种方法能够在更短的时间内生成更少错误的代码。理论上这是可以测试的,但实践中很少有人这样做。 - Jim C

2
通常,信息学领域分为四个领域(需要找到源链接,SWEBOK?),这些领域虽然不同但相关且相互连接:
  • 计算机科学
  • 软件工程
  • 计算机工程
  • 信息系统
在Steve McConnel的“专业软件开发”一书中,有关工程与科学的分析很好。请查看他的软件工程,而非计算机科学
软件开发更多地涉及工程——寻找实际问题的实用解决方案——而不是其他任何事情。确实,软件工程依赖于计算机科学、数学、复杂性理论、系统学、心理学和其他学科,但它不能等同于其中任何一个,也不是其中任何一批。

+1. 软件工程 就是 工程学。它是利用任何有用的技能和知识来创建东西。工程可能会利用特定的理论,但是工程学没有像将两块木头粘在一起的一般科学理论那样的科学理论。只有良好的实践方法(可能基于许多个别的科学理论)和对实际有效性的经验(经验主义)。 - Mike G

1

它们就像食谱一样:它们是指南,其成功取决于:

  • 部分取决于食谱的质量
  • 部分取决于原材料的质量
  • 部分取决于从业者的技能(和可用时间)

1
除了理论,还有框架、模型和经验法则。这些是想法,但基于不太严谨的基础,它们松散地属于您的教育/管理类别。
计算机科学有一些强大的基础理论(按您的定义是物理理论),但这些理论主要是将较小的元素联系在一起。
另一方面,软件工程是一个相对较新的学科,涉及利用计算机和偶尔的计算机科学来构建软件系统。该领域的大部分实践完全基于非严格的实验性和轶事性证据。由于即使是最简单的问题仍存在争议,因此大多数被视为实践的东西最好描述为纯粹的猜测和非理性偏好。这是一种学科,您真的需要了解很多才能意识到有多少内容是建立在非常不稳定的基础上的。
保罗。

1

编程是一项非常难以与其他人,甚至其他程序员沟通的抽象活动。软件工程试图在没有结构的地方添加结构,但这种结构并不根植于现实的必然性。因此,所有这些方法在人们试图取悦他们的技术神(或恶魔)时,就像宗教一样。


1

所有这些理论和最佳实践仍然没有让我们达到可以可靠、可预测地生产软件系统的程度。这些调查中最新的一项是2001年的;杰夫2006年的专栏仍在抱怨高失效率。

如果有人正在进行更新的调查,那将会很有趣。

航空电子设备和我车上运行的软件似乎不会像企业软件所引用的那样频繁失败。为什么企业开发者不更加密切地遵循他们的做法呢?也许我们都应该写Ada……(只是开个玩笑)


1

对我来说,这是我的独有理论,其中许多其他理论被用作基础。我不知道有谁使用单一具体的理论。这并不是回避问题的答案。

就像有不同的语言一样,理论/实践/方法论应在不同情况下使用。结构、规则和定义是人们理解如何完成任务的方式,但要完成什么任务是主观的。

适应,在客户、项目、程序员、时间以及特别是使您成功/快乐的方法(如敏捷、极限或其他方法)之间进行选择并灵活运用。成为一个团队,并根据团队的工作进行调整/适应,以造福于大众;只需记住,在你自己的头脑中定义一些东西,否则就不是混乱。

[发牢骚] 我从Atari 400开始编程,它有一个转换后的平板键盘和64K升级。当我上大学时,是VB 1.0,我看到我的经济老师使用它构建了一个教学工具,帮助人们使用图表和视觉输入更好地了解经济学。那很酷!而我知道我也能做到。

同一位经济学老师,后来也成为了IT老师(他很优秀),问我是否能够教授调试课程。他说:“我还没有遇到过像你这样理解概念并且具有天然的快速调试能力的人,你能否教给我们你所知道的和你是如何做到的。” 当然,这让我感到自豪,但更重要的是能够教、指导和帮助他人。
每一个这样的经历都激发了我帮助他人的愿望。对我而言,我想让计算机完全按照我的意愿工作,以帮助商业和家庭生活中的其他人提高生活质量、学习更多、完成更多任务。
有人曾经对我说过:“你的工具好,你才能做得好。” 学习、实践和成长吧。
如果你已经定义了某些东西,它正在工作,有秩序,并且它能够挑战你和界限,那么你就没有错。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接