If you look up "orthogonal" at Merriam-Webster online (http://www.m-w.com
), only the fifth definition ("statistically independent") seems to apply somewhat to how it has recently been used in discussions of software. Are we misappropriating this word?
See ConcurrencyIssuesAreOrthogonalToEncapsulation and ConcurrencyIssuesAreOrthogonalToObjects. Ever since ThePragmaticProgrammer book, people have adopted "orthogonal" to mean something on the lines of "not related"
- No. I think most programmers know enough math to know and use the word in its original sense: that of orthogonal axes, where, when you travel along one, only one coordinate of the n-tuple changes (cf. perpendicular).
This meaning has been common in programming language discussion since the early 1990s at least.
From dictionary.com, you can also see Mutually independent; well separated;
. So orthogonal is a well understood metaphor, in the jargon of mathematics, philosophy, programming and many other disciplines.
Then why not just say "mutually independent" or "well separated"? The word "orthogonal" does not seem to add value as far as clarity goes. Are we just trying to sound scholarly?
Mutually independent is longer than orthogonal, and well separated isn't actually that clear. If it's a common word, and it seems to be, there can't possibly be any harm in using it.
Is it clear? Is it really common to use it in this context? Do you think more people would understand "orthogonal" among your colleagues than they would "mutually independent", or "not related" or just plain "independent"? I doubt it. Just because it is shorter doesn't make it a better option. I suppose you would name a variable "f" instead of "firstName" also? Hey, it's shorter.
Anyone who is familiar with the normal mathematical meaning of the term should be able to pick up the implications (the two things are measured on different axes), and that includes most of my colleagues, but then again I'm majoring in math. In any case, though, it would seem that the word in this general sense has become common enough in the literature that it's fair game to use. Certainly it's no worse than ennui
, and much better than brobdignagian
Your last comment is certainly orthogonal to this discussion. Anyway, I don't mean to beat this into the ground, but clearly some programmers don't even know how to use this word in its stretched, expanded meaning. I did a search on Wiki for orthogonal and randomly picked a page to look at its usage. Here is a quote from DelphiLanguage:
From a language point of view, it's [ed. meaning "Delphi"] clean and orthogonal
Ha. But even common words like irony
Orthogonality when referring to a programming language means the amount of consistency in its syntax. See http://mindprod.com/jgloss/orthogonal.html
for examples of non-orthogonality in C.
According to Mathematics Dictionary
4th Edition, James/James
means "Right-angled; pertaining to or depending on the use of right angles". Certainly my courses in geometry, algebra and combinatorics all used the term orthogonal
to mean "inner-product of 0", which equates to being at right angles. Of course, my Ph.D. is in combinatorics, not in geometry.
Orthogonal very definitely means perpendicular in most contexts. Any familiarity with geometry, vector spaces, or Greek (orthos
, right, gon
, angle) will tell you as much.
Alternatives to Consider
- independent ("mutually independent" is redundant)
- not all mashed together
None of these mean the same thing. If two features are orthogonal it is required that they can be used together, as well as separately.
Kind of justification for the metaphoric meaning of orthogonal
One vector is orthogonal on another vector if their scalar product is null. When this happens the projection of either of the two vector on the direction of the other vector is 0. A system (set) of vectors is said to be orthogonal if any two of them are orthogonal with each other.
two non-orthogonal vectors the projection two orthogonal vectors, the projection is null
and decomposition of v2
^ v2 v2' ^-- ^v2 ^v4
/ | /| |
/ | / | |
/ |/ | |
O------------> O--->-----------> O-------------->
v1 pr_v2 v1 pr_v4=0 v3
In general orthogonal systems of vectors have very desirable mathematical properties, including independence (not every system of independent vectors is orthogonal, but the converse is true). Given a non-orthogonal system of vectors, it is often desirable to derive a system of orthogonal vectors (like from (v1,v2) to (v1, v2') where v2' = v2 - pr_v2)), a process called orthogonalization (e.g.
the Gram-Schmidt algorithm). Note, the geometry is not always WYSIWIG as above; sometimes the vectors can be very abstract, and likewise the scalar product, the projection and so on.
Now consider the vectors something abstract as concepts or aspects. The projection of one over the other can be seen as what they have in common, or how one influences the other. Like in the example above if v1, v2 represent velocities, the pr_v2 can be added to v1 and gives the resulting velocity on the horizontal direction. It is sometimes advantageous
to analyze phenomena through orthogonal aspects, because orthogonal aspects can be analyzed in isolation. In the above example we can analyze the motion (velocity, acceleration, distance, time, etc.
) on the horizontal and vertical axis separately and in order to find the end result we just have to recompose the two aspects together.
This search for orthogonal aspects has proven a valuable method well beyond geometry. For example in databases we can look at the transactional aspects, independently from the data manipulation aspect(be it relational, SQL-ish, OO, or whatever else). This allows us for reuse (a theorem about transaction serializability can be applied no matter what is the data model of the database) across the board. And also allows us to offer a simpler model to the programmer, who can think of the two aspects separately. And we can add another orthogonal aspect, data security.
Having all this long justification in mind, I find it a lot easier to use orthogonal. And it's also more precise, than mutually independent, well separated. If some programmers misuse the term, it is their fault, and it has to do with the fact that there are unfortunately many of them without mathematical (and computer science) background. I have no problems with self-taught programmers, but a little geometry and algebra can help them a lot more than the latest book on Java.
Reminds me, in some odd way, of a demonstration my physics teacher liked to do. He would open the door and have the biggest kid in class push against the side of it, exerting force along a vector parallel with the face of the door. Then the smallest kid would come along to the face of the door and give it a shove, along a vector normal to its face. The door always moved despite the best efforts of the big kid.
Not sure why you'd need a definition of orthogonal, after all that definition would be orthogonal to any other topic on Wiki!
I knew about the "90 degree" thing
(yes, I'm aware that it's a little more complex than that ;-)
but was unaware that the "mutually independent" definition was so well documented.
I'll have to use the term, in that sense, much more often.
Well, now I'm off to address some other issues, orthogonal to this one... -- JeffGrigg
Oblivious of the misappropriation of the term, I felt that a list of OrthogonalConcepts
may be useful, in a similar way to the WordsThatArentSynonyms
and the ExtremeOxymoron
Perhaps it is down to mathematically grounded programmers avoiding the word discrete, which is what they actually mean when they misuse orthogonal, because for them the word discrete is more strongly bound with concepts such as discrete methods rather than its English meaning in non-mathematical contexts? -- Glyn.