> One thing I really respected about them is that they throw tons of money > into research and development, even if that R&D doesn't seem to have a > real financial payoff in the future.
R&D does have real financial payoff in the future, though, and IBM knows this I'm sure. Any individual R&D project may or may not pay off, but if you have an R&D budget and do various R&D stuff, some of it will pay off enough that as a whole it was worth doing the R&D. The reason they do some R&D projects that may not pay off is because it's very hard to accurately predict *which* ones are and aren't going to pay off. You can play the odds, but ultimately you just have to do some R&D and figure some of it will pay off. Any well-run large company does this, *especially* a technology company. You can be certain that Microsoft does R&D work. For that matter, so does McDonald's, though in that case it's a very different kind of R&D from what IBM does.
> However, woe be unto you if you cross them.
This is a defensive strategy: set a precedent as a deterrent to future attacks. If it's done right, it can actually work fairly well. One of the tricks to make it work right is that you can't be arbitrarily nasty (at least not publically) to entities who clearly haven't crossed you. If you are, people just hate you. If you're only nasty to people who clearly were picking fights, the dynamic is different: people are afraid to fight you. It's the difference between a bully with lots of enemies versus a mostly benign tough guy nobody wants to cross. People gang up against the bully; the tough guy they want on their side. Applied sociology.
My horror story of tech support is from APC, from whom I solemnly vow *never* to buy or recommend *anything*. We had an ongoing issue for *months* with the software for one of their UPS units. I'm home ATM and don't recall the exact model number. The issue was an annoying intermittent one, wherein from time to time the software would decide for no particular reason that the UPS was operating on battery power (when in fact it was not) and activate five-minute automatic shutdown sequence. This was happening at night, causing many of our overnight backups to fail, and it was happening first thing in the morning when I (the only IT person on staff) am not normally there, causing a lot of panic among the staff (this system is *the* computer, the *one* that matters, the single mission-critical point of failure that CANNOT be down during the day), and I was told in no uncertain terms this had to be fixed *NOW*, but APC was totally unhelpful. I must have spent a hundred hours on the phone with them. Every *single* time I called, I had to wait while the tech support rep did a web search to find out what VMS was. On more than one occasion I was told that the product we were using (PowerChute for OpenVMS) did not exist, and that VMS was not supported. Also, despite that the trouble ticket CLEARLY stated the problem was with PowerChute for OpenVMS, were were told that we would have to purchase PowerChute for OpenVMS, since the problem we were having was due to having the Windows version of PowerChute installed on VMS, which was not supported. I was given Windows instructions and on one occasion Unix commands to follow. I was told that the problem was with the city's power grid. I was told that the problem was with our application software. Various people told me that they would research the issue and get back to me, but the only one who ever did told me that the problem must be the PC's serial port, despite that I had already explained numerous times to numerous people that the cable from the UPS plugs into LTA16, an RJ45 port on a DECServer terminal server. I called and I called and I called and I got *nowhere* every single time. I asked on one occasion to please speak to someone who knows VMS, but it never happened. We ran for weeks at a time on several occasions with the PowerChute software disabled, meaning that if the power went out at night we'd have an unclean shutdown -- unacceptable, but far less likely than the problems we were having with PowerChute enabled. The problem was never properly resolved.
Needless to say, I will never buy an APC product again, and neither will the library as long as I work there.
> "Okay, take the ethernet cable out of the modem and the computer, reverse > it, plug it in, and then let's try it!"
There's a reason for this. It doesn't have anything to do with the ends of the cable being different. It's because if you tell most people to make sure both ends of the cable are plugged in solidly, they'll just glance at them and tell you they did it. If you tell them to try unplugging them and plugging them back in, a lot of people will think you're stupid -- why would doing something and then undoing it have any effect? You'd be putting it right back the way it started, obviously futile -- so they just tell you yep, they did it, but they make if anything only a halfhearted attempt to actually do it.
If you tell them to swap the ends, stupid people think this actually serves a purpose potentially, so they do it; smart people know what you're really getting at, and they do it. Either way, both ends of the cable get checked.
> I had an elderly woman using a Mac who asked if the ISP could send her a copy > of IE 5.5 for Mac on CD because that version was required by her bank's web > site.
You need to refer her to either Microsoft tech support or the bank's tech support, possibly both. In this case, it actually IS the other guy's problem!
> The hard part is making a big bank of questions that clueless people will > mistake for regular diagnostic questions
Come to think of it, maybe some of them could instead be cleverly disguised as marketing-survey questions...
"If you were to buy an Apple Powerbook system that is on the market today, which one would you be most likely to buy? If you would probably buy a Powerbook Laptop with Windows 98, press 1. If you would probably buy a Powerbook Laptop with Windows XP, press 2. If you would probably buy a Powerbook Laptop with MacOS or Linux, press 3. If you would buy a Powerbook desktop model, press 4. If you are unsure, press 5. For End User Tech Support, press Star. To hear these options again, press the number or pound sign."
Sure, if you don't know what an Apple Powerbook is or what comes on it, it sounds like one of those while-we-have-you-on-the-line-give-us-data questi ons marketroids ask -- dumb, but harmless, and they'll feel smart and superior for knowing what you're up to, and they won't notice that they've been put in the Tier 1 queue. (It's not like the person who answers will say, "Welcome to Tier 1, how may I annoy you?")
> > Why can't we have advanced tech support? > Because everyone will choose that.
Quite so. There's a solution to this: make 'em pass a quiz. Use a bank of 100 questions and give them _three_; if they get all three right, you give them tier-two support immediately. If not, you send them to Tier 1. Of course, you should only make people spend time taking this quiz if they want to get to Tier 2 without going through Tier 1. Normal people would just go through Tier 1 instead, but in case they try the quiz, you want to word it in such a way that they don't realize that they're failing and being sent to Tier 1. I imagine it might go something like this...
Recording: "Thank you for calling BigCompany. If you know your party's extension, press 1 now. For Sales, press 2. For End User Tech Support, press 3. For Advanced User Tech Support, press 4..." [User presses 4]
Recording: "To help us diagnose your problem more quickly, please answer these simple questions." Recording: "What version of Internet Protocol are you using? If you are using IP version 1, please press 1. If you are using IP version 2, press 2. If you are using IP version 3, press 3. For End User Tech Support, press Star."
At this point if the user presses 1, 2, 3, or *, he gets thanked in a nice recorded voice and put in the queue for End User Tech Support, otherwise known as Tier 1. If he hits 4 or 6, he goes on to the next question...
Recording: "Which program do you normally use to edit your registry? If you use Internet Explorer to edit your registry, press 1. If you export the registry, use Notepad to edit the REG file, and then import your changes, press 2. If you use Outlook Express to edit your registry, press 3. If you use Microsoft Word or Excel to edit your registry, press 4. For End User Tech Support, press Star."
Again, if they choose any of the wrong answers, a polite recorded voice thanks them for this valuable information about their internet connection and asks them to hold for the next representative, and they go into the Tier 1 queue. If they get it right, they get a third random question from the bank, and if they get the third one right they go into the Tier 2 queue.
The hard part is making a big bank of questions that clueless people will mistake for regular diagnostic questions but the sufficiently cluefull will always be able to get the right answer. There will be a *handful* of people in the middle who will know what's going on but maybe not know all of the answers, but they can call a second time and hope to get easier questions, and in any case they'll be *way* in the minority, if the questions are written properly. (You have to write them so the wrong answers are very obviously wrong only if you understand the question and seem to make sense otherwise.)
Unfortunately, I don't think it's possible to write 100 questions as good as the IP version question. That one's impossible for a techie to get wrong, so impossible for a techie to get wrong that the correct answers don't even have to be listed as one of the options, meaning basically nobody will get it right if they don't know. Most of the questions will be more like the second one; end users might possibly be able to guess them correctly, which is why I think there should be three questions, not just one. If many clueless people get through to Tier 2 only to find out the circuit the computer's on tripped a breaker, the system fails. The reason for the bank of course is so people in the know can't easily tell morons "the secret" to get Tier 2 support; each person has to prove for *himself* that he knows more than the Tier 1 support reps.
The risk inherent in this system is a PR risk; some end users might notice that the questions are different each time, and, if they're smart (yes, there are smart people who aren't knowledgeable about
> The box under the monitor that you put the CD in is not the hard drive, > it's the MODEM
"Hard drive" and "modem" are synonyms. They both mean exactly the same thing as "CPU". Don't let the technical jargon fool you. Also, don't confuse "Hard drive" with "Hard disk". A hard disk is one of those little square things about three and a half inches across that you stick in the slot on the CPU/harddrive/modem, the slot that's usually right under the CD-ROM tray.
All the cool people these days are putting the harddrive/modem/CPU under the desk, so that on top of the desk they only have the computer (that is, the part with the screen), the keyboard, the mouse, and speakers.
One of the most popular operating systems is Microsoft 97. Windows is a popular word processing software, which allows you to create programs by typing them up. Another popular operating system is Dell, but in addition to being an operating system Dell is also an Internet Service Provider. Dell is better than Microsoft 97 because it runs faster.
> Actually calling 1024 'kilo' and 1024^2 'mega' has always been insider jargon
All of the terms in question, "bit", "byte", "nybble", "word", "double word", "quadword", "kilobyte", "megabyte", "gigabyte", "terabyte", and so on and so forth, are *all* inherently jargon. End users don't have any clue what any of them mean (and shouldn't have to, in this era of hard drives large enough to store more documents than you have time to create before the sizes have inflated so much that your drive is so hopelessly tiny it belongs in a museum). Just because they're jargon terms is no reason to change their meaning.
> What 1024 bytes are _really_ called now is a Kibibyte
*WAY* fewer people use that terminology than the traditional terminology.
The 1000-byte "kilobyte" and the million-byte "megabyte" were devised by hard drive manufacturers who want to inflate their size numbers. No operating system by *any* vendor uses this type of "kilobyte" or "megabyte", nor does any bandwidth provider of which I'm aware, nor any common throughput-measuring software or device, nor any popular application software I'm aware of. Pretty much just the hard-drive manufacturers.
> I get to the actual content of pages without constantly being distracted
Amen, preach it. (But it's not just advertisements I don't want distracting me; anything blinking or flashy MUST DIE, and that goes for the <blink> tag, Flash, looping animations, inane marquees in the statusbar, and anything else of the sort.)
> Being ADD means that flashing ads REALLY annoy me because it's virtually > impossible for me to concentrate on the article with the ads flashing in my > peripheral vision.
I don't think being ADD has anything to do with this; I'm virtually the opposite of ADD, the sort of person who can spend eight hours on one task, standing up from time to time to stretch my legs but still thinking about the thing I'm doing, working out how I'm going to tackle the next part of it, or whatever, the sort of person who gets engrossed in a book and doesn't even *notice* that several hours have gone by. (I have to be careful about this, setting alarms for myself in the daytime if I have somewhere to be later.) I'm the sort of person who has absolutely no comprehension of how ADHD people think, the sort of person who scores well on standardized tests (such as the SAT) because while I'm taking the test I don't notice anything else that's going on in the room, the sort of person who ten minutes after a conversation is still contemplating things that were said and constructing or revising a working theory on that topic. In other words, I'm pretty focused.
But yet, blinky flashy things on web pages still distract me, and I have to disable them. So I don't think it's just an ADD thing. I could probably ignore them if they were further away from what I'm reading, like, say, on the other side of the room -- but having them right there on the screen, right next to what I'm trying to read, is a serious problem. So: animated GIFs play once; Flash is not installed, and I don't read sites that use the <blink> tag (unless someone can point out an easy way to disable that too).
I allow scripts to change images, because rollovers are the *main* use of that, but occasionally I run into a site that abuses it to do looping animation (*WHY* not just use GIF, WHY?), and so it would be handy if it were possible to allow images to be changed only on mouseover, mouseout, and so forth but not in response to a timer. However, I suspect this is probably quite a difficult feature to add; it *sounds* hard to get right, to me, though I don't know jack about the internals of Mozilla's ECMA scripting implementation.
I already filter all incoming mail that's written in the GB2312 character set. This is my single most effective filtering rule by a wide margin, incidentally, and it has zero chance of ever causing a false positive, since I don't know how to read those characters anyway. I know of people who block China's entire IP range, but I haven't gone that far yet; that could potentially block a message I'm actually capable of reading, and *theoretically* it could block a legitimate non-spam message, if someone from China ever tried to contact me. (It's not *that* far-fetched; I've received legitimate mail from all seven continents at one time or another.)
> a byte is 8 bits, a nibble (no, I'm not making that up) is four
Nitpick: nybble is spelled with a y. It was originally defined as half a byte, IIRC, but these days we usually call a nybble a "hex digit", because it holds the same amount of information as one digit in a hexadecimal number. Also, you forgot to mention doublewords and quadwords;-)
The real win would be getting the kernel into hardware (i.e., making it part of the CPU's microcode). Then you could claim that your operating system software doesn't even *need* a kernel!
>... completely without letters if you do it right!;-)
Or, with nothing
_but_ letters. This still looks nothing like English. Of course,
that's a deliberate obfuscation; normal Perl code is considerably more
English-based than that. But with Perl6 you'll be able to define your
own grammar, so it ought to be easy to make a version based on another
language.
Prevention (of a lightning strike) is impossible, or at least too expensive to be practical. What you want is to minimize the amount of stuff (equipment, data,...) that it destroys whenever it hits. For starters, you need to split your network into segements in such a way that data can travel between the segments but lightning won't. Wireless is one option, but I think there are other ways to accomplish this. Some UPSes have data line protection...
Seriously. Java isn't the best and most modern language in existence, but C++ is substantially worse in an assortment of ways. The *only* thing it has going for it over Java is performance, which is mattering less and less as fewer and fewer people are trying to function on the 486SX systems with 1MB of RAM that were prevalent when Java got its reputation for slowness.
If you want to diversify from Java and learn more languages, that's good, but C++ isn't a good choice anymore. People are moving *away* from C++, for good reasons. Learn Perl or Python or Ruby or Scheme, something that actually provides some facilities Java doesn't.
> Out of curiosity, why would you want to use anything other than bittorrent?
I tried BitTorrent on four systems and couldn't get it to work on any of them. Of course, two of these systems are behind NAT gateways, which prevents them from being addressible from the internet, which could be a problem for BT (dunno; if someone knows how to get BT to work through IP Masquerade, either by doing something different with BT or by changing some iptables rules on the IP Masq box, let me know), and the other two are running older distros that don't have a sufficiently up-to-date Python for BT's tastes. So the problems aren't *all* BT's fault... but it should be noted that these problems have absolutely no impact on using wget to retrieve the thing from a traditional ftp or http server. (Well, wget has to be configured to use passive ftp, but that's easy enough.)
When common, popular, ubiquitous, easy-to-use tools start supporting torrent, then I'll be able to use it. For example, if there were a drop-in Mozilla plugin for it that would be easy to install, or if there were a client that doesn't require a recent release of Python (e.g., something written in pure Perl that will run on 5.003 or later),... then I'd be able to use it.
Though, I'm still not so sure about using it at home, on a shared dialup connection. I'm pretty sure getting it off a mirror is a better solution there. (Of course, in the case of Knoppix I can put it up on a mirror at work... I could easily justify that, since Knoppix is something I actually use at work. That's not true of everything I'd want to download at home.)
> Any compiled language by definition can't create functions on the fly
This is flat-out false. There are various compiled languages (compiled as in compiled to native machine code, yes) that not only allow creating functions on the fly but actively encourage it. Common Lisp is just one example. Yes, garbage collection gets compiled in. (This is no weirder than compiling a memory-management library into a C program, and actually being standardized is an advantage.)
Besides that, the whole compiled-versus-interpreted-languages argument is getting fairly blurry these days. It's no longer as simple as C and C++ on the one extreme, which take hours to compile and then run on systems that don't even have a compiler, and BASIC on the other extreme where you can stop the program while it's running, change some variables and maybe some lines of code, and set it running again (possibly at a different line) in-progress with the state intact. There are all kinds of in-between cases now, Perl and Java and Python and so on, which technically are both compiled and interpreted or neither or somewhere in-between. Java runs on a virtual machine, okay, and Perl6 will, but what do you do with Perl5 and others like it, which don't really run on a vm per se but have separate compile-time and run-time phases yet allow more code to be compiled later at run time (through eval and things like it),... and then there's JIT compilation... and then you have compilers that take languages designed to compile to a virtual machine and instead compile them to native machine code for a specific platform...
> > I'm trying to imagine a programming language that doesn't let you > > create functions on the fly but is powerful enough for writing real > > applications. > > C, C++, Java.
[Scratches Java off list of languages to learn.]
I know C and C++ have been traditionally used for writing applications, but I have long been of the opinion that they're not really powerful enough for the job. It takes several times as many programmer-hours as it ought to to do anything, from prototyping to new feature work to debugging, which IMO means that "powerful enough" is a real stretch. These languages get by and continue to be used at this point mostly because a lot of people know them.
In the past, these languages were selected because programmer time was cheaper than computer resources (with which they're more miserly than a higher-level language), but that's no longer anywhere near true, as the article points out; the *average* computer has enough RAM to run three horribly-inefficient extreme memory-hog applications at the *same time* without needing any swap, and newer models are coming with more and more. You talk about GC screwing up virtual RAM algorithms, but it's really not an issue on most systems; if a process grows to three or four *times* the size it needs to be, it doesn't actually have any user-noticeable impact on performance. Memory leaks are actually much worse, because in that case the wasted memory doesn't ever get collected and eventually it becomes a problem, after a couple of hours of use. (Actually, a very small memory leak can go for days without being a problem, but those aren't the ones we notice so much.) In 1996, when most consumer-grade operating systems were so stable that you had to reboot every few hours, memory leaks weren't such a big deal (provided you had lots of swap space), but now that almost any modern OS (and most applications) can run for weeks and weeks if not months or even years without being restarted, memory leaks are now a big deal. It's okay to continually use five times as much RAM as you technically need; it's not okay for your memory requirements to keep growing as a function of how long you've been running, because that can get to be *way* more than five times what you need.
Back to creating functions on the fly, I'm just a little bit surprised to learn that Java doesn't have such an important feature; I had been lead to believe it was a relatively high-level language with fairly high-level features. It runs on a virtual machine, for crying out loud; I had imagined it would be fairly modern and flexible in its design. Are you sure it can't create functions on the fly, or is that just something you don't know how to do in Java? That's a pretty serious accusation to level at a language, almost as bad as saying it can't allocate extra memory on the fly.
> By "correctly," I'm specifically leaving out memory leaks.
What a thing to leave out. Memory leaks are one of the hardest-to-track-down and most annoying kinds of bugs that we perpetually see in application after application. Okay, crashes are more annoying and pervasive, sure. And buffer overruns (which are not a problem in most languages that have GC, albeit GC is not the reason they're not a problem). But memory leaks are high on the list.
> And in functional programming, you're creating functions on the fly.
I'm trying to imagine a programming language that doesn't let you create functions on the fly but is powerful enough for writing real applications. The only thing I can come up with is that you could write what basically amounts to an interpreter so that you wouldn't have to write "functions" in the implementation language but could write them in the interpreted language instead. But that seems like a really ugly hack, just to avoid including real memory management in the compiler/interpreter/vm/whatever.
It is possible to get around the need for closures (i.e., anonymous routines that hold references to otherwise-out-of-scope lexicals), if you have a sufficiently powerful object system. But again, it seems like a questionable goal; sometimes closures are really the most convenient way to accomplish something. (Sometimes they're not, of course... that's why I favour multiparadigmatic languages.)
> So for all those languages, it's not an "ease of use" thing. It's a > "there's no way for a programmer to do even do it manually at all" thing. > GC is the only option.
Strictly *theoretically*, the programmer can do all that stuff in any Turing-complete language; it's possible to do functional programming in 8086 assembly language, for example, if you're willing to go far out of your way to do it. But in practice, neither assembly language nor C really makes that easy or practical, no. But then, there are actually quite a lot of things that those languages don't make easy or practical.
> One thing I really respected about them is that they throw tons of money
> into research and development, even if that R&D doesn't seem to have a
> real financial payoff in the future.
R&D does have real financial payoff in the future, though, and IBM knows this
I'm sure. Any individual R&D project may or may not pay off, but if you have
an R&D budget and do various R&D stuff, some of it will pay off enough that
as a whole it was worth doing the R&D. The reason they do some R&D projects
that may not pay off is because it's very hard to accurately predict *which*
ones are and aren't going to pay off. You can play the odds, but ultimately
you just have to do some R&D and figure some of it will pay off. Any well-run
large company does this, *especially* a technology company. You can be
certain that Microsoft does R&D work. For that matter, so does McDonald's,
though in that case it's a very different kind of R&D from what IBM does.
> However, woe be unto you if you cross them.
This is a defensive strategy: set a precedent as a deterrent to future
attacks. If it's done right, it can actually work fairly well. One of the
tricks to make it work right is that you can't be arbitrarily nasty (at least
not publically) to entities who clearly haven't crossed you. If you are,
people just hate you. If you're only nasty to people who clearly were
picking fights, the dynamic is different: people are afraid to fight you.
It's the difference between a bully with lots of enemies versus a mostly
benign tough guy nobody wants to cross. People gang up against the bully;
the tough guy they want on their side. Applied sociology.
My horror story of tech support is from APC, from whom I solemnly vow *never*
to buy or recommend *anything*. We had an ongoing issue for *months* with the
software for one of their UPS units. I'm home ATM and don't recall the exact
model number. The issue was an annoying intermittent one, wherein from time
to time the software would decide for no particular reason that the UPS was
operating on battery power (when in fact it was not) and activate five-minute
automatic shutdown sequence. This was happening at night, causing many of
our overnight backups to fail, and it was happening first thing in the morning
when I (the only IT person on staff) am not normally there, causing a lot of
panic among the staff (this system is *the* computer, the *one* that matters,
the single mission-critical point of failure that CANNOT be down during the
day), and I was told in no uncertain terms this had to be fixed *NOW*, but
APC was totally unhelpful. I must have spent a hundred hours on the phone
with them. Every *single* time I called, I had to wait while the tech
support rep did a web search to find out what VMS was. On more than one
occasion I was told that the product we were using (PowerChute for OpenVMS)
did not exist, and that VMS was not supported. Also, despite that the
trouble ticket CLEARLY stated the problem was with PowerChute for OpenVMS,
were were told that we would have to purchase PowerChute for OpenVMS, since
the problem we were having was due to having the Windows version of
PowerChute installed on VMS, which was not supported. I was given Windows
instructions and on one occasion Unix commands to follow. I was told that
the problem was with the city's power grid. I was told that the problem
was with our application software. Various people told me that they would
research the issue and get back to me, but the only one who ever did told
me that the problem must be the PC's serial port, despite that I had already
explained numerous times to numerous people that the cable from the UPS plugs
into LTA16, an RJ45 port on a DECServer terminal server. I called and I
called and I called and I got *nowhere* every single time. I asked on one
occasion to please speak to someone who knows VMS, but it never happened.
We ran for weeks at a time on several occasions with the PowerChute software
disabled, meaning that if the power went out at night we'd have an unclean
shutdown -- unacceptable, but far less likely than the problems we were
having with PowerChute enabled. The problem was never properly resolved.
Needless to say, I will never buy an APC product again, and neither will
the library as long as I work there.
> "Okay, take the ethernet cable out of the modem and the computer, reverse
> it, plug it in, and then let's try it!"
There's a reason for this. It doesn't have anything to do with the ends of
the cable being different. It's because if you tell most people to make sure
both ends of the cable are plugged in solidly, they'll just glance at them and
tell you they did it. If you tell them to try unplugging them and plugging
them back in, a lot of people will think you're stupid -- why would doing
something and then undoing it have any effect? You'd be putting it right
back the way it started, obviously futile -- so they just tell you yep, they
did it, but they make if anything only a halfhearted attempt to actually do it.
If you tell them to swap the ends, stupid people think this actually serves
a purpose potentially, so they do it; smart people know what you're really
getting at, and they do it. Either way, both ends of the cable get checked.
> I had an elderly woman using a Mac who asked if the ISP could send her a copy
> of IE 5.5 for Mac on CD because that version was required by her bank's web
> site.
You need to refer her to either Microsoft tech support or the bank's tech
support, possibly both. In this case, it actually IS the other guy's problem!
> The hard part is making a big bank of questions that clueless people will
i ons marketroids ask -- dumb, but harmless, and they'll feel smart
> mistake for regular diagnostic questions
Come to think of it, maybe some of them could instead be cleverly disguised
as marketing-survey questions...
"If you were to buy an Apple Powerbook system that is on the market today,
which one would you be most likely to buy? If you would probably buy a
Powerbook Laptop with Windows 98, press 1. If you would probably buy a
Powerbook Laptop with Windows XP, press 2. If you would probably buy a
Powerbook Laptop with MacOS or Linux, press 3. If you would buy a Powerbook
desktop model, press 4. If you are unsure, press 5. For End User Tech
Support, press Star. To hear these options again, press the number or
pound sign."
Sure, if you don't know what an Apple Powerbook is or what comes on it,
it sounds like one of those while-we-have-you-on-the-line-give-us-data
quest
and superior for knowing what you're up to, and they won't notice that
they've been put in the Tier 1 queue. (It's not like the person who
answers will say, "Welcome to Tier 1, how may I annoy you?")
> > Why can't we have advanced tech support?
> Because everyone will choose that.
Quite so. There's a solution to this: make 'em pass a quiz. Use a bank of
100 questions and give them _three_; if they get all three right, you give
them tier-two support immediately. If not, you send them to Tier 1. Of
course, you should only make people spend time taking this quiz if they want
to get to Tier 2 without going through Tier 1. Normal people would just go
through Tier 1 instead, but in case they try the quiz, you want to word it
in such a way that they don't realize that they're failing and being sent
to Tier 1. I imagine it might go something like this...
Recording: "Thank you for calling BigCompany. If you know your party's
extension, press 1 now. For Sales, press 2. For End User Tech Support,
press 3. For Advanced User Tech Support, press 4..." [User presses 4]
Recording: "To help us diagnose your problem more quickly, please answer
these simple questions."
Recording: "What version of Internet Protocol are you using? If you are
using IP version 1, please press 1. If you are using IP version 2, press
2. If you are using IP version 3, press 3. For End User Tech Support,
press Star."
At this point if the user presses 1, 2, 3, or *, he gets thanked in a nice
recorded voice and put in the queue for End User Tech Support, otherwise
known as Tier 1. If he hits 4 or 6, he goes on to the next question...
Recording: "Which program do you normally use to edit your registry?
If you use Internet Explorer to edit your registry, press 1. If you
export the registry, use Notepad to edit the REG file, and then import
your changes, press 2. If you use Outlook Express to edit your registry,
press 3. If you use Microsoft Word or Excel to edit your registry,
press 4. For End User Tech Support, press Star."
Again, if they choose any of the wrong answers, a polite recorded voice
thanks them for this valuable information about their internet connection
and asks them to hold for the next representative, and they go into the
Tier 1 queue. If they get it right, they get a third random question
from the bank, and if they get the third one right they go into the Tier
2 queue.
The hard part is making a big bank of questions that clueless people will
mistake for regular diagnostic questions but the sufficiently cluefull will
always be able to get the right answer. There will be a *handful* of people
in the middle who will know what's going on but maybe not know all of the
answers, but they can call a second time and hope to get easier questions,
and in any case they'll be *way* in the minority, if the questions are
written properly. (You have to write them so the wrong answers are very
obviously wrong only if you understand the question and seem to make sense
otherwise.)
Unfortunately, I don't think it's possible to write 100 questions as good
as the IP version question. That one's impossible for a techie to get
wrong, so impossible for a techie to get wrong that the correct answers
don't even have to be listed as one of the options, meaning basically
nobody will get it right if they don't know. Most of the questions will
be more like the second one; end users might possibly be able to guess them
correctly, which is why I think there should be three questions, not just
one. If many clueless people get through to Tier 2 only to find out
the circuit the computer's on tripped a breaker, the system fails. The
reason for the bank of course is so people in the know can't easily tell
morons "the secret" to get Tier 2 support; each person has to prove for
*himself* that he knows more than the Tier 1 support reps.
The risk inherent in this system is a PR risk; some end users might notice
that the questions are different each time, and, if they're smart (yes,
there are smart people who aren't knowledgeable about
> The box under the monitor that you put the CD in is not the hard drive,
> it's the MODEM
"Hard drive" and "modem" are synonyms. They both mean exactly the same thing
as "CPU". Don't let the technical jargon fool you. Also, don't confuse
"Hard drive" with "Hard disk". A hard disk is one of those little square
things about three and a half inches across that you stick in the slot on
the CPU/harddrive/modem, the slot that's usually right under the CD-ROM tray.
All the cool people these days are putting the harddrive/modem/CPU under
the desk, so that on top of the desk they only have the computer (that is,
the part with the screen), the keyboard, the mouse, and speakers.
One of the most popular operating systems is Microsoft 97. Windows is a
popular word processing software, which allows you to create programs by
typing them up. Another popular operating system is Dell, but in addition
to being an operating system Dell is also an Internet Service Provider.
Dell is better than Microsoft 97 because it runs faster.
HTH.HAND.
> I went to buy an ethernet hub and was asked if I wanted a 1 or 2 port hub.
The correct approach to that sort of question is to treat it as boolean
and answer "Yes" or "No". HTH.HAND.
> Actually calling 1024 'kilo' and 1024^2 'mega' has always been insider jargon
All of the terms in question, "bit", "byte", "nybble", "word", "double word",
"quadword", "kilobyte", "megabyte", "gigabyte", "terabyte", and so on and
so forth, are *all* inherently jargon. End users don't have any clue what
any of them mean (and shouldn't have to, in this era of hard drives large
enough to store more documents than you have time to create before the sizes
have inflated so much that your drive is so hopelessly tiny it belongs in a
museum). Just because they're jargon terms is no reason to change their
meaning.
> What 1024 bytes are _really_ called now is a Kibibyte
*WAY* fewer people use that terminology than the traditional terminology.
The 1000-byte "kilobyte" and the million-byte "megabyte" were devised by hard
drive manufacturers who want to inflate their size numbers. No operating
system by *any* vendor uses this type of "kilobyte" or "megabyte", nor does
any bandwidth provider of which I'm aware, nor any common throughput-measuring
software or device, nor any popular application software I'm aware of. Pretty
much just the hard-drive manufacturers.
> I get to the actual content of pages without constantly being distracted
Amen, preach it. (But it's not just advertisements I don't want distracting
me; anything blinking or flashy MUST DIE, and that goes for the <blink> tag,
Flash, looping animations, inane marquees in the statusbar, and anything else
of the sort.)
> Being ADD means that flashing ads REALLY annoy me because it's virtually
> impossible for me to concentrate on the article with the ads flashing in my
> peripheral vision.
I don't think being ADD has anything to do with this; I'm virtually the
opposite of ADD, the sort of person who can spend eight hours on one task,
standing up from time to time to stretch my legs but still thinking about
the thing I'm doing, working out how I'm going to tackle the next part of
it, or whatever, the sort of person who gets engrossed in a book and doesn't
even *notice* that several hours have gone by. (I have to be careful about
this, setting alarms for myself in the daytime if I have somewhere to be
later.) I'm the sort of person who has absolutely no comprehension of how
ADHD people think, the sort of person who scores well on standardized tests
(such as the SAT) because while I'm taking the test I don't notice anything
else that's going on in the room, the sort of person who ten minutes after
a conversation is still contemplating things that were said and constructing
or revising a working theory on that topic. In other words, I'm pretty
focused.
But yet, blinky flashy things on web pages still distract me, and I have
to disable them. So I don't think it's just an ADD thing. I could probably
ignore them if they were further away from what I'm reading, like, say, on
the other side of the room -- but having them right there on the screen,
right next to what I'm trying to read, is a serious problem. So: animated
GIFs play once; Flash is not installed, and I don't read sites that use the
<blink> tag (unless someone can point out an easy way to disable that too).
I allow scripts to change images, because rollovers are the *main* use of
that, but occasionally I run into a site that abuses it to do looping
animation (*WHY* not just use GIF, WHY?), and so it would be handy if it
were possible to allow images to be changed only on mouseover, mouseout,
and so forth but not in response to a timer. However, I suspect this is
probably quite a difficult feature to add; it *sounds* hard to get right,
to me, though I don't know jack about the internals of Mozilla's ECMA
scripting implementation.
> Let's take away their internet rights!
I already filter all incoming mail that's written in the GB2312 character set.
This is my single most effective filtering rule by a wide margin, incidentally,
and it has zero chance of ever causing a false positive, since I don't know
how to read those characters anyway. I know of people who block China's entire
IP range, but I haven't gone that far yet; that could potentially block a
message I'm actually capable of reading, and *theoretically* it could block
a legitimate non-spam message, if someone from China ever tried to contact me.
(It's not *that* far-fetched; I've received legitimate mail from all seven
continents at one time or another.)
> a byte is 8 bits, a nibble (no, I'm not making that up) is four
;-)
Nitpick: nybble is spelled with a y. It was originally defined as half a
byte, IIRC, but these days we usually call a nybble a "hex digit", because
it holds the same amount of information as one digit in a hexadecimal number.
Also, you forgot to mention doublewords and quadwords
The real win would be getting the kernel into hardware (i.e., making it part
of the CPU's microcode). Then you could claim that your operating system
software doesn't even *need* a kernel!
> If SCO is going after everything unix, why haven't they touched osX yet?
Their lawyers can only work so fast. Give them time to work, man.
Or, with nothing _but_ letters. This still looks nothing like English. Of course, that's a deliberate obfuscation; normal Perl code is considerably more English-based than that. But with Perl6 you'll be able to define your own grammar, so it ought to be easy to make a version based on another language.
> I havent seen nobody mention whitespace, it has no english keywords whatsoever
Other examples along these lines include Unlambda, Remorse, and Malbolge.
Prevention (of a lightning strike) is impossible, or at least too expensive to ...) that it destroys whenever it hits. For starters, you need to split
be practical. What you want is to minimize the amount of stuff (equipment,
data,
your network into segements in such a way that data can travel between the
segments but lightning won't. Wireless is one option, but I think there are
other ways to accomplish this. Some UPSes have data line protection...
Then there's data. One word: backups.
> Move away from C++ to what exactly.
To VHLLs, of course. I thought I was clear on that point.
> The only other languages you mentioned where[sic] Perl, Python, Ruby, or
> Scheme. I have yet to use Ruby or Scheme, but I did look up some things
> on them.
Try learning one of them.
> Most of those languages are scripting lanugages and aren't really what
> you'd program a major application in. I know I user perl for sys admin
> tasks and quick hacks to just 'get things done'
A good language is flexible enough to be used for "quick hacks" as you
put it or for full-blown applications. In fact, often a quick hack to
get something done ends up turning *into* a full-scale application over
the long haul. All four of the languages I listed are rapidly gaining
recognition as excellent choices for large-scale application development,
due largely to the excellent ratio of results to programmer time. (C and
C++ get a slighly better ratio of results to CPU time, but CPU time is
cheaper than programmer time and these days is almost never the bottleneck
for most categories of applications.)
> Those languages are solid, and fast. You can do most anything with them.
Congratulations, you've discovered Turing equivalence. Of course you *can*
do almost anything with them. The more useful questions are, how long does
it take you to write and debug the code, and how easy is it for someone else
to read and understand it? On the first question, C and C++ get abysmal
scores compared to e.g. Perl; the second question, as you point out, relates
a lot more to programming style and is largely independent of language. A
good programmer can write good code in pretty much any language he has taken
the trouble to learn, with certain obvious exceptions which deliberately defy
good programming practice. (For example, befunge is deliberately designed so
that data and code are not separate; this violates one of the basic principles
of maintainable code, so it's very hard to write good code in that language.
Similarly, unlambda is designed so that even simple problems cannot be solved
in conventional ways, but only by mind-bending paradigm gymnastics. SPL is
designed to be so absurdly verbose that no problem of any significant scope
can be solved in a section of short enough to read in one sitting. Nobody
writes good code in these languages, but it doesn't matter; that wasn't
their purpose.)
Seriously. Java isn't the best and most modern language in existence, but C++
is substantially worse in an assortment of ways. The *only* thing it has going
for it over Java is performance, which is mattering less and less as fewer and
fewer people are trying to function on the 486SX systems with 1MB of RAM that
were prevalent when Java got its reputation for slowness.
If you want to diversify from Java and learn more languages, that's good, but
C++ isn't a good choice anymore. People are moving *away* from C++, for good
reasons. Learn Perl or Python or Ruby or Scheme, something that actually
provides some facilities Java doesn't.
> Aren't "centralized" and "distributed" opposites?
Well, that just depends how much holistic synergy you've got. HTH.HAND.
> Out of curiosity, why would you want to use anything other than bittorrent?
... then I'd be able to use it.
I tried BitTorrent on four systems and couldn't get it to work on any of them.
Of course, two of these systems are behind NAT gateways, which prevents them
from being addressible from the internet, which could be a problem for BT
(dunno; if someone knows how to get BT to work through IP Masquerade, either
by doing something different with BT or by changing some iptables rules on
the IP Masq box, let me know), and the other two are running older distros
that don't have a sufficiently up-to-date Python for BT's tastes. So the
problems aren't *all* BT's fault... but it should be noted that these
problems have absolutely no impact on using wget to retrieve the thing from
a traditional ftp or http server. (Well, wget has to be configured to use
passive ftp, but that's easy enough.)
When common, popular, ubiquitous, easy-to-use tools start supporting torrent,
then I'll be able to use it. For example, if there were a drop-in Mozilla
plugin for it that would be easy to install, or if there were a client that
doesn't require a recent release of Python (e.g., something written in pure
Perl that will run on 5.003 or later),
Though, I'm still not so sure about using it at home, on a shared dialup
connection. I'm pretty sure getting it off a mirror is a better solution
there. (Of course, in the case of Knoppix I can put it up on a mirror at
work... I could easily justify that, since Knoppix is something I actually
use at work. That's not true of everything I'd want to download at home.)
> I nominate Thunderbunny as the new name.
At one point I actually suggested Screaming Flaming Rabbit.
(I was only halfway serious, though.)
> Any compiled language by definition can't create functions on the fly
... and then there's JIT compilation... and then
This is flat-out false. There are various compiled languages (compiled as
in compiled to native machine code, yes) that not only allow creating functions
on the fly but actively encourage it. Common Lisp is just one example. Yes,
garbage collection gets compiled in. (This is no weirder than compiling a
memory-management library into a C program, and actually being standardized
is an advantage.)
Besides that, the whole compiled-versus-interpreted-languages argument is
getting fairly blurry these days. It's no longer as simple as C and C++ on
the one extreme, which take hours to compile and then run on systems that
don't even have a compiler, and BASIC on the other extreme where you can stop
the program while it's running, change some variables and maybe some lines of
code, and set it running again (possibly at a different line) in-progress
with the state intact. There are all kinds of in-between cases now, Perl
and Java and Python and so on, which technically are both compiled and
interpreted or neither or somewhere in-between. Java runs on a virtual
machine, okay, and Perl6 will, but what do you do with Perl5 and others like
it, which don't really run on a vm per se but have separate compile-time and
run-time phases yet allow more code to be compiled later at run time (through
eval and things like it),
you have compilers that take languages designed to compile to a virtual
machine and instead compile them to native machine code for a specific
platform...
> > I'm trying to imagine a programming language that doesn't let you
> > create functions on the fly but is powerful enough for writing real
> > applications.
>
> C, C++, Java.
[Scratches Java off list of languages to learn.]
I know C and C++ have been traditionally used for writing applications, but I
have long been of the opinion that they're not really powerful enough for the
job. It takes several times as many programmer-hours as it ought to to do
anything, from prototyping to new feature work to debugging, which IMO means
that "powerful enough" is a real stretch. These languages get by and continue
to be used at this point mostly because a lot of people know them.
In the past, these languages were selected because programmer time was cheaper
than computer resources (with which they're more miserly than a higher-level
language), but that's no longer anywhere near true, as the article points out;
the *average* computer has enough RAM to run three horribly-inefficient
extreme memory-hog applications at the *same time* without needing any swap,
and newer models are coming with more and more. You talk about GC screwing
up virtual RAM algorithms, but it's really not an issue on most systems; if
a process grows to three or four *times* the size it needs to be, it doesn't
actually have any user-noticeable impact on performance. Memory leaks are
actually much worse, because in that case the wasted memory doesn't ever get
collected and eventually it becomes a problem, after a couple of hours of
use. (Actually, a very small memory leak can go for days without being a
problem, but those aren't the ones we notice so much.) In 1996, when most
consumer-grade operating systems were so stable that you had to reboot every
few hours, memory leaks weren't such a big deal (provided you had lots of
swap space), but now that almost any modern OS (and most applications) can
run for weeks and weeks if not months or even years without being restarted,
memory leaks are now a big deal. It's okay to continually use five times as
much RAM as you technically need; it's not okay for your memory requirements
to keep growing as a function of how long you've been running, because that
can get to be *way* more than five times what you need.
Back to creating functions on the fly, I'm just a little bit surprised to
learn that Java doesn't have such an important feature; I had been lead to
believe it was a relatively high-level language with fairly high-level
features. It runs on a virtual machine, for crying out loud; I had imagined
it would be fairly modern and flexible in its design. Are you sure it can't
create functions on the fly, or is that just something you don't know how to
do in Java? That's a pretty serious accusation to level at a language,
almost as bad as saying it can't allocate extra memory on the fly.
> By "correctly," I'm specifically leaving out memory leaks.
What a thing to leave out. Memory leaks are one of the hardest-to-track-down
and most annoying kinds of bugs that we perpetually see in application after
application. Okay, crashes are more annoying and pervasive, sure. And
buffer overruns (which are not a problem in most languages that have GC,
albeit GC is not the reason they're not a problem). But memory leaks are
high on the list.
> And in functional programming, you're creating functions on the fly.
I'm trying to imagine a programming language that doesn't let you create
functions on the fly but is powerful enough for writing real applications.
The only thing I can come up with is that you could write what basically
amounts to an interpreter so that you wouldn't have to write "functions"
in the implementation language but could write them in the interpreted
language instead. But that seems like a really ugly hack, just to avoid
including real memory management in the compiler/interpreter/vm/whatever.
It is possible to get around the need for closures (i.e., anonymous routines
that hold references to otherwise-out-of-scope lexicals), if you have a
sufficiently powerful object system. But again, it seems like a questionable
goal; sometimes closures are really the most convenient way to accomplish
something. (Sometimes they're not, of course... that's why I favour
multiparadigmatic languages.)
> So for all those languages, it's not an "ease of use" thing. It's a
> "there's no way for a programmer to do even do it manually at all" thing.
> GC is the only option.
Strictly *theoretically*, the programmer can do all that stuff in any
Turing-complete language; it's possible to do functional programming in
8086 assembly language, for example, if you're willing to go far out of
your way to do it. But in practice, neither assembly language nor C
really makes that easy or practical, no. But then, there are actually
quite a lot of things that those languages don't make easy or practical.