On Wed, 05 May 1999 22:14:08 GMT, Joachim Achtzehnter
<joac...@kraut.bc.ca> wrote: >here about mindshare. How can Lisp grow its user base? This is not >simply a question of who is willing to pay how much for which >features. It is more a question of how many potential developers are >comfortable with the idea of developing in Lisp. The static typing >issue is important in my opinion, others may disagree.
I'm one of those who disagree. I've talked to a lot of people about Lisp, and about the possibility of using it in place of languages such as C++. None of them ever mentioned static type checking to me as one of their reasons for rejecting Lisp. The overwhelmingly most common reason is the perception that Lisp is a special purpose language for academic projects where efficiency doesn't matter.
>On Wed, 05 May 1999 22:14:08 GMT, Joachim Achtzehnter ><joac...@kraut.bc.ca> wrote:
>>here about mindshare. How can Lisp grow its user base? This is not >>simply a question of who is willing to pay how much for which >>features. It is more a question of how many potential developers are >>comfortable with the idea of developing in Lisp. The static typing >>issue is important in my opinion, others may disagree.
>I'm one of those who disagree. I've talked to a lot of >people about Lisp, and about the possibility of using >it in place of languages such as C++. None of them >ever mentioned static type checking to me as one of >their reasons for rejecting Lisp. The overwhelmingly >most common reason is the perception that Lisp is a >special purpose language for academic projects where >efficiency doesn't matter.
This is like the old parable about measuring the Emperor's nose. No one has ever seen the Emperor, so any one person's opinion about the length of his nose has no significance. The joke is that you try gain significance by averaging the answers of many people.
I have actual reasons for not being able to use Lisp and you're saying those reasons are not important because the average programmer (who's ignorance of what compilers can do is apparently greater than mine) gives different reasons.
So I'd think a better question than why people who don't know anything about modern Lisp systems don't use them would be, what do Lisp systems need in order to be useful to everyone who does know about them.
There is nothing wrong with a Lisp being unsuited for many companies except that the language could change so that it covers all needs.
* jo...@removethisbeforesending.cetasoft.com (Joshua Scholar) | Welcome to the real world. The only time I've ever seen an office where | the programmers had all the time they needed for designing, documenting, | debugging and other 'engineering' process tasks was in a government job.
I love it when people think theirs is the only corner of the world that is worthy of the trademark Real World. one usually doesn't need any more evidence to discard people than that.
I have had the opportunity to do everything I have wanted to do for my client, and have been able to spend all the time I have wanted on what I think is important to the end goal: that I shall be able to leave the project and it shall continue to be operational for a long time to come. only when my management has decided on some particular deadline for some particular feature has this idyllic image been disturbed. this is not a government project -- it's a financial news agency's distribution system, where we care more about accuracy and fault tolerance than anything else.
Christopher R. Barry <cba...@2xtreme.net> wrote: +--------------- | r...@rigden.engr.sgi.com (Rob Warnock) writes: | > Johan Kullstam <kulls...@ne.mediaone.net> wrote: | > | lisp has infix syntax. | > +--------------- | > | > I think you meant to say, "Lisp has PREFIX syntax". | > (At least, I *hope* that's what you meant to say...) | | I believe I remember seeing someone use an infix syntax package (in | this group?) and it looked something like #I(2 + foo * pi ...). +---------------
Uh... That's what Lisp *can* do, if *you* choose to write a reader macro function that implements an infix parser and bind it to a dispatch character (in this case, "I", which is undefined by default in standard CL) for the non-terminating dispatching macro character "#" in *your* application program. But it's not built into Lisp. Lisp's native syntax (in the absence of macro characters) is prefix:
(+ 2 (* foo pi))
-Rob
----- Rob Warnock, 8L-855 r...@sgi.com Applied Networking http://reality.sgi.com/rpw3/ Silicon Graphics, Inc. Phone: 650-933-1673 1600 Amphitheatre Pkwy. FAX: 650-933-0511 Mountain View, CA 94043 PP-ASEL-IA
>>>>> "Rob" == Rob Warnock <r...@rigden.engr.sgi.com> writes:
Rob> Christopher R. Barry <cba...@2xtreme.net> wrote: Rob> | I believe I remember seeing someone use an infix syntax package (in Rob> | this group?) and it looked something like #I(2 + foo * pi ...). Rob> +---------------
Rob> Uh... That's what Lisp *can* do, if *you* choose to write a reader macro Rob> function that implements an infix parser and bind it to a dispatch character
There is the infix package in the CMU Lisp archives....
>> > Well Bagheera didn't state the problem quite right. The overall >> > point is that type checking saves you from tons and tons of late >> > night typos and logic errors.
>> Nothing in CL forbids you from type-declaring every variable. Knock >> yourself out. Don't forget to send bug reports when the compiler >> fails to use them well or flag problems, so your vendor will know >> you care.
>It is true that one cannot fault the language for this. Nevertheless, >until vendors listen to and act on these 'bug reports' the problem >persists in practise. I agree strongly with Joshua that lack of static >type checking is one on the main disadvantages of (at least) the >commercial Common Lisp implementation I am familiar with.
I agree strongly that the lack of static type checking is perceived *by you and Joshua* as a main disadvantage of CL implementations.
One of the major problems with C++ is that it requires static typechecking, which means that building generic functions requires the contortions of templates, which have taken years to settle down enough that compilers could coherently implement them. (And it is not at all clear that template-based code is portable between different template-implementation approaches.)
The fact that CL doesn't *force* you to restrict the manipulable types at the time that you write the code means that you don't need templates; you just need to go write CL code, and use it on whatever datatypes you need to use it on.
You're not likely to get agreement that the problem *that you perceive* represents a problem *in fact.*
>> But the language itself already supports this. It's simply up to >> the market to decide if this is what stands between it and >> success. I doubt it is, but you're welcome to make the case >> otherwise.
>Well, I tend to disagree. Adding static type checking (optional of >course) would go a long way towards convincing experienced C++/Java >programmers to take another look at Lisp. Of course, I can be certain >only about my own opinion, others may disagree. I have heard a >representative of a Lisp vendor seriously argue that Lisp code must >look as simple as Java code to be competitive. IMHO, static type >checking is an order of magnitude more important than that. :-)
Adding in a requirement to put semicolons at the ends of statements, and changing over to C++ syntax, might also go a long way towards convincing C++/Java advocates to take another look at Lisp.
By the way, if static type checking is, as you say, an order of magnitude more important than simplicity of appearance, would you then pay an order of magnitude more for the Lisp implementation?
Money talks; if the Lisp vendors figure out that they can make ten times as much (a decimal order of magnitude) in sales as a result of implementing this functionality, then I don't think they'll sit back on their haunches with some "religious" attitude about not doing it because they think it's a silly idea; they'll say:
"Cool! If we invest $100,000 paying a developer or two to add static type checking, and when our sales increase by an order of magnitude, from $10M to $100M, this $100K investment will pay off handsomely!"
[Hint: The fact that they haven't done so means that they obviously consider this "enhancement" to *not* be of that much economic value.]
>> I won't try to tell you not to write declarations if you won't try >> to tell me that I must write them.
>Sure, there is no need to take away this flexibility.
>> > In code that rarely runs or isn't expected to run under >> > normal conditions, this sort of correctness checking is very >> > important.
>> You don't say what your point is.
>The point is probably this: A C++/Java compiler cannot catch all >errors, especially not design or logical errors, but at least it >catches most simple errors like typos, passing the wrong number of >arguments, passing a wrong argument, etc. With existing Lisp >implementations many such errors are detected only at runtime even >when declarations are used. This is less problematic with mainline >code which is likely to be run by the developer anyway, but typos in >sections of the source code that are less frequently run have the >habit of crashing in the hands of a user, or the QA department if >you're lucky. Yes, you should test all your code, but the kind of bug >we're talking about is often introduced by changes that are so >'obvious' that many developers don't imagine a bug may have been >introduced.
I have a whopping lot more problems with things other than type declarations.
Feel free to believe whatever you want about the "order of magnitude" importance of static type checking. If you lose credibility as a result of this belief, that's not my problem. -- Where do you *not* want to go today? "Confutatis maledictis, flammis acribus addictis" (<http://www.hex.net/~cbbrowne/msprobs.html> cbbro...@ntlug.org- <http://www.ntlug.org/~cbbrowne/lsf.html>
<marc...@copernico.parades.rm.cnr.it> wrote: >cbbro...@news.hex.net (Christopher Browne) writes: >> An X implementation written in a Lisp would indeed be extremely >> interesting. Definitely would need some interesting compilation >> techniques to stay fast; it would doubtless trample some bugs out of >> existence.
>Ahem! CLX? Remember that in the beginning there were TWO >implementations of X, C/Xlib and CL/CLX.
Isn't that merely a CL implementation of Xlib?
That's hardly an "X implementation written in a Lisp;" that's merely a wrapper for the X protocol written in a Lisp, and is not a *remarkably* interesting thing.
cbbro...@news.hex.net (Christopher Browne) writes: > On 05 May 1999 10:22:23 +0200, Marco Antoniotti > <marc...@copernico.parades.rm.cnr.it> wrote: > >cbbro...@news.hex.net (Christopher Browne) writes: > >> An X implementation written in a Lisp would indeed be extremely > >> interesting. Definitely would need some interesting compilation > >> techniques to stay fast; it would doubtless trample some bugs out of > >> existence.
> >Ahem! CLX? Remember that in the beginning there were TWO > >implementations of X, C/Xlib and CL/CLX.
> Isn't that merely a CL implementation of Xlib?
> That's hardly an "X implementation written in a Lisp;" that's merely a > wrapper for the X protocol written in a Lisp, and is not a > *remarkably* interesting thing.
I stand corrected. However, beside being interesting, why should a X *server* be built in CL at this time in history?
Cheers
-- Marco Antoniotti =========================================== PARADES, Via San Pantaleo 66, I-00186 Rome, ITALY tel. +39 - 06 68 10 03 17, fax. +39 - 06 68 80 79 26 http://www.parades.rm.cnr.it/~marcoxa
>>>> In message <3134940176823...@naggum.no> >>>> On the subject of "Re: Newbie questions [Followup to comp.lang.lisp]" >>>> Sent on 06 May 1999 00:42:56 +0000 >>>> Honorable Erik Naggum <e...@naggum.no> writes:
>> * jo...@removethisbeforesending.cetasoft.com (Joshua Scholar) >> | Welcome to the real world. The only time I've ever seen an office where >> | the programmers had all the time they needed for designing, documenting, >> | debugging and other 'engineering' process tasks was in a government job. >> >> I love it when people think theirs is the only corner of the world that >> is worthy of the trademark Real World. one usually doesn't need any more >> evidence to discard people than that. >> >> I have had the opportunity to do everything I have wanted to do for my >> client, and have been able to spend all the time I have wanted on what I >> think is important to the end goal...
[No, you do not owe anyone anything, and I am not blaming you for anything, and I am not whining &c &c &c.]
-- Sam Steingold (http://www.goems.com/~sds) running RedHat6.0 GNU/Linux Micros**t is not the answer. Micros**t is a question, and the answer is Linux, (http://www.linux.org) the choice of the GNU (http://www.gnu.org) generation. I may be getting older, but I refuse to grow up!
In article <3730d086.5562...@news.select.net>, jo...@removethisbeforesending.cetasoft.com (Joshua Scholar) wrote:
> On 05 May 1999 18:44:31 -0400, Raymond Toy <t...@rtp.ericsson.se> > wrote: > >I would say your software engineering process is broken in this case,
> Welcome to the real world. The only time I've ever seen an office > where the programmers had all the time they needed for designing, > documenting, debugging and other 'engineering' process tasks was in a > government job. But then I work in the games industry which is > entertainment after all - flakiness and ego are expected to be main > ingredients of both management and engineering here. Not that I'm > complaining - for one thing I fit right in :)
must've been a good govt. job. I've been working for the government for several years now and I've only had 1 position where your situation held true. But that was a group filled with young, idealistic, crusading programmers that had little control enforced over them from management. Maybe the younger generation just knows a better way of getting the work done?
In general, though, all the jobs I have had have been flaky, with ego maniacal managers and leads. I find this kind of atmosphere too difficult to be productive in. Chaos begets chaos.
-- Bagherra <jaeb...@frenzy.com> http://www.frenzy.com/~jaebear "What use is it to have a leader who walks on water if you don't follow in their footsteps?"
-----------== Posted via Deja News, The Discussion Network ==---------- http://www.dejanews.com/ Search, Read, Discuss, or Start Your Own
r...@rigden.engr.sgi.com (Rob Warnock) writes: > Christopher R. Barry <cba...@2xtreme.net> wrote:
> | I believe I remember seeing someone use an infix syntax package (in > | this group?) and it looked something like #I(2 + foo * pi ...). > +---------------
> Uh... That's what Lisp *can* do
That's kinda what I was getting at.
> Lisp's native syntax (in the absence of macro characters) is prefix:
> > Joachim Achtzehnter <joac...@kraut.bc.ca> writes:
> > It didn't bring down the whole application, I'll give you that. But > > similar behaviour can be achieved with statically typed languages. The > > point is that static typing can catch certain simple bugs ealier.
> I disagree that you can do this in practice in C++. Have fun trying. > Trimmed comp.ai.
If there is one thing that gets me up a tree when discussing programming languages, it is this pretentious believe some people have that some requirement, feature, or behaviour can only be achieved using their favourite language.
Contrary to what you say, isolating failures is not at all difficult to achieve in C++ or other mainstream languages. Of course, if you only look at monolytic systems typically emanating from Redmond, then you are sure to crash the whole system when something goes wrong. As an example of where we are heading, consider distributed systems (using CORBA and other technlogies). More and more systems are built as collections of components where every component does one thing and one thing only. And this isn't exactly new either: On certain mainframe systems of the past it was commonplace to implement every transaction type as a separate program.
Anyway, this is all besides the point. How did we get distracted into this discussion? The topic was whether more static type checking in Common Lisp implementations would be a worthwhile improvement or not. Nobody, at least not me, was claiming that other languages are better than Lisp.
> One of the major problems with C++ is that it requires static > typechecking, which means that building generic functions requires > the contortions of templates, which have taken years to settle down > enough that compilers could coherently implement them.
Yes, and they are still not as flexible as they should be. There is a lot of research going on in the area of virtual types and genericity. Don't be surprised to see a revision of C++ templates in the future, or the emergence of a new language. In fact, the discussion about adding genericity to Java has prompted a lot of activity in this area of research. The point with all this is that languages that are alive tend to learn from experience and improve over time. I could say something about dead languages but this would have an undesired effect in this newsgroup :-)
Note: this last sentence was meant to be a joke! Keep in mind that I am using Lisp myself.
> Money talks; if the Lisp vendors figure out that they can make ten > times as much (a decimal order of magnitude) in sales as a result of > implementing this functionality, then I don't think they'll sit back > on their haunches with some "religious" attitude about not doing it > because they think it's a silly idea; they'll say:
> "Cool! If we invest $100,000 paying a developer or two to add static > type checking, and when our sales increase by an order of magnitude, > from $10M to $100M, this $100K investment will pay off handsomely!"
I don't share your believe in the power of the market to lead us to paradise. If the market had this power would Lisp be the fringe language it is? Would Microsoft be the most successful software company?
> Feel free to believe whatever you want about the "order of > magnitude" importance of static type checking.
Definitely.
> If you lose credibility as a result of this belief, that's not my > problem.
> I didn't say it was impossible in C++, just very difficult, to the > point where most people don't do it. I don't hear you contradicting > this point.
It is difficult only if you approach the design with the preconceived notion that a system must be a single, monolytic program. But as I said, my point wasn't to compare Lisp with C++. I was proposing something that I consider an improvement for Lisp implementations (and you are welcome to disagree). Even if Lisp is better than every other programming language under the sun, we might still be able to improve it, no?
* William Deakin <wi...@pindar.com> | If you did want to write a CL compiler in C, is there a formal grammar | (LALR etc) out there somewhere. I had a look and couldn't find one.
you won't find one, either. formal grammars are useful for languages that are designed to be unreadable and with constructs designed to be impossible to represent at run-time. Lisp is designed to be readable and source code to be representable at run-time, and so have a very different way of thinking about its grammar. considering that all you will ever do with a grammar is associate the first element of a list (a symbol) with a rule for dealing with the rest of the list, you might as well design the whole system using a recursive descent "parser".
Common Lisp's syntax is designed to be LL(1), and objects are read in their entirety before any semantics are associated with them, quite unlike languages designed to keep the sources unreadable to programs written in those languages.
CMUCL alows you to specify types, and I imagine that the commercial compilers do as well. Just because it is not specified in ANSI does not mean that it does not exist in most implementations... but it would be nice if it were specified.
<baghe...@my-dejanews.com> wrote: >In article <3730d086.5562...@news.select.net>, > jo...@removethisbeforesending.cetasoft.com (Joshua Scholar) wrote: >> On 05 May 1999 18:44:31 -0400, Raymond Toy <t...@rtp.ericsson.se> >> wrote: >> >I would say your software engineering process is broken in this case,
>> Welcome to the real world. The only time I've ever seen an office >> where the programmers had all the time they needed for designing, >> documenting, debugging and other 'engineering' process tasks was in a >> government job. But then I work in the games industry which is >> entertainment after all - flakiness and ego are expected to be main >> ingredients of both management and engineering here. Not that I'm >> complaining - for one thing I fit right in :)
>must've been a good govt. job. >I've been working for the government for several years now >and I've only had 1 position where your situation held true. >But that was a group filled with young, idealistic, crusading >programmers that had little control enforced over them from >management. Maybe the younger generation just knows a better >way of getting the work done?
>In general, though, all the jobs I have had have been flaky, with ego >maniacal managers and leads. I find this kind of atmosphere too >difficult to be productive in. Chaos begets chaos.
Two caveats: 1. I didn't say WHICH government. The department was Agriculture Canada. 2. The manager I met was a flaky, ego maniacal man who insisted on meticulous software engineering. But the only reason he could get away with all he did (he was having programmer reinvent the wheel and be WAY too fancy instead of buying off the shelf packages) was that he didn't have to turn a profit.
On Wed, 05 May 1999 02:33:23 GMT, jo...@cetasoft.com (Joshua Scholar) wrote:
> Now in my work (game programming) I don't really have a choice, I more > or less have to use C++.
By the way, the Web site of Franz Inc. http://www.franz.com/ mentions that their Common Lisp system is being used also for game development. The site provides information about a couple such projects.
William Deakin <wi...@pindar.com> writes: > Hmm. If you did want to write a CL compiler in C, is there a formal grammar > (LALR etc) out there somewhere. I had a look and couldn't find one.
Given the complexity of the Common Lisp reader, and it's flexibility (reader macros, read-time evaluation, etc.), I strongly doubt that any parser generator will be able to handle this task out of the box. Of course I haven't tried to do this, so I might be mistaken... ;)
Joachim Achtzehnter <joac...@kraut.bc.ca> writes: > I don't share your believe in the power of the market to lead us to > paradise. If the market had this power would Lisp be the fringe > language it is? Would Microsoft be the most successful software > company?
*IT IS BECAUSE THE MARKET HAS THIS POWER* that Microsoft is the most "successful" software company. It is the direct consequence of the fact that most participants in the shrink-wrapped software market don't really care about quality, safety, ease-of-use and TCO, their whining not-withstanding. Free markets work like democracies: Given responsible, ethical and intelligent customers / citizens, they can create paradise. Of course, in most mass markets / communities, those customers / citizens are in a stark minority, and thus paradise is unatainable[1].
Back to Common Lisp:
If Lisp is about anything, it's about doing the right thing, or at least trying very very hard to do so, and recognizing that to achieve this, you have to move very carefully, yet move nonetheless. There has gone much thought, and philosophical analysis, into nearly all of the features you'll find in the current ANSI CL spec, and I expect the same to happen with any other new ingredient that might be added to that self-same standard in the future.
That high standard of doing the right thing, is the single most outstanding reason that I'm working with CL. It is not the dynamism, the machismo or the nice parenthesis. It is that I care about doing the right thing, it is that my customers expect this of me (or else they will not be my customers), and I trust Common Lisp to help me achieve this.
So before we added some kind of (mandatory) compile-time type-checking to Lisp, I'd want to be very sure that we are doing the right thing here, that we've understood the issues at hand, the limitations, the user's expectations, and the ability of implementations to successfully implement this reliably.
Well, and C++/Java-style "type-checking" strikes me as being most obviously not the right thing.
IMNSHO, IF C++ or Java programmers *really* cared about type-checking at compile-time, they wouldn't be using those languages in the first place. To care about type-checking, you'd want to have a sensible and expressive type-system to start with. So you'd want at least something like Ada, which also has bounds checking and a lot of other stuff you'd want, or much better yet, you'd want something like the current crop of typed pure functional languages, like Haskell or OPAL, etc., which not only have expressive type-systems, and compile-time type-checking but also type-inference, and at least in the case of OPAL, an algebraic property language, which allows you to specify further properties of your defined operations, to be checked at compile-time where possible.
That would be the course of action for C++ programmers that *really* cared about compile-time type-checking.
Since the above mentioned languages don't have huge amounts of new recruits either, it seems to me that most C++ programmers care about compile-time type-checking like they care about OOP, or speed, or portability, or most other things for that matter: It is a must-have-it-and-exactly-this-way feature, yet they don't really know what it is, or care about the underlying semantics or problems. As long as the compiler acts like it's doing something, everything's just fine. The sayings "Lisp programmers know the value of everything and the cost of nothing" vs. "C++ programmers know the cost of everything, yet the value of nothing" come to mind. And since the time of this saying, I think CL programmers at least have gotten a long way to knowing the cost of things, yet I still see no movement in the C++ community of starting to care about the value of things.
Since I've heard in this discussion that C++-style type-checking is mostly helpful in uncovering simple mistakes in argument order, etc., (which strikes me as being as mostly unrelated to type-checking), I'd suggest using environments that reduce the likelyhood of MAKING those mistakes. Although I've not been prone to making those mistakes even in languages like C++, in my Lisp environment, not only have I got the arglist and documentation of every Lisp operator -- whether built-in or user-defined -- at my finger-tips, but also the complete Hyperspec, all just a keypress away. So if I'm only a tiny bit in doubt about argument order, or semantics, I look them up. And guess what, I'm quite a bit better at doing that kind of checking, than any compiler I've yet seen (besides the SSC of course ;).
Of course I'd still be very willing to listen to the ideas and designs of someone who *REALLY* cares about type-checking at compile-time. But I fear that since the type systems of modern pure functional languages are still a much researched area, meaningfully type checking a language like CL seems to me to be worthy of a number of PhDs before the design space is clearly understood.
Of course, a much more "simplistic" kind of type-checking can be attained with CMU CL today... Not that I see most former C++ users flocking to CMU CL instead of other CL implementations though...
Regs, Pierre.
Footnotes: [1] Note that these ideas are over 2000 years old...
[2] In reality of course, it's the languages' communities that care, and not the language itself ;)
* Joachim Achtzehnter <joac...@kraut.bc.ca> | There is a lot of research going on in the area of virtual types and | genericity. Don't be surprised to see a revision of C++ templates in the | future, or the emergence of a new language. In fact, the discussion | about adding genericity to Java has prompted a lot of activity in this | area of research. The point with all this is that languages that are | alive tend to learn from experience and improve over time.
I tend to think of this in terms of young people who learn something that older people have known for decades. the world is getting increasingly complex, so the effort needed to get up to speed also increases and young people need to work harder to catch up. and when they do, they have a steeper "gradient" than the older people they catch up with, so it is only natural that they want to continue with their catch-up speed and go on to do new stuff at a higher pace than they think the old people do. that's why you find new languages picking up a lot of _experimental_ stuff that is "new" in some sense of the word, but which older people know to be junk, because it's something they discarded long ago, and people who catch up don't see where people retracked after going wrong, only where they went and decided to proceed. similarly, new languages will do a lot of "research" and get a lot of funding for concepts and ideas that have previously been discarded. however, to make this fly, they have to call it something else, the same way people who want to "circumvent" patents have to do _something_ clever on their own that lets them use somebody else's inventions. except that regurgitated research uses somebody else's money by fooling people who don't know that it didn't work the last time around.
and with all these new languages and regurgitated research, progress is _actually_ moving a lot slower than it would have if people could just stick to using other people's inventions instead of optimizing for their own degrees and for funding fun research and publicity hunters.
| I don't share your believe in the power of the market to lead us to | paradise. If the market had this power would Lisp be the fringe language | it is? Would Microsoft be the most successful software company?
this is so mind-bogglingly over-simplified an attitude that I can't begin to answer it, but Microsoft has succeeded because it moved technical issues into _irrelevant_ positions. people do _not_ buy Microsoft's shitware because they want quality, robustness, investment protection, or the like, they buy it out of fear of not being able to keep up with the competitors for their manpower and with companies they exchange files with. Microsoft did, however, offer something of relevance a good number of years ago: they gave the suits a computer on their own desk that the computer people didn't control. _that_ was the relevant criterion that propelled Microsoft into their leading role in the minds of the people who decide life or death in business: the suits. like evolution, any irrelevant property can mutate without control, and some day it might prove to be relevant once sufficiently advanced.
I read Kent Pitman's incessant argumentation for the "market" to be a strong voice to let the vendors know that certain issues are _relevant_ to their customers, because the market only decides what's relevant, the irrelevant is taken for granted, and can be _anything_ that doesn't get relevant one way or another. Kent's trying to influence that, and lots of people are trying to let people know what kind of irrelevant issues caused them to purchase virus distribution vehicles and security holes from Microsoft along with the relevant ego-stroking abilities for suits.