什么是自以为是的软件?


200

我经常看到有人说某些软件“很自以为是”,或者Microsoft倾向于编写“不受质疑”的框架。这到底是什么意思?


Answers:


206

如果对框架有意见,它将锁定或引导您进入其工作方式。

例如:有些人认为模板系统不应提供对用户定义的方法和函数的访问,因为它会使系统对返回原始HTML敞开大门。因此,自以为是的框架开发人员只允许访问数据结构。通过设计,该软件受到限制,并鼓励设计人员以自己的方式做事。

另一个示例(摘自信号链接)是Wiki。Wiki的设计者有很多意见。他们认为HTML对于人们来说太复杂了,因此他们想出了一种更自然的更新内容的方式。他们还剥离了精美的设计,因为他们认为重点应该更多地放在内容而不是设计上。

苹果在设计产品时有强烈的意见。

非优化的软件设计更像PERL / PHP。它允许开发人员并信任开发人员做出正确的决定,并将更多的控制权交给他们。

我也将Microsoft放在非专栏文章中。未定义Microsoft框架的一个很好的例子:.NET。通过打开CLR和规范,它对各种语言和实现样式都开放了它。


18
我不会说“锁住你”,而是很难使它脱离“黄金”道路。黄金之路通常是最佳做法,大多数情况下,它应该对大多数人有用。
dpan

5
我同意锁有点强,但是我会注意到许多自以为是的产品有多成功,从而消除了负面含义。
cgp

32
好吧,很明显,这个答案是
有道理的

6
固执己见的框架是这样设计的,即以不违反框架设计者的假设的方式使用框架时,用户将对该框架的体验最小。
Crippledsmurf

2
我同意altCognito。.NET 鼓励开发人员在WinForms应用程序中混合使用“模型”和“视图”,例如,使脑筋急转弯轻松地将业务逻辑应用于由按钮单击事件生成的方法中。这样,Microsoft间接鼓励近视的开发人员将其代码锁定在其框架中。更简洁的设计将强制执行或鼓励更好的实践,例如,在单独的模块中,强制按钮单击方法以使用Model逻辑调用第二个函数。并不是说.NET无法实现简洁的设计,而是默认情况下不鼓励这样做。
Jared Updike

62

固执己见的软件意味着基本上只有一种方法(正确的方法 ™)做事,而尝试以不同的方式做事将是困难而令人沮丧的。另一方面,以正确的方式进行处理可以使您使用软件进行开发变得非常容易,因为您必须做出的决策数量减少了,并且软件设计人员可以专注于使软件正常工作。如果您的问题很好地映射到了解决方案上,那么自以为是的软件可以很好地使用。解决那些未映射到提供的工具上的问题,可能是非常痛苦的事情。这里的一个例子是Ruby on Rails。

另一方面,非优化软件为用户(开发人员)留下了很大的灵活性。它并没有禁止解决问题的一种方法,而是提供了可用于以多种方式解决问题的灵活工具。不利的一面是,因为工具太灵活了,所以开发任何解决方案可能都比较困难。由于框架没有提供足够的帮助,因此许多解决方案可能必须由用户(开发人员)手动编码。您还必须更多地考虑如何提供解决方案,而中等水平的开发人员可能最终会获得较差的解决方案,而不是他们购买了某些有思想的软件。PERL可能是非优化软件的经典示例。

我的理想是一个非主观的框架,但有一个强有力的约定。我将ASP.NET MVC归为此类。实际上,所有软件在某种程度上都是自以为是(尽管可能不是PERL)。MVC在选择模型时有很强的约定,但是提供了许多解决这些约定中问题的方法。其中一些方法甚至可能破坏模型。但是,按照这样一个框架中开发的约定正确使用,确实是一件令人愉快的事情。


22

它基本上是一种软件,可以像作者认为的那样工作,而不是试图取悦所有人。这意味着很多人不会喜欢它,但是有的人会喜欢它。

Rails可能是一个自以为是的框架的典范示例:您以自己的方式做事,一切都很顺利。如果不这样做,那您就痛苦不堪。但这没关系-如果您不想按照自己的方式做事,就不想使用Rails。


1
我同意这一点。...我有一个优化的软件...之所以被优化是因为这是我的小宠物项目...我不知道它会被广泛采用...有些人喜欢它,其他人抱怨.. 。但是他们都知道这是我的宠物项目
TimothyP 2010年

8

为了平衡起见,我将提供一个(较为自以为是的)描述,它更适合于自以为是的方法(与其他一些答案相反)。

固执己见的框架提供了一条“黄金之路”,对于大多数人和大多数情况(在作者看来),这都是最佳实践。

但是,这并不一定意味着锁定。这意味着可能需要付出额外的努力才能以不同的方式做事。

观点较少的框架提供了许多不同的选项,由您自己决定。

固执己见的框架通常减轻了开发人员的负担,使他们无需重新发明轮子或一次又一次地思考同一问题,从而有助于专注于眼前的实际问题。

在开源世界中,您可以找到许多自以为是却又相互竞争的框架,因此您仍然可以选择。您只需要选择自己的黄金路即可。


1
+1,感觉就像您提到的企业应用程序。尽管可以做到,但Siebel却有一条不容易打破的黄金路,而我在一个偶尔做过的团队中工作。由于您不必一直开发UI元素,数据存储和业务逻辑,因此它可以使开发过程更快。
J. Polfer

5

固执己见的软件以这样的方式构建和设计,使其可以以某种方式轻松地做事。它比其他设计更喜欢某些设计模式。在此过程中,很难偏离开发该软件的软件开发风格。另一种表达方式是,它偏爱“惯例胜于配置”。即,由于软件假定了许多配置方面,因此配置选项非常有限。一旦理解了这些假设,自以为是的软件通常可以更快地掌握。

另一方面,未经优化的软件几乎没有做出任何假设。结果,未经优化的软件/软件开发框架通常会具有许多配置选项。开发人员通常必须对软件的各个方面做出很多决定。通常,会开发各种工具,以便更轻松地处理这些巨大的选项。例如,用于.NET的Visual Studio .NET,用于Java的Eclipse IDE等。精通软件通常比精通软件花费更长的时间。


5

tl; dr

  • 有意见:例如Ruby on Rails。有一种特别喜欢的做事方式,这种方式在做事中得到了很多支持。用其他方式做事很困难,或者对于某些系统来说是不可能的(想到卡桑德拉)。
  • 未调配:例如Perl 5。您可以按照自己喜欢的方式以任何方式做任何事情。所有样式都一样开放,有效和受支持。

3

很多人都将ASP.NET MVC称为“不受限制的”框架,而我只是想对此提出几点想法。

的确,ASP.NET MVC并不需要太多。您可以使用任何喜欢的持久性解决方案,例如Linq-to-SQL,ADO.NET实体,NHibernate等。

另一方面,MVC框架确实倾向于“约定优先于配置”,Phil Haack引用了这句话,该建议强烈建议遵循预定义的模式来定位控制器,视图,模型和其他代码。尽管您可以更改此行为,但使用潮流游泳更容易,并且对于大多数人来说,这样做没有问题。

在ASP.NET MVC周围也有很多有见识的人,我发现这些人导致了很多有偏见的教程,这些教程坚持要涵盖,例如单元测试和依赖注入。我全心全意地进行测试和关注点分离,但是我确实认为这样的话题会被轻描淡写,通常是在覆盖更有用的基础知识之前。

再有,我确实不得不承认,在那些领域中,框架本身完全可以采用您想要的任何单元测试解决方案,以及您想要使用的任何依赖项注入和模拟框架,因此我想这提供了另一个示例。灵活性,甚至在单元测试的“圣经重击”之内也是如此。


2

这是在框架中实现的约定数量以及已做出的决定数量。

例如,如果有5种(或更多种)不同的方式将表单数据提交给控制器操作(在ASP.NET MVC中就是这种情况),则该框架似乎是“不受质疑的”-决定已决定给你!

但是,如果该框架仅通过一种方式(通过直接禁用其他方式,或者通过大力鼓励它)启用了该功能(Fubu MVC就是这种情况),那么您可以说该决定已由框架做出,从而使框架自以为是。


1

您现在将看到的示例是ASP.NET MVC框架。它具有惊人的可扩展性,但是在某些方面却是失败的原因,没有任何肉。要进行数据访问吗?您必须自己编写。想要进行一些AJAX吗?同上。

但是,由于它具有高度的可扩展性,因此如果您在此基础上进行构建,则可以将其转变为一个自以为是的框架。这就是MVCContrib之类的方法,它们为您提供了特定的处理方法,这意味着您必须编写更少的代码。

这的确意味着,如果您想脱离观点,通常要做的工作要比处理原始版本的工作多。不过,这是80/20的情况。如果您正确选择了自己的观点框架,那么您仅希望在20%的时间中摆脱观点,而在其他80%的时间中您将获得很高的生产力。


ASP.NET MVC似乎很自然地适合于ASP.NET AJAX框架,甚至还包括对该库的MVC特定的添加,因此我不同意Ajax实现的选择是完全公正的。另外,该库没有明确规定甚至不推荐jQuery的ue,但是它确实将其捆绑在一起,偷偷摸摸地朝着这个方向打手势,“看看这个”。
罗布
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.