Various half-baked ideas I've come up with over the past hour or so.Apologies for typos or if I'm not making sense, or if what I'm saying is obvious. It's intended for any of the panelists that may want to use them as part of the OopslaOhTwo "Objects Have Failed" grand debate, but also for anyone that wants to discuss it here.
I'm managing to update this WikiPage from *inside* the main ballroom at OOPSLA during the Onward! keynote. So I guess people on the panel may well read this!
SUCCESSES
At enabling some successes of never-before seen productivity, flexibility, and adaptation that is so highly regarded by those that think objects have failed - yes, it has succeeded, at times. Mainly from anecdotal evidence.
Some examples I know of:
EXPERTISE
That OO requires commando-level expertise is a separate problem, and isn't necessarily reflective of an intrinsic problem of OO itself. The toolset of the expert programmer is different from the tools of a novice. And the experts always differ in their view. If OO enables experts to create more dynamic, flexible, and maintainable systems than prior approaches, it can be considered a success.
This quote was at at the beginning of the first edition preface to HaroldAbelson and GeraldSussman's StructureAndInterpretationOfComputerPrograms:
The opponents of objects seem to be saying objects have failed in that modern environments have largely destroyed the dynamism of early approaches, such as the immediate reactive environment of Smalltalk, in favor of static thinking approaches of C++.
Is this a failure of objects, or of people? In the historical dialectic between programming statism and dynamism, of emphasizing mathematical proof, correctness, and performance over abstraction, complexity management, and readability, C++ was a step back towards statism. But Java and C# are clearly a step back towards dynamism, though a baby step - perhaps needed for the statists to get on board.
With the emergence (and popularity, if anyone at the BOF noticed!) of dynamic environments like EclipseIde, there still is a desire for dynamism out there!
IMPRECISION of the idea of "Objects" AND ITS PROPERTIES
Object orientation has a very imprecise definition, because it was created in an imprecise way. Anyone who has read ChrisDate's attempts to formalize the idea of objects as a data model will understand how imprecise this is.
It is a set of properties that emerged from Kristen Nygaard's needs and from Xerox PARC's needs. These properties synergistically strengthen one another, but individually their value is debatable. While inheritance and encapsulation are often used as examples of OO's strengths, many papers have been written about the problems with inheritance, and the impossibility of total encapsulation.
It is arguably the popularization of polymorphism and dynamic runtime dispatch that have had even more profound long-term effects. Alternatively, look the importance that OO has played by providing a formal notion of identity and reference semantics as opposed to the chaos of pointers and flat memory in C.
CeeIsNotThePinnacleOfProcedural
How have objects in their totality failed? Perhaps certain properties have: inheritance is certainly a candidate.
BIG BALL OF MUD: UNIQUE TO OBJECTS?
If the majority of software is a BigBallOfMud, is this any different than C? Is C then also a failure? And can we at least say that objects have improved matters over C? If so, perhaps they are therefore a modest success.
PERFECT PLANNING vs EVOLUTION
RichardGabriel likened traditional programming techniques, including object orientation, to be like the obsession with "perfect planning", of designing the one true model, the "Babbage" view of the world (I didn't entirely catch the argument).
Planning is fundamentally about analysis, decomposition into atomic parts. Planning deals with structuring a set direction, or perspective, but says nothing about the direction or perspective you're taking. This applies well to structured top-down programming.
I would argue that the object-oriented paradigm isn't about planning or analysis, it is about synthesis. It is about synthesizing multiple behavioral classifications on top of the data structures, through the creation of polymorphic interfaces, protocols, roles, contexts, etc. Object orientation is about building abstractions, and abstractions are always a synthetic process, biased towards the needs of the moment. This is part of why XP could only have grown out of object orientation: it recognizes the fundamental idea of abstraction being "of the moment" -- you abstract a concept that requires substitutability. (At first, a concept didn't require substitutability. Eventually it did.)
Of course, object orientation doesn't completely reject the notion of planning, and elements of analysis remain an important part of object orientation. But analysis doesn't drive the design process. Object orientation introduced the importance of synthesizing the atomic parts of our algorithms into larger conceptual wholes.
One hypothesis (half-baked) is that the future of programming can't be anti-OO or non-OO, because OO is fundamentally a raw technique for synthesis. Aspect Oriented Programming is another technique. Future paradigms will build upon it.
ON THE ROLE OF OO IN OUR EVOLVING INSIGHT INTO PROGRAMMING
Another quote from Abelson & Sussman's preface:
Object orientation itself is an abstract model of how we think about the world. It is a paradigm of thought, of how to structure knowledge. Clearly, it is not the end of this quest, and is probably quite primitive. But to suggest it has failed ignores its crucial historical role in our evolving ideas for the better -- more expressive, more productive, for a wider audience. (Not as wide an audience as we'd like, but wider than past approaches.)
Is Newtonian physics a failure because it ignored quantum dynamics? I think not. So it is with OO. As we find new paradigms to structure our knowledge, the legacy of OO will remain useful. Is this a suggestion that OO is to AI what Classical Mechanics is to Physics?? No, this is an attempt to suggest that OO got a lot of things right, but it's not the end of the journey of knowledge representation in mainstream systems.
LACK OF OBVIOUS ALTERNATIVE
What ever you may say about OO, it at least gives you an approach. There is no current obvious alternative to using OO.
Procedural programming with heavy use of relational databases. And FunctionalProgramming
WIDESPREAD DOGMATIC AND CULT-LIKE ATTITUDE
The ObjectOrientedCulturalAssumption, and perhaps even a bit of boastfulness contained on this page, may provide a hint at why OO may have failed and may continue to do so in the foreseeable future.
I would recommend that every OO fan that contributed so far look at the EwDijkstra manuscripts.
[Would some nice person be willing to link to a specific anti-OO article of his? Thanks.] The reference to Dijkstra is a recourse to go back to proper style, logical and meaningful discourse, plain English. If OO fans and gurus could learn at least that much from him, that would truly be a blessing !
The entirety of Dijkstra's manifesto for computer science and software engineering are still patiently "waiting for the rest of the world to catch up".
Would the AnonymousDonor give some examples of ObjectOrientedCulturalAssumption in the above? I tried not to say "objects are the only way", or that "OO is cool and the alternatives are obsolete", or that "everybody should be doing OO" -- many of the gems associated with ObjectOrientedCulturalAssumption. I don't believe I have those opinions. My entire premise is that OO is useful and has succeeded in several ways: economically, evolving our means of structuring knowledge, and encouraging dynamism (in some environments like Smalltalk). And I agree that there is a widespread dogmatic/cult-like attitude, and I think it is unfortunate. I don't think objects are the end-all, but I also don't think they've failed. I think they've succeeded. But so will other approaches.
OK. Here are some examples...
Ok, rebuttal points:
Wow! Would you be so kind to raise this point on news://comp.lang.c++.moderated? Or has it ever occurred to you that: a) SmallTalk and CLOS are simply inadequate to solve some engineering tasks, b) others moved on beyond SmallTalk and CLOS to other advanced topics?
I would not suggest they are inadequate, though I would certainly hope people have moved on to advanced topics beyond CLOS and Smalltalk. And why would I flamebait comp.lang.c++.moderated? If I don't like C++ as a language that much, that's my opinion, and others are free to use it and love it (and they do). Again the point seems to whoosh over your head: there are ideas in CLOS/Smalltalk that are important, in particular their dynamic nature, and some would think these ideas should be used more widely. That's all. (Of course, in some ways they are being used again -- aspect-oriented programming, for example).
This page is riddled with presuppositions and assumptions. The reader is supposed to know what the writer is talking about without it being stated. Even more, he is supposed to whole-heartedly adhere to those ideas; otherwise a "you don't get it" is readily implied. A more cautious tone and a careful construction of arguments before jumping to conclusions would certainly be a good idea. After all, this is not a manifesto, it's the OO community who brought about this debate. The rest of the world is minding its own business, thank you very much. If the OO community just asked the question WhyObjectsFailed? (which is a very bad start to begin with, as noted on this page) just as a pretext to proclaim how great and magnificent this whole OO thingy is, and how others had better "catch up", that's truly a laughable enterprise.
Negligent use of words and throwing around fancy terms like "model", "abstract", "structure of knowledge", "framing" only exacerbate the effect. Can we go back to English please? And try to actually *communicate* something? A properly constructed argument maybe?
You expect people to try to communicate with you, Costin (whoops, I meant AnonymousDonor)? Wake up, man. All you typically offer is inane, specious argumentation laced with vitriol, hatred, scorn, and lately, the cowardice of omitting your name. If you want reasoned discourse, then supply reasoned discourse. Otherwise, find yourself a different community. Your behavior here does not conform to WikiSocialNorms and is unwelcome for as long as that is the case. -- RandyStafford
Perhaps, Costin/AnonymousDonor, you missed the whole target context of this page: it was ideas for a panel, with direct links to some specific points raised at that panel. You aren't the intended audience. It used an argument and jargon that the intended audience generally would understand. If I wanted to argue this point with you, I would have framed the arguments much differently.
That's precisely the problem. Are we to understand that it is OO community's preference to use metaphors, imprecise and/or improper terms that can't be explained in plain English with the aid of just mathematics and logic? Do you think this is good? Yes, I think metaphorical thinking is an approach to understanding a complex topic. That was pretty much the theme of this year's OOPSLA: the importance of metaphors and how they shape our understanding of almost every aspect of computing hardware and software. I think a problem here lies with your refusal to acknowledge that "plain English" heavily relies on the use of tropes, such as metaphors, to convey meaning. Certainly one can misuse metaphors, but one can also misuse mathematics :)
As for suggesting AI and OO have had no effect on each other, I would suggest looking at most modern editions of AI, Expert Systems or knowledge representation books. Most of them (that I've seen) include a section on object orientation, and its relationship to KR's like frames & slots. Both AI and OO have focused on knowledge representation, just from different disciplines and perspectives. Perhaps AI has helped OO more than OO has helped AI, but there is something to be said for what OO has done: it's brought the problem of knowledge representation to mainstream developers. A lot of people work with it: building domain models, analysis patterns, design patterns, etc.Surely this helps to elevate the "water level" of computing industry by encouraging more expressive languages for more complex knowledge representation. -- StuCharlton
To say that OO has focused on knowledge representation is a slight exaggeration. The same can be said about correlating a "section" (anything from a paragraph to a small chapter) with "irrevocably affected the study of [the structure of knowledge]". Not to mention that a few prominent figures in AI don't hold OO in high regard.
OO certainly has focused significantly on knowledge representation! Perhaps not from the AI community's perspective, but the study of object-oriented information and behavior modelling has had a long history. I could think of a couple of reasons for the AI community not holding OO in high regard: a) it's 35 years old - been there done that, let's research other paradigms, or b) NotInventedHere. Research communities are notorious for snubbing things that didn't grow directly out of their discipline--for example, the expert database systems community has largely snubbed work on the relational model. Pardon my ignorance, but what's that ObjectOrientedInformation??
The objects that AI talks about are not the same thing as Smalltalk or CLOS or Java or whatever objects, and classification schemes are not the same as UML boxes and arrows. Likewise domain models, patterns and etc can be knowledge representation only by a very, very long stretch.
A very, very long stretch? That's where we diverge. The paradigms, perspectives, and constructs differ, but the intent remains similar (if with different desired end-goals).
To avoid any confusion let me put a brief definition here (from http://cirl.uoregon.edu/research/kr.html):
You want to say that knowledge is embedded in those systems. Of course, no useful program can be constructed without some knowledge about the problem it's suppose to solve. In this sense even programs written in assembly do embed knowledge. Knowledge representation (in the ComputerScience jargon) is qualitatively different, meaning knowledge has to be encoded in such a form as to be readily available for computerized manipulation (including but not limited to automatic reasoning, verification, validation, searching, retrieval, etc). Only if you think how difficult is to extract knowledge from OO computer programs, and what a lousy job UML tools do when reverse engineering large bodies of OO code, you'd lower your claims a little bit.
My original reference was how programming was "shaping the structure of knowledge". Someone suggested that "knowledge representation" would be a better term, so I started using it. Now I see why I hesitated to use it in the first place, and preferred the unedited Abelson/Sussman reference: I was not referring to knowledge representation as a study inside computer science. I was referring to knowledge representation as you discuss above: that even assembly language can embed knowledge, but object-oriented languages just did it in a more human-manageable fashion than assembly (or some other languages) did. It wasn't an ambitious statement; it just seems to be interpreted as such.
Can you briefly explain how Smalltalk object model or OO in general support automatic reasoning, search strategies, proof checking, probabilistic information, modal logic, higher order logic or any related topic at all? It's an abstract model of how we think about the world, after all.
This is a RedHerring. Why limit your question to Smalltalk? Lisp in and of itself doesn't have support for these research topics, after all it's just symbols & lists (which is another abstract model of how to think about the world).
That is not a red herring, unless you want it to be. Lisp supports what is called symbol manipulation, and therefore there's a world of a difference in what regards support for AI between ST and Lisp. While it's true that Lisp doesn't directly support higher-level constructs, symbol manipulation is essential in putting those frameworks in place, and those frameworks do exist (even abound) in Lisp world. So, if you maintain your claim that OO focused greatly on KR , even influenced it a great deal, please reply to the questions above.
A programming language provides a conceptual paradigm for knowledge representation, nearly always based on a central metaphor. Fortran used mathematical functions as its metaphor. Lisp used lists as its metaphor. APL used arrays. Simula and Smalltalk used the platonic "object" and the "message pass" as their primary metaphors. All of these are constructs for knowledge representation.
No, those are constructs specific to programming languages. Many of them have little to do with KR. Arrays certainly are not a KR concept. FORTRAN and mathematical functions are quite a distance apart. To say lists are *the* metaphor of LISP is a gross simplification. And while you may argue that knowledge can centered around "objects", I can't quite figure out how my brain is using message sends to reason about the world. And you keep forgetting that a great deal of knowledge is about propositions, predicates, inference rules, induction, deduction, pattern recognition and a great deal of many things that OO has little if anything to say about.
It may help you to consider for a moment that OO is not everything to everybody, and many people have important things to do, other than "catching up with Smalltalk and CLOS". In case you haven't figured out I wasn't trying to make the case for "OO has failed", but I was rather trying to draw you to the conclusion that somebody put it so accurately below.
I never claimed OO to be everything to everybody. I never even claimed OO was a serious competitor to any of the AI research on knowledge representation. I *did* suggest that there is some frustration that some arguably elegant and useful ideas have not reached a wider audience. Hence my *HYPERBOLE* of "waiting for the rest of humanity to catch up". This was never to be intended to be an absolute statement, that the rest of the world *should* catch up with CLOS/Smalltalk, just that there are good ideas in there that can still be mined. I find it perplexing and frustrating that you take my words so literally. It's as if you're reading my statements through some sort of vacuum devoid of context. Now, perhaps this is due to a language barrier, and we've just been talking past each other. I know you want people to StopUsingMetaphors, tropes and linguistic tricks, but this is very difficult for an native English speaker when I'm not conscious about it. Which brings me to an earlier point - you weren't the audience for my points above, Costin, and that's partly why they are worded that way. The other reason is that it was written in haste, literally an hour after the panel, as a mind dump.
Of course I took that hyperbole more as a bad joke (the same can be said about C++ model being pathetic). You know, good irony is always self-referential. You didn't literally suggest that OO is everything to everybody, but when you stretch OO so much and mix it with all kinds of orthogonal things and compare it to Newtonian physics and allude that it is fundamental to knowledge representation, and make it an abstract model of human thought, you effectively cry out for making OO an everything to everybody. Such an endeavour is really unwarranted. OO doesn't need to be stretched so much to prove it did not fail. It's much easier to show that OO helps you build good programs, which is what is all about.
Why take your words so literally? Hey, everybody and their friends around here are SoftwareEngineers, not postmodernist literary critics: we should take the concepts related to our profession at their value. When you speak about "abstract model", "knowledge representation", "structure of knowledge", "the way we think about the world" , all these have either a precise meaning or they have no meaning at all. It's your choice what you intend to communicate.
Maybe you will take your time to refactor this page and make it better. Otherwise if you delete it altogether and move the few useful ideas elsewhere, it's still a step forward. I'd still recommend you to take a daily doze of Dijkstra. Even if your style is more tilted towards James Joyce, I'll humbly suggest that in this corner of the world, Dijkstra's English is a lot better :)
Fair enough. I have reasons for talking the way I do, as do you for preferring Dijkstra :).
Please don't forget that when Costin was a young child, his parents were murdered by crazed object-oriented programmers. They did horrible things with their bodies and wrote "Die relational scum" on the walls with blood. And now he sees them off in some corner of the internet, having the gall to say that their chosen metaphor can be useful, when any decent person knows that ObjectOrientationIsMurder?. His anger is understandable, don't you think?
Anger? Someone is so kind here. Most people suspect it's more like dementia, delirium tremens, homicidal tendencies, to say the least. Someone is generous indeed. A recourse to logic can surely be rooted only in the darkest corners of a sick human mind. In the object-oriented abstract model of thought, the logic is nowhere on the radar. If it's not a bug in the model -- and how can we suspect such a wonderful model -- we should rather be suspicious of the reality that doesn't fit the model. It must be an evil reality.
But if it's only anger there must be a glimpse of hope after all. Maybe we should try to re-educate the poor bastard.
Though the original post is in bad taste, your response brings up an interesting perspective: "logic is nowhere on the radar". Some of my studying of Peter Wiesse's Meta Pattern seems to resonate with what I've been trying to communicate here: objects are ontological, a certain idea about reality. They're not perfect, because absolute objects (with traditional notions of inheritance) are a fairly primitive view of the world. But they have had significant value because, for many people's purposes, you can synthesize a solution in terms of absolute objects and their relationships.
I'm not fortunate enough to have the time to study the MetaPattern you referred to, unless someone convinces me it's a breakthrough relevant for my job and having seen a few meta patterns I have my doubts. However, when someone brings philosophy into discussion, I'm reminded of a certain memorable phrase of EwDijkstra (yet, again) -- see it on his wiki page. I'm of a rather strong opinion that Philosophy, Architecture, Film, Music and other such fine arts should be kept away from TheArtOfComputerProgramming, or at least in the very back seat. It's another failure of OO that a significant portion of OO movement tends to discount Mathematics, and bring into the front seat all kinds of voodoo arts. See IsProgrammingMath / ProgrammingIsMath.
There's a serious problem with disconnecting from logic. Most OO programmers are inclined to encode everything in DomainObjects and message sends. However, this kind of encoding is at best a (low-level) implementation concern. With maybe few exceptions the language of business rules and the way most non-programming humans think, is still fundamentally about logic (classical first order logic, modal logic, temporal logic and maybe a few variants). For example, read http://www.businessrulesgroup.org/first_paper/br01c0.htm.
OO programmers then hit a PsychologicalMismatch? much the same as ObjectRelationalPsychologicalMismatch, and they fail to recognize that structuring information (the knowledge about the domain) is a different activity than choosing DomainObjects for the implementation of various use cases. DomainObjects are mostly a structuring unit for the program and on very few occasions that structure is also a good match for the structure of the information.
Maybe all we need is shining example to kick start our understanding. How will I make Apache or vi using rules of logic?
I think the main reason this argument happened in the first place is that OO was not created from a mathematical basis, and hence is of questionable worth. OO was created from a psychology / human factors focus. Time has shown to some that it has been worthwhile endeavour (but of course many would disagree). I guess it depends on your perception of what software development is: an application of mathematics or general epistemology? Isn't mathematics an offshoot of philosophy? Perhaps the popularity of non-mathematical techniques is related to the the growing rejection of logical positivism in philosophy circles.
''I'm not sure I understand what previous authors mean by "the study of the structure of knowledge" but I would tend to say that OO is about using our natural powers of abstraction to get a better grip on complicated problems. Shouldn't the question be more about "the study of the representation of knowledge"? It seems to me that OO is a step along a path that evolved from the concepts of modular programming and is leading towards the addition of concepts like aspects and cross-cutting concerns to our vocabularies. The success or failure of OO is not an industry-wide rating.
I personally do not like OO, at least in its heavy form. But, I suspect that ParadigmsAreSubjective?. OO sings to those who like it, but that does not mean that it sings to everybody. There is nothing objectively better about OO. There are multiple ways to create "abstraction" and manage complexity and change. Relational modeling and relational algebra is highly abstract, for example. It is one of the most compact and powerful forms of abstraction I have seen. I would like to more research and improvement in this direction.
That being said, OO will probably survive as one paradigm among many the same way that dynamic typing and static typing still exist with no clear winner.
Things are getting sufficiently complex in the software world that people are unknowingly starting to model their own head more so than anything objective in the external world, and this creates tension as different heads have to work together.
See Also: BenefitsOfOo