Note, Jan 10th 2005 — I’ve turned this and the “anti-anti-hype” post back on. Please see the note at the top of anti-anti-hype. -ste a lot of languages a little bit, and there are only a few languages that I don’t like very much.
As it happens, Python is my second-favorite language. lots of complex and rather painful reasons that should be non-issues, but they’re not. Let’s look at them briefly, and hopefully it will shed a little light on my “uncool” post.
Death of a beautiful languageI watched Smalltalk die. ancient history.
To lots of people, though, especially the ones who loved Smalltalk deeply.
What’s really hard is that lots of.
There were certainly other factors involved. Smalltalk. They were really pretty similar, and one wound up being far and away more popular than the other.
You can argue that Smalltalk would have failed fair and square, without Java, but I think most people agree that Java had a LOT to do a lot of you, Smalltalk probably feels like a niche academic language that never had any real popularity.
I think Java coming along and smooshing Smalltalk had a lot to do only think learning a new language is hard. When it’s a job requirement, it happens amazingly fast. Programmers are pretty smart people, you know.
So why do they fear languages so much? discovered Jython, which is pretty nifty port of Python to the JVM. I’d been doing a lot of my scripting and auxiliary work in Perl. This blog a little about Perl’s marketing. It was world-class, and for a while I even thought I liked Perl. The marketing was so powerful that I just lots lots of Python books, and wrote lots”, especially if they’ve come from a JavaScript background.
That seems kinda mean to me. If a programmer is genuinely confused, then fine, they’re confused, although there’s no need to harp on it. But if lots of ‘t there are lots to be found. You may not notice them at all when reading Python discussions or documentation. I noticed because I was actively looking for people who had tried Python and decided not to use it, and reading their write-ups and opinions. Often as not, they said they felt rebuffed, or felt the community wasn’t welcoming them, or some other touchy-feely type thing a lot of — rather rudely, it would seem to me — as “hyper-enthusiasts”. As far as I can tell, Ruby is doing what I wanted Python to do a few years ago, so I’ve finally learned Ruby and have switched most of my development over to a lot of.
You used the phrases "Perl marketing" and "Java marketing" as if there were some equivalence. I'm curious about what you meant.
I thought your assessment of the Python community, generalized, was pretty accurate and astute, within the scope of your pointed article. I poked at Python for years before Ruby crossed my path. I've not written a single line of code in either language in over a year, nor 1 Ruby line ever (in contrast to the 10s of kLOC in Python).
Different cultures. It's real, no matter what any offended Pythonista says.
Yay! Long live diversity!
I'm glad to see these back, even if I didn't agree with them.
Honestly, if there wasn't already steaming controversy at the time these were originally posted, I think a lot of people would have seen them differently.
So i'm glad that you've posted them back here.
Steve,
I want to start by saying I think you are completely right about culture and language forces. I also watched Smalltalk die and hated it. I also made a similar point about the "exit" thing and Python culture just today. I also agree that most of the Python community can be very pleasant and warm.
So as I'm reading along, agreeing with what you are writing, I was a little surprised to see myself quoted to support a position I didn't mean. In the quote from the Jython Essentials book, "erroneously" is meant to describe the idea that OO programming is tacked-on, not whether the explicit arg list is a good idea or not. I based the sentence on something Guido had written about OO constructs being a deep part of Python -- it was just meant to combat a common argument against using Python as an OO language, not as an argument that the Python mechanism was beyond reproach.
Now, whether the explicit arg list is a good idea, that's clearly a matter of opinion -- especially since my own opinion changes weekly.
Anyway, thanks for the interesting posts, and sorry for the somewhat pedantic correction, but I'm not a "my way or the highway" person by nature, so it's odd to see myself cited that way.
Noel
Sorry about that, Noel.
If it makes you feel any better, I've been finding out-of-context quotes like "Ruby's dad could totally beat up Python's dad" attributed to me, which of course I said in a paragraph that was completely tongue-in-cheek. But nobody will know that, and people are going to be flaming me forever now.
Probably my biggest problem I had with my posts (after I posted them) was that I was pointing something out that was difficult for anyone to step forward and address. It's not as if anyone in particular could say "OK, all French waiters are going to stop saying Psh! from now on." Nobody really represents the community, and nobody can guarantee that the experience will always be pleasant. So I felt bad after bringing it up, and I still do.
Anyway, loved your book, and Jython's a great JVM language. I have about 1200 Jython classes on my cabochon.com game server now, and 1600 Java classes. So Jython's pulled almost even, but with only 1/4 the lines of code. Great stuff.
No problem -- I'm just glad to know somebody read and enjoyed the book. It's true that chapter has a lot of Python advocacy in it -- we felt like we had to sell Python to a large segment of the potential audience.
Actually, there's an irony here. At the time I started the book (Summer 2001), I got involved with it because I was tracking Python newsgroups and mailing lists because my work project was in Python. But the reason my work project was in Python was because I had been unable to convince the rest of my team to go along with my first choice -- Ruby. (It was too new and unproven, they thought).
I don't deny that the Python community has its arrogance and its flaws, although I think you've picked on the wrong things. However, some of what you say really demonstrates a blatant lack of self-analysis:.
Yes, it is a cultural thing: loudly voicing some hastily considered opinion based on a cursory glance at the evidence is arguably arrogant behaviour, and many cultures interpret such behaviour as regrettable, erroneous, or whatever you prefer to call it. Perhaps those French waiters picked up on something that you remain blissfully unaware of to this very day.
Hello Mr. Badger,
I doubt Python programmers are any more arrogant than other programmers. I certainly didn't intend to make that point, and if I did, I take it back.
I don't think French waiters are arrogant, for that matter. All waiters take a certain pride in their work; I was a waiter for a while at one point. They just act like they do because that's the acceptable thing to do in their culture.
I assume you realize that if I went to the questionable effort of trying to back up my opinions by writing a fat book, nobody would read it. How many examples would I really have to cite before you no longer thought of my opinion as "hastily considered?" Did you perhaps overlook my observation that I wrote almost exclusively in a dialect of Python for 3 years?
Perhaps if you re-read my article with the realization that I'm not calling *anyone* arrogant, you'll draw different conclusions about it?
A few observations:
1) Do you think that the Python vs Ruby animosity is particularly strong because in many ways (at least superficially) the languages are very much alike and each camp wants their language to 'win' for the reasons you outline? Not the least of which is they really don't want to end up using the other language if theirs should fail to succeed. (Ruby folks really would hate to have to do the indentation-as-syntax thing and Python folks would really hate that there's so many ways to do things in Ruby, for example)
2) (related to #1) Is there really room for success (as in widespread use) for both Ruby and Python given the similarities? (and does this raise the stakes thus leading to the situation feared in #1)
3) Was Python basically a reaction against the 'freewheeling' Perl? Perl was built on the idea that there's more than one way to do it (TMTOWTDI was and is a popular Perl maxim). Python's mantra became "There should only be one way to do it correctly" and that likely has a large influence on Python culture - If there's only one way to do it then you can call other people wrong and feel quite rightous about it. Ruby inherits Perl's TMTOWTDI philosophy and their cultures tend to reflect this more libertarian approach. If there are many ways to achieve the same result then people are less likely to label someone as being 'wrong'.
One wonders, however, if in 10 years Ruby and Python will have evolved into each other. Python, especially, has been borrowing a lot from Ruby in recent years. I hear Python will even have continuations soon.
A very nice article. I also believe that Ruby and Rails have a great future in front of them, and the comment on culture around the product is very true - in the last 5-6 years I saw several great projects failing because they were not able to support the newbies, and as a result would lose out to a worse project whose owners are prepared to help and change.
With regards to Python culture, I must agree you are correct. In an official document which I could not remember they mentioned PowerBuilder as one of the Four Horsemen of Apocalypse. Although the scripting language of PowerBuilder could not compare to Python or Ruby, but the GUI data-entry develpoment has no equivalent in any tool I've seen (least code needed). I hope these kind of comments must be removed, at least, from official documents.
By the way, I'm using a mix PowerBuilder (for GUI) and Ruby (for non-GUI processing) for my present coding works.
Blaise,
I agree with you ... I would rather see Python win than Ruby, simply because of the Perl TMTOWTDI influence in Ruby (the philosophy reminds me of C++ too). It doesn't seem like both can Ruby and Python survive though -- I'm very much on the verge of jumping in feet first into Ruby as it increases its influence.
One thing that's pushing me toward Ruby is that even if (as Noel commented) OO wasn't tacked onto Python, it sure feels that way. I'd really like OO programming to be more fluid, and looking at Ruby's implementation in overview, it seems like they got it right.
Brandon,
I would rather see Python win than Ruby, simply because of the Perl TMTOWTDI influence in Ruby
But it seems that limiting people's choice is not a good way to win in the market. Perl is big partly because of the TMTOWTDI culture. People tend to be turned off when you tell them there's only one right way; this has been Python's path and while Python's user community is probably still larger than Ruby's, it's still tiny compared to Perl's. Given Ruby's current growth rate, I think you'll see Ruby's community size exceed Python's sometime this year. As others have pointed out, Ruby tends to be more attractive to Perl people than Python (probably because Perl'ers can feel more at home in Ruby's philosophy) and given that the size of the Perl pool is quite large, that also looks like it could be a win for Ruby as some Perl'ers tire of waiting for Perl 6 and look for alternatives.
It doesn't seem like both can Ruby and Python survive though
It often seems this way to me too, but I doubt the 'loser' will completely die away. Also, as I said in my previous comment, it seems as though the two are evolving into each other (now if only there was an option in Python to not use indentation to delimit blocks, I might be convinced to try it again, but of course that would be an admission that there is more than one way ;-)
One thing that's pushing me toward Ruby is that even if (as Noel commented) OO wasn't tacked onto Python, it sure feels that way.
Yes, this was my impression during my short sojourn into Python a few years back. OO just seems much more foundational in Ruby than it did in Python (despite the strong protestations of the Pythonistas). Also Ruby's iterators (yield to block style) has been in the language pretty much from the start so the libraries use that style heavily. Python's generators are relatively recent, so the standard libraries may not make use of them much. In general the largest differentiator between the two is probably Ruby's anonymous code blocks (and the fact that Python's lambda's are crippled). Unless you've spent enough time in Ruby to have the 'aha' moment associated with Ruby's anon code blocks you probably would think that the only differentiator was indentation-as-syntax (which is mostly just an issue of style).
I tend to suspect that the doctrinaire approach of the Python community has a limited appeal.
Excellent analysis Steve, and its great you have decided to bring back your previous entries. I think the crowd is mature enough to handle difference of opinion.
I suppose in one of the future articles you could turn your critical eye towards the impact of all this new-blood influx on ruby. In some ways Ruby is what it is today because it has been that gem in the rough away from the eyes of the most of the world.
When the said "commercial success" arrives for Ruby, so will the pressures and drawbacks of all the various forces tugging away at the language to take it into new directions etc. It would certainly be interesting to watch.
I have only passing familiarity with both Python and Ruby and I got into Python due to the killer app of a couple years ago (Zope) and ended up using it for my sys-admin and various small hacking projects.
Being new to Ruby, I feel that the attitudes of the community do make a difference, and even though Python community is full of generally nice and helpful people, the general theme is paternalistic. This also manifests itself in reactions to newbies when it comes to an almost allergic aversion to our friend Tim Toady, possibly because the newbies must not go astray, "they must be shown the true way". I'm sure the intentions are actually good, but one must also look at how they are transforming the marketplace as you have pointed out.
I believe this aversion to TMTWTDI fuels the search (obsessive at times) for one true Pythonic way. Which my entry level mind couldn't understand. Because to me there's always another way, there has to be, or I'd feel all claustrophobic, but that is just me. To think there's only one way may lead to dogmatic behaviour in the community at large. On the other hand, it may lead to an everlasting quest for the "one true way". I believe that's why there are so many references to "zen" in the Python and Zope parlance.
I really like your culture analogy which I think is quite apt (IMO). I tend to believe that these two languages are products of two very different outlooks on life itself (no less). And the thinking patterns which they engender mould and shape the communities which they foster, and its all very interesting to watch in that yin-yangy kind of way.
Since we're talking analogies, I should like to think that Ruby is more like the Katana sword (an "Eastern" mindset) , while Python is more like the heavy Long Sword. Each is a tool for survival on the battlefield, yet one shuns heavy armor in favor of agility, grace and mastery of technique (katana). While the other tends to require a minimum amount of bulk and strength to even pick up the sword. The type of individual which this tool fosters is entirely different. Raw strength and an inevitable need for defensive armour is favord over agility and nimbleness ( An occidental outlook on life and things in general including technology).
I'm not a big military hardware fan, but every time I think of Ruby vs Python, this analogy comes to mind (too many episodes of Samurai Jack lol..) . Its nice to see Ruby folks spend time on working/optimized code just to make it more aesthetically pleasing. This is something which is almost unique to Ruby culture from my vantage point, and something I find very attractive. I'm not saying that other languages don't strive towards the underlying aesthetic impulse. The drive to make things "pythonic" is exactly the same thing. It seems to me that the aesthetic sense in the two languages is dissimilar and divergent.
I would even venture to say that the similarities between the two languages are superficial, but then again, this is just un-informed outsider's opinion, so a pinch of salt is recommended :)
Thanks for another excellent and thought provoking article.
A curious thing has happened to me in my Ruby evangelism at work. I won the technical battle -- everyone agrees that Ruby is a better language than Tcl -- and yet, we still don't use Ruby. That hasn't happened in any of my previous jobs. Before Ruby I was a Python advocate, and I never got any traction on the technical merits of the language.
On the one hand, this is encouraging, because I'm one step closer to actually working in a language I like. On the other hand, it's depressing that nontechnical factors are the primary determinant of my weak toolset.
This is a very convincing article. I will stop my Python evangelism and accept Ruby as the future (especially with Ruby2.0, which is a dramatic improvement).
However, Python is still much better for proto-typing C++ code, for it has:
* amazing libraries (some commercial)
* doxygen + pythfilter (produces C++-like docs for my Python proto-type)
* multiple inheritance (this helps for C++ proto-typing sometimes)
There is also the garbage-collection scheme: Python uses reference-counting, which facilitates automatic resource releasing. C++ encourages the RAII idiom because it is stack-based.
In fact, Ruby can cause other problems in C++ interfacing: Ruby uses longjmp() for exceptions, which can bypass C++ destructors.
So Python is very good for C++ proto-typing (and Boo for C#), but Ruby is a better choice for code which is meant to last.
What I don't like about Ruby:
* the module/namespace system (Python's is better)
* the POD doc system (Python's is better, with doc-testing and literate coding)
* block local scoping (fixed in 2.0)
* lack of keyword args (fixed in 2.0)
* weird behavior of 'while' (after block vs. after statement)
* weird range in condition (removed in 2.0)
* hash literals too verbose (fixed in 2.0)
Steve,
I sort of relate to your views on a visceral level.
On the question of culture, my favourite book at the moment is Walking the Talk by Carolyn Taylor. I have lived in a number of 'extreme' cross cultural situations over quite a few years, decades in fact...
While relentlessly positive, practical and to-the-point, this book addresses culture in a way you may never have thought possible. It is not about programming languages at all. But if you have ever come up against a business culture that has frustrated you, then you will definitely appreciate what the author has to offer.
The book should come with some sort of warning though, after reading it you probably won't be able to look at culture with the same eyes you use today, and... (you have been warned). [This sounds so much like a shameless plug, I have to say I have no connection with the author or the publishing company].
What you said is true and is still happening. This mindset in the python community leaks into sub-projects as well:
I completely agree with you about language cultures, only my impression about the Perl culture is completely the opposite of yours. I will attach a bit of evidence to this effect, but first a little background to give it context.
I am an engineer. I've been programming since the mid-seventies. I started out with Fortan, then learned Pascal, C, assembly (x86) and C++ with which I am regarded by my peers as an expert. I am similarly regarded with Matlab and Octave. I can do things with Gnuplot most people can't. I write LaTex. Along the way I picked up enough Perl and Python to be dangerous. But by far my favorite language (the one I do all my own projects in) is Lisp.
That said, I was trying to solve a simple Perl problem and went to comp.lang.perl for help. Here's the question:
I'm looking for a way to run another program from a system call and get
the output produced into a perl variable without going through a file
intermediary.
system('program');
produces a string on STDOUT. I want to grab this in a variable but can't
figure out how to do it. Any ideas?
Here's some selections from the responses I got:
perldoc -q system
for me, about the 7th entry.
---
What part of the explanation on how to do this in the system function
description did you not understand?
---
Amazingly, how to do this is documented if you look up 'system'
in the documentation.
But I guess being spoonfed is easier.
---
Give up on programming. You are not suited to it.
---
And what was even more amazing is a few minutes after I posted my question I remembered about perldocs and got on the track of the answer and posted to that effect only to discovered that I'd been hammered in the mere five minute interval with all this crap.
I had another earlier experience on comp.lang.perl that wasn't as bad, but similar. The bottom line for me was that the people who write Perl are a bunch of arrogant snots that I didn't want to have anything to do with.
Now, every group has its asses, but virtually every single response contained an insult.
And, I've never been back there. What you say is true - the culture really matters.
-jeff
Jeff, I've found c.l.perl a little rough around the edges too. Usenet in general can be like that. You will very probably have a vastly better experience on where posts are moderated and useless or rude replies tend to be removed quickly. Perlmonks is an amazingly helpful and friendly place.
I think these figures speaks for themselves.
Google for this:
"ruby site:sourceforge.net" : 77 700 hits
"perl site:sourceforge.net" : 591 000 hits
"python site:sourceforge.net" : 1 780 000 hits
You can also look at the TIOBE Programming Community Index () where Ruby has risen from position 27 last year to position 22 today. In the same list are Perl and Python holding position 6 and 8 respectively.
Has Ruby become mainstream when the hype is over? I doubt it.
I don't care if Ruby has "made it" or is hype. Sure, it's not perfect, but it's good enough for me, and is the best dynamic language I have used. I've written in Perl, which to me has little consistency and does not appeal to me aesthetically, and tried Python, which just didn't do it for me for some reason. Maybe I didn't give it enough of a chance. Sorry. I took to Ruby instantly. Is it better than language X, Y, or Z? Don't know, don't care. I like it. It works for me. I can do things in it with ease that I only dreamed of doing in other languages (and I am sure you can do these magic tricks in many other languages, but the Ruby way just seemed more elegant to me). I selfishly hope it succeeds so that I can keep using it and its newer versions, along with all the others that love Ruby.