The problem is, they said that about big business, until Enron and friends collapsed. By then it was too late.
The Internet is in a dangerously similar position: it's so free at present that even normal laws agreed in almost all jurisdictions effectively don't apply, and the results range from irritations like spam e-mails, through disruption from viruses, to serious harm via phishing, electronic fraud, and several more "up-and-coming" crimes.
The major problem with the Internet is the fact that you can do things effectively anonymously. With anonymity comes lack of accountability, and with that comes the cessation of any effective rule of law whatsoever. (I realise that a lot of people may now bleat about all the damage that would be done by losing that anonymity, and probably 1/5 of them will be making a valid point rather than just parroting.)
But the simple fact is that with freedom must come responsibility, always. I believe in as much freedom as possible, up to the point where the individual's freedom is harmful to society as a whole, but if you're going to say what you like, you have to expect to be held accountable for what you say. (/me inserts standard "shouting 'Fire!' in crowded theatre illustration.)
Well, I'll be... There is someone in the world who's even more of a B5 nut than me! Sorry, I got the Minbari half of the reference but missed the Prometheus bit entirely. Time to go watch In The Beginning again.;-)
That model was always the odd one out. Most of the human ships and technologies in B5 are remarkably credible for a SF series; rumour has it the guys designing the Star Fury model talked to some guys from NASA about how they'd design such a ship for real, for example. But who in their right mind would design a carrier ship where the main egress for the small craft was right at the front, where all the incoming fire is going?
They'll be putting the bridge of a starship right on top, next to the hull with pretty lights saying "Shoot here!", next... <sigh>
My original point was that extracting code into procedures should be a heuristic rule, a second-nature of a good programmer, and that branches are an excellent starting point. Polymorphism was introduced in OO languages based on similar premises.
Indeed, and now inheritance and polymorphism are probably the most over-used programming language features on the planet.
I'm not saying you're wrong to try to isolate self-contained and independent blocks of code -- you're not -- I'm just saying that it's not always possible, even when you look at "obvious" dividers like branches or loop bodies.
Different branches of an if statement are, by definition, logically separate.
You'd better hope not. If you're branching down two paths that have no logical connection, you almost certainly have a design error!
The key thing when factoring out code into procedures is whether you can isolate a complete and self-contained idea, so that it makes sense without context. If you happen to be implementing a complex algorithm with lots of nested conditionals, but none of the branches makes sense without the context of the other conditions, then you absolutely shouldn't factor out all the branches; that just creates a maze of functions where you have to keep jumping from randomly-isolated function to meaningless function just to see what the algorithm is doing.
This is something I encounter several times a week, though I realise that I'm working with more complex algorithms than many at present. I'm frequently told that I (and presumably therefore everyone else in my department too) "just don't understand" what functional decomposition is about, or words to that effect. I've been told this by at least one person on the ISO C++ standards committee, for a start.
However, given the collective experience with programming in general and complex algorithms in particular embodied in the department, and the fact that everyone there writes these complex algorithms as single functions even if they involve 100+ lines, such a claim tells me more about how qualified the speaker was to express any opinion at all than anything else. Often, you later find that they think quicksort is a complicated algorithm, and can't think of any uses for more powerful flow control constructs in languages.
Splitting code into procedures provides an opportunity to invent meaningful names and write documentation.
Ah, but the clue is in the question: if you can't think of a meaningful name for a block in isolation, then perhaps that block shouldn't be read in isolation in the first place.
I can read just fine, thanks. I'm aware of the official line about the different naming; I just happen to disagree with it. If you feel that holding a different viewpoint merits moderating some down "until they learn to RTFM" then I'm very sorry for you.
They are going to support CSS3; I don't know where this "if they were going to" crap comes from, since a significant chunk of CSS3 already is supported.
It's an "if" until it's supported. There is no prejudice implied; it's simply a factual qualifier.
Here's a hint: Mozilla does many many things that CSS3 does not. That's not embrace and extend at all; that phrase refers to ruining existing standards by bloating them out, pretending that things which aren't part of them are, and confusing the end-user as to the nature of the standard. Netscape used to participate in things like this, but hasn't in a long, long time.
Aside from the fact that the above is irrelevant -- we are, after all, talking about a point that is already listed in the standards -- other companies (notably Microsoft) have frequently been attacked for exactly the same behaviour. Indeed, Microsoft's actions around IE3/4 time were, for a long time, the textbook example of "embrace and extend" for many of their critics, despite the fact that others claimed they were simply adding features that were ahead of their time.
The thing is, Mozilla extensions are free. If I want to tweak an extension a bit, make a personalised version for my own use, I can do that.
The thing is, that isn't really the thing at all. How many people, in the entire world, do you think have ever written/tweaked an extension for Firefox? Do you think it's 1% of the market? 0.01%? 0.0001%? Do you think losing these people make any difference at all to Microsoft's strategy?
The reality, harsh as it may be to some people, is that if Microsoft implemented major features like tabbed browsing and pop-up blocking, and beefed up security, then the vast majority of users would no longer have any reason to switch to Firefox.
If you mean they all have an algol-like syntax, then you're correct. However I don't know what you mean by "sugar for common control structures".
I mean something that highlights the logical structure of what's going on. The most trivial example is probably picking out sequential vs. iterative vs. conditional logic in algorithms. Of course you can do these things in LISP, via cond and such, but there's no particular emphasis on them; they just look like any other bit of LISP. I realise that this is necessary in a language that prides itself on simple-but-flexible syntax, and indeed that a lot of LISPers would argue that it's an advantage, but experience suggests that most programmers prefer something a bit more explicit.
Consider, for example, the loop example shown here (scroll down a page or so). While the Scheme code shown has power and a certain elegance, the same algorithm could have been written significantly more clearly and concisely in a language that provides syntactic sugar for list manipulation and pattern matching.
Apparently, you haven't really used Lisp, or you'd know that most things that are in standard libraries are handled internally by the language.
I don't know what you think counts as "most things that are in standard libraries", so I'm going to guess that you're talking about the minimalist approach taken by, say, C. I'm talking about the behemoth that is Java's standard library, or a rather more powerful approach like Perl's CPAN. Certainly something like Java's standard library is no demonstration of exemplary design, but the point is that for real tasks, it's often Good Enough(TM).
Also you'd know that you'd know that lisp provides hooks to use foriegn language libraries just like pretty much every other language.
Sure. And I also know that in the real world, you usually want imported libraries from other languages to be the fall-back if you really need it and not the primary means of increasing functionality. It's almost invariably a hassle to set it up compared to using something that fits in with your native language.
Name control structure that doesn't exist in Lisp.
It's hard not to give a loaded answer to that involving loops and side-effects. My point wasn't that you can't do it, my point was that doing it is "nothing special". You might argue that this is an advantage, and for skilled LISPers you may well be right; I'm talking about average programmers working on typical projects.
Flexible-but-underpowered is why almost no-one writes new applications in C any more.
And with that statement, you lost all credibility.
I take it you disagree, then? Obviously I'm only one data point, but I live and work in a very high-tech area, and both I and quite a few of my friends are professional software developers. Lots of us use C++, quite a few use Java, many of us using $SCRIPTING_LANGUAGE_OF_CHOICE either for utiliities or for web work, but I don't know anyone who's working in C any more, aside from a couple of specialist embedded projects.
Can you name a few major development projects that have been started in, say, the last five years, that use C for reasons other than being tied to it by compiler availability on the target platforms? Do you think there are anything like as many as there are in, say, Java, C++, or Visual Basic?
But if the standard is actually a draft and subject to change, how can they possibly implement it and guarantee compatibility?
They can't, but at least they'll be encouraging web developers to use the standard notation, so that those pages will work in any browsers that do implement the final standard later (probably including the next version of their own).
In the meantime, their functionality might not be complete, but then whose will be if the standard isn't finished yet? This is the way software works with any standard, and always has been. The alternative is, effectively, proffering a competing standard at just the time it's most destructive to do so.
It is proof enough that Windows XP comes with an "auto-update" program so that its users can download and fix vulnerabilities as Microsoft gets around to them.
(So does Firefox, for exactly the same reason.)
Outright lie:
If you didn't run Internet Explorer, you wouldn't be seeing any pop-up ads at all.
(As a Firefox user, I can dispute that from immediate personal experience.)
I know it's become a joke to suggest Lisp, but those that laugh have never used Lisp.
(oh (yes (we (have))))
LISP has a lot going for it, but it also has a lot against it. The most popular programming languages in general use today have a lot of things in common with each other and not with LISP, starting with providing syntactic sugar for various common control structures and vast libraries. Sure, you *could* define your own control structures in LISP and write your own libraries, but why bother when you can just use a tool that saves you the trouble? Flexible-but-underpowered is why almost no-one writes new applications in C any more.
One library might use RTTI, while another might be working on a KISS base class. Another library may be throwing all kind of exception shit. One library may be using std::except, the other might be throwing ints. Or worse, the library implementor may have not read the 3 lb. "The C++ Programming Language" (try fitting that in a PDF), and is using catch (...) {throw runtime_except()} instead of just 'throw', obliterating any exceptions that you're trying to throw through it.
So in other words, if you don't RTFM so you know what exceptions the libraries you use might throw and/or you make kindergarten errors in your fundamental design, things break. No kidding.
In any case, you're completely misunderstanding the point of the zero-overhead principle, and your arguments are therefore pretty much irrelevant to what the grandparent post said.
A template is compiled separately for every single type it's instantiated with, right?
Simplistically, yes. But, for example, it's common to implement specialisations such that all pointer types use the same code (based around a void* and casting internally), thus gaining all the advantages of type safety and code reuse, but without the bloat. The same concept could be applied in other contexts as well, though I'm not aware of any mainstream development that uses it so at present.
I just don't think there are _any_ good solutions for writing large, portable, comprehensible, etc. programs.
Sad, but almost certainly true.
As I've said in these parts before, C++ should have been superceded for all areas of programming a very long time ago. The fact that it hasn't is a pretty damning indictment of the software development community as a whole, a reflection of how little "new" languages like Java or C# have really added, and an insight into how productive many theoretically sounder languages beloved of academics are out in the real world.
Blockquoth the AC (it's funny how the smart-asses so often are):
Sorry, it's you that needs the reality check. Adding more programmers to a late project just makes it later.
Nice try, but I've read Brooks. I'm also an experienced programmer and project manager, not that you really need to be particularly experienced with either to analyse the type of extension that's popular with Firefox and what it would take to implement equivalent functionality for another product.
The key features are usually a minor project that one or two people working independently could achieve in a short space of time. (That is, after all, how most of the Firefox extensions are written.) It wouldn't take a lot of resources for a company like Microsoft to task a few of the IE dev team to writing these extension-like modules and hook them in.
This was mentioned in another thread the other day. No major browser currently renders the "image" correctly. Firefox is close, but still has significant bugs/unsupported features in this area.
First quit stuffing this proprietary crap down my throat, at least have the decency to put it under the GPL.
Erm... You're free to use an alternative if you want.
Second, please don't default load to the msn page, WTF, google.com would be much nicer.
As opposed to Firefox, which just irritatingly changes your home page back to the Firefox home page by default every time it auto-updates, unless you remember to uncheck a box on one of the wizard-y dialogs?
Third, could you actually put something in there to block ads and popups, and any other crap that I don't want on my screen. Al least temporairly. Eg NO AD.DOUBBLECLICK.NET !!!!!
Like Firefox, except when the pop-up blocker doesn't work, you mean?
Fifth, could you actually make it work with java?????.... no I mean the real java from Sun. And the same with the "real" javascript too now that I'm thinking about it.
Of course. Now if you could just fix Firefox to support ActiveX from trusted sources, so it's actually usable with the vast majority of corporate intranets, that would be lovely.
Oh, I've worked it out now. You were just trolling. My bad.
Even if IE implements everything that the basic Firefox installation has and then some, they still won't have the strong community of extension developers that Mozilla does.
Sorry, but you desperately need a reality check. You are talking about probably the largest and most successful software company in the world. If the management wanted to, they could probably divert/recruit sufficient resources to implement every single popular extension to Firefox in IE, within a matter of weeks. The fact that they haven't (at least, not yet) says more about the business case they see for it than their ability to do it.
This is why competition is good: Microsoft are now losing market share, which means there is a business case for them to improve their product to compete. They will aim to do so in what they believe is the most efficient way to get users back, whether that is security, improved CSS support, ad-blocking or whatever.
If they were actually going to support the proposed standard, surely anything other than naming it in the standard way is embrace-and-extend (or, in this case, embrace-and-rename)!
Just look at Ruby, a completely object-based language.
Mistake number one...
You can do thinks like "Hello World".length, or -113.abs.
And how is this an advantage over
length "Hello World"
or even
strlen("Hello World")
in real life? Do you often find yourself taking the length of a string literal in real code anyway?
I mean mucking around with pointers is something that can be fun, but it definitely doesn't have the beauty you need for doing real work.
It does, however, have the practicality you need for a lot of real work. I write C++ code that works with complex graph-like data structures for a living, and we use pointers all the time. Expressing the same structures, with the same fine control of data size (which matters when your graphs can easily have millions of nodes) would be more difficult in languages that obscure the concept.
And [Ruby] is even clean at that.
OK, I confess: I've looked into Ruby seriously twice, and found it awkward and unnatural both times. I've programmed a lot of different languages in my time, from assembler and C to C++ and Java to Perl and Python to OCaml and Haskell. I've never seen a language that tries as hard to force the programmer into its mindset, rather than trying to provide tools for the programmer to express their intent, as Ruby does.
An expertly designed and elegant C++ program with all the proper abstractions, frameworks, and methodologies that 1% of software developers can comprehend quickly, or a C program with a flat set of files, simple structs, and a few shell scripts to build it, which everyone understands (and can even debug)?
That's a slightly loaded question, don't you think?;-)
Any high-level design tools are a double-edged sword. When used well, they allow you to express designs more simply and clearly. When used poorly, they simply add another layer of complication onto whatever you had anyway. You can do this in any language that offers such tools.
FWIW, I've found that often the languages where you couldn't write obfuscated code if you really wanted to also lack the power to express clean designs cleanly as well. IMHO, this is one of the biggest problems with C++'s "successors" C# and, particularly, Java.
<Devil's advocate> The question is how much of that would actually be a bad thing. </Devil's advocate>
The problem is, they said that about big business, until Enron and friends collapsed. By then it was too late.
The Internet is in a dangerously similar position: it's so free at present that even normal laws agreed in almost all jurisdictions effectively don't apply, and the results range from irritations like spam e-mails, through disruption from viruses, to serious harm via phishing, electronic fraud, and several more "up-and-coming" crimes.
The major problem with the Internet is the fact that you can do things effectively anonymously. With anonymity comes lack of accountability, and with that comes the cessation of any effective rule of law whatsoever. (I realise that a lot of people may now bleat about all the damage that would be done by losing that anonymity, and probably 1/5 of them will be making a valid point rather than just parroting.)
But the simple fact is that with freedom must come responsibility, always. I believe in as much freedom as possible, up to the point where the individual's freedom is harmful to society as a whole, but if you're going to say what you like, you have to expect to be held accountable for what you say. (/me inserts standard "shouting 'Fire!' in crowded theatre illustration.)
Well, I'll be... There is someone in the world who's even more of a B5 nut than me! Sorry, I got the Minbari half of the reference but missed the Prometheus bit entirely. Time to go watch In The Beginning again. ;-)
Way O/T, but what the heck...
That model was always the odd one out. Most of the human ships and technologies in B5 are remarkably credible for a SF series; rumour has it the guys designing the Star Fury model talked to some guys from NASA about how they'd design such a ship for real, for example. But who in their right mind would design a carrier ship where the main egress for the small craft was right at the front, where all the incoming fire is going?
They'll be putting the bridge of a starship right on top, next to the hull with pretty lights saying "Shoot here!", next... <sigh>
Nah. Goa'uld, sure. Asgard, maybe. But I'm pretty sure Minbari is a different series.
Indeed, and now inheritance and polymorphism are probably the most over-used programming language features on the planet.
I'm not saying you're wrong to try to isolate self-contained and independent blocks of code -- you're not -- I'm just saying that it's not always possible, even when you look at "obvious" dividers like branches or loop bodies.
You'd better hope not. If you're branching down two paths that have no logical connection, you almost certainly have a design error!
The key thing when factoring out code into procedures is whether you can isolate a complete and self-contained idea, so that it makes sense without context. If you happen to be implementing a complex algorithm with lots of nested conditionals, but none of the branches makes sense without the context of the other conditions, then you absolutely shouldn't factor out all the branches; that just creates a maze of functions where you have to keep jumping from randomly-isolated function to meaningless function just to see what the algorithm is doing.
This is something I encounter several times a week, though I realise that I'm working with more complex algorithms than many at present. I'm frequently told that I (and presumably therefore everyone else in my department too) "just don't understand" what functional decomposition is about, or words to that effect. I've been told this by at least one person on the ISO C++ standards committee, for a start.
However, given the collective experience with programming in general and complex algorithms in particular embodied in the department, and the fact that everyone there writes these complex algorithms as single functions even if they involve 100+ lines, such a claim tells me more about how qualified the speaker was to express any opinion at all than anything else. Often, you later find that they think quicksort is a complicated algorithm, and can't think of any uses for more powerful flow control constructs in languages.
Ah, but the clue is in the question: if you can't think of a meaningful name for a block in isolation, then perhaps that block shouldn't be read in isolation in the first place.
I can read just fine, thanks. I'm aware of the official line about the different naming; I just happen to disagree with it. If you feel that holding a different viewpoint merits moderating some down "until they learn to RTFM" then I'm very sorry for you.
It's an "if" until it's supported. There is no prejudice implied; it's simply a factual qualifier.
Aside from the fact that the above is irrelevant -- we are, after all, talking about a point that is already listed in the standards -- other companies (notably Microsoft) have frequently been attacked for exactly the same behaviour. Indeed, Microsoft's actions around IE3/4 time were, for a long time, the textbook example of "embrace and extend" for many of their critics, despite the fact that others claimed they were simply adding features that were ahead of their time.
The thing is, that isn't really the thing at all. How many people, in the entire world, do you think have ever written/tweaked an extension for Firefox? Do you think it's 1% of the market? 0.01%? 0.0001%? Do you think losing these people make any difference at all to Microsoft's strategy?
The reality, harsh as it may be to some people, is that if Microsoft implemented major features like tabbed browsing and pop-up blocking, and beefed up security, then the vast majority of users would no longer have any reason to switch to Firefox.
I mean something that highlights the logical structure of what's going on. The most trivial example is probably picking out sequential vs. iterative vs. conditional logic in algorithms. Of course you can do these things in LISP, via cond and such, but there's no particular emphasis on them; they just look like any other bit of LISP. I realise that this is necessary in a language that prides itself on simple-but-flexible syntax, and indeed that a lot of LISPers would argue that it's an advantage, but experience suggests that most programmers prefer something a bit more explicit.
Consider, for example, the loop example shown here (scroll down a page or so). While the Scheme code shown has power and a certain elegance, the same algorithm could have been written significantly more clearly and concisely in a language that provides syntactic sugar for list manipulation and pattern matching.
I don't know what you think counts as "most things that are in standard libraries", so I'm going to guess that you're talking about the minimalist approach taken by, say, C. I'm talking about the behemoth that is Java's standard library, or a rather more powerful approach like Perl's CPAN. Certainly something like Java's standard library is no demonstration of exemplary design, but the point is that for real tasks, it's often Good Enough(TM).
Sure. And I also know that in the real world, you usually want imported libraries from other languages to be the fall-back if you really need it and not the primary means of increasing functionality. It's almost invariably a hassle to set it up compared to using something that fits in with your native language.
It's hard not to give a loaded answer to that involving loops and side-effects. My point wasn't that you can't do it, my point was that doing it is "nothing special". You might argue that this is an advantage, and for skilled LISPers you may well be right; I'm talking about average programmers working on typical projects.
I take it you disagree, then? Obviously I'm only one data point, but I live and work in a very high-tech area, and both I and quite a few of my friends are professional software developers. Lots of us use C++, quite a few use Java, many of us using $SCRIPTING_LANGUAGE_OF_CHOICE either for utiliities or for web work, but I don't know anyone who's working in C any more, aside from a couple of specialist embedded projects.
Can you name a few major development projects that have been started in, say, the last five years, that use C for reasons other than being tied to it by compiler availability on the target platforms? Do you think there are anything like as many as there are in, say, Java, C++, or Visual Basic?
They can't, but at least they'll be encouraging web developers to use the standard notation, so that those pages will work in any browsers that do implement the final standard later (probably including the next version of their own).
In the meantime, their functionality might not be complete, but then whose will be if the standard isn't finished yet? This is the way software works with any standard, and always has been. The alternative is, effectively, proffering a competing standard at just the time it's most destructive to do so.
Misleading:
It is proof enough that Windows XP comes with an "auto-update" program so that its users can download and fix vulnerabilities as Microsoft gets around to them.
(So does Firefox, for exactly the same reason.)
Outright lie:
If you didn't run Internet Explorer, you wouldn't be seeing any pop-up ads at all.
(As a Firefox user, I can dispute that from immediate personal experience.)
(oh (yes (we (have))))
LISP has a lot going for it, but it also has a lot against it. The most popular programming languages in general use today have a lot of things in common with each other and not with LISP, starting with providing syntactic sugar for various common control structures and vast libraries. Sure, you *could* define your own control structures in LISP and write your own libraries, but why bother when you can just use a tool that saves you the trouble? Flexible-but-underpowered is why almost no-one writes new applications in C any more.
So in other words, if you don't RTFM so you know what exceptions the libraries you use might throw and/or you make kindergarten errors in your fundamental design, things break. No kidding.
In any case, you're completely misunderstanding the point of the zero-overhead principle, and your arguments are therefore pretty much irrelevant to what the grandparent post said.
Simplistically, yes. But, for example, it's common to implement specialisations such that all pointer types use the same code (based around a void* and casting internally), thus gaining all the advantages of type safety and code reuse, but without the bloat. The same concept could be applied in other contexts as well, though I'm not aware of any mainstream development that uses it so at present.
Sad, but almost certainly true.
As I've said in these parts before, C++ should have been superceded for all areas of programming a very long time ago. The fact that it hasn't is a pretty damning indictment of the software development community as a whole, a reflection of how little "new" languages like Java or C# have really added, and an insight into how productive many theoretically sounder languages beloved of academics are out in the real world.
OK, I'll play. Let's stick to current, reasonably popular operating systems to make things easier. Which do you think are written in C?
Blockquoth the AC (it's funny how the smart-asses so often are):
Nice try, but I've read Brooks. I'm also an experienced programmer and project manager, not that you really need to be particularly experienced with either to analyse the type of extension that's popular with Firefox and what it would take to implement equivalent functionality for another product.
The key features are usually a minor project that one or two people working independently could achieve in a short space of time. (That is, after all, how most of the Firefox extensions are written.) It wouldn't take a lot of resources for a company like Microsoft to task a few of the IE dev team to writing these extension-like modules and hook them in.
This was mentioned in another thread the other day. No major browser currently renders the "image" correctly. Firefox is close, but still has significant bugs/unsupported features in this area.
Erm... You're free to use an alternative if you want.
As opposed to Firefox, which just irritatingly changes your home page back to the Firefox home page by default every time it auto-updates, unless you remember to uncheck a box on one of the wizard-y dialogs?
Like Firefox, except when the pop-up blocker doesn't work, you mean?
Of course. Now if you could just fix Firefox to support ActiveX from trusted sources, so it's actually usable with the vast majority of corporate intranets, that would be lovely.
Oh, I've worked it out now. You were just trolling. My bad.
For future reference, pages like that would be more impressive if they weren't misleading in many places and outright lying in some...
Sorry, but you desperately need a reality check. You are talking about probably the largest and most successful software company in the world. If the management wanted to, they could probably divert/recruit sufficient resources to implement every single popular extension to Firefox in IE, within a matter of weeks. The fact that they haven't (at least, not yet) says more about the business case they see for it than their ability to do it.
This is why competition is good: Microsoft are now losing market share, which means there is a business case for them to improve their product to compete. They will aim to do so in what they believe is the most efficient way to get users back, whether that is security, improved CSS support, ad-blocking or whatever.
If they were actually going to support the proposed standard, surely anything other than naming it in the standard way is embrace-and-extend (or, in this case, embrace-and-rename)!
Mistake number one...
And how is this an advantage over
or evenin real life? Do you often find yourself taking the length of a string literal in real code anyway?It does, however, have the practicality you need for a lot of real work. I write C++ code that works with complex graph-like data structures for a living, and we use pointers all the time. Expressing the same structures, with the same fine control of data size (which matters when your graphs can easily have millions of nodes) would be more difficult in languages that obscure the concept.
OK, I confess: I've looked into Ruby seriously twice, and found it awkward and unnatural both times. I've programmed a lot of different languages in my time, from assembler and C to C++ and Java to Perl and Python to OCaml and Haskell. I've never seen a language that tries as hard to force the programmer into its mindset, rather than trying to provide tools for the programmer to express their intent, as Ruby does.
That's a slightly loaded question, don't you think? ;-)
Any high-level design tools are a double-edged sword. When used well, they allow you to express designs more simply and clearly. When used poorly, they simply add another layer of complication onto whatever you had anyway. You can do this in any language that offers such tools.
FWIW, I've found that often the languages where you couldn't write obfuscated code if you really wanted to also lack the power to express clean designs cleanly as well. IMHO, this is one of the biggest problems with C++'s "successors" C# and, particularly, Java.