Skip to content

Instantly share code, notes, and snippets.

@atduskgreg
Last active December 18, 2015 14:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save atduskgreg/5798283 to your computer and use it in GitHub Desktop.
Save atduskgreg/5798283 to your computer and use it in GitHub Desktop.

OOO and OOP

What is Object-Oriented Ontology?

Here's a brief definition from Ian Bogost

Ontology is the philosophical study of existence. Object-oriented ontology ("OOO" for short) puts things at the center of this study. Its proponents contend that nothing has special status, but that everything exists equally--plumbers, cotton, bonobos, DVD players, and sandstone, for example. In contemporary thought, things are usually taken either as the aggregation of ever smaller bits (scientific naturalism) or as constructions of human behavior and society (social relativism). OOO steers a path between the two, drawing attention to things at all scales (from atoms to alpacas, bits to blinis), and pondering their nature and relations with one another as much with ourselves.

Originally coined by Graham Harman. Associated with Harman, Ian Bogost, Tim Morton, and Levy Bryant, amongst others.

Part of a general movement called Speculative Realism.

More specifically, from Graham Harman, some core ideas:

  • undermining/overmining
  • withdrawal
  • black box

(Useful: Dictionary of Concepts for Graham Harman's OOP)

Harman claims no relation to Object-Oriented Programming. But it seems to me there are lots of overlaps. I'm intrigued by these.

Black Boxes

For example, the term "black box" comes directly from network and systems theory. It seems to have first appeared in the work of German mathematician Wilhelm Cauer, but it was made famous by Norbert Weiner, the legendary mathematician who created the field of Cybernetics. In "Cybernetics: or Control and Communication in the Animal and the Machine" (1948), Weiner defined a "black box" as "a piece of apparatus which performs a definite operation on the present and past of the input potential, but for which we do not necessarily have any information of the structure by which this operation is performed" cite.

This idea has had many applications in engineering and programming from code breaking to electronics to the design of programs.

In its most common programming usage, the "black box" stands for the principle of abstraction: the goal that individual components should be built with as few assumptions as possible about the wider system so that they can be reused in different situations without needing to be changed.

Harman's usage of "black box" is perfectly resonant with this understanding. Harman adopted the term from Bruno Latour. He uses it as a technique for thinking about objects as unitary wholes even while knowing that they contain complex networks of components and relations inside of them:

"the black box replaces traditional substance...while traditional substances are one, black boxes are many – we simply treat them as one, as long as they remain solid in our midst. Like Heidegger’s tools, a black box allows us to forget the massive network of alliances of which it is composed, as long as it functions smoothly"

Withdrawal

"Withdrawal" is, I think, an even more interesting example.

When you create a new Ruby object, it has an object_id:

o = Object.new
puts o.object_id
#=> 70152737816360

You can add data to the object by defining instance variables on it:

o.instance_variable_set("@name", "spot")

and its object_id won't change:

puts o.object_id
#=> 70152737816360

even though the data is now there:

puts o.instance_variable_get("@name")
#=> "spot"

You can also remove data without affecting the object_id:

o.send(:remove_instance_variable, "@name") 
puts o.object_id
#=> 70152737816360
o.instance_variable_get("@name")
#=> nil 

And, of course, the same thing holds for adding and removing methods:

def o.cat!
    puts "meow"
end

def o.dog!
    puts "arf"
end

o.cat!
#=> "meow"
o.dog!
#=> "arf"
puts o.object_id # no change
#=> 70152737816360 

class << o
    remove_method(:dog!)
end

o.dog!
#=> NoMethodError: undefined method `dog!'...
puts o.object_id # no change
#=> 70152737816360 

(You also can't change the class of a Ruby object, but this feels like a way that Ruby is a bit more "class-oriented" than "object-oriented".)

In a very real way, a Ruby object's id "is" the object; it's how the system knows where to find the object in memory. On the other hand, the object_id is utterly uninteresting. It doesn't tell us anything about the object's data or methods. And we can't (and have no need) to change it.

This is perfectly resonant with Harman's idea of withdrawal. For Harman, real objects withdraw, in that they can't be accessed through an object's relations or its qualities. Harman calls the part of the object we can observe and relate to a "sensual object".

In fact, Harman came up with his idea of withdrawal in order to solve a problem he saw in Latour's ontology with the continuity of objects. For Latour, an object is nothing more than its relations. Objects (or "actants" in Latour's terminology) sit in a network of other objects, acting as their supporters, components, evidence, masters, associates, etc. They are entirely determined by these relations. However, Harman observed that if any of these relations changed (which they obviously do over time) then, in this understanding, the object must cease to exist and become a different object (objects being nothing more than their relations).

For Latour, the demitasse out of which I drink my espresso becomes a fundamentally different object when the barista fills it, another different one when she passes it to me, and a third, fourth, fifth, and sixth with each sip I take from it. Six completely different objects.

Harman observed that this point of view makes it hard to think about change. There's no object that persists through this series of alterations, undergoing changes. He invented withdrawal to explain change. The withdrawn object is what persists even as its qualities and relations change. Just like the Ruby object_id. And just like the Ruby object_id even though the withdrawn object is mysterious and inaccessible, it's not very interesting since it's exactly the object's qualities and relations we're usually most interested in (either in programming or in more down-to-earth branches of philosophy).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment