guys like Joe Barta and the guy at HTML-Goodies were capable of acting as a “layperson’s liaison” (so to speak) & create user-friendly on-line tutorials from some truly cryptic stuff. But you can’t change a leopard’s spots, and those languages still remain cryptic, despite their best efforts. (what makes me shudder is that compu-geeks consider HTML easy - if that’s supposed to be e.z., & they call Perl difficult, then I wouldn’t wish Perl on my worst enemies!
What puzzles me is why those same geniouses couldn’t use their user-friendly skills to create a language which is BOTH totally intutive (tested on your average Tom & Harry) AND eclectically provides every capability that any of the present programming languages offer? (languages such as Java, Perl, XML, DHTML and so on.) It’s ridiculous how, if anyone tries to choose which language to study, their head could swim from the choices and from the need to have to learn many languages instead of just ONE all-encompassing, intuitive language.
BTW, I’d only understand a response brought down to my layperson’s level
I realize that this analogy isn’t perfect, but maybe it’ll make it a little more clear. Why don’t we just have one, all-encompassing, easy-to-learn language for the purposes of human communication? English, as far as I know, is an extremely difficult language, so why do so many people bother learning it? And I’m willing to bet it takes, on average, a person with a reasonable grasp of language a longer time to learn English, or Chinese, or Latin, or whatever, than it does for a person with a resonable grasp of computers to learn Perl, C++, Java, or even HTML, if you think that counts.
There are actually many more reasons for computer languages being how they are, but one of my favorite ones I hear told to people who complain about their difficulty (not that I’m saying it’s not a valid complaint, mind you) is that computer programmers intentionally make things obfuscating, in order to keep out the weak-willed.
It’s kinda proposterous to suggest one all-encompassing language that is easy (by that I assume you to mean more like English) should be magically produced. The fact is that different languages suit different purposes. An interprative scripting language such as Perl is suitable for the Web because it is versatile with few constraints. Visual Basic is good for writing Windows applications, C++ fits the bill for bespoke business applications, writing computer games etc. (don’t be posting examples of how we can use compiled languages for Web applications people, I’m summarising). Basically, it’s horses for courses. And if you look at it logically there isn’t much that is difficult about programming. A lot of it reads like English anyway, it’s just the sybtax that is different. Once you learn one language you can learn any. Perhaps it takes a particular mindset.
To paraphrase Clausewitz, everything in programming is simple, but even the simplest thing is very difficult.
From COBOL through 4GLs, computer scientists have been trying to devising simple, powerful, easy-to-use programming languages for over forty years. And over forty uears of programming experience (collectively; I personally only have about half of that) has shown that non-programmers do not want to deal with any expression more complex than, “Hey, buddy, you wanna write that program while we’re both still young?”
To get my BS in Computer Science, I learned several programming languages, mostly to serve as examples of different styles of programming. (Pascal, BASIC, FORTRAN, RPG II, Assembler, Ada.) Each offered a unique feature that demonstrated what could be done with computers (e.g., structured variables, loose or tight type checking, object-oriented programming, report formatting).
However, HTML, XML, and other -ML languages are “mark-up” languages, not programming languages. (Each would fail the Turing test of programming.) They instead mark-up, or format, data for presentation. (They themselves can have Javascript, but that invokes a separate interpreter.)
Perl is harder than HTML because it is a programming language.
The easier a programming language is designed for lay people, the more pre-defined features have to be implemented. With that is less dynamics, that is, you can only do a limited set of algorithms that were designed by the language creators.
This is not unlike asking GM to build a car that will be able to take your 5 kids to the softball game and also run the Indy 500 competitively.
The biggest problem is being “intuitive”. Intuitive to who? Some people find pumping gas intuitive, others use full service because they can’t figure out how to work the pump. Ok, that’s probably a bit of a hyperbole, but think about it. Some non-computer using people could dive right into Windows 95, others need “Windows for Dummies”. Let’s face it, programming (at least the type I do) involves a pretty big knowledge set.
We’ve tried half a dozen times to give a few of our VP’s direct access to our company’s main database using about the most user friendly tools we can get, but they need to comprehend the complex nature of database structures in order to use it. Computers can’t interpret natural language instructions very well, so unless you take years to build an interpreter that will turn the request “show me all our sales this month” into a formatted report, you need a human interpreter (aka programmer) to do it for you.
Anyway, learning to use the language itself is the *easy part. In my programming career I’ve had to learn BASIC, Assembler (6502, 6809, 8080, 68000, 80x86, 68HC11), Pascal, Modula-2, C, C++, Java, Javascript, VBscript, Perl, SQL, a zillion incompatible database languages like DbaseII and Access, and probably a bunch more that I’m forgetting. I’m not including stuff like HTML and XML, as those are nothing more than tagging formats for marking up data. People who write HTML pages are not programmers.
On top of that, you have to learn the architecture of the environment you’re working in, and that’s often more complex than the language itself. It takes a long time to become proficient in Windows programming, because it has become a very complex environment.
But really, to a professional programmer this stuff is just hammer and nails. The real skill comes from what you are able to do with it.
Lately, I’ve been interviewing recent tech school grads, and I’m finding a disturbing trend - they are graduating with a huge laundry list of languages and environments that look good on their resume, but to cram that all in the basics of good programming are being ignored. Several graduates I recently interviewed didn’t know what a Stack or a Linked List were. I asked them to define recursion. Never heard of it. Re-entrant code? What’s that? How about a simple Boolean equation? No clue.
The answer is that programming is hard, no matter what language you do it in. You can build in cool features into the language (this makes Perl much easier to use than C for things like chomping on text), but most people have a hard time trying to figure out how to use cool features in a GUI, let alone cool features their programs are invoking with parameters that aren’t decided until run-time.
HTML is easy because it’s not a programming language. You can’t program in it.
Scheme perhaps comes closest to the ideal of a programming language where you don’t have to think about the language, but programming in Scheme isn’t that much easier than programming in, say, C.
This stuff does get easier after you spend a few years on it.
These are the sort of responses I was afraid of (i.e. a situation where people insist that “never the twain shall meet”, meaning the programming world w/the non-programming world. To correct possible misconceptions, there actually are people who fall somewhere between abstract mindsets and bimbo’s. You see, I do have some programming in my background even if it was 20 years ago, at which time I took courses in Basic & Cobol. So even from that experience, I know that there were many aspects of Basic that were just a different way of skinning the Cobol cat. Furthermore, I later had on-the-job experience “programming” via macros a system of forms within WordPerfect with a sortable index. Each form could be invoked by macro. And throughout several jobs I taught myself various word-processing and data-entry software on-the-job with no prior training.
Why am I saying all this? Only to explain that I’m not so wet behind the ears as not to have learned that many word-processors and languages have, on the one hand, ALOT of overlap, yet on the other hand, some provide those same features in a more intutive way or else they have unique features which aren’t offered elsewhere (although they could have been). It takes TRUE GENIOUS to combine geek-abilities WITH clarification-abilities.
I’d be very surprised if there weren’t alot of overlap, not to mention variations in intuitiveness, between many of the programming languages presently offered. I read what you all had to say, but I wonder what someone like Joe Barta would say (if he had time to read this). Or for that matter, any “humane-geek”, that is, a geek who believes in empowering the average person.
BTW, imo, one of the worst traits of America, is its nuturing of compassionless competitiveness. It might not be a bad idea for some of those Big Brains out there to consider that perhaps they’re so “brilliant” because they have healthier blood flow to their brains. Others are not so fortunate, and have more sluggish blood-flow, making it more difficult to concentrate despite their best efforts.
By using the term “intuitive” I didn’t mean that languages should necessarily be complete English statements. Rather, here’s an example of what I mean:
The following loop is more intuitive than the one below it:
Intuitive:
DO 10 TIMES
skd fjsklf jslkf sklfjlsjflsd;
Less-Intuitive:
FOR XXX = 1 TO 10
kslf ksljdflks flks;jflk;slkjd
NEXT XXX
(i.e. I didn’t say “PERFORM THE FOLLOWING 10 TIMES”, rather I said “DO 10 TIMES”)
So, is it truly impossible for someone to create an entire language which is intuitive, & includes the best of all the worlds insofar as capabilities?
I don’t know if it is impossible, but I certainly think it is impractical. As has been mentioned before, intuitiveness is a trade off with flexibility. Your example will suffice to demonstrate how it starts to fall apart in a hurry:
DO 10 TIMES
statement X;
What if I write
DO 10 TIMES
statement X;
statement Y;
statement Z;
How do I know what the loop applies to? Does it always apply to one statement only? (inflexible.) Does it rely on the indentation of the line? (Maybe intuitive, but harder for the computer to deal with and harder for me to keep track of.) It’s much more precise if we allow delimiters to tell us what the loop applies to.
DO 10 TIMES until ENDLOOP
statement X;
statement Y;
ENDLOOP
statement Z
How do you make this intuitive? What if you want to break out of the loop conditionally? Everything that you can think of that adds a flexibility requirement will remove some of the intuitive nature of the language. Every consideration made for intuitiveness will hurt flexibility. This is why all the ‘intuitive’ 4GLs that came along that swore they would put programmers out of business have not lived up to the hype - they simply can’t do all the things you can do with a real programming language, so they are consigned to simple tasks that can be handled by their restricted syntax.
Of course, peoples brains do work differently as well. Some people just cannot think logically. This is not necessarily a bad thing - many of my friends are this way to one extent or another. However, it does mean that no matter how intuitive a language is they will not get it.
Programming languages like BASIC and some other HLL’s provide facilities like this. The problem is, the more “intuitive” it looks, the more contrained it is. Consider your loop,
DO 10 TIMES
stuff;
and the standard C for-loop, also used in Perl, Java and some other stuff:
for (int i = 0; i < 10; i++) {
stuff;
}
Both of these do the same thing. However, the second is more versatile. i is the index value, and it can start anywhere (not just at zero) meaning you can use it as an index for an array. To accomplish the same with a DO X TIMES loop, you’d have to perform some mathematical conversion inside the loop each time. i++ is the incrimentor; it incriments the value of i by one. Likewise, you could use i–, i+=2, and any other number of things. The middle parameter is the conditional, which stops the loop when it’s false. By seperating the continuation conditional from the loop declaration, you have greater control over when the loop ends. (i.e., the loop could end when some other variable, say, j, reaches a certain value.)
The point is that because computer languages are abstract, it makes them more versatile. It may not make sense in English, but it’s not supposed to. And I think you’ll find that if you study programming languages long enough, things like
[quote]
-Several graduates I recently interviewed didn’t know what a Stack or a Linked List were. I asked them to define recursion. Never heard of it. Re-entrant code? What’s that? How about a simple Boolean equation? No clue. - Sam Stone
[quote]
It may not be his fault (but that doesn’t help you any). Some colleges offer “accellerated” programs that basically skip a lot of stuff. Even in more lengthy programs, poor textbooks and other materials (and students who can’t figure out how to do assignments using them) can take up lots of the instructor’s time, causing them to skip subjects: they want to pace the class so that most of the people at least pass. I know what a stack is; the others I’m not so sure. I may have heard/used them referred to by different terms.
And jally, it does get easier. I’ve been taking classes for about two years part-time now, and I can see similar features in C++, Java, VJ++ and VBasic. - MC
Again I read your further responses, & again I maintain that programming should be more intuitive (MUCH more so than the i++ sample cited above). As an analogy, the English language is quite illogical, but unfortunately is so entrenched as the dominant culture that it won’t change so quickly.
On the other hand, I can easily envision that if just one billionaire would advertise a contest offering, say, even $1 million each, to the Top-5 technerds [voted for by the public] who create a versatile, flexible, eclectic & above all, intuitive programming language, then all of the above-cited considerations wouldn’t stop many geniouses out there from taking on the challenge, especially in view of the publicity they’d get.
I know (from having interacted with many tech-support people) that people with certain mindsets can get so steeped in an abstract, cryptic morass, that they truly get to think it’s user-friendly, even though it isn’t. Similar to the idea of olfactory nerves becoming desensitized to ughy smells, or people getting acclimatized to illogical English, or members of a cult becoming indoctrinated to various cults’ distorted logic.
Now, once again returning to that i++ example, can someone please state, in clear, simple, language, a few of the possible things needing to be accomplished with such command? Then I might try giving it a shot in a more intuitive way. No guarantees. Then, again, for $1-million, who knows? Maybe someone else can come up with something.
Sorry, I thought my examples were clear. The C-style for-loop looks more abstract than the type of loop you mentioned (DO X TIMES) because the individual pieces of it are completely seperate. This means it’s possible to manipulate it any way you want. Consider the following example (in Perl):
for ($i = 0; $i < 10; $i++) {
print "$i
";
}
This loop simply prints out the value of $i, which goes from zero to nine (because it stops when $i is no longer less than ten, per the conditional.) and a new line. So what? You can do the same thing with a DO X TIMES loop.
But, suppose you want to count from zero to one hundred, but only print even numbers. Well, here you go:
for ($i = 0; $i < 101; $i+=2) {
print "$i
";
}
To accomplish this with a DO X TIMES loop, we would need to add more complexity into the loop itself. Consider a BASIC-style FOR loop, which is close to the DO X TIMES loop:
FOR X = 0 TO 100
IF INT(X/2) = X/2 THEN PRINT X
NEXT
In this, we have to test whether X is even or odd by dividing it by two and seeing if it has a remainder. This is also less efficient; half of the loop cycles are wasted.
The important thing to remember is that computer languages are not designed to be like English, which is extraordinarily flexible and infinately complex. What seperates intelligent minds from machines are abilities like pattern-recognition, concept application, interpolation, and intuition. All of these play a part in language. They can be modeled mathematically, but never perfectly. Computers are just mathematical machines, and as such, are designed to solve specific problems. In order for them to do that, though, there needs to be a simple (yes it is SIMPLE (So simple, in fact, that many people reject the concepts because they aren’t complicated enough)), abstract method of communicating with them, so we can tell them what to do. The thing is, many programming languages ARE EXTREMELY INTUITIVE…but only in the context of the problems they are designed to solve. How would you describe a recursive function in English? It’s difficult, but easy as pie in C or Perl. This is because computers are made to do things like recursive functions, whereas people are not. Until someone invents an inherently non-mathematical computer (which is essentially a contradiction) or figures out how to accurately model human communication (AI mixed with a touch of chaos theory?) interface languages that are intuitive in a “social” context not only WON’T, but CAN’T exist.
Ach sod it! I like the fact that I can do it and lots of people can’t! It gets me big bucks and a superior attitude. In fact, make the damn languages even more cryptic, keep them pesky kids away from it…they might just unmask C++ as the old caretaker and then where will we be?
jally - While I agree with the others that programming is a long way off from being actually intuitive, you may want to take a look at AppleScript, the language thats the closest I’ve seen to being intuitive. It was designed as a scripting language for controlling other programs, and does a fine job at that, but its also a decent general purpose language (with the caveat that its slow) and one which I’d say is a good introductory language. The syntax is very englishy, there are a good number of synonyms (e.g. I can say “if X <> 7”, “if X isn’t 7”, “if X doesn’t equal 7”), and type conversion is easy.
Of course, its not going to be totally intuitive, but its sure a lot closer than C or Perl.
For the example above (IIRC; i haven’t used it in about 3 years):
repeat with i from 0 to 100 by 2 {
print i
}
There are certainly programming languages out there that approach what you’re asking for… on some level. As someone pointed out earlier, one man’s intuition is another man’s obfuscation.
I suggest you take a look at scripting languages such as AppleScript. This is about as intuitive as I’ve seen, though I’m sure there are others. Bear in mind that these languages will have a lot of restrictions on the kinds of activities that a programmer can do.
One of the reasons that there are so many different computer languages is that many have their individual specialties. Lisp is better at certain kinds of activities than Perl, which is better at certain kinds of activities than Pascal, which is better at certain kinds of activities than Java, which is better at certain kinds of activities than assembly, which is better at certain kinds of activities than Lisp…
The essential thing to realize however, and this has been said here already, too, is that command of the language does not necessarily a programmer make. Think of it this way, most children master the fundamentals of the English language fairly early on. It takes another level of competance in the language to read a book and comprehend the literal meaning. It takes another level of competance still to understand the figurative meaning of an advanced book. It takes yet another level of competance to be able to write such a book that will entertain, inform, and generally appeal to a large population of readers… The understanding of the basic mechanics of the English language are only a small subset of the tools that an effective writer must use.
Having said all that, it’s not rocket science. I think nearly anyone can learn to program, though it takes practice and experience to get good at it. The trick is to start small, learn the fundamentals, and build your skills incrementally. You have to learn to think different (No, this is not a Macintosh commercial). The kind of logical tools you use to be an effective programmer are not the same as the logic tools you use to live your daily life. If you’re looking for a computer language that will take you instantly from being a non programmer to a master programmer… well, that’s just not going to happen.