Stack OverflowWhat are five things you hate about your favorite language?
[+405] [187] brian d foy
[2008-11-11 22:14:43]
[ language-agnostic programming-languages interview-questions ]

This question exists because it has historical significance, but it is not considered a good, on-topic question for this site, so please do not use it as evidence that you can ask similar questions here.

More info:

There's been a cluster of Perl-hate on Stack Overflow lately, so I thought I'd bring my " Five things you hate about your favorite language [1]" question to Stack Overflow. Take your favorite language and tell me five things you hate about it. Those might be things that just annoy you, admitted design flaws, recognized performance problems, or any other category. You just have to hate it, and it has to be your favorite language.

Don't compare it to another language, and don't talk about languages that you already hate. Don't talk about the things you like in your favorite language. I just want to hear the things that you hate but tolerate so you can use all of the other stuff, and I want to hear it about the language you wished other people would use.

I ask this whenever someone tries to push their favorite language on me, and sometimes as an interview question. If someone can't find five things to hate about his favorite tool, he doesn't know it well enough to either advocate it or pull in the big dollars using it. He hasn't used it in enough different situations to fully explore it. He's advocating it as a culture or religion, which means that if I don't choose his favorite technology, I'm wrong.

I don't care that much which language you use. Don't want to use a particular language? Then don't. You go through due diligence to make an informed choice and still don't use it? Fine. Sometimes the right answer is "You have a strong programming team with good practices and a lot of experience in Bar. Changing to Foo would be stupid."

This is a good question for code reviews too. People who really know a codebase will have all sorts of suggestions for it, and those who don't know it so well have non-specific complaints. I ask things like "If you could start over on this project, what would you do differently?" In this fantasy land, users and programmers get to complain about anything and everything they don't like. "I want a better interface", "I want to separate the model from the view", "I'd use this module instead of this other one", "I'd rename this set of methods", or whatever they really don't like about the current situation. That's how I get a handle on how much a particular developer knows about the codebase. It's also a clue about how much of the programmer's ego is tied up in what he's telling me.

Hate isn't the only dimension of figuring out how much people know, but I've found it to be a pretty good one. The things that they hate also give me a clue how well they are thinking about the subject.

(11) This is a really nice spin on the old "your favorite language" question. Good justification. - Tom Leys
(14) I find it interesting that despite SO having a large .NET audience, at the time of this writing there are 24 answers, only one of which (mine) is about .NET or a .NET language. I have no idea what this says about SO or .NET, but it's interesting... - Jon Skeet
(20) Btw I think every language deserves its own hate page in SO :) - utku_karatas
(6) Maybe people hate everything except C#? :) - Dmitri Nesteruk
(2) Wow, there is a massive love-hate thing going on with Javascript - Mike Robinson
(22) The first 15 years of programming with C/C++, I hated (in alphabetical order): 1. Pointers 2. Pointers 3. Pointers 4. Pointers 5. Pointers - ileon
(4) I wonder how many comments people made about hating their language of choice because they didn't understand how to program in their language of choice.... - Kris.Mitchell
Many people make comments showing they don't know their favorite language. That's one of the beautiful things about this question: it quickly shows how much you've thought and learned without having to ask something specific. - brian d foy
(1) its funny that when i ask a question about how to use a GUI, people get upset that it is not programming related, whereas when you have something like this, people cant wait to share their 2c - I__
(3) This is a fantastic question. If you're wondering what some language is like, reading 3 different replies about it on this page would be easily the best useful-information-for-time-spent you could find. Also a great way to gauge a programmer's experience (and humility) levels if you already know the language. - j_random_hacker
@Andrew: The thing I don't like about lolcode is that your comment doesn't compile in it. Shows a lack of vision on the part of the authors… - Donal Fellows
(1) Well, the question certainly provokes a response, if not a real answer. Five things... why five? Anyway, I agree that inability to find a defect in one's favourite language can indeed show one's lack of knowledge of the tool. When I first read the title, I thought: "Right, I may dislike something in Delphi, but why hate?" But after I read the point mentioned I could see its validity: my knowledge of Delphi is really incomplete, quite incomplete. And yet when I have started hating something in my favourite language, I wonder how long I will be allowing myself to call it my favourite... - Andriy M
(3) I voted to reopen this. It's got 404 up-votes, and answers with loads of up-votes. Doesn't that mean that the community values it? Why is this being moved to deletion? - David Heffernan
[+745] [2008-11-11 22:43:29] MusiGenesis


Add more in the comments if you've got 'em.

(13) Lol! He did not mention programming languages ;-). - Gamecat
(3) I find English inconsistency not really inconsistent which in the end makes English a non-inconsistent language. - Trap
(1) I probably should have said "Inconsistent spelling/pronunciation". - MusiGenesis
(103) It lacks a good syntax-checking compiler. - Tom Leys
(3) +1 for originality - Ken Gentle
(5) @Tom: it's got 400 million syntax-checking compilers. That would have been #5, but mentioning Canada seemed snarkier. - MusiGenesis
(6) @MusiGenesis, yeah, but none of the conform to the standard - Adam Rosenfield
(87) I before E Except after C, or when sounding like A like in neighbor and weigh, unless it's weird. Or science. - Dean
English spelling is weird because a lot of the words are borrowed from other languages - geometrikal
Re: #4 - aren't "it" and "they" non-gender-specific pronouns? Someone once told me that English has two neuter genders (whereas most [European] languages have one), although they never explained how... - alastairs
(3) @alastairs: "it" is a non-gender-specific pronoun, but it's kind of impolite to use it to refer to a person. "They" is a non-gender-specific plural pronoun that technically isn't correctly used for an individual. "he/she" is just a drag to type over and over again. - MusiGenesis
(2) A book I read in college (Woman on the Edge of Time) got me to try and push the use of "per" (short for person) instead of him or her. Then I actually started dating. - MusiGenesis
(7) @MusiGenesis, I like point 5. However, I have to disagree. Most of the compilers don't syntax check on compilation but instead raise errors at runtime. Most don't even raise errors, they just execute the bad code unpredictably. Don't get me started on the lack of error-checking in the transmission. - Tom Leys
(1) "lack of error checking" - "What?" - "I said: 'lack of error checking'" - "Huh?" - "I said: 'lack of error checking'" - "What?" - MusiGenesis
(5) @Tom: good point, actually. Any game of "telephone" illustrates your point perfectly. - MusiGenesis
(1) Well played MusiGenesis, well played - cole
(5) Also, English lacks a second-person plural pronoun, instead forcing the speaker to say "you guys", "you all", or "y'all". - Nik Reiman
(5) @sqook: I'm a former yankee transplanted to Louisiana, and I've come to love "y'all" and possibly the only second-person plural-plural (or is it second-people plural?) in any language: "all-y'all". - MusiGenesis
(1) @spook, Southern Standard English has the word yall as a second-person plural pronoun. Other dialects borrow this word or try to replace it with other constructions like "You people" - epochwolf
(12) Evangelists of the language often have poor proficiency in the language. - James Schek
(3) Highly customizable - e.g. every noun can be verbed. Poor interoperability - e.g. embrace/extend/extinguish, native speakers tend to be monoglots. - jamesh
(4) I like the monoglot comment, but that's not really the fault of the language. When you have guns, you don't need to learn a new language. :) - MusiGenesis
(6) thus, Disadvantage: relatively high coupling with gun ownership - Jimmy
I'd put that one up there, but I'm afraid of gun owners. :) - MusiGenesis
(1) I always get pissed off that English doesn't use Chinese characters like Japanese and Korean (and Vietnamese I suppose). - Ziggy
(2) @Ziggy: think how that one would look on the list: "Doesn't use Chinese characters like Japanese and Korean". Sure you want that up there? :) - MusiGenesis
(7) You don't use English, you use American. "English" speakers don't spell colour and centre, wrong, and don't call officers "loo-tenants". - Roddy
(56) English actually does have a second person plural pronoun: "you". 200+ y. ago, the English started using "you" as a respectful "thou" imitating French "vous". Soon they treated everyone respectfully. Then forgot about "thou", so "you" became the only word for both second persons. - Joe Pineda
(2) The same is happening in Latin America: Spanish here lost "vosotros" (familiar "you"), our friends we might call "tu" alone, yet altogether they always deserve respect. Portuguese lost both "tu" (thou) and "vos" (familiar you). So in Brazil people always address each other in the respect form. - Joe Pineda
(80) I disgree abot the lackof eror checkng. English, like all human lnagaugse, is higly redndnt/compresble, therfore it contans plnty of err chekng. - Jeffrey L Whitledge
(2) @Jeffrey: I wish I could upvote a comment! But then that's only true of polysyllabic languages written in alphabetic scripts, or any language in ideographic scripts. Try omitting a vowel writing Mandarin in pinyin, or avoiding a letter in a Semitic scripture, and you destroy the word! - Joe Pineda
(14) Subject/object ambiguity: "Tom put Bill's suitcase in his car." Whose car is the suitcase in? - Dour High Arch
(6) #5 Shared with Canada <- the rest of us says this about you Americans. :P - Phillip Whelan
(2) @Philip: are you saying Canadians aren't Americans? :) - MusiGenesis
(3) 'She's said 'Bob's Bobs "own worst enemy."' -- Both Bobs need apostrophes, 'Bob's Bob's "own worst enemy"', unless Bob's the worst enemy of all Bobs, in which case 'Bob's Bobs' "own worst enemy."' - Windows programmer
Correct, and corrected. Amazing how so many apostrophes camouflage the one that isn't there. - MusiGenesis
(4) "English doesn't use Chinese characters like Japanese and Korean" is a better example of ambiguity. - ysth
(5) buffalo^n is a grammatically correct sentence (see - drhorrible
@Dean, I'm late with this, but here goes: I before E except after C when sounding as S (without an S), or when sounding like A as in neighbor and weigh, unless it's really, really weird. At least that how I was taught it. - dragonjujo
(4) Verb conjugation is a totally useless pain the butt which afflicts all the Romance languages. I am, he is, you are? Simpler: I be, he be, you be. Chinese got it right by leaving that out. - Eric Johnson
(1) @Eric: ever try to learn Esperanto? I did, but it didn't bring the chicks running, as I expected. :) - MusiGenesis
Second-person plural pronoun: don't forget "yinz" if you're in Pittsburgh! - Daniel Dickison
(4) What's wrong with not having a formal second person pronoun? Why should the pope get any more respect than my dog? - Zifre
(3) About the second person plural pronoun, you are all in error. English DOES have a second person plural pronoun: "you". What it lacks is a second person SINGULAR pronoun. - Peter Wone
(9) we should just lump she/he/it into a new word for a none-gender specific pronoun. I propose: shheeit - yx
@yx: that is some funny shheeit right there. :) - MusiGenesis
(2) Another bullet to add: No formal standard, and conflicting ad-hoc implementations. (US English vs. UK English is only the tip of the iceberg) - Christoffer
(8) @jamesh: Here's a perfect example of that - "I helped my uncle Jack off a horse" vs "I helped my uncle jack off a horse". With a lack of syntax checking the primary communication method of the above statements (verbal) can result in the same outcome (disgust) - Slace
(50) Backwards-Compatibility requirements of old libraries has stalled progress on the language's evolution. - too much php
(4) "Shared with Canada" - Pah; cheeky. We shared our language with you a few hundred years back, and look what happened then. -- A Brit, with his tongue planted firmly in his cheek. - Andrew Ferrier
@Andrew: you guys didn't share it - we took it. And you guys stole it from the Neanderthals in the first place. -- A TheUnitedStatesian, with his tongue somewhere. :) - MusiGenesis
(1) It is very easy to write but TERRIBLY HARD to speak (at least for me, I'm spaniard) - Konamiman
Lack of standardisation when adding new accepted vocabulary. Words are 'words' when they been popularised. - rockacola
Hahahhahahah, best answer on this entire website! English is full of "Configuration over Convention". What about vowels, which make different sounds based on context (An idiotic feature of all ASCII languages). - orokusaki
(9) So it's like PHP? - Mike Robinson
From orokusaki: "Use of loose pronunciation conventions in lieu of diacritical marks ("o" sounds like "oh" when followed by a consonant followed by a vowel but not when followed by only a consonant... except in the word "oh", et al) " - MusiGenesis
(2) Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo. - Corey D
(1) 'its' is always incorrect. - Robert Davis
Of course it has syntax-checkers. Some of them even run in the background without the need to activate them. I think this kind of syntax checker is called "grammar nazi". Better checkers exist, though. scnr - Meinersbur
(2) English is a language, American is an accent. - Paul McKenzie
(3) Since losing "you vs thou," English has not had a GOOD way to distinguish second person plural from singular. Fortunately, we in the Southern US created "y'all" for the plural form. (The Midwestern "yous" is also acceptable.) Let's not let snobbery limit our grammatical possibilities. - Nathan Long
(1) If you are finding swear words worn out then I suggest you increase your sweary vocabulary: - Colonel Sponsz
(1) Words like "colour" and its crippled American brother "color". Or alternatively: Words like "color" and its "what the hell is that growth on its face?" brother, "colour". Depending on your inclination. - Ryan Bigg
(2) English pronounciation just follows the Perl mantra of 'many ways to do it'. - Notice for example this alternate way of spelling fish - using the [f] from cough, the [i] from women and the [sh] from station: Ghoti. - Thomas Ahle
(2) There is a non-gender-specific 3rd person pronoun: one. For too many examples see Ayn Rand's "Anthem". @Nathan Long: "Y'all" is the singular form. The plural form is "all y'all". - Chris Wuestefeld
In Northern Ireland, Dublin, and parts of Scotland, "youse" is used as a second-person plural. In the Irish midlands, "ye" is more common. As with "y'all" (and "you" itself), the plural form "ye" is occasionally used as a singular. This seems to be a common pattern in English. - TRiG
(1) @TRiG: that's interesting about "youse". In the New York - New Jersey area, "youse" is commonly used (yoused?), but usually by Italians (I think). - MusiGenesis
@Chris - "All y'all"? Y'all is "you all." I support useful contractions, but not redundancy. Southerners have a useful language feature - let's not ruin it. - Nathan Long
(1) All your base are belong to us. - icelava
@Nathan: Chris has it right...depending on who are you talking to. :) see Y'all might have derived from "you all", but it can indicate singular or a subset. "All Y'alls" is the more complete plural, where you indicate that yes, indeed, you do mean to include everyone. - Robert P
@RobertP, except I've heard that "All Y'alls" is pretty specific to Tennessee :) - zanlok
English is the one language to rule them all! - muntoo
[+216] [2008-11-13 13:38:32] Jeremiah Peschka

Wow, I'm surprised that SQL hasn't made it up here yet. Guess that means nobody loves it :)

...And a few bonus reasons to hate it, at no extra charge

(5) +1 for poor string handling. - BoltBait
(7) Maybe nobody can learn to love it until they stop thinking of it as a language. :) - Alan Moore
(4) +1 for everything. And yet people wonder why I'll put up with the headaches of ORM... - James Schek
For the record, all I do for a living is write SQL :) - Jeremiah Peschka
Apparently, we need an open-standard SQL parser that DB vendors can plug in and merely be responsible for the backend data retrieval... - Tanktalus
(2) @Alan M...isn't that what the L stands for? :) - Kev
@Kev I thought it stood for Legume. - Jeremiah Peschka
(29) I can't understand why the syntax for INSERT is so different from UPDATE. And MERGE is incomprehensible. - LaJmOn
Poor support for text manipulation? - Dalin Seivewright
(1) @Dalin in comparison with, say C# or Ruby, SQL's text manipulation is god awful, especially when you take regex text replacement into account. - Jeremiah Peschka
(1) SQL isn't a shining example of language design, but many constraints are imposed on the architecture by query optimisation and the mechanical component to database operations. SSDs notwithstanding, database development is more or less unique in that SQL is a declarative language controlling operations with a mechanical component - disk heads moving and rotational latency. Not subject to Moore's law.… - ConcernedOfTunbridgeWells
I am a huge fan of SQL, but I hate the fact it lacks Regex or any other advanced string manipulationoptions. - TimothyAWiseman
My general feeling about string manipulation and SQL is “do it in something else if you can, almost anything will do”. If only no queries ever required it… - Donal Fellows
LOVE your bits about checking NULL and not being able to GROUP by an alias! Seriously. The compiler can't internally translate " [!]= NULL" into [NOT ]IS NULL" ?? - eidylon
I can't write SELECT col1, col2, col3, col4, col5, from - xenoterracide
@All "SQL sucks for string manipulation" commenters: In some legacy code of my company there is a scripting language implemented entirely in T-SQL (SQL Server 2000), I once had to modify it.. that was... interesting. - Earlz
+1 for IS NULL ... - David Božjak
(3) The necessity of IS NULL should be clear, if you consider that NULL is a third possible result, right after TRUE and FALSE. Since it's meaning is "unknown" you can not tell if something which is unknown matches another thing which is unknown as well. Another example: if NULL equals NULL this would mean that the whole concept of making JOINs would be impossible, since any NULL value could be matched to another NULL value. If you understand this (what also is called ternary logic) than you might understand the reason for introducing the "IS" operator for testing against NULL. - Vash
(1) Vash is right. Another (easier to digest?) way of putting it: if you made NULL = NULL, then you don't remove weirdness from the language, you just push it into other, even more inconvenient places. - j_random_hacker
(1) +1 for missing WHERE clause havoc. Thank $deity for ROLLBACK; - al
I'm not sure if it's the language, implementation, or the users but it's always undercommented. At least some places in some implementations it will delete the comments anyway. I'm looking at you MS views, some clown always opens it in design mode sooner or later. - dwidel
[+183] [2008-11-24 16:04:07] Zarkonnen [ACCEPTED]

Five things I hate about Java:

I know, I should check out Scala.

Do you have any idea to make Java's NPE contain information about what is null? - grayger
@grayger I wish I had some kind of idea, but I don't. It's admittedly not a trivial problem, as the thing that may be null may not be assigned to any variable. - Zarkonnen
(7) @both: The NPE is shown in the first line of the stack trance. It contains ( most of the time ) class,java file name, and line number like: "at your.faulty.code.Instance( )" Then you just open that file, go to that line and there it is, a variable which has nothing assigned to it. - OscarRyz
(35) @Oscar Reyes - Er, we know that. But there may be multiple variables on that line, and the exception message doesn't tell me which one is null. - Zarkonnen
I was about to say scala as I was reading this. We're learning it as part of a course. Amazing stuff. - Ape-inago
(10) Scala has its warts too. However, it is magnificently better than Java. - wheaties
@Zarkonnen : yeah, but when you know the line, a simple debug can tell you the incriminated variable - Valentin Rocher
(2) @Bishiboosh Yes, if you can replicate the problem, and it's on your own machine so you can attach a debugger, and it's not in a loop that goes around 10000 times... - Zarkonnen
(10) +1 for the proliferation of frameworks etc. - ammoQ
(6) @Valentin, just imagine the fun of the NullPointerException being in a gigantic logfile from a nightly run and you need to figure out what happened... Debugging is not an option. - Thorbjørn Ravn Andersen
If you use Eclipse (or anything similar), you can set a breakpoint at the line, then set breakpoint properties to only stop when the variables are false - otherwise it would continue on. In other words, conditional breaks. - nevets1219
you always trade one evil against another - Chris
type inference... meh. - Longpoke
@grayger, write your code so there is only one candidate in each source line - i.e. one array index - [..] - or one period - - in each line. Then there is no doubt which one caused the NPE. - Thorbjørn Ravn Andersen
@Thorbjørn Ravn Andersen So my method (with 5 parameters) call should be on 5 lines? :p - Jeriho
@Jeriho, naturally not as all your parameters are already calculated and placed in local variables. - Thorbjørn Ravn Andersen
(1) @Thorbjørn Ravn Andersen, I disagree strongly: adding extra variables just to hold a value that's used once add a lot of mental overhead for the reader and make the code more verbose. (Obviously, it's OK to convert code to do this temporarily as a debugging technique.) - Zarkonnen
@Zarkonnen, "conversion of code temporarily as a debugging technique" does not help much when you need to find an issue in production which cannot be reproduced, and you are not allowed to change the code. Feel free to disagree, and come back when you've had the 3 AM call... - Thorbjørn Ravn Andersen
@Thorbjørn Ravn Andersen: "Not allowed to change the code"? I'd run away. Quickly. - configurator
@configurator, we are talking production code here, and the issue happens in production. I don't know about you, but we are simply not allowed to change code in production which has undergone acceptance test etc. - Thorbjørn Ravn Andersen
@Thorbjørn Ravn Andersen: Okay, that makes a bit more sense :) I think you should be allowed to change production code to add logging if that's the only change you make, but I'm not sure how that would be accepted in most places. - configurator
@configurator, in a true emergency anything goes, but then comes the question why the log statements were not in the code in the first place, and why you need to insert them to find out which candidate on the source line were the culprit. In other words, the defensive coding I started mentioning. - Thorbjørn Ravn Andersen
Some Java hate... :) - muntoo
[+160] [2008-11-12 00:26:19] jTresidder


  1. It's fugly

  2. All the coolest things are insanely complex, but then, all the coolness is also wrapped up in such a small amount of code that you feel stupid for struggling to follow it

  3. '+' is an absurd choice of operator for concatenation in a weakly-typed language. Were they trying to scare off the noobs?

  4. It's a cross-browser compatibility minefield (never mind if it's even turned on or not)

  5. It's generally untrusted - associated with scummery such as blocking the back button, pop-ups that never die, etc.

  6. Did I mention that it's fugly?

  7. It's nearly impossible to debug because there are only a few different error messages and a few different types (Number, String, Object, etc.)

If it wasn't for jQuery, I'd probably still hate it as much as I used to :)

I wonder how many total programmer hours have been spent on trying to disable the back button. Has to be millions and millions, if not billions. - MusiGenesis
(17) indeed, jQuery totally fixed my hate for javascript (as soon as you get the chaining part that is). - Pim Jager
(1) Javascript is indeed the fugliest language... except for all those others. - JoeBloggs
It appears we need to work on natural language programming again for the sake of beauty! - Albert
(178) -1, this list is not about the language but the browser environment. Javascript itself rocks - Mauricio Scheffer
(15) I agree with mausch. ECMAscript in and of itself is a beautiful and powerful language. It's the pesky browsers (:cough: IE) that muddle its name. - tj111
...and here I was thinking beauty was subjective :) - jTresidder
(32) @Mausch: where does javascript live in the vast majority of cases? You're saying the equivalent of "cars don't contribute to global warming, it's driving cars that does it" - true, of course, but missing the point - what else do you do with a car? - jTresidder
(1) I would like an argument for #3. In some cases it makes perfect sense (to me) for numbers and strings to share a similar operator that does something different to each. For example, Python has "2*2" for 4 and "'yes'*2" for "yesyes". Same operator, different meaning. I think this makes perfect sense. - Chris Lutz
(20) @Chris: Yes, "+" is a good operator for concatenation in a strongly typed language (like Python). In a weakly typed language (like Javascript or C) it is terrible; it decides (silently!) that 'sum: '+2+3 is not 'sum: 5' but 'sum: 23'. Someone with more Javascript experience can give better examples. - ShreevatsaR
(1) I agree with #3. - grayger
(1) So your problem is not the use of + to be addition and concatenation, but the absurd contextual rules that the language uses to determine which one to do? - Chris Lutz
(4) Undeclared identifiers are global variables. Eeek! - Martijn
(2) @ShreevatsaR: C is weakly typed? - Blindy
(1) Fugly? Really? - eyelidlessness
(2) @shreevatsaR: since when is C a weakly typed language? oO - knittl
(3) The beauty of javascript is it keeps me employed - Mike Robinson
(2) JQuery is fugly. JQuery code looks like somebody who likes to eat a lot of brackets got sick. - Pekka
(5) Yes, C is weakly typed, compared to, say, Python (e.g. you can assign integers to chars, cast anything to anything via void* pointers, etc.) It is statically typed instead of dynamically typed, and also requires explicit typing instead of type inference, but those are unrelated to strong v/s weak typing. [Random examples: Python has implicit dynamic strong typing, Haskell has (optionally explicit) static strong typing, Java has explicit (mostly static) strong typing, C has explicit static (relatively weak) typing.] "Strongly typed" and "weakly typed" are actually not well-defined. - ShreevatsaR
I never want to have 'max' returned as a value. - graham.reeds
(2) @ShreevatsaR: C is strongly & statically typed. Maybe you need a beginner's textbook. - Viet
(4) @Viet: Can you state your definition of strongly typed? (As I've already said, "strongly typed" is not well defined. See — by most of those definitions, C is less strongly typed than Python or Ocaml.) My definition of strongly typed, which I already made clear from context, is that casts are not silently performed. This is the sense relevant to JavaScript and this question, anyway. - ShreevatsaR
Would web applications be a lot more advanced now, if all browsers had been gifted with a bytecode interpreter from the start? - Chris S
(5) @ShreevatsaR The clasical example is: '3'+'2'='32', '3'-'2'=1. - Thomas Ahle
(3) javascript has no "proper" associative arrays: you cannot use arbitrary objects as keys. I find this mindboggling. - deubeulyou
(3) If it's fugly you're doing it wrong. - Justin Ludwig
(1) Well, as for #7, you're lucky if you get an error message at all. In most JS environments I've seen, the only "error message" is causing the script to terminate silently. D: - MiffTheFox
(1) i'd add a bullet point for broken scoping rules for closures necessitating stuff like: var that = this; - Nathan Hughes
no JS specifically but I hate the DOM - xenoterracide
(1) I strongly disagree with Mauricio Scheffer: DOM and the browser-dependent APIs are indeed very bad, but the language itself is also pretty terrible. I actually refused to touch it until I found jQuery. - reinierpost
JavaScript is a language of politics. That's why typeoff(null) is object. Some guy made a mistake in LiveScript. JScript copied the mistake. Now the mistake's an ECMAscript standard. - diadem
@Gordon Tucker: What would you want it to return? - configurator
@Gordon Tucker: oh, that makes sense. I was thinking you're saying it returns that as opposed to something else it should have returned. - configurator
(1) JavaScript has a tendency to be mistaken as an ugly version of Java or C by people who don't know enough JavaScript. It's a damn pretty language when you truly know it. - Ates Goral
Disagree with mostly everything: There are very few incompatibilities between browsers on the language side of things, DOM is the problem. JavaScript can be very stylish, if you know what you're doing. If you don't, you'll scatter a lot of procedural code in html, rather than write nice OO code in js files, where it belongs. I would call it the best of both worlds if JavaScript added optional type checking with classes, as did ActionScript. - Juan Mendes
[+148] [2008-11-11 23:59:12] too much php


1) Forces me to make unnecessary variables:

$parts = explode('|', $string);
$first = $parts[0];

2) An implementation of lambdas so lame it is roughly equivalent to using eval() and so hidiously wrong I have never used it (see

3) A try/catch system which can only catch about 80% of errors that might occur.

4) Regex support just as lame as lambda support because it has to be written inside regular strings, making one of the most hard-to-learn programming tools about three times as difficult. And PHP is supposed to be an "easy" language?!?!?

5) No way to safely pull stuff out of $_POST without writing it twice or building your own function, or using the '@' operator:

$x = isset($_POST['foo']['bar']) ? $_POST['foo']['bar'] : null;

6) Bonus answer: '@'. If you can't be bothered writing your code correctly, just add '@', and too bad for anyone who has to debug your code later.

(42) what about list($first) = explode('|', $string); ? - mlarsen
(3) or $first = explode('|', $string); $first = $first[0]; - Pim Jager
(44) Ideally, I would like to use some_function(explode('|', $string)[0]); - too much php
(2) Best solution for #1 is to use strtok. That only works if you're getting the first element - otherwise list is the only other method I can think of (apart from using some hideous regex...). I, too, would love to add [0] to the end of functions. It's very neat and intuitive. - DisgruntledGoat
Btw for 5. you cant check isset within a function, php is gonna yell at you for sending an undefined variable into the function. - Ólafur Waage
(1) What about its weird variable scoping? - Leonardo Herrera
(8) What weird variable scoping? Having everything local and forcing you to declare when you want to use a global is a good idea, it prevent noobs from making functions that just use globals, rather than using arguments and return values like they should do. - scragar
(24) you forgot about functions with parameter order changing randomly - dusoft
(2) It's funny looking at this, because almost all these gripes have been addressed in newer versions of PHP. Mainly real lambdas and the ternary shortcut operator. Also, by setting a simple error handler, you can convert all PHP errors (notices, warnings, etc) to Exceptions, so they can be caught by try/catch blocks. - jason
(2) 5.3 has fixed #2, and that is all. Custom error handlers still can't catch fatal errors, so try/catch still can't catch all errors. - too much php
(2) @too much php, consider fatal errors to compiler errors. In languages like Java and C# if you leave a semicolon out or make a syntax error which doesn't let it compile, you would get a compiler error the same way you get fatal errors in php - Click Upvote
(2) @Click Upvote: But Fatal errors are not the same as compile errors - if you have null instead of an object than trying to call a method results in a Fatal Error. Could you imagine trying to build a reliable Java program if the NullPointerException instantly crashed your program and there was no way to catch the exception? - too much php
How does #4 make the language harder? And why would you consider it being one of the hardest to learn? That is simply not true. - Franz
My favorite part is I thought of explode and having to toss it into a separate variable first too when I was listening to the last SO podcast - Andrew G. Johnson
(4) @Franz: I think he meant that regex is a hard language - and I'd concur. It's hard enough to keep track of escaping for regex, without adding string-escaping as well. - K Prime
@1:… - Alix Axel
(5) $parts = current(explode('|', $string)); - Galen
For the #5 : filter_input. - Arkh
(1) PHP 5.3.0+ has nice lambda-like functions: - Felix
(7) PHP isn't a language it's a hack. - Longpoke
(38) You forgot about verbNoun, verb_noun, noun_verb, nounverb, verbnoun, nounVerb, etc >_> - ItzWarty
To solve the first problem: function elem($array, $key) { return $array[$key]; } ... elem(explode('|', $string), 0); - Ollie Saunders
(1) @Ollie: When you're writing library code that you need to run anywhere, it's dangerous to define functions with short names (as it will likely clash with something else somewhere), and a longer function name just isn't convenient any more. Also, the function call is expensive, especially when you need to handle more than one $key. - too much php
For #1: Why not $first = reset(explode('|', $string)); I do agree with the rest though... also, for #1 it is such a hack to use reset there... sigh - SeanJA
namespaces... namespay-what? - Evan Plaice
@too much php: Even in php 5.3 lambda are poorly design, you are oblige to specify which variable you want to capture and you could even not capture $this and self ... - mathk
(1) #1 should be substr($string, 0, strchr($string, '|')). - Billy ONeal
[+136] [2008-11-11 22:41:21] Chris Jefferson



(13) I agree with the STL, but I will say what is there is pretty good. - Bernard
STLfilt for the win. :-) - Chris Jester-Young
iomanip. if it would be a puppy it should keep a 100 meters distance from me at all times. - wilhelmtell
(22) unicode. i do respect ascii's simplicity, but for goodness' sake, we're well into the 21st century now. - wilhelmtell
lambdas should have been here in 1998 if the standards committee would be technology geeks like us. surely in 2003 if they had a little bit of desire to be at the forefront. but no, they have fermat's math skills AND age. - wilhelmtell
(1) argh. i wish my love for c++ wouldn't be so strong. :) - wilhelmtell
(2) Const Correctness - So much effort for so little gain. - Kieveli
What bothers me the most about C++ is the lack of a standard POSIX C++ API, though that's not really the language's fault. - Tyler McHenry
(29) @Kieveli const correctness is actually one of the things i miss most when programming in other languages. particularly the dynamically-typed ones. raii is a big feature i often miss too. - wilhelmtell
(1) +1 for template error messages. Argh. - JasCav
...implicit conversions can be really interresting. - KarlP
(6) Most of C++ problems come from being an ISO standard and locked for 10 years. - graham.reeds
(2) I completely disagree with #4 - this is handled so radically different on operating systems that any attempt to pin it down to a standard would be a mess. - George Edison
(1) I think you can count Boost and Qt as standard libraries. - tstenner
(7) +1 "Template error messages." - João Portela
+1 Template error messages. Threads are being added to 0x (whenever that get's here =/) - KitsuneYMG
I definitely think that const correctness is often worth far more implementation time and "Oh I forgot to mark that method const, now my build won't compile" than it's actually worth in value. - DeadMG
+1000 for template error messages - Brendan Long
@tstenner: I don't think you can call Qt standard when it cannot even be compiled with a C++ compiler. (Unless you pass the code through something else first...( - Billy ONeal
@DeadMG - or my var is const but somewhere deep down in a library somebody made an iterator not const so I can't pass my const value to it. - Martin Beckett
Template error messages, oh how i despise thee - nebukadnezzar
[+128] [2008-11-11 22:21:00] Jon Skeet

C# / .NET:

Those were off the top of my head - ask me tomorrow and I'll come up with a different 5 :)

(1) Sealed by default? Why? - Erik Forbes
(2) Java has hashCode() and equals() methods as methods on Object, and I find this to be a very reasonable design. As it makes semantic sense for every object to be able to compare itself against other objects and generate its own hash code I am not understanding why you are opposed to this. - Ryan Delucchi
(4) I really don't agree with classes being sealed by default. But hey, it's your list I suppose. - JSmyth
(3) @Eric: for most classes, deriving doesn't make sense and most classes actually support it poorly. By default, every virtual class should be abstract and every other class sealed, meaning that you could only have leaf classes as dynamic types, never node classes in the inheritance hierarchy. - Konrad Rudolph
(22) Sealed by default: inheritance should either be designed into a class (which takes time and limits future options) or prohibited. hashCode/equals: it sucks in Java too. One day I'll write a long blog post about it. Read Effective Java for details of why equals is hard in inheritance chains. - Jon Skeet
(87) Sealing by default means that you have thought of every possible reason that someone may want to inherit from your class and you don't think any of them make sense. Sorry, but none of us are that smart. - Ed S.
(69) In that case I'm not smart enough for you to derive from my code: because I can't predict what future changes I might make which could break your code. That's a very significant problem, IMO. Sealing the code is more restrictive, but leads to more implementation freedom and robustness. - Jon Skeet
I agree with all except #3: how can an IEquatable help with the fact that equals() is broken under an inheritance chain? - Buu Nguyen
(3) @Buu: You'd usually only use IEquatable when only one sense of equality was sensible, which would usually exclude unsealed types. For other situations you'd use an IEqualityComparer, which is effectively context-sensitive: "I'll compare for equality in <this> way because that's what I care about." - Jon Skeet
(1) Good point. Thanks for clarifying, Jon. - Buu Nguyen
Hi Jon can you elaborate more on why inheritance should be prohibited? If inheritance is designed into a class wouldn't that mean that the class would be very massive and represent multiple entities? I can see there will be many switch statements inside the class. - RWendi
(1) RWendi: Designing for inheritance doesn't mean that it has to be massive or already know what the subclasses will do, exactly. It just has to know which bevahiours may be specialised, and deal with them appropriately. (Continued in next comment) - Jon Skeet
(1) I have a blog post on the "inheritance tax":… It's fairly old now - I may have to rewrite it some time. Josh Bloch (unsurprisingly) does a better job in Effective Java. See item 17 in the second edition. - Jon Skeet
(11) I can't believe no-one mentioned the "goto case" syntax, I hate that one! - Aistina
(1) Glad you aren't Anders! This business of "sealed by default" is just a bridge too far for me. It sounds like propaganda from some incomprehensible Java Community Process community with some kind nonsense JSR assigned to it. - BobbyShaftoe
(4) I'd 'kill' anyone that will make all classes sealed by default in .Net, even if it tries to hide on the other side of the moon. Actually I have a better "Idea", ban the sealed keyword .... - Pop Catalin
(4) @Pop: I think we'll have to agree to disagree then. I strongly urge you to read Josh Bloch's "Effective Java" on the topic though. - Jon Skeet
@Bobby: I don't see what this has to do with the JCP at all. Is that just because I mentioned Effective Java? Let me know when you have wisdom to match that of Josh Bloch... - Jon Skeet
(4) @Pop: I think a death threat is a pretty extreme reaction to a suggestion that is as reasonable as wearing a seatbelt. - MusiGenesis
(1) @MusiGenesis: it's a metaphor to show my extreme position regarding this, and that I'm strongly against it. I know it's bad to be at extremes, but in this case I'm combating an extreme solution with a extreme attitude :P - Pop Catalin
(1) @MusiGenesis: guess not everyone knows about that classic vb 6 joke: "code like the next person maintaining the code is a psycho maniac killer that knows where you live", or that everyone digs this kind of jokes... - Pop Catalin
(4) @Musigenesis: I think we must have a different idea of "extreme". I'm saying that I believe that the default should have been sealed. I'm not trying to ban inheritance - you could still explicitly unseal a class. By being explicit, you'd be showing that you've thought about the consequences. - Jon Skeet
(4) I'm going to go ahead and agree with Jon Skeet on the subject of keeping classes sealed by default. If you want something to be inheritable, make it so. Don't assume that every class should be inheritable, though. - Alex Fort
@Jon: by "extreme" I was referring to Pop's saying that he would 'kill' anyone who sealed classes by default (I know he didn't really mean that). I agree 100% with sealing classes by default - it makes sense like wearing a seatbelt makes sense. :) - MusiGenesis
@Musigenesis: Sorry, my comment should have been to Pop, who was claiming that my idea was an "extreme solution". - Jon Skeet
no friend class support. - Kon
(1) +10 for "there shouldn't be a monitor (or even an index into the lazily-created monitor table, which I believe is the present situation) for every object" - Doug McClean
(3) Good list. I agree with every point, and in particular the "sealed by default" and no implicit support for comparison/hash-code. There should be as few built-in things in the base object as possible, and everything else should be explicitly specified that a class supports it. - Lasse V. Karlsen
(2) +1 for sealing classes by default. I strongly believe (and Jon stated it above already) that designing a class that PROPERLY supports inheritance is an order of magnitude harder than designing a sealed, immutable class. Thus "allow inheritance" should be a conscious decision. - Milan Gardian
(4) +1 for sealing by default. Planned Inheritance: The contract of a class must describe what derived classes must, may and can't do. - peterchen
(4) +1 for poor immutability support. I always prefer immutable data structures. - Anton Tykhyy
(2) You really don't hate array covariance!? - Mehrdad Afshari
@Mehrdad: I don't like it, but it was somewhat useful pre-generics. It's not a big "hate" for me. - Jon Skeet
(1) The biggest problem I have with classes being sealed is the difficulty in mocking them for Fitnesse or Unit tests. The biggest example that comes to mind is HttpContext - it can't be extended, and only implements IServiceProvidor. If I want to mock a call to a function that takes an HttpContext, it would be nice to pass in a MockHttpContext that extends/overrides HttpContext. Instead, you have to create an instance of HttpContext and populate it, and there's no way to spy what functions were called. Even Rhino Mock can't deal with a sealed class. - Matt Poush
(7) @Matt: To me, that says that HttpContext should implement a suitable interface, not that it should be unsealed. Overriding arbitrary methods of classes without understanding whether internally one of those methods would normally call another is just replacing one problem with a different one, IMO. - Jon Skeet
I think I could live with sealing by default as long as there was a keyword to allow you to override the sealing: Please allow us to run with scissors if we want to! I think a better solution (which could actually be implemented in a future version of C#/.NET) would be a DesignedForInheritanceAttribute and a warning from the compiler when a class derives from it anyway. - Rasmus Faber
(1) You'd be able to override the sealing at the base class level obviously, but not at the derived level. If I design a class not to be derived from, I don't want that to be violated. - Jon Skeet
Here's my 2c on default sealing of classes. This should be done. Even in the framework itself, this causes troubles. For instance, once upon a time, I wanted to extend some of List<T> 's default behavoiur (specifically, I wanted to add events for Add, Remove, etc). So away I go and derive from List<T> which worked, but then I couldn't actually do anything from there... - Matthew Scharley
Wow, It's been a long time since I looked at this topic :). I do understand your point about 'sealed by default'. Inheritance is often overused and used incorrectly. However, in practice I doubt that sealed by default would make our lives any better. In my own code I wouldn't care because I can change it as I see fit (I don't develop public libraries). Unfortunately, elegantly designed third party API's are the exception, not the rule. So, what does this mean? It would probably mean that almost every darn class in the API I am using is sealed. I would rather be able to inherit from - Ed S.
(1) these deficient classes if needed than to be blocked out entirely. Since this theoretical API was designed poorly to begin with, I highly doubt that they have provided sufficient flexibility in their interface for me to accomplish what I need, so now I am screwed. In theory I think that you may be right, in practice, at best, I doubt that it would help. - Ed S.
What about Mutex class? I think it solves 2nd issue. - terR0Q
@terR0Q: Yes, but at the cost of being a full Win32 kernel object instead of a lightweight .NET lock. - Jon Skeet
(It also doesn't free "lock" from being a keyword, which is one of the annoyances of the current situation.) - Jon Skeet
@Jon Skeet Yep, Mutex is heavy. But managing lock tokens involves more information and actions that can be mishandled while lock introduces only one more variable handling per lock (and that's definitely easier). And we always can implement tokens support system if we really need them in a project :) Concerning syntax, well, there are pros and cons of equal weight: keyword (bad as it is, yet better readability), brackets (more indentation, yet we have better view of what is being locked), some strange variable doing some strange business inside :) - terR0Q
No array properties. No constants inside a method. - Loren Pechtel
I believe in C# everything should be virtual by default.. - Tigraine
(20) It's a good thing Jon Skeet didn't design C#, or my list would look like "1. classes are sealed by default; 2. locking is too complicated; 3. most objects aren't hashable"! - Gabe
(2) @Gabe: Locking would still be easy to do right - it's only bad locking (e.g. locking on "this" or typeof(...)) which would be broken. And you could still use any type in a hash table - just use the ReferenceEqualityComparer which would obviously be required. - Jon Skeet
@John Skeet, Now is tomorrow++. What 5 do you have today? - Thorbjørn Ravn Andersen
(2) @Thorbjørn: They're still the same, as it happens :) - Jon Skeet
[+113] [2008-11-11 22:27:42] Michael Burr


Having to deal manually with the string buffers is an error-prone pain. Since so much computing is really moving and modifying strings (computers aren't used quite as much for big number-crunching stuff as people thought they'd be way back when), it's really nice to be able to use managed languages or C++'s string objects to deal with these. When I have to do it in straight C, it feels like swimming in quicksand.

(50) Agreed. String manipulation is item 1 through 5 of things I hate about C. - BoltBait
I guess I wasn't too interested in coming up with 4 others - that one is just a real bear. Also, I suppose straight C isn't really my 'favorite' language, so maybe I should have just passed on this question. - Michael Burr
String manipulation in C is great, all you have to be able to do is count. Compare it with the syntax nightmare of using istringstream in c++ - Martin Beckett
(1) Just use DJB's safe string library or something. XML manipulation is difficult in most languages, and a lot of programs do XML manipulation, but you don't see many posts saying "Perl is totally broken because it doesn't support DOM nodes as a primitive data type". They use a library. - Steve Jessop
(5) C string manipulation does suck, but as far as language issues go, it's not the worst. - Chris Lutz
Okay, I really really don't get this complaint. C is a low level language, system work. It is not meant for UI stuff, not compared to modern languages. This is a case of trying to put on elephant robes on a donkey. You're asking C to do something it really doesn't want to do. C has enough problems, string manipulation is just using a hammer instead of a philips screw. - Daniel Goldberg
I don't know what else to say - I don't really do much in the way of UI programming so it's not that. But I also don't do a whole lot of number crunching. I still find myself doing a lot of string manipulation, and it's generally more painful to do in C compared to C++ or other languages. I use C an awful lot, and I don't hate it. But I wish dealing with strings was somehow less difficult. I can't tell you how that might look since I haven't thought much about fixing it at the language level. I have library routines that help quite a bit, but they still require more effort than I'd like. - Michael Burr
(3) strcat to concatenate, but wait... does the destination have enough space... ok, must insert if statement to check... but wait, what if my string is on the heap? Ok, must keep a variable around to keep track of size... And this can go on and on and on... - blwy10
(1) Maybe I'm daft and haven't used much of C itself, but couldn't you just make an abstract data type for char* (and relevant properties) in a struct and call it string? - trinithis
(1) @trinithis: you're not daft - that can be done (and there are several libraries that implement that kind of thing), but you often run into a problems integrating existing code and practices or using the datatype with other libraries. - Michael Burr
@blwy10: strcat? Try using getcwd() or readlink() correctly. - Joey Adams
Just use an excellent string implementation like GLibs GString ( and string handling becomes at least as easy than in C++. - ahe
(1) Design principal if esoteric language BIT ( "Extend the ease of string processing in C to other, more basic, data types such as integers." :) - whybird
(4) We need a thread for five things we don't hate about C... - Longpoke
I would like to add "no function overloading" - Dave O.
(1) String manipulation is the most beautiful part of C. How can you make strings any simpler! Better than having some monster string library that goes and does a zillion copy ops or a locale specific lookup of Klingon plurals when I want to read the first character.\ - Martin Beckett
[+94] [2009-06-17 05:20:46] community_owned

How about five things I hate about "Things I hate about some language" lists? :D

5- Painting an orange red doesn't make it an apple.

When a language is designed, the designers typically have in mind what it's useful for. Using it for something completely different can work, but complaining when it doesn't is just dumb. Take Python. I'm sure either someone has or someone will some day make a utility to create exe's from Python code. Why on God's earth would you want to do that? It would be neat—don't get me wrong—but it has no use. So stop complaining about it!

A well-designed project would likely contain code from multiple languages. That's not to say you cannot complete a project with only one language. Some projects may be well within the abilities of whatever language you are using.

4- Are you standing on wooden legs?

The platform can be a large influence of what the language can do. With nowadays garbage collectors, or well even pascals early attempt at "garbage collection", can aid in memory fade (maybe malloc more ram??). Computers are faster and so of course, we expect more out of our languages. And quite frankly, we probably should. However, there is a huge price to pay for the convenience of the compiler to create hash tables or strings or a variety of other concepts. These things may not be inherit to the platform of which they are used. To say they are easy to include to a language just tells me you may not have a leg to stand on.

3- Who's fault is it really?

Bugs. You know. I love bugs. Why do I love bugs. Because it means I get to keep my job. Without bugs, there would be many closed pizza shops. However, users hate bugs. But here is a little splash of cold water. Every bug is the programmers fault. Not the language's. A language with such a strict syntax that would significantly reduce how many bugs were possible to generated would be a completely useless language. It's abilities could probably be counted on one hand. You want flexibility or power? You've got bugs. Why? Because you're not perfect, and you make mistakes. Take a really identifiable example in C:

int a[10];
for (int idx = 0; idx < 15; idx++) a[idx] = 10;

We all know what that's going to do. However, what maybe some of us don't realize is.. that functionality can be very beneficial. Depending on what you are doing. Buffer overruns are the cost of that functionality. That code above. If I actually released that to the public. That's again.. say it with me.. "My fault". Not C's for allowing me to do it.

2- Shouldn't we put that in the recycle bin?

It's very easy to point at a feature in a language we don't understand because we don't use it often and call it stupid. Complain that it's there etc. Goto's always entertain me. People always complain about goto's being in a language. Yet I bet your last program included a type of goto. If you have ever used a break or a continue, you've used a goto. That's what it is. Granted, it's a "safe" goto, but it is what it is. Goto's have their uses. Whether "implicit" gotos like continue or break are used or explicit gotos (using the actual keyword "goto" for whatever language). Not that language developers are flawless, but typically... if functionality has existed since the dawn of time (for that language). Likely that aspect is a defining quality of that language. Meaning.. it's being used and likely is not hanging around because of backwards compatibility. It's being used today. As in 5 minutes ago. And used properly. Well.. arguably someone is using it improperly as well, but that relates to #3 on my list.

1. - Everything is an object.

Ok.. this one is really a subset of #2. But this is by far the most annoying complaint I see in hate lists. Not everything is an object. There are a great many of concepts that do not belong or need to be objects. Putting things where they don't belong is just ugly and can decrease efficiency of a program. Sure. Maybe not much depending on the language. This also relates to #5. This means... yes. Global are ok. Functions as apposed to static methods are ok. Combining OO programming with global functions is ok. Now.. that doesn't mean we should all go out and "free" our code from it's object models either. When designing a section of code or a whole project, what happens behind the scenes should be considered when putting it together. Not only where that concept lives and many other factors. Why wrap global functions within classes or name space concepts if it serves no purpose? Take static member variables. That greatly amuses me because.. well..Depending on the language and implementation of course, but generally speaking, you just declared a global. Yes, there are some reasons to wrap these non-OO concepts in OO wrappers. One of course being self documenting code. That can make sense. So.. like I say. Don't go out and "free" your code. But any good modern language will have a global concept outside of it's OO modeling. Yes I'm specifically meaning to point out that an OO programming language without a global concept most likely has a serious design flaw. Again though.. depends on the intention and design of the language so I'm not attempting to pick on any specific language and there are far too many to analyze right here. Anywho, Consider where the code should live and be the most effective. Adding a bunch of flare to something which doesn't add functionality or support just wears down the keyboard faster. It doesn't do anybody any good. Well.. unless you like brownie points from the person who probably incorrectly taught you that everything is an object.

In short, programming isn't just mindlessly tapping on the keyboard. There are a lot of design considerations to any project. I know it's cliche, but you have to look at it from every angle. Even with nowadays type-safe languages. You don't just chuck code out and expect it to work well. Sure.. it may work, but it may not be the right way to go about it. Overall, pick the language and format that is best suited for the specific job AND the environment. But no language takes away the thought behind it. If you're not thinking.. you're just typing.

+1, even though everything should be an object. ;) - eyelidlessness
(19) Languages aren't perfect, and if you make a list of things you hate about a language, you may get some interesting comments and ideas. First, it allows others to give you solutions which you didn't know existed (look through the posts, you will see a few things were learned). Second, it constitutes user feedback for the language developers (wouldn't you be interested if your users came up with a list of the 5 things they hate the most about your software?), and third, it's kinda interesting to ponder on the flaws of your tools. - Sylverdrag
(1) +1, amazing post - the_drow
you just made my day. - MathGladiator
I certainly agree with your #1. On the other screen as I write this I have 11 "objects" which contain nothing but data and can't logically contain anything else. They only exist to organize fields in a parent object so I don't end up with an object containing 2 pages worth of fields. - Loren Pechtel
(4) If you view it at that level not only break and continue are gotos, but loops are gotos (jump the begin of the loop if the condition is met), if is goto (if the condition is not met jump over the block, function calls are goto (jump to the begin of the function and later jump back), ... - helium
@helium If you think about it, even Exceptions can be considered some form of goto. @Znr ++upvote Best post in weeks. - Helper Method
(17) Creating executable files from source code "has no use"? What? - detly
(4) Perl could create an executable from a Perl file since the late '80's. One thing to distribute is useful. No need to a) install Perl, b) install components of program, c) maybe write a script to set paths and execute it all... Yeah, really useless. - xcramps
I agree with #1, but not the example given. You should always target as close to vanilla Windows as possible with software like this. - MiffTheFox
I agree with you, but I just had to snarkily point out "Because your not perfect, and you make mistakes." My not perfect WHAT? B-) - Brian Postow
@detly Agreed. Since when is Py2Exe useless? Sure developers dont really have a use to compile their Python code because they all have an interpreter installed, but not everyone is a developer. Instead of having to install & update Python & countless libraries and dependencies on user's systems, it's a lot easier to send them a single .exe to run. - crgwbr
Exactly. Try distributing a wxPython program to someone who wants an easy install. Gauntlet of pain. - detly
(1) But, if you can't create .exe files from the source, windows users won't be able to run it. ;) - Evan Plaice
@Sylverdrag Not to mention these lists can help programmers decide which programming language IS appropriate by the limitations of each (intended limitations or otherwise). - Dan
Nice list, but everybody should understand by now why for loops and goto are bad. - reinierpost
"Adding a bunch of flare to something which doesn't add functionality or support just wears down the keyboard faster." What popular languages actually do this? I can only think of Perl and C#... Others are drawing from new paradigms to help create better code (not fancier). @MiffTheFox @delty, sure you can create an exe, but then again you can create a one line batch file to launch the app with the proper lang runtime.. Ideally, the OS should manage the entire packaging (what Linux distros do, although still too ghetto) - Longpoke
And what aren't objects? Everything down to the atom and whatever is under that is an object, likewise for conceptual objects. Globals are bad (or any state for that matter). They can be convenient in certain situations, but they should be used conservatively. Every time you add more state, your program gains (exponentially) more bugs. Continue is a goto? Maybe, but then every statement could be a goto to the next statement. I've never personally seen a use for goto in any high level language (and I'm mainly an assembly guy...) - Longpoke
Maybe in PHP where a ton of functions return error values instead of raise exceptions, goto may be useful, but not in any good high level language. - Longpoke
@Longpoke - So, how can a one-line batch file detect the presence of a certain version of .NET/Java/whatever your project uses, run the code if the runtime is present, or else display a helpful message to the user prompting to install the runtime? - MiffTheFox
@Longpoke - I'm sorry, that comment was so old I forgot what it relates to. :O - MiffTheFox
@MiffTheFox: eh you're right, you can't in Windows, which is a major flaw, you can always double click the jar to run it though, as jdk registers that on windows, although this is also bad because it makes the code have to manage its dependencies. Depending on old versions of Java is bad and insecure though, dunno about .NET as there is 1/2/3/4... Then again, most devs don't care about security so they'll just force the user to install a bunch of useless native crap and ship with some old JRE. - Longpoke
(1) Well written, but a terrible message. Making up excuses. - reinierpost
[+88] [2008-11-11 22:38:59] Ryan Delucchi

Five things I hate about Java (which, presently, is my favorite language) in no particular order.

  1. As much as I am a fan of Java Generics, there are a lot of oddities that arise from the way it was designed. As such there a myriad of annoying limitations with generics (some of which are the result of type-erasure).
  2. The way Object.clone() and the Cloneable interfaces work is totally broken.
  3. Instead of taking the high-road and making everything an object ( SmallTalk), Sun wimped out created two distinct categories of data-types: Objects and primitives. As a result there are now two representations for fundamental data types and wierd curiosities such as boxing/unboxing and not being able to put primitives in a Collection.
  4. Swing is too complex. Don't get me wrong: there's a lot of cool stuff one can do with Swing but it is a great example of over-engineering.
  5. This final complaint is equally the fault of Sun and those whom have written XML libraries for Java. Java XML libraries are way too complicated. In order to simply read in an XML file, I often have to worry about what parser I am using: DOM or SAX? The APIs for each is equally confusing. Native support in the language for easily parsing/writing XML would be very nice.
  6. java.util.Date sucks. Not only is it unnecessarily complicated but all the useful methods have been deprecated (and replaced with others that increase complexity).

(32) You forgot about java.util.Date! - TM
(1) ah yes. The Java Date/Time classes. Well, I probably forgot about it because it's been a long while since I have had to use them. - Ryan Delucchi
I agree with all of these, but I would like to hear your explanation of (2). Saying it's "totally broken" is not much of an explanation. Could you clarify? Thanks. - dj_segfault
You can't reassign final fields in clone. - Steve Kuo
(3) Also: The "Cloneable" interface doesn't have a "clone()" method. This makes The Cloneable interface an Oxymoron. And since clone() returns an Object, type safety is out the window (there does not appear any attempt made to rectify this even after Generics have been introduced in J2SE 5.0). - Ryan Delucchi
(2) As long as we're bashing cloneable, might as well include the so called Serializable "interface". Whenever using it I always want to stab myself. - wds
XMLBeans for the win! - TofuBeer
(12) Hard to do simple things like open a file and read from it. - Eric Johnson
(1) JAXB makes XML reading/writing very slick (1.6+), but I'll concede the rest and a few more I havne't thought of yet. - Andrew Coleson
I hate beans -- ugly set/get code vs C#/Ruby properties, and class-invariants are right out the window with constructors that make crippled objects -- "run enough sets and eventually this object will be useful for something". Next on the chopping block: I'm really tired of the mark-and-sweep garbage collector. It would be nice to have alternate GC settings like "none", "refcount" or "s&m", er, "m&s". It sounds cool to never have to worry about memory leaks again (oh really?), but the cost of blasting pg faluts through CPU caches any time you have stuff cached in your app gets old. - Roboprog
(3) @Ryan clone() does not necessarily need to return "Object". With J2SE 5.0 Java introduced covariant return types, which means you can return any subtype of a base class. So public MyType clone() IS possible! - Helper Method
(1) @Eric +1 Decorator pattern done wrong :D. It's funny that in C file handling is so much easier -,-. - Helper Method
"Native support in the language for easily parsing/writing XML would be very nice." If you think Java should have this, you don't understand Java... Enjoy your bloated JavaScript with E4X... - Longpoke
(1) For XML I find that xmlpp (Pull Parser) it just about the easiest to use. I like that I can pass the xmlpp around like an iterator. What's this? a Foo tag? Let me can parseFoo() to deal with that. - KitsuneYMG
(1) DOM and SAX are two inherently different approaches to parsing XML. One is document-based (i.e. read the whole doc in, and then manipulate it) vs stream-based (react to tokens as they are seen in the input- much better for larger documents). But I'll grant you that using them both can be a PITA, especially since they're implemented via "service provider" interfaces. - Caffeine Coma
[+73] [2008-11-11 23:29:13] Myrddin Emrys

Ruby has many flaws related to its speed, but I don't hate those. It also has flaws with the community evangelism going overboard, but that doesn't really bother me. These are what I hate:

I agree with the last one, it was also surprising to me when I started to learn Ruby that passing a function (block) is conceptually different from passing any other argument. - Adam Byrtek
(2) sub-optimal m17n & unicode support although it is getting better. 1.9 remains complicated... - Keltia
(37) I thought that metaprogramming abuse is called "idiomatic ruby" :) - Slartibartfast
1. Global variables (especially, class/module names) which cuts possibility to load several versions of the same library 2. Mutable string literals (you have to write Cblah = "blah".freeze to optimize GC) 3. Operators are not methods (!=, !~, !, if, while), so you cannot do 100% proper proxies and futures - Oleg Andreev
I never thought about lame sides of metaprogramming abusing. Nice point. - Arnis L.
I wish Ruby blocks were just JavaScript anonymous functions with a more elegant syntax. That would make much more sense IMO than doing what they did. - musicfreak
Re: closure (block) passing after function args: this lets you extend your own language to create "visitors" and the like. It's quite useful, actually. Nothing stops you from making and passing function/closure references in as standard arguments. - Roboprog
I can see the problem in excessive cutesy dynamic programming in frameworks gumming up IDE support, though. I don't want to sound like too much of a fan-boy (fan-geezer?). And, Ruby implementations do run a bit slowly. And, I have gotten a little tired of Rails version thrashing: I want my Postgres driver to just continue working, please. - Roboprog
You can get to within one character of your desired syntax: alias :L :lambda object.method(1, L{|a|}, "blah") I fully agree that it's not optimal, but I think it's a useful, and more importantly, practical convention. - ben_h
Threads are not true kernel threads, but 'green' threads. Using require to include other ruby files doesn't expand the path, so if multiple files in a library load the same files from different paths they get linked twice. - Allyn
What are the 4 creation syntaxes? I only know { ... } and do ... end. - akway
(2) akway: The other two syntaxes are lambda and - Myrddin Emrys
(2) Re documentation, I once heard a talk by someone working at the Pragmatic Programmers publishing house, who said that when the company was founded, they wanted a Ruby book because the only one that was available was in Japanese. So they could have had that book translated and published by their company. But what they did instead what to read the source code :-) The Ruby book was apparently one of the books that launched Pragmatic Programmers. - Arthur Reutenauer
(13) I find it interesting that 3 of these are to do with people and not the language itself. Ruby remains the language I hate least. - Toby Hede
Lol. Myrddin, I wish I could vote twice for this answer. :-) - conny
(2) I think it may be that there's an inherent tradeoff between language power and IDE power. Making a language more expressive may place hard limits on how much help an IDE can provide. If that's the case, I'll go for language power every time because I've found that powerful IDEs help a lot more for writing code than reading it, and I do more of the latter. - Zak
OH GOD, THERE ARE SO MANY endS! - John Douthat
Just because you can infer some code's purpose by reading it doesn't mean that it's the One True Way of finding out what some function does. - MiffTheFox
I actually love blocks coming last and coming outside of parameter list brackets (if any). The reason for that is, the function is usually the largest parameter: it quite often spans lines. I hate the split argument lists way more than I mind the separate syntax. - Amadan
(1) @Amadan I wouldn't mind it as an optional, occasional way to pass blocks that were long... but as the only way blocks are usually passed, I think it kinda sucks. - Myrddin Emrys
[+72] [2008-11-12 01:10:28] Brad Gilbert



(5) I don't see lack of true OO as being as bad as you make it. Sometimes, it's a saviour, especially when the CPAN module you're using didn't think to expose what you need. And lack of multiple dispatch could be worse: perl could have been strongly typed ;-) - Tanktalus
Basically I went through the differences of Perl5 and Perl6. - Brad Gilbert
my @two = @array[0,1]; - derobert
(1) $array->[0] != $array[0] != @array[0] - Brad Gilbert
Poor exception handling is one of my #1 problems with Perl 5. I also dislike the fact that it is not strongly typed and that I can't have defined paramater-ized functions - Mick
What's wrong with m/(?=>look ahead)/; ? - ysth
Should have been (?=look ahead). ... fixed. - Brad Gilbert
(3) I like that Perl isn't strongly typed, but it would be useful to add in some type information. - Brad Gilbert
Wow. I REALLY don't like the change in character class notation. That's one thing I don't think should be changed. I don't mind (?non-capture) - it's clearly a GROUP, which is what matters more then whether or not it captures. - Chris Lutz
The only change in character class notation, is that they must be inside of <>. Which would allow you to do <-[a-z]> for negation. - Brad Gilbert
(13) It seems like you chose to criticize a language that's not your favorite (you should have criticized perl6) - Frew
(5) What's the point about comparing to perl 6? Are you suggesting that perl 6 fixes your issues, or continues them? - Robert P
(1) Perl6 improves upon them. - Brad Gilbert
(1) I agree with all of these, except for the regex constructs - I think that Perl's regular expressions are as good, if not better than any other language. - Drew Stephens
(1) That's not a bug, it's a feature! Perl is probably my favorite "get 'er done" language, but the OO bag-on-the-side in Perl 5 did kind of jump the shark, in terms of conceptual and notational clutter. - Roboprog
+1 for the list of all possible array / hash notations, all but two of which are authorized by the syntax, with completely different meanings :-) - Arthur Reutenauer
(1) Perl should just die. But it can't. It's specified as mandatory by the Linux Standard Base :( -
The "inconsistent sigils" are actually typed dereferencing operators, and should be thought of as such. Every one of those examples makes sense. Perl 6 is going to break this, and therefore, regardless of its improvements on Perl 5, is downright offensive. Most of the actual inconsistencies in Perl can be chalked up to growing pains. - Jon Purdy
(2) I doubt I need to say more than: - Arafangion
Lack of true OO? You appear to actually not like the lack of a clean implementation of a common way of implementing OO. Others would argue that OO is simply about message passing, isolation and polymorphism. Still others would have different definitions of what "OO" really is. While I agree with some of your warts, this isn't one of them. - Ovid
(1) The question was '[...]about your favourite language[...]'. - hlynur
(1) TNANC;DR (too many non-alphanumeric characters; didn't read) - Longpoke
@Drew Stephens: By any other language do you mean {COBOL, microcode, VB} ? - Longpoke
Forget "fake" OO. My biggest issue with Perl is that sub foo { +(1..5) } returns 5 elements when called in list context, but '' when called in scalar context. That's just not right. - fennec
[+58] [2008-11-11 23:02:02] I GIVE TERRIBLE ADVICE

I'll do PHP as I like it at times and Python will be done way too much.

I still like PHP, though. It's the chainsaw of web development: you want a small to medium site done real fast and be sure anybody can host it (although configurations may differ)? PHP is right there, and it's so ubiquitous it takes only 5 minutes to install a full LAMP or WAMP stack. Well, I'm going back to working with Python now...


And I so want strong typing. Or at least give me the choice to activate it. - christian studer
You can partially have it, just use !== and === for comparisons. That ensures the types are respected but for +-/* etc. I believe PHP gives enough choice. Being weakly typed is a language choice like duck typing, and letting people choose on their own would make the language even less consistent. - I GIVE TERRIBLE ADVICE
(4) Love the irony of point 4 :) - Damir Zekić
(4) I suppose point 1 is implemented in 5.3 :) While param ordering is getting better naming is still poor. I agree with the backward compatability though. - Ross
Chainsaw of web development? Man, I'll use that in my signature. Hehe. - capfu
The only thing I have to (sort of) disagree with is the weird return values. With the way PHP does it now, you can do if(preg_match_all("/regexp/", $str, $ret)) { print $ret; } (or if (preg...(...) > 2) {...}, etc) which was probably the point. - Andrew Koester
When returning an empty array, PHP will evaluate it to false with its loose typing. Returning the array itself would still let you like "if($matches = preg_match_all($regexp,$str)){...}". Adding 'or' after sounds like a pretty bad reason to have the return values that way. - I GIVE TERRIBLE ADVICE
I believe the common version of the phrase is "Swiss Army Chainsaw," which is also accurate. Also, you were supposed to write it about your favorite language, not one you "kinda" like. - NateDSaint
(4) Gotta love #4. That's one of the things that bothered me the most all the time, too. - Franz
(1) I think, the speed argument is pretty subjective. Speed depends much more on how efficient the code is than on the language itself. Poor PHP code is probably slower than high quality python code but good PHP may also perform better than poor Python. - Techpriester
It is subjective, especially since the largest bottlenecks you have are about the network and how long it takes to render the page to the user (CSS, JS), which amounts to roughly 90% of the time taken to load a page. What makes file importing really bad though is that it basically just calls 'eval' on the file you pipe in. It's neither smart, safe or fast. - I GIVE TERRIBLE ADVICE
(16) no_really_now_mysql_escape_the_string_im_serious() - Salaryman
(2) namespaces schmamespaces. PHP is on the world wide web so everything should be global - Evan Plaice
[+53] [2008-11-26 20:17:00] Nathan Long


  1. Irregular verbs. All the common ones are irregular, too. First person of "ir" is "voy"?? That does not follow the "o" "as" "a" "an" "amos" rule at all.

  2. What is up with the subjunctive? "El que tenga sed" - he who is thirsty, hypothetically speaking. Do we really need to conjugate this differently?

  3. Venezuelans. How come Venezuelans are always leaving out the s in the middle of words like "mosca?" Come on people, it's right there in the spelling. I thought your language was phonetic.

  4. Vocabulary. "Peel" and "rind" and "skin" and "husk" and "shell" are all "cascara" to you? Just "the outside part, who cares about the texture or edibility?" Sloppy.

  5. Corazón. OK, so this is not so much linguistic as cultural. Why do all Spanish songs contain the word "corazón" (heart)? I mean seriously, even in Spanish 1101 I could understand half the song lyrics, because I knew this one word. You've got to come up with some new subject matter. Somebody start translating They Might Be Giants into Spanish - they sing about all kinds of weird stuff.

5. ref. corazon is the english love-dove, the german Herz-Schmerz. 3. Try Argentina... - peterchen
3. Venezuelans aren't the only ones. I've heard Dominicans,Puerto Rican, even a couple of Mexicans greet me with Como eta? For a long while I thought the common spanish exit phrase was No vamo. - Thedric Walker
I was taught Spanish by an Argentinian, so I sound like a challenged Frenchman. And you can't translate They Might Be Giants songs into Spanish - see point 4. - JasonFruit
(31) The common verbs are irregular in almost every languge: Be, Go - chris
(12) On #4 Probably is the kind of spanish speakers you've met. Here are the translations: peel-pellejo,rind-corteza,skin-piel,husk-cascara,shell-caparazón. Spanish also have formal mode (Tú-Ustéd) On #5 I haven't heard a song with the word "Corazón" in ... mmh years!! ( and I'm being honest on this ) - OscarRyz
On the others points there is no way to argue ( I have the same complaint je je ) . Still it is good to know Spanish is your favorite language. :) :) Byte!! - OscarRyz
(1) Haha - thanks for chiming in, guys. I actually had to make up complaints for the sake of this joke; every language has its odd bits, but Spanish is a beautiful one. - Nathan Long
Almost all my songs are in Spanish and none of them has the word corazón (which, by the way, has a tilde in the o). I hate that word too. - Eduardo León
Good point Eduardo: accent mark's and ~'s. Another annoying feature in Spanish. Typing those are annoying. - Eric Johnson
'Eating' the syllable-terminating S is common all over Caribbean, most coastal South America, and southern Spain (where it originates); see e.g. But personally I think it's kinda neat, and I like to put on a Cuban accent imitation featuring that :) - Jonik
(6) Spanish lacking vocabulary? We have two different verbs for "to be" and two more for "to have"! And verb tenses FTW! - Roberto Bonvallet
@Eduardo, fixed 'corazón'. By the way, ~ is tilde; you meant accent. :-) - Jonik
(2) we have the subjunctive mood in English too. "If he were president..." It makes sense to distinguish hypothetical situations from things that actually are true. - Neil G
Name a language that doesn't have irregular common verbs (esp: to be, to go, to do) - Dinah
OK, once again folks - this was a joke answer. I thought it was funny to pick Spanish in a context where "programming language" was clearly implied. I have taken linguistics and I realize that every language has irregularities, and in fact, the most common words are the most irregular (because for rarely-used words we forget the rule and default to something that sounds normal). THIS ANSWER WAS A JOKE. :) - Nathan Long
+1 for TMBG - eyelidlessness
(10) #4: corteza, piel, concha, cáscara, vaina, pellejo, escama, costra, monda... If you don't know the words it doesn't means that they don't exist. - Pedro Ladaria
@chris, that's true, for instance 29 of the 30 most used Dutchs verbs are irregular. Only 'maken' is regular. - tuinstoel
"If he were present" is not in the subjunctive mode, it's in the conditional mode. English doesn't have a subjunctive mode. - René Nyffenegger
that's why there are no programming languages based in Spanish :-p (ok, there are one or two, I can recall "Lexico" XD) - fortran
About #5, may I suggest that you listen to some songs by Sr. Chinarro. - Daniel Daranas
@Rene - I think English may have a subjunctive, or at least used to. "Be he live or be he dead, I'll grind his bones to make my bread." "Be he dead" might be translated "esté muerto"... - Nathan Long
Fortunately English has fewer irregular verbs than Spanish, it lacks the subjunctive mood, and it has no word selections that are different than the first language of learners. Oh, wait... - pc1oad1etter
(1) if you think all those words are cascara and all songs have corazon your problem might not be spanish per se, but venezuelans :) on the other hand all r'n'r songs have the word baby and they still rock. - user179997
Lol funny answer just keep up with it and sound all smart pants, @Jonik, it is called tilde. Accent is the stronger intensity on a syllable when pronouncing it, tilde is the actual little mark that goes over any letter to specify it is pronounced different or to distinguish it from others. Of course, since tilde is most commonly used to denote accent, the word accent became a sort of synonym of the word tilde. - Francisco Noriega
There are two kinds of past tenses and that is really bloody and make Español more complex language. They are preterite and imperfect. - Bakhtiyor
[+50] [2008-11-11 22:31:21] Don

Here are some things I dislike about Java (which is not my favorite language):

Inability to catch multiple exceptions (of different types) in a single catch block -> will most likely be added in Java 7 - Jorn
(2) Thank god! Now I will see shit like try{ ... }catch(Exception1 e1, Exception2 e2, java.sql.SQLException e3 ... ){ ... } Hmmm... that's gonna get ugly - Ubersoldat
yeah, and you wont know what exception you are dealing with... - Svish
(1) @Svish - I think is the point is that you would only use this construct when you don't care what type of Exception you're dealing with. In other words, when you want to handle them all identically - Don
(3) I wouldn't call a lack of destructors a flaw when the language has a GC, and a GC that's gotten better and better with each release. Destructors were missed in java 1.1.8 but not in java 6 because gc is so vastly improved. - Mike Reedell
(6) C# fixes all of these except catching multiple exceptions. Generics are reified, destructors are replaced by using/IDisposable, closures are implemented by anon methods and lambdas, exceptions are unchecked, there are collection literals, and there is 'var' to avoid specifying the constructed type twice. - Daniel Earwicker
(1) Java definitely has closures. An anonymous inner class closes over local final variables in its scope. I agree that anonymous inner classes are not a proper substitute for anonymous functions, but they are closures. - Adam Jaskiewicz
Re inability to catch multiple exceptions - please name a language that does support this. At least it is planned for Java. The planned implementation might not be elegant but that is better than making no effort to solve the problem. However if you meant SQLException should have been unchecked then I agree. - finnw
(1) Anon inner classes are NOT closures: try creating a visitor callback with something like "sum += current.amount()" in it, where "sum" is a non-final variable from the enclosing scope. Close, but no cigar. - Roboprog
The lack of destructors: how could I forget. That often sucks mightily. - Roboprog
type erasure is really annoying. - fastcodejava
@finnw: Well since you asked, Python supports catching multiple exceptions (as a tuple of exception classes) in a single except clause. - Don O'Donnell
@Roboprog This is due to the fact that everything in java is pass by value. If your created a Ref<T> class that held a T[1] that was access via a get/set pair, you'd be able to pass a local final Ref<Integer> into an anon function and do myRef.set( myRef.get().intValue() + current.amount(). Now I should go try that to make sure it actually works. - KitsuneYMG
Anonymous inner classes are syntactic vinegar (the opposite of syntactic sugar) for closures. - Gabe
[+39] [2008-11-11 22:26:42] grieve


  1. Template Syntax
  2. Diamond Inheritance issues
  3. The plethora/lack of standard libraries that modern languages have (though boost comes close).
  4. IOStreams
  5. The syntax used around IOStreams


  1. Spaces are meaningful (sometimes)
  2. underscored keywords
  3. Limited thread support (at least currently)
  4. "self" instead of "this"
  5. Spaces are meaningful (sometimes)

(80) You can refer to "self" as "this" is you really want to (although it might be hard for others to follow). "Self" isn't a keyword, and you can name the variable anything you want. - mipadi
(1) Could you split these into two separate answers? - wnoise
(36) there you go, I would actually list the meaningfulness of whitespace (especially indentation) in Python as one of its biggest pluses... ;) - Oliver Giesen
(2) @Oliver - I agree, but it gets confusing when you mix spaces and tabs. Tab space space is not the same as any number of just spaces. - Tom Leys
(4) Personally, if I were to make this list, I'd list "Spaces are meaningful" 3 or 4 times. - Paul Wicks
@wnoise: I could, but laziness overwhelms. - grieve
@mipadi: Damn! how did I not know that. Thanks! - grieve
Why the emphasis on "sometimes"? - Joshua Swink
I don't know Python, but the "sometimes" seems of quite an interest! - call me Steve
(22) "spaces are meaningful" is one of the best features of python!! p.s. try to run this in an interpreter "from future import braces" - hasen j
@mipadi why do you need to give a name to "this" in the first place? Why cant python do it like everybody else (say C++/C#/Boo)? - SDX2000
(2) The way python methods are implemented (they are just a funciton with the object as the first parameter) allow all sorts of flexible tricks, for example monkey patching. Is it really that hard to write "self, " once for each method? - gnud
(1) spaces and tabs not being equal frustrated me too until I set my editor to 'replace tabs with spaces'. The whitespace syntax I find very appealing. - Josh Smeaton
(4) I disagree with pretty much your whole python list, except thread support. Whitespace is not meaningful, indentation is meaningful; there's a big difference. - Christian Oudard
@Gorgapor: You are welcome to disagree, I am certainly no great authority on anything. :) I will point out, however, that you achieve indentation by using whitespace. - grieve
(1) @Oliver - mix your space and tabs, and you're going to have a real fun time debugging. It will waste at least a good couple of minutes (if you're experienced in python), and you'll feel like an idiot when you finally found the problem after stressing over it. It happens more than you think, and the lack of real tokens for code blocks makes it impossible to attempt to put the code back in some kind of order. - Calyth
@gnud - yes. yes it is very hard to write self for each method because it shows that Python, historically, didn't think of OOP. The Python interpreter should take care of that. You'd think that with all the other OOP languages getting the self/this pointer right that Python would eventually fix that crap? - Calyth
(2) I really enjoy the Python's aspect of "self." It finally taught me how to think of OOP. It would be so easy to write a C++ program in C now (with regards to classes). The "methods" would take the object (structure) as its first argument. Of course, many things would still be lacking in C, but writing from an OOP perspective would be must simpler now. - Noctis Skytower
Oh god, Python's threading support or lack thereof is ridiculous. I disagree with the keywords though. I believe that a lexical differentiation of this sort is necessary in this case. - orokusaki
(1) just be glad its not like the language whitespace - mikek3332002
@Calyth It doesn't show that Python forgot to think of OOP; it just shows that they are following their philosophy of explicit is better than implicit. If you don't know what I mean, run import this - crgwbr
(1) So spaces are not meaningful in, say, C? if(condA)foo();elseif(condC)bar(); - badp
(1) @call: they are only meaningful in indentation: if x and y: and if     a     and     y: and if a and\ny: are perfectly equivalent. - badp
imho: Non of the points mentioned for python are bad (except [a python keyword] #3). I like that Python do things in its own way. :) - Joschua
(1) If self wasn't explicit, then understanding python's scoping rules would be more difficult. Python's scoping rules are very different to other conventional languages. - Arafangion
(3) Wow. It's like no one invented a text editor that highlights/shows whitespace/tabs as special chars (What, are you coding in notepad?). Also, if you expand tabs to spaces, please go die in a fire. - Fake Name
(1) Python threading is crap, though. WTF can't I change thread priority? - Fake Name
@Fake Name: Jython, my friend. Python has no language concurrency constructs, so the best you can do is grab a library for it. - Longpoke
(1) People rejecting Python due to whitespace is the most retarded thing I can imagine. Braces are just redundant in C-like languages, since all good code is indented anyways. You don't even need to indent all the time in python, you can separate statements with semicolons (although, just like in C-like languages, nobody does this, because it's retarded) print 'hurr'; print 'durr'. Although I wish I could make anonymous functions/classes, which is natural with braces, but hardly any big deal, plus you can use lambdas a lot of the times for this. - Longpoke
What's wrong with underscored keywords? Python does its best to stay out of your namespaces. Instead of, say, defining the sequence protocol as requiring your objects to have a 'length' method, it requires them to have a len method which is called be the 'len' function in the builtin namespace. As far as I can tell, Python never requires you to have a non-underscored name in your objects for its own mechanics. - Dan Ellis
[+37] [2008-11-12 03:01:42] Kendall Helmstetter Gelner


1) No namespaces, just manual naming conventions - I don't mind the that in terms of class separation, but I do miss being able to import all class definitions in a namespace in a single line (like import*).

2) Libraries still have some holes in important areas like RegEx support.

3) Property syntax is a bit clumsy, requiring three lines (in two separate files) to declare a property.

4) I like the retain/release model, but it is easier than it should be to release a reference and then accidentally make use of it later.

5) Although not really a language feature, Xcode is so intertwined with use of Objective-C I can't help thinking about that aspect... basically the autocompletion, is very iffy. It's more like a system that rewards you for finding something you want exists, and then presents it as a choice afterwards. But then I suppose I never have liked autocomplete engines.

(2) Agree about the namespaces, prefixing classes with letter codes is dumb. And I would add missing support for real class variables, I don’t like faking them with file statics. - zoul
Definitely agree with the property verbosity. It ought to default to @synthesize until you tell it otherwise. I also have a gripe with the amount of C-ness and the amount of code needed to move between C and Foundation types. - Graham Lee
(2) Objective-C properties. Seriously, they are shocking, I can't understand the hype especially seeing how well C# does them. - Justicle
I really like codesense, but it's still not what it should be. I personally think that it needs to take time and frequency into effect. If you've been using a lot of NSPoint recently, it should be the first suggestion, and it should pop up faster. - Sneakyness
Don't forget the message sending syntax: [[[someObject sendMessage] doSomethingElse] doAnotherThing]; Making sure the # of open/close brackets match up is a PITA for especially complex messages, it's like I'm working in LISP again. - drewh
(6) Actually I really liked that aspect of Lisp and ObjC - you just need an editor with good brace matching, like Emacs or XCode. I usually type braces in pairs before I type anything in them, so I don't really run into problems with matching... and XCode can also highlight the region enclosed by a brace just by double-clicking on either containing brace. - Kendall Helmstetter Gelner
@synthesize should make it in there. YES/NO for boolean values. Named parameters. Strange mixture of dot notation and []. - Chris S
(1) @Chris S: Are you saying YES/NO for booleans is a bad thing? And more importantly, are you saying Named Parameters are a bad thing?? I can understand bools, but named params are possibly one of ObjC's best features (in terms of readability). - jbrennan
(1) named parameters rock! I like YES NO it makes code more readable. - nickthedude
Property syntax really requires four lines, if your properties are marked retain and you don't want to leak memory. - Frank Schmitt
(1) Yes/no is too VB-esque for my liking. Named parameters are good if the method has many, many overrides, but pointless otherwise - Chris S
(3) Maybe I'm a masochist, but I like prefixed class names. It makes google and documentation searches crystal clear, there's never any confusion about what kind of string your using if the class is called NSString. - kubi
@kubi: That's a really good point, but I'd still like to be able to import a prefixed group all in one import... the way you get with package imports like #import <MapKit/MapKit.h>. I guess I could set it up that way myself... - Kendall Helmstetter Gelner
[+36] [2008-11-15 10:35:47] peterchen


Granted, a lot of that is beyond strict language scope, but IMO the entire toolchain needs to be judged and needs to evolve.

Looking documentation on the STL is like looking for manuals on how to build a graphics card from scratch. - Aviral Dasgupta
Frankly, most of these points sound like you never quite bothered to learn C++ properly... this gets rather obvious in #3, since inclusion guards are something that every C++ programmer should know. I'm not sure how to understand Point #1 either, are you confused about std::string? maybe reading a good documentation and/or tutorial on std::vector (and why you're not supposed to use std::string in places where it was never designed for) could clear that up for you. - nebukadnezzar
@nebukadnezzar: I found Meyers illuminating on the STL, but it doesn't solve the fundamental problems. Frankly, this sounds like you never had to maintain a large project, you never had to hunt down a circular dependency in a dozens-deep include hierarchy. I know include guards, but why do we have to bother with them? BTW. they don't fix every problem. How "standard" is a std::string if I can't use it half of the time? (C++0x at least fixes that, but I'm still stuck with dozens of libraries that use different string representations). - peterchen
but why do we have to bother with them (inclusion guards) - because C++ doesn't have modules. How "standard" is a std::string if I can't use it half of the time? - I think that depends on the way you use std::string. The string class allows you to access the string data as const char* via std::string::c_str, which already makes std::string perfectly compatible with every class/function that also takes const char* arguments. - nebukadnezzar
because C++ doesn't have modules - exactly my complaint: the build model is antique (I'd just accept any other solution than modules, too). ----- perfectly compatible - but perfectly incompatible with many other scenarios (I'd argue C++0x fixing this says I do have a point here.) I'd be happy if std::string had been pervasive enough to have been adopted as THE string class 10 years ago, but it wasn't - the other complaint. - peterchen
@peterchen exactly my complaint: the build model is antique - I see how you mean it now. But seeing how it simply is not a module system, you will have to live with inclusion guards. That is, I doubt that there will ever be a module system for C++. I'm still not sure what you mean about std::string - if any function takes a const char* argument, you just pass std::string::c_str along, and be done with it. - nebukadnezzar
[+35] [2008-12-07 02:16:16] Daniel Cassidy


(3) For null and undefined: sometimes you really want to know if the variable has been assigned a value or not. Since null is a value, undefined is the only way to tell. Granted, the only time I've found this useful was for creating getter/setter functions. - Zach
Javascript being my favorite language, this is pretty close to the list I'd write. Exceptions: object closure/this doesn't confuse me; null/undefined doesn't confuse me; don't know what you mean by syntax for setting up prototype chains; block scope with closures (and I believe Mozilla's block scope implementation is syntactic sugar around that); I would note that the use of a variable without declaring -> global is a necessary consequence of the lack of a documented global object (window is DOM, not JS). - eyelidlessness
The lack of object closure and the fact null !== undefined doesn't confuse me either, but they're still design flaws, as well as a plentiful source of confusion with other programmers (whose code I then have to fix). Also I disagree that implicit globals is a necessary consequence -- it's just the solution Netscape chose. One possible (albeit somewhat unpleasant) alternative would be to require programmers to declare all referenced globals in every file (e.g. JSLint requires this). I am easily able to imagine other alternatives. - Daniel Cassidy
I guess I don't see object closure/this and null/undefined as design flaws. I see them as design choices, with benefits and drawbacks, and I happen to appreciate the benefits. One thing I'd add about globals is that the language does not offer any way to distinguish between global and local variables of the same name. - eyelidlessness
(1) "if one of your keys happens to be proto" -- well, it's a reserved word with special meaning. it's like complaining that you can't use for as a variable name. - nickf
(5) @nickf: The key to a hash is a string. Strings can have any value including reserved words. In particular the value "for" is valid as a hash key. __proto__ is not a reserved word. Special string values that do not work as expected when used as hash keys violate reasonable expectations about how associative arrays work in any language. They also violate the EcmaScript spec. - Daniel Cassidy
(1) How about the fact that semicolon isn't needed to terminate statements, except everyone seems to think they are so they use them. Statements are terminated by newline in JavaScript. - Thomas
(1) Thomas: Newline doesn't always end a statement. Therefore sensible coders terminate every statement with a semicolon to make the code more clear. - Daniel Cassidy
Well if you think undefined may be corrupted, you may just declare a new one inside your function... var undefined; But still, you bette use this : function isset(obj) { return typeof obj === 'undefined'; } The only way it can fail is by using is on non-declared vars. But in this case, you're able to get window.varname and it works. - xavierm02
(1) newline may or may not end a statement depending on context is one in my top 5 list - reinierpost
[+34] [2008-11-11 22:31:35] Greg Hewgill



really? how do you change the default argument? that's great! - Claudiu
If it's a mutable object, because there is only a single instance of it created, when the function is first evaluated, any changes to it will be reflected in all future calls. - Jeremy Banks
Most consider lack of static typing an advantage. Anyway in Python 3 you will be able to use function annotations for type checking. - Adam Byrtek
(10) What I'd like is an option to use static types. - Greg Hewgill
(4) BTW: init isn't really the constructor, the object was already created, when you enter there (guess what self is...). The constructor is acutally new where you get access to the class to be instantiated. - André
(90) If you prefer static typing, why is Python your favourite language? - finnw
(9) finnw: Static typing is great for some kinds of programs, and not really needed for other types. I usually don't mind the lack of static typing, but when you need it, it's really nice to have at least the option. - Greg Hewgill
The only time I miss static typing is in IDE's since static typing improves auto completion capabilities. Python 3's function annotations will fix this, for any code which annotates its functions with type information (assuming someone will come up with a standard way of doing so). - Dan
Please add: No try-except-finally construct in Python 2.x - pi
@pi: try-except-finally was added in Python 2.5: - Greg Hewgill
(1) static typing would destroy python, even if it was a built in optional feature... - Longpoke
(2) Actually, things that start with a single underscore are considered 'private' by convention. Names prefixed and suffixed by double underscores are reserved by the language. - Romuald Brunet
You can also have double underscore prefixes on methods (without double underscore suffixes) which makes them "really" private, but it's generally kind of a bad idea that will make your code less easily extendable. Better to use the single underscore convention. The default argument thing, as others have pointed out, is only true for mutable objects. In cases where a mutable object is the expected input, it's best to just have None defaults or something like that and then check for them in the body. Annoying, but once you're aware of it, not that big a deal. - dwf
@greg hewgill have you looked at ctypes? - Jiaaro
(8) I would say that lack of static typing is a feature, not missing functionality... - arnorhs
python 3 has now a (optional) syntax, that can be used for typechecking: - Joschua
if you don't like the 'self' keyword. how is it any better than having to add the 'public' for methods or 'static' for non-method functions. or override public static void FunctionName(). I much prefer self/no self over public/internal/static. private is 'var' and internal is '__var'. I agree that the underscores suck but I'd prefer python over static typing anyday (unless I was getting paid per LOC :)~). - Evan Plaice
(1) the fact that python does not enforce member privacy is a conscious language choice. It wouldn't have been hard to add this, but it's not there because we're all adults here. Anyone that is mucking about in the implementation of a class knows what he's doing, and is doing it for the right reasons. This is fine! If a pythonista doesn't need to muck with the implementation, our good sense will prevent us from doing so, because it's undocumented or some such and we don't want to write fragile code. - TokenMacGuy
[+32] [2008-12-22 05:36:30] Jay Bazuzi


I'm really reaching here. I think C# is fantastic, and it's hard to find much that's broken.

(14) +1 for switch on any type - oɔɯǝɹ
+1 for switch issues, and {} issues, which I hadn't really thought about until now - Maslow
I hate {}. They look too much like (). Mismatching has never been much of an issue to me because I always put them at the same level unless they are basically one-liners. - Loren Pechtel
(2) +1 for the linq query. Especially when you only want one object returned. Instead of (from x in y select).first(), why not a (from x in y select top 1) or something to fit closer to actual sql syntax. - AdmSteck
if you wish you could switch() on any type, and that case could be any expression check out F# pattern matching.… - gradbot
+1: because C# belongs on higher place on this list ;-) (Oh, and the LINQ thing) - GvS
+1 for the LINQ method call thing, and I'd give +45 for switch()ing on any type. - drharris
switch on any elementary type? case as any expression? Sounds like VB.Net is better :) - MarkJ
The do method is trivial to write in only 2/3 lines of code with an etension method - pretty sure many here have written one themselves... - saret
Surely switching on a type could be better handled with polymorphism? - Stimul8d
@Stimul8d: No, not switching on type, switch on any type. Not just int, enum, string. - Jay Bazuzi
[+26] [2008-11-13 14:37:57] mabwi


  1. No debugging features if you don't control the server, and even then they kinda suck
  2. The extreme amount of bad PHP code floating around gives all PHP programmers a bad name
  3. Inconsistent function naming
  4. Inability to have a static typed variable if I want one (I'm a big fan of dynamic typing 90% of the time)
  5. REGISTER_GLOBALS is the devil

(25) REGISTER_GLOBALS once ate my dog :( - Pim Jager
(2) 1: I recommend xdebug and a GUI client such as MacGDBp. That really eases some of the pain... I agree on the other points. - Jonas Due Vesterheden
(3) #2 == Wordpress - Jason Miesionczek
(5) #2: Oh god, don't get me started on that. I always have to defend myself as a PHP developer against people who only have seen the mess that many people create with PHP. - Techpriester
(1) +1 for #2 I've spent far too much time defending myself as a PHP developer. - Unkwntech
+1 for #2 -- results in bad salary too :( - Shiki
I heard that: A long time ago, Chuck Norris got angry with the world and roundhousekicked REGISTER_GLOBALS from hell until it got to PHP. - Javier Parra
There are IDEs such as NuSphere's phpED that comes with their own debugger that will work with any server, regardless of your level of control. Also, you can use any debugger, like you said, when using your own server, such as localhost. You wouldn't want to do line-by-line debugging with a live build anyway. - asnyder
[+25] [2008-11-11 22:38:47] Bill the Lizard

C (OK, it's not my favorite, but it hadn't been done yet.)

EDIT: I could probably come up with more if I resorted to more library code (like I did with sockets, but those are particularly bad), but I already felt like I was cheating for picking on C. So many languages exist only to take the good parts of C and replace the bad that it's kind of like beating a dead horse.

(22) What socket syntax? C has no concept of sockets. - Ferruccio - Bill the Lizard
(3) Oh, c'mon! You can come up with five. Doesn't pointer arithmetic just suck? :) - brian d foy
Actually, I've never understood what sucks about it. I learned it from K&R (like most people, I imagine) and never had much problem with it. - Bill the Lizard
Okay, the peer pressure got to me. I came up with one. (I could never cut it as that 5th dentist.) - Bill the Lizard
(8) +1 I laughed at "C-style strings." And @brain_d_foy: pointer arithmetic only sucks if you don't understand it. - Chris Lutz
(1) @Chris Luts: Even back when I was learning plain C (before I knew C++ or any other OO language) I just knew there was something wrong about char arrays. :) - Bill the Lizard
(2) pointer arithmetic is a power saw - very efficient, but you risk taking your whole leg - Thorbjørn Ravn Andersen
(1) library != syntax - Longpoke
Seriously.. the "Cryptic syntax" point is valid, but should refer to actual syntax (i.e: type declarations) to get the point across. For example: char *(*(**foo [][8])())[]; Not to mention the standard library is a useless piece of crap. "No function overloading" is also a pretty bad point... C is meant to be a portable assembler, not an OO language. - Longpoke
@Longpoke: Nobody said library == syntax. There's nothing particularly OO about function overloading. Plenty of languages have it, and I always miss it when I write anything in C. - Bill the Lizard
@Bill: Well it would be kind of useless since C isn't good for anything but glue code these days... - Longpoke
@Longpoke: Maybe if it had nice features people could stand to write more than glue code in it. :) - Bill the Lizard
@Bill: Yeah well it would also need a total remake, I find programming assembler more intuitive than C (although I'm not sure if it's possible to effeciently remove all the undefined behaviour, but at least the syntax and semantics could be fixed up quite a bit). I've always been hoping to see a modern version of C be made, Ada, D, C++, and Go are too big to be called that. - Longpoke
@Longpoke - no one considers assembler more intuitive than C. You can't be serious. Hate C, OK. But implying assembler is somehow easier than C is disingenuous. Have you ever looked at the assembler output of a good C compiler? - xcramps
@xcramps, The syntax, not semantics, (although the semantics are equivalent to a very well documented library). Take C vs the style of Intel x86: in C, a pointer dereference is *x, while in x86, it's [x]. Now imagine if you could expand that how Ollydbg does. double dereference would be [[x]], while in C it's **x. call deref would be [x](), while in C it would be (*x)(). func pointer declaration: [int function(int a, [float] b)] x, vs int (*x)(int a, float* b) x. clearly the former is superior. heck anything is better than C syntax. - Longpoke
but yeah, that would be if Intel x86 assembler syntax was generalized to a C like language. nonetheless the restricted subset that's allowed is very easy to comprehend compared to C... - Longpoke
[+24] [2008-11-11 22:50:52] David Thornley

Common Lisp:

  1. Keywords are often too wordy.
  2. Library support is pitiful.
  3. Doesn't work well in OSes that want to handle memory more strictly.
  4. Doesn't have good facilities for interacting with the OS.
  5. The "loop" facility is not well defined, and sure doesn't look Lispy.

(2) 'loop' might not be lispy, but what's poorly defined about it? - Daniel Cassidy
(2) I haven't read the standard myself, I'm mostly going on Paul Graham's "On Lisp". He says the standard is mostly examples, and doesn't define corner cases at all well. - David Thornley
(3) don't you mean keywords-are-too-wordy ? - GClaramunt
I agree that it isn't "lispy," but CLtLv2 spends a lot of time on it. I just think it was designed to do way too much.… - HVS
In addition to "loop", "format" is also not very Lisplike. I hate "format" and "loop" both even though Lisp is my favorite language. - Paul Reiners
[+24] [2010-05-26 06:33:28] a paid nerd


(6) There's no namespace or dynamic module support. How can we be expected to write chemical plant control systems without such basics? - Donal Fellows
No syntactic sugar, such as >10 (move 10 times), 0 (insert zero), +5(add 5). - Squall
[+23] [2008-11-11 23:44:18] BoltBait


  1. numbers as strings - Math can be frustrating when numbers are intpreted as strings. 5 + 2 = 52? Grrr...
  2. permissions - all the best stuff requires permission from the user!
  3. screen updates - The browser must be in the steady state to update the screen. There doesn't seem to be a way to force the screen to update in the middle of a script.
  4. Slow - although Google's Chrome is nice...
  5. Browser differences make using the language a [censored].

(4) The numbers as strings is easily fixed. If you've ever got a string, you need to parseInt(x,10) it. The giant fail is when you leave out the ,10, and it interprets '017' as OCTAL - Orion Edwards
What I have been doing is multiplying all of my numeric variables by 1. That seems to force Javascript to read them as numbers. And, it doesn't convert decimals to integers. - BoltBait
Didn't everyone learn that 1+1=11 when they were a kid? - Flame
(3) false == 0 == [] == "" but null and NaN are not. NaN != NaN. null == null. - Jimmy
(7) typeof "a string" == "string". typeof new String("another string") == "object. new String('a').constructor == "a".constructor. typeof new Array() == 'object' - Jimmy
for(x in list) returns the indices rather than the values. - Jimmy
(1) for(x in object) returns functions - Jimmy
(ok, not javascript technically) domelement.onmouseover/out fires against child nodes. - Jimmy
@boltbait, that probably just translates to a parseFloat(str) call. javascript does treat numbers and strings as different types. - Jimmy
function rather than block scope, this causes not only the standard looping counter headaches but also manifests as sometimes requiring extra functions in loops just to provide closures around variables - Jimmy
I used to stay away from JavaScript until I found - now I love the language! Takes care of 4 & 5, and reduces the pain of 2 & 3. Now I'm longing for a JavaScript compiler... - Joe Pineda
@Jimmy: NaN != NaN is important (and C's fault anyway) - ysth
ok, perhaps NaN!=NaN isn't a 'real' problem, but [NaN, null, and <undefined>] form an unholy trinity of confusion. Add in isNaN(undefined) == true, undefined==null, undefined != NaN, for example. - Jimmy
personally i think NaN != Nan, null == null, null != everything else, NaN != everything else makes sense - Dan
(14) -1, this list is mostly about browser issues, not the language itself. - Mauricio Scheffer
@mausch: Yes, but IE support is a real "clusterbomb", no? - Roboprog
typeof null == 'object' - I.devries
@Mauricio, how would you use the language except in a browser? - BoltBait
@Jimmy: isNaN(undefined) == true that makes perfect sense, undefined is NotaNumber you wouldn't expect isNaN('string') == true to return false, would you? - Javier Parra
@Jimmy: a little clarification isNaN doesn't test if var == NaN it tests if ` typeof var != number` - Javier Parra
@BoltBait: Mozilla Rhino, Windows scripting host, node.js, just to name a few. The question is about languages, not about particular runtimes or environments. - Mauricio Scheffer
[+20] [2008-11-11 22:32:36] okoman


Nevertheless PHP is the (scripting) language. ;-)

OK, only one more thing to go! - brian d foy
there's a fifth. - Alister Bulman
(4) Totally agree with point 5 - would be on a Javascript list too. - Steve Claridge
I disagree with "all the poor programmers that don't learn how to make it work properly, and give it a bad name". I'd replace it with "massive tacked on runtime language configuration options". - Longpoke
[+18] [2008-11-12 03:54:41] Asrrin29


  1. Windows only.
  2. No longer supported.
  3. Arrays can start at any number, rather then all being normalized to 0.
  4. compiled applications depends on many dll's to run properly.
  5. Many complicated controls like a browser control or complicated pieces of code tend to break the IDE when you run code uncompiled, but work just fine when compiled.

(13) VB is someone's favourite language? O_o. Why isn't "syntaz that is completely different and incompatible with other languages" and "gives bad habits with regards to other languages" here? - Jonta
just out of curiosity, what bad habits? I need some ammunition against my VB6 colleagues.. ;-) - petr k.
(3) I actually find #3 a very powerful feature, not a bug - I'd really love VB.NET had this. AWK has it, in a sense, but then in AWK arrays are really hashes in disguise :( - Joe Pineda
@Joe: Maybe you should program in PL/1 or Pascal where you can start your arrays from anywhere :) - Adrian Pronk
(3) On 1 and 4, and .NET C# doesn't require A COMPLETE FRAMEWORK and Operating System??? (hey, I heard that you mono bigot... it's still a "complete framework" for you, and I doubt a debian dist ever eats it). Regarding 5, no right-minded VB6 programmer (back in the day) kept the default "Compile On Demand" option ON... - jpinto3912
(2) Still have to support vb6 occasionally. Pet pieves: can't initialize a variable at declaration, no parametrized constructurs, one class per file, etc... If they would fix these issues, the language could go on for another 10 years easy. - AngryHacker
(14) What about "On Error Resume Next"... thats like saying "this code is F**KED, but lets keep running it anyway. =) - StingyJack
It's a pity no 2 didn't come sooner, then I would've had to be taught it in Highschool. - mikek3332002
I will add these: 1 No brackets! 2 Variable declaration. 3 Function calling and array accessing. - Secko
(1) Also, many older VBx installers did not check the 'minor' part of Major.Minor.Revision.Build on DLL versions and would actually end up downgrading system DLLs. - JBRWilkinson
The different syntax is actually not that terrible. What is more informative, C's and friends' }, Pascal's/Ruby's end, or VB's End If? (or Wend? har har har.) - badp
[+18] [2008-11-13 00:09:46] Orion Edwards

Ruby is my favourite language, here's what I don't like:

(3) Have you tried Ruby 1.9.1? It offers a vast speed-up compared to Ruby 1.8.6 - Christian Stade-Schuldt
Try jrubyc. JVM JIT FTW! - KitsuneYMG
+1 for including reasonable problems, as opposed to the 'hates' the from the top-rated Ruby answer. - Phrogz
[+17] [2008-11-11 22:44:07] Gamecat


(5) All of these seem to be complaints about Delphi the IDE rather than Delphi the language (AKA Object Pascal) - Don
(11) Presumably that's because Object Pascal is perfect ;-) - Mark Bessey
Ehm, I love Object Pascal because it's what I started with ... but every IDE since D7 was an utter failure. Mostly due to the insane instability since D7, no version after that has run properly on my systems (and I've used it across 3). - The Wicked Flea
@The Wicked Flea: things are supposed to have become a lot better since Delphi2007, and that's also actually my own experience... - onnodb
Delphi 2007 is rock-solid. I use it everyday and it just works. I previously used Delphi 2005 for about 3 months and it really really sucked for me. Delphi 2007 is sweet. - Mick
Delphi 2009 is a lot more stable than Delphi 2007 yet, I cant imagine working with a old version animore. - Cesar Romero
I still use delphi 6 and love it... - MikeJ
(3) I'm a bit late to the party, but here goes anyway: - having to write down method signatures twice (interface + implementation) - Unit name is REQUIRED to be identical to the file name. WTF?!? - Martijn
The IDE has reasonable code completion so you're writing method signatures ONCE. Keep in mind that with Delphi, it really is a one stop shop - the IDE and the Language really come in together. - Arafangion
Carpal tunnel from having to type begin and end all these years... - dverespey
@dverespey At least you don't need to use the shift key { :-} - Gerry
(1) I find the begin..ends to be superior--they're much clearer than {}. You spend a lot more time reading code than writing it. For a gripe, though--you can't use defined subranges of enumerated types in a case even though it's perfectly legal if you declare the range right there in the case. Also, no forward references across units. - Loren Pechtel
isn't Delphi dead as disco by now? - AlexanderN
(1) @AlexanderN: No, it has never been more alive, popular or great. - Andreas Rejbrand
+1, easy to build, optional namespaces, clear syntax - arthurprs
(1) You forgot: The compiler enforces type safety with a strictness unknown to many languages, yet considers strings as "special". Changes the size of 'char' depending on compiler, has a confusing implementation of "Interfaces", which turn out to be almost completely unrelated to classes - classes are to object oriented programming, whereas Interfaces are as to Microsoft COM interfaces! Classes are not reference counted, but interfaces are! - Arafangion
Interfaces may be reference counted if, for instance, the implementations subclass TInterfacedObject. But interfaces do invoke "compiler magic" at the entry- and exit-points of a procedure/function. - Frank Shearar
[+16] [2008-12-07 15:19:00] Andreas Grech


AFAIK, all extensions to the JS language (not the DOM) by browser vendors have at least been pushed for standard adoption—even if the standards process has failed to achieve that. hasOwnProperty/workarounds: double-edged sword. To force the "simplicity", we lose a lot of power and flexibility. That complaint always pisses me off. Write your loops right (and check your object members right too)! - eyelidlessness
[+15] [2008-11-12 01:25:07] wnoise


  1. Space leaks from lazy evaluation.
  2. Numeric Hierarchy not constructed with regard to mathematical abstractions.
  3. Strict monadic IO can make it harder to debug.
  4. The big implementations handle I/O in ways that don't seem quite compatible with the standard. (In particular, outputting characters only outputs the low 8 bits -- and then code gets built that uses this assumption to do binary I/O. Ick.)
  5. Associativity of ($) operator could be changed to make some expressions prettier.

Most of these don't rise to the level of hate, and there are people trying to fix or construct solid workarounds for each of these.

Edit: There's been some confusion about point 5. In particular some people seem to think I meant the order of arguments, which I don't. Rather than explaining what I meant, I'll just point people to the following link, , which expresses it well.

(3) Why would you want to change the associativity of ($)? 'f g h x' brackets as '((f g) h) x' and 'f $ g $ h $ x' brackets as 'f (g (h x))'... - Erik Hesselink
(1) I <3 Haskell. The standard library needs to include mountains of mathematical abstractions, including vector spaces et al. The prelude also needs an operator which chains just like ($) but from left to right { source |> func1 |> filter func2 |> map (func3 10) }. - Justice
(10) You missed out the really bad one: the tendency of Haskell programmers to use one letter variable names. - Benjamin Confino
(1) A left-associative ($) operator is just function application, which in Haskell is represented by the space character. @Justice: Try the flip function. (|>) = flip ($) - Apocalisp
I was with you up to the $. An infix right-associative identity function is the best thing ever. - Norman Ramsey
The lack of cast operators(string to int), odd syntax for IO, & list only access were my hates - mikek3332002
(1) Can someone explain the point of #5? I thought right associativity was the whole point of ($). - Tim Matthews
(1) The thing I hate the most is the ugliness of working with mutable arrays (example: ). However, dynamic programming with immutable boxed arrays works very nicely. - Joey Adams
6. Difficult to work out time and space complexities due to laziness. - j_random_hacker
(1) 7. Half the useful things in the language are described in a huge DAG of research papers. - j_random_hacker
8. Basic stuff like recursing through nested data types requires either a pile of repetitive boilerplate or a language extension (rank-2 polymorphism for SYB) - j_random_hacker
9. Point-free style! What's the point? Other than to satisfy some masochistic minimalistic craving? (Of course half the time it won't automatically typecheck due to the monomorphism restriction.) - j_random_hacker
10. It's hard. It's taking me forever to get beyond newb. I love it though :D - Matt Ellen
@Erik Hesselink: @Apocalisp:, @Tim Matthews:, See the link I added. It's a subtle point. The dollar sign seems to replicate function application via " ". The utility is the different precedence it has. The associativity is a minor point, but just as left associativity is nice for function application, it's also nice for this bracketing and mixing with function application. - wnoise
(1) @Eric, Norman, Apocalisp: If you flip the associativity of $ it can be used to delimit multiple arguments. f $ x y z $ quux quaffle becomes f (x y z) (quux quaffle), the utility of the right-associative $ is still present, because if you wanted the other meaning for that you can use f . x y z $ quux quaffle. - Edward Kmett
[+14] [2009-12-28 02:07:12] rockacola

Chinese (as written language)

Inspired by hilarious (yet to the fact) answer [1] on English. I feel like posting something not as original as fun facts.


..and the same script is also used by Japanese Kanji. - JBRWilkinson
(4) how about "Not phonetic!!!!!" So if you find a character and want to know how to pronounce it, there's no way you will ever know unless you ask someone or look it up in the dictionary. - Jacob
@JBRWilkinson: Japaneses writing system is another worth-mention due to its combination of 3 categories of character system. @Jacob: Kids grow up with phonetic character system like Korean or Japanese would be consider as lucky. - rockacola
(1) English is not strictly phonetic either "I take it you already know, Of tough and bough and cough and dough..." - J.F. Sebastian
@Jacob: For most characters, Chinese is pretty phonetic. Usually, the right side tells you the pronunciation of the character. - FUZxxl
[+13] [2009-04-09 16:23:32] BlairHippo

I know I'm late to the party, but hate is timeless!


-1 java tells you which object it is, it's the one before the . or [] operator in the first line of the stacktrace - flybywire
(3) Uhm, no. It will tell me which LINE it's on. If there's only one object that could be null on that line, that's sufficient. If there are multiple objects on that line that could be null, I have to guess. - BlairHippo
@File IO: Moving files is painful, but Java's IO API is not that bad. I used to hate it, but that's before I learned about encodings. Now, I find it quite handy. Of course, if you just want something like C#'s ReadAllText/ReadAllBytes, it's still inconvenient. - luiscubal
[+13] [2008-11-11 22:48:39] Stephan Eggermont


How is the first something you hate about Smalltalk? - ysth
(5) Smalltalk made me much unhappier over other languages, that's not nice. - Stephan Eggermont
@ysth: since my day job uses C++ to exclusion of (almost) all other languages, anything that makes me like it less could hurt my morale. :-) If my goal was only to feel better about my day job, I'd learn Intercal! - Aaron
[+12] [2009-01-09 16:25:59] PhiLho


I love this language, but there are some things that bug me for years!

Not sure exactly what you mean with "long string concatenation", but lua has one facility for building strings: pack a table of strings, and make the result with table.concat(..). -
I greatly miss the continue statement when I'm using Lua. Pretty much entirely because I find less indentation levels more aesthetically pleasing. - David I know, and use it, but yet I feel there is some waste of memory in this process (can be wrong, though). Anyway, it is really a minor issue... :-) @David: I agree on this one too. - PhiLho
[+11] [2008-11-13 13:00:22] StingyJack


+1 for UpperBound array declaration. I dislike optional parameters too, but the C# guys are clamouring for them? odd. According to someone (can't remember who, on SO) said that in vb11 will allow mid line breaks (think fluentInterfaces) with out the _. I look forward to that :) - Pondidum
past .Net, there's no good reason for you to stay with VB... go C#. - jpinto3912
(3) c# is getting optional parameters, and I miss them - Maslow
(1) Do some office interop work. You'll end up praying for optional parameters. - wefwfwefwe
@wefwfwefwe - I have, but I just see it abused too much. - StingyJack
Nothing being null as well as default(T) for value types. This leads to such nice effects like If(True, Nothing, 5) returning zero! - Heinzi
(1) How do optional parameters lead to sloppy coding habits? - helium
Because you or the next dev can "forget" to set the parameters in the correct order on a method call, and cause yourself additional debug/troubleshoot/recompile time. Once this pattern is established, it will continue to be used, leading to additional time wasted. - StingyJack
@jpinto3912 - VB has literal XML handling that C# doesn't appear to have yet..… - JBRWilkinson
In VS 2010 you don't have to use _ in most of the places you used to have to. - Kyralessa
[+11] [2008-11-26 19:26:10] J.F. Sebastian


[+10] [2009-05-27 04:25:07] james woodyatt

Objective Caml

  1. Non-concurrent garbage collector. I can write multi-threaded programs all day long, but they're only ever going to get one of my eight cores at a time. This makes me sad.

  2. No type classes (or their moral equivalent). There's Furuse-san's GCaml [1], but it's A) not quite as good as type classes, and B) not in the INRIA distribution.

  3. Badly in need of a Cocoa bridge. Seriously. If I wrote more code with actual interfaces to DNA-based life forms, then I'd probably break down and write the damned thing myself. Why hasn't anybody else done this yet?

  4. Functors are abominable. Seriously, modules ought to be first-class values. There should be only one kind of function. Read Montagu and Rémy [2] before you flame me for this.

  5. Should use LLVM for its back-end. Who do I have to murder to get OCaml to compile for my stupid little ARM6 core?

So yeah, I have some issues. I still love the language to pieces. It's totally awesome.


(1) I agree 100%. OCaml is a language that I want to love so much, but just won't ever use it because of a combination of the factors you list. - Jason Baker
(1) Hey, so it turns out that OCaml-3.12 adds first-class modules. I should edit my original entry to replace item 4 with item 5, and append a new item 5: tagged boxes. Seriously gentlemen, I think the debate is settled now-- the spineless tagless G-machine is the proper way to lower functional languages into stock hardware. Please fix this at the same time you add the LLVM back-end and the concurrent garbage collector. I don't want to lose the 'mutable' keyword by going to Haskell, but the temptation is near overwhelming. - james woodyatt
[+9] [2008-11-11 23:03:05] Lance Roberts

VBA (including MS Office IDE):

1) Poor Documentation
2) Poor Error Messages
3) Inadequate Array Manipulation Routines
4) Having to repeat types for DIM statements
5) Won't print in color (have to buy 3rd party addin)

I dont get how VBA can be anyone's prefered language - Eric
(2) Because that's what I have to do most of my work in. I have to support a huge amount of convoluted, interconnected Excel spreadsheets. I hope to rewrite it all someday in a console app, but it'll take a while. - Lance Roberts
(2) i Feel so so sorry for you...:( vba is trash - Kelly
(1) @Eric: be a non CS enginneer, install MSOFFICE, and start solving everyday problems while doing your spreadsheets, docs, etc. - jpinto3912
(1) How about lack of casting from variant to its named object type. Had the problem varient/Contanct assigned to contact produced type mismatch. - mikek3332002
[+8] [2008-11-14 00:59:57] utku_karatas

Delphi (aka Object Pascal), I'll talk about the native version, not .NET.

Instead something like

auto obj: TMyObject; // compiler adds the default constructor call and the destructor call in a try/finally block.

+1 i find with blocks in delphi very unhelpfull - oɔɯǝɹ
[+8] [2009-06-16 13:27:33] SadSido

My own top-5 "what do I really hate in c++":

[5] Automatic generation of constructors, destructor and assignment operator. Man, whenever I don't declare something in the class, it means I DON'T NEED IT, not I FORGOT IT. Do you, compilers, hear me?!

[4] Template syntax. Oh, do I really need to type all these "<" and ">", whenever I decide to extract definitions from the class body?

[3] Strings. Jeez, I am fed up with "const char*", I have to handle NULL situations, I have to waste O(N) to get its length, I have to allocate a buffer for concat operations.

[2] Macroprocessing. Whenever I do not understand, what is going on with my compiler, I start looking for a macro.

[1] Operator overloading. I see the code "A + B * C" and I cannot say a word what this code is about, until I see the actual types of A, B and C.

+1 for [1] Lots of people moan that Java should have operator overloading, clearly they never coded much in C++ - Steve Claridge
+1 for all the items in the list (I wish I could give you +1 for each item of the list ;-) Re operator overloading, I'm going to illustrate that someday, by writing a very special class where all possible operators will be overloaded, and things like +, += or = will have completely incomprehensible meanings and unrelated to their semantics in C. - Arthur Reutenauer
(9) Re: operator overloading: it won't be the fault of the language but of the programmers if they write strange overloaded operators that don't do what they convey. I like the flexibility coming of operator overloading. - MP24
@SteveClaridge operator overloading isn't difficult to handle when you have managed memory and you only pass reference the way Java does. The reason it's a disaster in C++ is because you can get values or references and you have to manage the memory yourself. - TM
+1 for Automatic Constructor creation - Viktor Sehr
(2) Constructors and destructors are generated not because you forgot them, but because no matter what the compiler needs them to be there. Construction so that the compiler can call the constructors of member variables, and destructors likewise. - there's no other sensible place to call them. - blwy10
to blwy10: I would like to see an error, if I try to create an object, but no constructors were defined. I don't want to receive object with uninitialized members instead. - SadSido
re: [3] You're in luck, there are at least two dozen other implementations of string for you to choose from! - Jacob
(1) Re: operator overloading. 'A.Add(B).Mult(C)' doesn't tell me any more then 'A+B*C'. Either way I have to either look up the types and functions, or trust that the programmer gave things sane names. And 'A.Add(B).Mult(C)' is ugly and wordy. - Matthew Scouten
If (3) is biting you, you are doing something wrong. Well written C++ code uses std::string. - Billy ONeal
[+7] [2009-05-28 09:21:41] Jonas Kölker


  1. No parametric polymorphism (i.e. C++ templates). It makes writing reusable data structures and algorithms a pain (and there's hardly any static checking). See for instance the comparator argument to qsort and bsearch: the comparator takes void pointers :(
  2. No library of data structures. I really hate writing my own hash table. I also really hate scouring the web for a library of reusable data structures. Especially if it turns out to be incomplete.
  3. Strings. Inefficient representation, unwieldy if you make it sane, too hard to safely input a string. No standard for snprintf. Too hard to create a format string with sprintf, then use that to create a string with sprintf again, in a safe way.
  4. Only lexical macros. If different compilers expects function annotation in different places, I have to put the same HAS_NO_SIDE_EFFECTS in different places. Why can't I just grab the function, switch over the compiler type, and then insert it at the right place by a macro call?
  5. No portable libraries for common functionality. For sockets and threading, I use SDL---a frigging game library. For .ini-style parsers, the only library I could find which was packaged for ubuntu, I posted on the daily wtf (it calculates an array of hash values, then does a linear scan through it...)


  1. Template syntax is heavy and unweildy. Let's see, for(map<string, int>::const_iterator it = mymap.begin(); it != mymap.end(); ++it).
  2. Design errors in the STL. Should changing allocation strategy for your vector really change its type?
  3. Overly complex type system. Type T1 has a convert-to-T2 method, and T2 has an implicit from-T1 constructor. Which is called? How does overloading, overriding and multiple inheritance interact? Poorly, I guess...
  4. Incredibly long and unwieldy error messages from templates. You know what I mean...
  5. References means you can't see output parameters at call sites. In C, you can guess what foo(bar, &baz) can and can't modify.

(1) "Should changing allocation strategy for your vector really change its type?" -- I can't see how you could use more than one allocation strategy without considering it a different type. The type includes the operations upon it, and the operations must be different if different allocators are used. - Juliano
(2) +1 for C++ point 4. Template error messages make your eyes bleeed. - Steve Claridge
But when you fix all the problems in C, you basically get C++ - Calyth
@Calyth: When you fix all the problems in C++, you basically get D. :) - missingfaktor
C 2.,3. and 5. are all handled by Glib pretty well. - Helper Method
Very well written lists +1. - JBRWilkinson
(1) I agree a lot about #5: references bring so little to pointers and they obscure readers, all that for some convenience for not having to use * there in front of the name. - progo
[+7] [2009-01-12 00:47:42] Sean Edwards




It sounds like you preffer C# to C++, it supports every one of your dislikes about C++. - Blindy
I don't understand the connection between $function($arg) and closures. $function is a dynamically assigned function name, closures are basically equivalent to block scoping (and usually mistakenly conflated with anonymous functions). - eyelidlessness
I'm sorry, you're right. Closure is the wrong word. - Sean Edwards
(2) Regarding static/dynamic typing, your ideal system seems a description of C#. - luiscubal
luiscubal and Bindy: Funny you say that. Since writing this, I've been using C# a lot more, and it is wonderful. - Sean Edwards
[+7] [2009-01-12 00:50:58] brian


  1. It's damn slow
  2. The egotistical community
  3. It's not quite smalltalk
  4. Errors when calling methods on nil rather than just returning nil à la Objective C
  5. Non-native threading

[+6] [2009-01-04 01:33:35] EMP


It's a great language, especially with LINQ, but generics support is poor compared to C++. It had so much potential, but the current implementation is only useful for strongly-typed collections and similar trivial things. Some examples of where it falls down:

You cannot specify that a generic type must have a constructor... while thats true but you can specify the constructor where you want to use it.. class Test<T> where T : New(int) or some thing like that. - Petoj
If you could cast IList<string> to IList<object>, you'd be able to call Add(object) on it and add stuff like integers. That's hardly type safe. - Blindy
You can use where T: Enum to limit the type argument to enum's - oɔɯǝɹ
Nope, you can't. :) - EMP
you're right, my bad. - oɔɯǝɹ
> "while thats true but you can specify the constructor where you want to use it.. class Test<T> where T : New(int) or some thing like that" Um.. what? - Fowl
"A generic argument cannot be a static class. Why?" This is for the same reason interfaces can't have static methods. What method could you call on the generic type? Static classes have no instance methods; static methods are non-inheritable. Alternatively, what method in your class could have a static parameter type-- you can't instantiate it, so by definition there can be no instance! - Jacob
[+6] [2009-01-08 15:29:46] SpoonMeiser


Although the weird way python deals with scope has been mentioned, the worst consequence of it, I feel, is that this is valid:

import random

def myFunction():

    if random.choice(True, False):
        myString = "blah blah blah"

    print myString

That is, inside the if block is the same scope as the rest of the function, meaning that variable declaration can occur inside condional branches, and be accessed outside of them. Most languages will either prevent you doing this, or at least offer you some kind of strict mode.

This function will sometimes succeed, and sometimes throw an exception. Although this is a contrived example, this could lead to some subtle problems.

I actually consider this good. Its easy to point at the scope rules of language X and say that its scope rules are insane, but my feeling is that fewer rules to learn is better. - TokenMacGuy
(4) I think generally scope rules for languages are simple and consistent, conditional blocks and loops having their own scope isn't more rules, it's the same rules being applied recursively. - SpoonMeiser
.. and I ususally would set myString to None just before the if anyway, signifying "have not been set yet". - kaleissin
@kaleissin I would too, but it's another step to get safe code that you get for free in other languages. - SpoonMeiser
@SpoonMeiser: How is that another step since you seem to be implying that in other languages myString needs to be declared/initialized outside of the if scope in order to exist outside of that scope? - Don O'Donnell
Since myString is obviously a string, for most use cases it would be safer to initialize it to the nul string, '', rather than None. - Don O'Donnell
[+6] [2009-07-07 07:45:57] Paul Delhanty


[+6] [2008-12-08 15:29:46] Iain

ActionScript / AS3

Otherwise it's actually a good language - much better than JavaScript, contrary to popular belief, and a million times better than something like PHP.

nowai js > as! ;) - eyelidlessness
nah-uh! as3 > js - Iain
nowai ! - eyelidlessness
ptthhhhhhhhhhhfff - Iain
(1) No method overloading, doesn't throw exception on division by zero - Amarghosh
1~5 Fantastic Flash code editor. - Eonil
@eyelidlessness: ActionScript3 is compiled, has inline XML capabilities (no DOM required), output works on 98% of internet-connected computers (source: Adobe :-) ) and comes with a ton of awesome graphical abilities in the libraries. Iz soo > JS. - JBRWilkinson
[+6] [2008-11-26 20:04:12] kristina


  1. Function object syntax:

    f = new Function( "foo", "bar", "return foo+bar;" );

    (It takes n arguments, the first n-1 are arguments for the function, then nth is the actual function, in string form. Which is just silly.)

  2. Function arguments can be repeated.

    f = new Function( "foo", "foo", "return foo;" );

    The last repetition is the only one ever used, though:

    f( "bye", "hi" ) // returns "hi"
    f( "hi" ) // returns undefined
  3. E4X should just die. My users are always complaining that it doesn't work the way they think it will. Let's face it, when you need a page and a half of psuedocode for a setter, it's time to rethink things.

  4. A standard notion of stdin/stdout/stderr (and files!) would be nice.

  5. null != undefined

    It's irritating to have to handle them both. Sometimes it's useful, but most languages manage to limp along fine with one.

(1) Actually, null == undefined (loose equality). However, null !== undefined (strict inequality). You only need to handle both if you're testing for strict equality (null === undefined, which is false). - Daniel Cassidy
(8) Also, why would you ever use the function constructor? f = function (foo, bar) { return foo+bar; } - Daniel Cassidy
To add to what Daniel Cassidy said, the Function constructor basically exists to ensure the language is consistent and developed upon its own foundations. You're not meant to use it for anything that isn't dynamically generated (which is probably a bad idea for most purposes anyway). - eyelidlessness
+1 for the fifth. It just makes your life a lot harder. - drowntoge
[+6] [2008-12-05 18:18:36] hasen j


I don't mind self in the method, there is no other way to distinguish a method from a function other than context otherwise. I suppose met could be made a keyword tho ... - Brendan
[+6] [2008-12-07 02:40:21] Rob Wells

Not that I hate my mother tongue but a couple of points that humour me.

Spelling! That is, English spelling is revenge for German grammar!

Oh, and different sounds for the same spelling! Cough, bough, through, rough, thorough, thought, and hiccough.

This is why ghoti spells fish!

(4) hah that 'ghoti' comment really cracked me up - Andreas Grech
How come you could spell ghoti but you couldn't spell grammar? They didn't teach you spelling in grammar school? - Windows programmer
How do you pronounce hiccough? Isn't the 'ough' the same in hiccough and cough? - wilberforce
(1) On googling - weird! I've always assumed that was some kind of cross between a hiccup and a cough, rather than a legitimate alternative spelling to hiccup. Thanks again StackOverflow! - wilberforce
hicough ahhhhhhh! - eyelidlessness
Don't forget 'though'. Or, if you feel that it has the same terminal vowel sound as 'thorough', then don't forget 'thoroughfare'. - Zac Thompson
[+6] [2008-11-11 23:34:47] Jeremy Reagan


  1. Compile Time for large Flash Forms.
  2. Dynamic Variable Types (Sometimes I hate them.)
  3. Lack of features in CFScript.
  4. CFTable (Can never get it to display right).
  5. The lack of chart types left out of CFChart.
  6. Complete lack of NTLM support (enterprise ready - yeah right)
  7. Moronic var scoping in CFCs
  8. No concept of a true NULL - your variable just vanishes!
  9. No way to test for the existence of certain things (like scopes, just members inside them)

(7) Oh god... Cold fusion. Why hasn't it died yet? - Nick Stinemates
Because it rock so hard. :) - Jeremy Reagan
(2) ColdFusion is a zombie. Zombies are already dead ... yet somehow they're still up and about, still biting people in the face. (I get to say that: I work with it day-to-day.) - Justice
I worked for a company that had their main website in ColdFusion. I hated trying to debug the thrown-together and bug-ridden mess. And it didn't help that the some servers used ColdFusion 5, others used 6, and others ran the ColdFusion code on .NET via BlueDragon. - Adam K. Johnson
[+6] [2008-11-11 22:40:53] Ken Gentle


  1. Duck-Typing
  2. Convention over Configuration, assuming you know the Convention
  3. Everything you hate about Spring
  4. Everything you hate about Hibernate
  5. [Groovy] common operations across collections aren't (but recent releases improve this)

Maybe more important than all of those: horrible documentation that is usually either missing or flat out wrong. - TM
[+6] [2008-11-11 22:26:52] Claudiu


  1. Too slow!
  2. list operations don't return the list, so you can't do list.append(4).append(5). (I mean a reference to the same list, not a copy). This is a minor gripe; it's only come up a few times.
  3. statements don't return values (if, print, while, for, etc). This is only a problem when dealing with lambdas.
  4. lambdas can only be one expression. There's no real need for this restriction, as they are equivalent to functions in every other way. What if I want a button press event which calls two functions? I'd need to create a named function to supply that functionality to an action listener, while doing "lambda: f1(); f2()" would not hurt.
  5. you can only put standard a-zA-Z_0-9 as names. Having functions like "true?" and "+" would be great. Of course, this could lead to terrible obfuscation, but I'm not saying we immediately rename all functions to "p@$%3". Which do you find clearer to read: "dec2bin" or "dec->bin"? ("store_results" or "storeResults") or "store-results"?

(5) Your second point is sooo minor. Why don't you list.extend([4,5])? - Martin Cote
@pt 2, Lists are MUTABLE. Why return a copy of itself when adding a new entry? - Nick Stinemates
@Nick: He doesn't want to return a copy, he wants it to return the original list so that he can chain modifications to it. I think. - Jeremy Banks
In Py3k you'll be able to use non-ASCII characters in identifiers, but I think it still tries to stick to ones that are letters, not symbols. It's a pity, I think this would have been a good time for them to add that ability to the language. - Jeremy Banks
(12) My gut reaction to number 5 is shuddering in horror. This summer I had to clean up column names which had slashes, spaces, question marks, parens, colons, etc. Not fun. - pbh101
Yeah, the lambda thing is a big WTF for me, too. Overall, you seem to want Lisp. - Svante
(1) This is heavily influenced by my recent exposure to Scheme, it's true. for 5, it's mostly the fact that function names with dashes as separators ("print-columns") are prettier than either print_columns or printColumns, and also conversions (dec->bin) is cleaer than (decToBin) or (dec2bin). - Claudiu
"Too slow!"... as compared to? - unpluggd
@Philip: as compared to java, c, c++, haskell (Damn haskell is fast), maybe scheme. - Claudiu
(1) #2: list.extend([4, 5]) - Kirk Strauser
list + [4] + [5] + [some comprehension] - hasen j
(5) if the langauge allows + in function names, parsing would be hell!! a+b is that a function name or an expression? if you have a function called "a+b" and two varialbes a,b then what should a+b do?? - hasen j
tmp = 2048 x=3 tmp>>x Under your suggestion of having other characters be available for function names is "tmp>>x" a function or an expression? what about "tmp>x", or "tmp%x"? This would kill the readability of python. - Asa Ayers
Punctuation in function names is my #1 reason for disliking lisp & scheme. - user26294
Reason why symbols appear in lisp identifiers and not in other languages: Number of lisp reserved symbols: 5 (, ), `, ', and " and the last two are optional. - TokenMacGuy
@hasen and asa: under my suggestion, tmp>x would be a function/identifier called "tmp>x", and you'd have to type "tmp > x" to use the greater-than symbol. Allright, maybe it's not the best idea =). - Claudiu
(1) "Too slow!" ... my Python data processing code runs at 50k-200k rows/sec on a 3 year old laptop. That's good enough for me... - Stephen Simmons
(10) "lambda: (f1(), f2())" is a trick I've used in a few cases. - Joe Wreschnig
(1) I don't get all the complaints about limiting lambdas to only one line. Just use a regular function! - TM
Unladen Swallow for the "Too slow" part. On your ->bin addition... ????? I think you're looking for Pearl or Ruby if you want your code to look like Mesopotamian hieroglyphics. - orokusaki
@TM: Of course. And, while we're at it. Why have lambdas at all when you have functions? If you're going to add a feature to a language, make it useful. - luiscubal
#1: ~~~ #3: For a good reason: lambdas are supposed to be side effect free! Besides, what should a if return? ~~~ #4: Use full fledged functions instead. You can also nest them. ~~~ #5 Not being able to insert operators in variable names sounds like a good idea to me... unless you believe a = 2; b = 3; c = b-a should raise a NameError? ;) - badp
[+6] [2008-11-11 22:24:56] zmf

My language du jour is Java. Here is what I hate about it:

5.) Lack of pointers
4.) Exception catching
3.) The Boolean type
2.) BigDecimal type
1.) C# fanboys and Java fanboys

Boolean can be null. I find this counterintuitive.

BigDecimal is a library and not a language feature. My annoyance with BigDecimal and Exception catching stems mainly from writing test classes that have to jump through a bunch of hoops to get actual work done. I should clarify I'm annoyed by these things, I'm not about to lobby for changes.

5 is not enough for java! - Ali A
Item 1, is really not about java. :) - grieve
I could use some clarification on issues 2 - 4. - Bill the Lizard
What exactly is the problem with Boolean? Also, item (2) is a library rather than a language issue - Don
Lack of pointers? I thought every object was a pointer in Java... - Martin Cote
You left the 'why' part out of your list. =\ - Erik Forbes
References are sufficient. For the rare occasion that you need change the referenced object: you could always create a Pointer class that does this. And I am not following why you hate Exception, Boolean and BigDecimal. - Ryan Delucchi
So why is there a NullPointerException if there are no pointers? - Mark
@Mark, it's just a bad name, NullReferenceException would be more appropriate - Don
So, in Java, what exactly is the difference between a Pointer and a Reference? Why would you want a Pointer? - Mark
You don't get to have fanbois as one of your items. Every language has those. :) - brian d foy
Alternatuive to Boolean is to use boolean, can't be null (but not an object). Pointers would be nice in regards to primitive arrays IMHO - basszero
If you go into an interview claiming Java has no pointers, you are going to be in a world of hurt. Java is nothing but pointers. If you don't think so, describe how to call a method without passing a reference back to the objects you are calling with... - Kendall Helmstetter Gelner
@brian: I'm fairly certain Visual Basic has no fanboyz. If there ever were any, they're dead now. - MusiGenesis
Pre-.NET Visual Basic, I mean. VB.NET has plenty. - MusiGenesis
@Kendall. JVMs of course use pointers under the hood to implement references, but the Java language doesn't "have pointers". A fundamental property of pointers is the ability to do arithmetic on them. Java has re-seatable references. - Steve Jessop Pointer arithmetic is not fundamental to pointers - unless the only pointers that count are C pointers. There is no pointer arithmetic Pascal/Ada, Modula and PL/1, recent Fortran, and virtually every high-level language with pointers other than C and C++. - crosstalk
[+6] [2010-05-25 20:19:00] Dave Rolsky

Here's some more for Perl 5, from the perspective of someone who's created a lot of Perl modules, and in particular worked on Moose [1].

  1. The horrible brokenness that is overloading and tied variables. Both of these features are a failed attempt to allow transparent extension to the built-in types.

    They both fail in various ways, and require module authors like myself to either implement horrible hacks to support them, or to say "never pass an overloaded object to the foo() method". Neither alternative is really acceptable.

  2. Lack of proper hooks into the compilation process and the meta-model. Moose in general, and role usage in particular, could be made much safer if the Perl core allowed us to affect the compilation process via a sane API that allowed us to hook into the meta-model (packages, classes, etc.)

  3. Lack of named parameters built into the language. Instead, everyone reinvents this. It's annoying.

  4. Similarly, lack of optional types. I don't want a static language, but the ability to specify types and constraints, particularly on function/method parameters, would be great. Perl 6 gets this right. Types are optional, but very rich, and there's no fundamental difference between built-in and user-defined types.

  5. The backwards compatibility police. This is more of a cultural issue. A number of the above issues can never really be fixed, since Perl 5 has a very strong commitment to backwards compatibility. So even if something were to be added that effectively replaced the current ball of shit that is tie and overloading, those features will never be removed. Of course, backwards compatibility is also one of Perl 5's greatest strengths.

  6. Bonus hate: Perl's built-in exception mechanism is a joke. The fact that exceptions may be a string or object makes for an eternity of fiddly exception-catching code, and the lack of a catch in the language syntax is the wart on the wart.


Well done, sir. - brian d foy
#5 should be #1 imo and this needs to be voted up more. - xenoterracide
I heard you like warts so I put a wart on your wart so you can pull it in rage while you wrestle with exceptions. - Jon Purdy
[+5] [2010-05-26 03:11:37] Arnold deVos

Scala is my favourite language. Five things to hate? Easy:

  1. Takes a long time to learn properly. I know you can write Scala as a 'better java'. That is what we used to say about C++ and C too. I agree this is an inevitable consequence of the deep ideas in the language. But still ...

  2. Methods vs. Functions: def f(x: Int) = x*x defines a method f, not a function f. Methods are not functions despite a lot of early Scala tutorial material blurring the distinction. The language tries to blur it too because if you supply a method in some places where a function is expected it is accepted. Do we have to have both methods and functions? Yes it is fundamental. But it was initially confusing to me.

  3. Composing classes or objects from mixins in the 'cake' pattern is prone to NPE's. e.g. trait X { val host: String; val url = "http://" + host } is a mixin that will NPE on instantiation, or not, depending on its position in the class declaration. The compiler could tell you if it will fail but doesn't. (In 2.7 anyway.) It is hard to diagnose the problem in complex inheritance graphs.

  4. Arrays in 2.8 rely on implicits to mesh with the main scala collection types. But implicits are not applied everywhere. An Array can be supplied where a Seq is expected. But an Option[Array] cannot be supplied where an Option[Seq] is expected. I know there are no completely 'right' ways to handle java Arrays.

  5. Type erasure. Enough said.

[+5] [2010-05-26 16:10:06] luxifer


My native language... Though it can sound even more beautiful than Klingon it's a grammar hell...

  1. conjugations: even regular verbs have different forms for each person and time (with few exceptions)... Example: I see, you see, he/she/it sees, we see, you see, they see translates into: Ich sehe, du siehst, er/sie/es sieht, wir sehen, ihr seht, sie sehen.
  2. polite form of address: equals 3rd person plural, used to equal 2nd person plural in the middle age... I really hate the concept of distinguishing between "Du" and "Sie" for my philosophy is that each human being should be considered equal in the amount of respect for it deserves (I mean, what are swear words for, hm?)
  3. punctuation: show me a language that uses more commas regularly!
  4. missing suitable words: eg. there's no real German equivalent of "convenience" or any derivate of this word... in almost every case you just can't translate it into another German word and keep the meaning... instead you would have to make up a whole subset to describe it somewhat adequate...
  5. Anglicisms and Denglish [1]: Sure, the English language has "Kindergarten" or "Poltergeist" and what not but the German language is overflowing with Anglicisms nobody needs... Even worse: We redefine some words we adopt, eg. in German "Handy" means a cell phone and has nothing to do with the adjective it is in English... There are influxes on grammar as well, leading to "Denglish" expressions (see linked article at Wikipedia) There's more, but I don't want to exaggerate this and those are my personal Top5 of what I hate about the German language...

[+5] [2010-07-16 03:37:30] xenoterracide

Perl 5 In order from most annoying to least.

1.) Backwards compatibility police. Yes backcompat is a strength but Perl 5 takes it too far. Now we don't really even get new features in our language without having to enable them explicitly. I'm much prefer the inverse, if a new feature causes a problem let me disable it or enforce old behavior. e.g. perl 5.10 added say I'd rather have no feature 'say' if I have my own say implemented than have to put use feature 'say'; or use 5.010; also if 5.8 worked but 5.10 didn't. I'd rather have use 5.008; to restrict my code to only use features available up to and including 5.8 if no use version; was defined then it should be defaulted to whatever version you're running, and a recommended practice of not to restrict it unless you have to.

2.) Excessive Boilerplate.

use strict;
use warnings;
use utf8;
use autodie;
use English '-no_match_vars';
use 5.010;
package Package::Name;

    Package::Name::VERSION = 0.1;

sub somesub {
    my $self = shift;
    my ( $param1, $param2 ) = @_;

now you may start coding. This won't change due to #1. of course there are shortcuts to this stuff like use common::sense; or use modern::perl; which will shorten the above and you may want some slightly different modules or pragma's. But because of #1 we'll never be able to reduce it to.

package Package::Name 0.01;

sub somesub ( $param1, $param2 ) {

some modules are helping with this, and there is the new package version in 5.0.12 which allows exactly that syntax though I think it requires use 5.012; first, and Method::Signatures but it'll never be completely resolved, (in language).

3.) Poor variable choices

slurp a file

use strict;
use warnings;
open my $fh, "< foo" or die $!;
local $/; # enable localized slurp mode
my $content = <$fh>;
close $fh;

wtf is $! and $/? rewrite to be legible.

use strict;
use warnings;
use English '-no_match_vars';
open my $fh, "< foo" or die $ERRNO;
local $INPUT_RECORD_SEPARATOR; # enable localized slurp mode
my $content = <$fh>;
close $fh;

and lest not forget that the '-no_match_vars' must be there if you don't want to take a performance hit.

How 'bout no direct way to create an anonymous scalar?

my $scalar_ref = \do{ my $anon_scalar };

couldn't they have come up with something?

my $scalar_ref = <>;

oh and how about how perl is thread unfriendly because all the variables (including special ones) are global by default. At least now you can use my $_; to lexical scope that and use local on the others.

4.) really ugly syntax

MooseX::Declare is a much nicer syntax. Also I wish for -> to be replaced with . (personal preference doesn't matter much)

5.) Too much TIMTOWTDI or Too many best practices Seems like you have to read 3-5 books just to figure out all of how you should be doing things.

6.) Previous (no longer applies). Un-sane releases. 5.10.0 had features 5.10.1 had features no set time 'till the next release. Now it's yearly feature releases with quarterly updates.

7.) Ivory Tower perspective. community problem, seems to be a large number of devs who want high barriers to entry and thinks it's ok to treat n00bs ( or really anyone who disagrees with them ) disrespectfully.

8.) Insane Version Numbers/Strings Perl has floating point version numbers and they're ugly. Oh and the dev's don't know that not all downstream deals with version comparison the same way. Not really a language problem

0.012 # simple
5.012001 # semantic 
4.101900 # time based + version (for multiple versions in a day)
0.035_002 # prerelease

all valid versions in perl.. can't we just use like...

0.12 # simple
5.12.1 # semantic
20100713 # time based (just use the date and be careful not to need to release more than 1 a day)
0.35-beta2 # prerelease


9.) No obvious way to reinstall all XS modules after an upgrade

The whole thing with the existence of match variables causing a performance hit always struck me as being an irritating misfeature, especially as it is a problem of Perl's own making. If only the language compiler could determine that a particular RE match wasn't captured and use the faster code automatically. (One basis for doing that would be identifying that the match vars are never used before the next RE is matched, which is amenable to compiler-level theorem proving.) - Donal Fellows
Perl 5.10 has the /p flag so you can use capture variables per match rather than globally. - brian d foy
The "explicitly enable"-thing is required to make updating versions a trivial thing. Nobody would update if all their scripts blew up everytime. - Thorbjørn Ravn Andersen
@Thor sorry for shortening your name I don't believe that, because I don't believe that most of these features have overlap in most programs. Even if they did I don't believe people would shirk at an upgrade if the fix was as simple as adding 'no feature 'feature'; to the top on the rare occasion that something did break. We punish people for using modern perl, and reward those who don't. Just my 2 cents. I'm really curious... have you ever seen the function 'say' anywhere? How many places do you think having that would break things? - xenoterracide
@Thor oh and things break every time I upgrade perl, due to the PITA of rebuilding XS modules. - xenoterracide
@xenoterracide, I don't do Perl anymore, but I know that if a release used in production breaks programs we don't install it without extensive retestning in production. Which we don't want to, so it doesn't happen as fast. Don't you have mission critical code in production? - Thorbjørn Ravn Andersen
@Thor you don't do extensive testing before doing a release on a new version of your platform for mission critical code as is? ... Basically I just don't believe that we shouldn't be able to add new keywords to perl indefinitely... if they wanted to go through some inverse of deprecation. e.g. first release you have to use use feature, next release use version, and then after that it'd be just available. I'd be fine. - xenoterracide
@Thor also if you had mission critical code that you knew worked on 5.8 why wouldn't it be good enough to put use 5.008; at the top if that meant no features from future versions would work after that (unless explicitly imported). - xenoterracide
@xeno, plenty of options. I still maintain that if minor update breaks programs, it will result in less people updating. - Thorbjørn Ravn Andersen
@Thor from 5.10 to 5.12 is not a minor update. - xenoterracide
[+5] [2010-08-20 04:21:48] dan04

Python (3.1)

Re: #5, numpy also decided to use the np.concatenate() (16chars!) function to achieve concatenation, leads to stupid long lines in my scripts ... - Brendan
[+5] [2010-06-01 12:34:23] Bastien Léonard


[+5] [2008-11-11 23:04:27] staticsan

I have a book exploring all sorts of projects in SNOBOL [1]. The first chapter explores the history and culture around SNOBOL programming and language and spends some time making the argument that a good programmer likes a language not because of its flaws but in in spite of them.

My favourite language is Icon [2]/ Unicon [3]. But there are still things that annoy me about it:

  1. It's not well known or all that popular.
  2. It has a much smaller library compared to PHP, Perl, Java, etc. Database access is done via ODBC, which is actually quite annoying.
  3. For all it's otherwise excellentt list handling, I miss PHP's built-in explode() and implode().
  4. It doesn't have a table constant. Lists, yes, tables, no.
  5. It is a compiled (actually translated) language.

[+5] [2008-12-04 08:42:50] namin


  1. Type inference is limited.

    1. It propagates forward only.

    2. F# won't try to infer an object type based on the methods and properties used: you'll get "lookup of indeterminate object type" errors when it doesn't have a clue.

  2. One cannot mix floats and ints: 1 + 2.3 is a type error.

  3. It's a little awkward to have to create a builder object in order to define a monad or computation expression. In Haskell or Scala, you can define the monad operations directly on the monadic object.

  4. Though the #light syntax is preferred, the indentation rules are sometimes not very intuitive or become cumbersome.

"1 + 2.3 is a type error" -- is F# derived from Fortran? - Windows programmer
(2) No, F# is not derived from Fortran but from OCaml. Like F#, OCaml doesn't automatically convert from ints to floats. Unlike F#, the + operator is not overloaded in OCaml: it's + only for ints and +. for floats. - namin
In Fortran, even though the + operator was overloaded, it was + only for ints and + only for floats, no mixing allowed. (Vendor extensions often allowed it with automatic promotions.) - Windows programmer
(1) Yes, F# is exactly like Fortran in this respect, then. - namin
[+5] [2008-11-26 19:46:32] Paul Nathan


[+5] [2009-01-04 01:46:34] Logan Serman


  1. No constructor overloading
  2. Inconsistent function naming (str_replace, but strtolower)
  3. define() does not replace the global variable literally like C++ does.
  4. When combining with XHTML, statements like the if-statement must start out with no indentation, even though the XHTML is indented if you want to keep the XHTML indentation consistent.


You must type:

if($x == NULL)
                     <p><?= $x . ' is null' ?></p>
  1. Error catching is awful

(not sure why SO changed #5 to #1 again but whatever)

(5) Your example code is pretty shocking there... you break out of the PHP section to output some text, but then you break into PHP again to output a string. I'd suggest <p><?=$x?> is null</p>. Also, you can do <?php if (...) : ?> [HTML] <?php endif; ?> which is a bit more readable. - DisgruntledGoat
Place a space after escaping out of PHP and the following new line will be honored as legitimate whitespace. So will the space, which is annoying, but it at least lets you keep sane indentation in your templates. - eyelidlessness
[+5] [2009-01-12 02:43:48] Kim Reece



That's why Lisp Machines had a the parenthesis on their own keys! - Technical Bard
[+4] [2009-01-08 07:27:34] community_owned

Emacs Lisp

[1] Of course, one of the beautiful things about Lisp is that it's not hard to fix these things in your own code with a one-liner. Still it irks me that it's not built in.

Good question; I'm a bit embarrassed that I couldn't come up with better things to hate, but honestly, your honor, there is not much to hate.

Regarding the last gripe: you can do #'(lambda (...)) - Trey Jackson
Come on, no lexical scope? Threading? FFI? Plus XEmacs is basically dead, no need to worry much there. - technomancy
[+4] [2009-01-08 15:09:33] nes1983


self? as in .. yourself? or what? - hasen j
Well, Self is a generalized Smalltalk, which is a programming language. It's called Self after the keyword. See - nes1983
(1) Woot, you are into self? I am a huge fanboy of self. Unifications of methods and class (to say so), never seen that elsewhere, except BETA. - Adrian
Guess what, so am I. - nes1983
[+4] [2009-01-08 19:32:09] peSHIr

C# (well, part of it is the VisualStudio IDE, I guess):

Could be different list if you ask me again tomorrow. Even though the covariance and designer trouble will be in my top 5 until they are solved (with variance added to C# 4.0, this seems to have happened for at least one of them...).

Yeah the mystery checkouts are annoying especially if someone else as an exclusive lock on the file. - mikek3332002
[+4] [2009-02-19 08:22:36] Jon Ericson

Oracle SQL

  1. The DUAL table.

  2. Can't GROUP BY an alias.

  3. I can never remember the syntax for analytic functions and so I forget/am too lazy to use them.

  4. Lack of combined LIKE and IN conditional operator. (After 10g there's a REGEX_LIKE operator that could do the trick, though.)

  5. Awkward concatenation syntax.

SQL isn't really my favorite language, but it's one of the top three I use everyday. There are probably more items, but these are the ones at the top of my mind.

I have a whole slew of problems with SQL*PLUS. I wrote a Perl replacement that does what I'd like from the command line and I use sql.el [1] in Emacs for interactive SQL sessions. These tools help me work around my SQL*PLUS issues.

Speaking of which:


  1. "Only perl can parse Perl." (But this is mostly an issue in syntax highlighting, which I don't prefer to use much anymore for any language.)

  2. I'm sometimes surprised by "the simple (but occasionally surprising) rule...: It looks like a function, therefore it is function, and precedence doesn't matter." (From perlfunc(1))

  3. Dereferencing complex data structures can be confusing at times. I can't decide if this is a true flaw in Perl or just a consequence of having really powerful data structure facilities. Either way, I can normally get it right by taking a few minutes to think about what I'm doing.

  4. No option to cause system calls to raise their errors like the DBI module. (Thanks to brian d foy, I now know the autodie module on CPAN does this, but I'd like it built-in.)

  5. Warnings and strictures not enabled by default in scripts. (The -e option would turn them off for command line use.)

Again, there are bound to be more things, but these are issues I've noticed recently. I'd add the need for =over and =back and the quirky L<...> syntax in POD, but maybe that ought to be a separate list.

Now for the trifecta:


  1. Sourcing a file with arguments replaces the values of the parent script's arguments. (Executing . file arg1 puts arg1 in $1.)

  2. ksh is not an ideal interactive shell and defaults to vi key-bindings, rather than emacs. (My solution is to use bash for interactive shells.)

  3. Common utilities (such as grep) are implemented differently across different platforms thereby preventing perfect portability. Some useful commands need to be installed on some platforms and are part of the OS core on others.

  4. The syntax for conditionals is overly heavy. (if [ ... ]; then ... fi)

  5. Although it is Turing Complete, you are eventually going to want to move up to a more expressive language like Perl.

One solution for #4 is to get used to short circuit evaluation:

[ ... ] && ...

(1) For 4) in Perl, the pragma is autodie. - brian d foy
One can use the regexp_like operator in Oracle 10 too. Only Regexp_count is a new feature in Oracle 11. - tuinstoel
(1) For Perl: PPI can parse Perl. 'Fatal' and 'autodie' are both core modules, you don't need to install them from CPAN. "use strict" will be enabled by default in 5.12. - Alexandr Ciornii
@Alexander RE: use strict; no it won't you have to use 5.012; to get strict in 5.012 (or use strict). which imo is not the same as default. - xenoterracide
[+4] [2009-02-19 23:41:17] Ellery Newcomer


Someone check me on these; not sure if they are all still relevant.

Associative arrays + array/string literals was finally fixed :-) - Robert Fraser
I don't use D. But a not_in b is the same as not (a in b) in all the languages which i use that have an 'in' operator. - Wallacoloo
[+4] [2009-06-16 01:12:23] Rado

First post, so take it easy on me :) ... Awesome community site, btw!

I tried reading all other C# replies just so mine doesn't overlap

C# ... In no particular order:

1) No fallthrough for cases in switch statements. And if there is no fallthrough ... why does one have to explicitly type break; anyway? It's just retarded and confusing since it implies the ability to not have the break;!!!

2) Can't declare a variable with the same name in a child scope, but you can declare a variable by the same name as a class variable? Either allow both or disallow both. Otherwise, it doesn't make sense.

3) No optional/default parameters in functions

4) Exceptions in finally{} should be implicitly caught for every line. Or at least, just the NullReferenceException exception. For instance, after accessing a db, one should always clean up. So, the finally block should look something like this:

  if(par1 != null)
  if(comm != null)
  if(conn != null)

It would be so much cleaner if it could be written as:


But, no ... you have to check if you are accessing a null object, otherwise it may throw a NullReferenceException from the finally block .. and who really needs exceptions in the finally block anyway?

5) Generics: you can specify new() to be able to instantiate your generic objects, but that object needs to have a default constructor. Why can't you specify a signature instead so one doesn't need to create empty constructors if it doesn't already have them and just use the constructors it does have.

The C# switch statement isn't very good but fallthrough isn't the solution. The possibility to comma separate more than one case value is much better. - tuinstoel
There is fallthru in case statements. - Qua
#4: There is using block for that. - ssg
#5: Oh this is so annoying! probably a consequence of no static methods in interfaces. - Fowl
[+4] [2009-06-16 01:48:09] Apocalisp


  1. The Prelude is imported by default.
  2. The scope of type classes is universal.
  3. Modules are not first-class.
  4. Types cannot depend on values.
  5. Monad does not unify with Functor.

What's wrong with default inclusion of Prelude? - kodai
[+4] [2009-04-09 23:57:54] dfa


  1. checked exceptions
  2. type erasure
  3. missing operator overloading (e.g. for BigInteger/BigDecimal)
  4. missing regexp/date/durations/complex literals
  5. poor support for immutability

[+4] [2009-10-30 14:10:09] kaleissin

I can't believe it, my favorite Python pet peeves still haven't been mentioned:

  1. (Prior to 3.x) Relative imports look like absolute imports.

    import foo

    Does this import foo from the directory you're standing in or from the sys.path?

  2. Zipped eggs, leading to a sys.path full of shite. Zipped eggs means you can't use grep and find (to among other things debug problem 1)! Fortunately, there's pip. Use pip.
  3. Some of the included batteries are unpythonic. It grates to use them.
  4. Might be the fault of distro's and packagers, but still: sourcefile-encoding set to fscking ASCII on install/compile. WTF? Means I have to put the "# coding: UTF-8"-stuff in every single .py I ever make.

Py3k fixes several of my other pet peeves, by for instance insisting that strings are unicode and that 8-bit-stuff are treated differently...

Source encoding used to default to latin-1, then to ascii after Python 2.3 or 2.4, and now to UTF-8 in Python 3! -
[+4] [2010-05-04 10:09:15] DeadMG


1: Header files.

Linking your code is harder than compiling it. Also, the requirement of templates to have the full source in that translation unit is absurd. It's over in that other file there .. the one you compiled two seconds ago. Go look there. Stupid compiler.

2: Empty standard libraries.

I mean, yes, there's std::thread in C++0x, but no std::socket or anything of the sort. The primary reason there's no cross-platform code is because you have to learn a new library for every function that you want to perform on more than one platform. Without OS headers or OS functions provided as standard, C++ is only good for pushing bits around.

3: No multiple returns or return value overloads

double x, int y, char z = func(); is just as valid as void func(double x, int y, char z);. Please. The only reason ever given for no return value overloading is because we "might" write ambiguous code. Might! Please, give me grief when I actually write ambiguous code, not before.

4: No reflection

It's ok to make reflection compile-time. It really is. Not having any makes writing a lot of libraries difficult, at best, and seriously annoys me. I could abuse the preprocessor but..

5: Duck typing on templates

Yaargh. Please, concepts and proper template error messages. It's practically impossible to use a library like Boost, just because if you get it wrong, you're shooting in the dark.

[+4] [2008-11-24 04:24:58] Theran


About your 2nd point: use weave, see… - J.F. Sebastian
(8) You don't need py3k for from __future__ import division to work - J.F. Sebastian
Inlining C (although not perfectly), you might want to check out Cython. - Noufal Ibrahim
[+4] [2008-11-14 20:45:55] dragonjujo


And to all those C-ish language programmers, self makes more sense to me than this, because the object is referring to its self

(1) You should look at py2exe — — it allows you to make an executable file with all the required dependencies. - Paul Fisher
py2exe still requires the manipulation of a half-dozen dll's and such. The bottom line is no matter what, there's an installer. This makes python a real hard sell for me for desktop stuff. (still using tcl/tk for this, with starkits) - TokenMacGuy
(1) Why do you want an exe-file ? Java and C# require an installation of runtime files aswell...and noone complains about this. The real problem is that few people have python installed on their machine - smerlin
[+4] [2010-06-02 05:27:04] RCIX


[+4] [2010-05-25 20:16:38] paul.meier

Erlang is absent from this list. Among my favorite languages, but a few flaws for sure:

Sixth, bonus:

All that being said, Erlang is a joy ^_^

[+3] [2010-05-25 21:09:38] DrewConway


Not my favorite language, but I use it a lot and there is plenty to complain about...


I think the looping thing is a community issue more than a language issue... related: apply() has the be the most opaque and frustrating language construct I have used. - JD Long
As you say, the . character in a variable name is not special and is completely ignored by the parser. Except that it's critically important to S3 method dispatch! Who thought that was a good idea? - Harlan
JD, sorry, that is what I meant (it being a community thing). I love apply, but sometimes I just want a loop, and don't want to feel dirty doing it. Harlan, see, there you go talking about something I had no idea about. - DrewConway
Some base library functions have strange interfaces that make sense if you're working interactively, but cause nasty bugs if you're writing longer code. Worst example: sample(10:12, 3) gives three numbers between 10 and 12; sample(10:10, 3) gives three numbers less than or equal to 10! Who thought that was a good idea? (And no, the fact that the behavior is documented is no excuse!) - Harlan
[+3] [2010-05-26 16:39:26] Grant Peters

Five things I hate about all languges (that I know of at least):

  1. Does what I say/type, not what I mean
  2. Will undoubtedly meet people who think they are experts in the language, but just make a mess of it (e.g. people who insist that removing comments/unused local variables will speed up execution time for a program)
  3. Unless the language is obsolete, then it will probably continue to evolve (either the actual language, or the concepts behind using it effectively) requiring you to actively develop with it so as to not fall behind.
  4. Can't modify the lexer/compiler (add in own context sensitive grammar)
  5. No perfect language (every language is missing some sort of useful feature that usually is either impossible to simulate, will unavoidable have an ugly interface or just require far too much time to implement and get it right)

Lisp has do-what-I-mean flags. - mpez0
So lisp can figure out that I meant to initialize a variable to 1, but out of habit I wrote 0? (recently did this and made a very hard to track bug, was involving networking so it could work depending on packet losses/ordering) - Grant Peters
[+3] [2010-05-26 08:16:45] stormianrootsolver


What I hate most:

  1. No multiple inheritance - imagine you could provide whatever GUI framework base class (Control, Window, whatever) with MVC - related stuff, etc... framework / base class agnostic!

  2. No "friend" keyword... I know, the RAD - victims would abuse it for all kinds of stinky code and for hilarious malpractices, but it would be nice for the OOD - guys to enforce the law of demeter

  3. No language integrated DBC features, there are the Contracts, but I would rather have that Spec# - style with a general purpose "!" - postfix operator

  4. No AOP (I don't get it... this language has attributes, it would have been SO EASY to add interception code in the compiler!)

  5. No weak event delegates - the observer pattern becomes nothing but a memory leak bait as it is now... :-(

1: if you need multiple inheritance, consider interfaces (there's sooooo much that is confusing with multiple inheritance); 4: you can get a very nice AOP library - RCIX
4: Just got into AOP, and C# would be an awesome language for this! I really wish they would add something in soon for this. 5: Totally agree. I've been slowly converting everything to RX and IObservable, which seems more comfortable. - drharris
@RCIX I KNOW about interfaces, but this is not the point. For many tasks you don't only need the interface but also the behaviour to be able to code things in an understandable way. Of course one can use the strategy - pattern (for example) to implement MVC, but the better way would have been to be able to add, say, the full data context handling to a System.Windows.Forms.Form by adding a generic base class - oh, and I use PostSharp.NET. It's amazing. @drharris I totally agree. It's not understandable to me why they didn't expand attributes to interception. That would perfectly solve it. - stormianrootsolver
Ah, but that's a rare case compared to the number of times that yo don't need it, and it brings in all sorts of crazy problems -- for instance, if you have class C which inherits from A & B, and both have a Foo method defined, what (non arbitrary) setup do you use for determining which Foo gets called? - RCIX
If you ask me, the compiler should fail with an error if one tries to inherit from two classes with colliding member names. I do, however, believe that this should rarely by the case, given well educated developers who know how to separate concerns and observe the law of demeter. People who only write code to earn a living (Morts, approximately 90% of developers around) will always give us hell, multiple inheritance or not. I guess the best way to solve that would be to only allow Elvis and Einstein types to work on software. - stormianrootsolver
[+3] [2008-11-29 05:44:01] D.Shawley

Another vote for C++ here... still my favorite with a few close followers - C and Python. Here's my current hate list in no particular order:

[+3] [2008-12-22 05:18:42] Jay Bazuzi

.NET framework (the libraries)

And one more:

As far as equality goes, it could be worse. There is no === operator in C# like some other languages, and Object.ReferenceEquals exists because == can be overridden (it's also nice for null handling). - Matt H
One more from me: Everything I want to fix is sealed. HttpContext and System.CodeDom being sealed both drive me absolutely crazy, for two completely different use cases. - Jacob
[+3] [2008-12-22 05:47:11] Dinah


Most of my gripes have to do with assuming C++ conventions were automatically the best choice for C#

Bonus one for .NET (not C# specific)

Hmmm, a more intelligent compiler would be nice, however i do find the (background) compiler slightly better than the c# one. I think both language dev teams need to talk to each other more :p - Pondidum
@Andy: I couldn't agree more. It seems to be that they are 2 brilliant teams with different strengths. Combine them and imagine the results! - Dinah
(2) var is not an optimization. String vs. StringBuilder will depend, an it will almost never matter in practice. - erikkallen
[+3] [2008-11-12 06:41:12] Malkocoglu


  1. Lack of integral SWAP functionality
  2. Template Syntax
  3. You can not #define a #define (no multi-pass)
  4. Structure packing incompatibilities between compilers
  5. char is signed or unsigned ?


  1. Immutability on the edge
  2. No ref keyword like C#
  3. try/catch blocks everywhere
  4. Poor runtime performance
  5. All string related stuff


  1. No "main" (I'm used to it !)
  2. underscored keywords
  3. Limited thread support
  4. "self" instead of "this"
  5. Lack of C/C++ like syntax

(4) I noted this in an earlier post, but in Python, "self" isn't a keyword, so you can call it "this" if you want; you can have a method like: def my_method(this, whatever): this.whatever = whatever. Of course, coming from an ObjC background, I think "self" is nicer than "this" anyway. :) - mipadi
I am not very fluent in Python yet, so thank you for clarification... - Malkocoglu
(4) Python: def main(): ... solves the 1st point. - J.F. Sebastian
(3) ... the idiom i've seen in python is "if name == 'main':\n #your code here" to represent 'main'. it seems to work well enough, and is ugly enough to be found by code search :) - Aaron
(1) If I understand your comments correctly you really should learn a LISP-family language. Take a look at Scheme (the easiest to learn) or Clojure (the most "modern".) - finnw
C++ has integral swap. int a, b; std::swap(a, b);. - Billy ONeal
@Billy: Well; it generally requires the use of stack, because it uses a temp variable to do the swap. Bu in fact; in ASM, you can do a swap without using a temp variable regardless of the size of your variables. When I wrote integral, i actually meant "as a function of the language/compiler" - Malkocoglu
@Malkocoglu: Most any compiler is going to be smart enough to do that when it's available in hardware, if it would benefit performance. On modern hardware I'd be willing to bet the swap instruction gets translated into the same thing as effectively what std::swap does, and therefore isn't much (if any) of an optimization. - Billy ONeal
@Billy: I have not come accross a compiler that does what you say when the type is not a POD but somewhat big struct. For small datatypes & structs; you are right, it does not use the stack. But for big structs, they always use the copy to/from stack code as I examined their ASM output. - Malkocoglu
[+3] [2010-05-23 15:47:08] Yasir Arsanukaev


[+3] [2009-10-09 19:59:12] Gautham Ganapathy

Common Lisp

I wonder what a strongly-typed lisp would be like

(1) I assume by "strongly-typed" you mean strongly statically typed (most Lisps avoid implicit coercion and such). It would probably look a lot like PLT's typed Scheme. - Zak
yes, sorry about that! i had been looking into haskell, and really liked it's type system (well, whatever i understood so far). i'll take a look at typed scheme, thanks for the tip - Gautham Ganapathy
(1) > I wonder what a strongly-typed lisp would be like You mean like Qi? - technomancy
[+3] [2009-10-09 20:39:51] Pavel Minaev

Haskell (with all GHC extensions, not just the base Haskell'98 spec).

There's exactly one thing that I hate about it: it's not mainstream.

[+3] [2009-12-28 02:13:39] Aaronaught

My favourite is really C#, but there are already a ton of answers for C#, so I'll go with my next "favourite":


  1. The GO statement, and the fact that you need it for all manner of DDL/DML scripting, and the fact that it also breaks transaction semantics, making it far more difficult than it needs to be to write an atomic script, which you really need to have in order to upgrade a production database.
  2. Inconsistent semicolon semantics. 99% of the syntax doesn't need it, MERGE statement has to end with it, WITH statement has to begin with it... make up your mind!
  4. Optional parameters in UDFs aren't really optional. Caller must specify DEFAULT (and don't even try using NULL instead). Compare to SPs where they are truly optional.
  5. "...may cause cycles or multiple cascade paths." HATE HATE HATE HATE HATE HATE HATE HATE HATE HATE HATE

[+3] [2009-12-28 05:32:21] slebetman


This is my absolute favourite language for doing almost everything. Over the years it has evolved (slowly, very slowly) to address most of the things that annoy me. And the language is so flexible it's easy to implement syntax sugar to cover things that still annoy me. But there are things about the language that can't easily be changed just breaks its Zen:

I agree on the first two points. I've got some plans for where to evolve arrays that give them more purpose, I've seen some ideas for syntax for dicts (though I'm not sure that I agree with all of them) and I would like closures and have ideas there (the main problems are how to do introspection and how to pass them through lambda values given our strict value requirements). And I also really want both true GC and UDP support. (Teacup is Someone Else's Problem.) - Donal Fellows
[+3] [2009-12-28 13:34:45] Viktor Sehr


(Except for lambda functions, I've avoided things that will be available in Cpp0X)

[+3] [2009-06-05 16:57:59] G B

1 - indentation

2 - indentation

3 - indentation

4 - indentation

5 - indentation

I'll let you guess the language. :-)

(8) FORTRAN! I want my eight columns back! - brian d foy
(2) Looks like you're a Java programmer. I'd hate to have to read your Java code if you don't indent it. - Don O'Donnell
(2) Could be any language without enforced indentation and bad coworkers that don't indent their code. - helium
Well, I work as a Java programmer, but that doesn't make Java my favorite language. I think it's just good enough. - G B
[+3] [2009-02-19 07:24:03] Chris Lutz


I love this language, and I don't want to add things that have already been used, but no one has mentioned this yet, so I'll throw it on the pot. When I used this feature, I found it to be the most horrible experience of my life (and I've worked in assembly language):

They have the single worst, ugliest, most horrifying syntax imaginable, and yet they don't manage to give you any more functionality than you could already achieve with some (infinitely prettier) printf() work. No one should ever try to use those two functions to do any output, simply because of how bad they are.

I'm sure someone will disagree, but when I looked into them, hoping they would solve my problem, I found them to be a "world of pain" (to quote the Big Lebowski), and hope that Perl6 has either done away with them or, better, completely rewritten them to be somewhat more usable and useful.

(1) I used them quite a bit when I first learned Perl for automating reports. The brilliant thing about format/write is that you can see what the report will look like (more or less) from the format string. But the mechanism is unwieldy to say the least. There are better solutions these days. - Jon Ericson
(1) format() paginates and applies headers,footers, and page numbering which you'd have to do on your own with printf. format() can also handle line wrapping, etc. - brian d foy
@brian d foy: Good points. I ran out of space to mention an alternative I use that does these things: <>;. If you need plain text, pdftotex works well. - Jon Ericson
[+3] [2009-07-22 21:37:33] Chase Johnson

Objective-C / Cocoa / Cocoa Touch:

Blocks are in the latest version(but not on iPhone yet, I believe). Pretty nifty implementation, too. - Mark Bessey
If you want a really dynamic language similar to Objective-C you should try Smalltalk. - Amuck
[+3] [2009-03-13 05:54:45] sipwiz


  1. The foreach command bombing out when an object in the collection being enumerated changes,
  2. UI controls spitting the dummy because they were accessed on the wrong thread. Surely all the dispatcher.invoke calls can be moved into the CLR plumbing,
  3. PInvoke, marshalling etc.,
  4. The wasted two years I spent learning remoting,
  5. It's not as sexy as Ruby.

+1 - Totally agree with Point 2. It is a real pain and they havent fixed it in WPF (which uses even more threading) I feel your pain with remoting as well :) - Russell
[+2] [2009-03-13 18:04:16] Steve Melnikoff


[+2] [2009-02-20 03:55:34] smcameron


  1. bit fields -- they aren't well specified by the language and how they work is compiler dependent and architecture dependent.
  2. It's often hard to find where a particular symbol is defined in a large mass of code, esp. if that symbol is produced by a macro. Which reminds me...
  3. The preprocessor is a rather ugly hack, amenable to all sorts of abuse.
  4. lack of standard sized integers (remedied by uint*_t lately, but there is lots and lots of old code floating around out there with custom typedefs or #defines for DWORD, WORD, BYTE, etc.)
  5. Lack of something akin to Perl's (would love to be wrong about that one.)

Edit: While thinking about a CPAN for C, I thought... what would I call such a thing, and thought of "ccan", and googling it, I came across this:

It seems to be as yet in its infancy though.

Bit fields are awesome! I don't target multiple compilers and architectures, so I wasn't aware they weren't portable. Understandable, I guess. (And if C didn't have unions I'd say bit fields were just ok.) - Jon Ericson
If only C was still "sexy" - we have the technology to solve all these problems now. But not enough programmers care. - finnw
[+2] [2009-02-23 04:43:35] Frew

I'm going out on a limb since I can't really use it full time, but I'll try anyway!

Perl 6

  1. func("frew") != func ("frew")
    • It annoys me, but there is good reason for it. In Perl 5 print (5 + 6) * 10 still gets me every now and then
  2. It may be easier to parse than Perl 5 in a lot of places, but it still kills my editor sometimes
  3. It still has a lot of the line noise Perl 5 which scares a lot of people. That means it's harder to get them excited etc.
  4. There are no libraries yet.
    • This will be a non issue if Perl 6 does indeed end up supporting Perl 5, but that may be a burden not worth bearing.
  5. There's no REPL, or what rubyists would call irb.
    • A solid interactive Perl 6 with tab completion, color coding, etc, would make using and learning it so much nicer.
  6. Currently the documentation [1] is basically the English spec. Not exactly an easy read.
  7. I know it's a stupid cliche, but it's not out yet!
    • (I am allowed to complain because I am helping :-P)

The first three are the language; the rest aren't really the language itself but the fact that it's not out yet.


(1) Only two has anything to do with the language. The rest are about the tools, and those things change. So, only three more to go. :) - brian d foy
[+2] [2009-01-06 19:09:21] Gregg Lind

R (R-Project for statistics)

  1. Terrible, terrible string support
  2. Surprisingly difficult for some simple descriptive tasks, like cross-tabulation
  3. Large data set manipulation is done in-memory.

[+2] [2009-09-10 08:55:18] Yacoby


And far more subjectively:

The purpose of config files is to change the behavior. Why is that a problem? And can you give more details about the "Terrible error catching" please? - Techpriester
@Tech Regarding the config files, I meant the php.ini file. Things like magic quotes make it harder to write code that works everywhere. I can't remember what I meant when I said "Terrible error catching" (Hence I have removed it from the answer) - Yacoby
[+2] [2009-07-13 06:32:59] quant_dev

C++ lack of good refactoring tools, lack of checked exceptions

Java lack of templates, lack of const keyword

You don't have const keyword in Java, but you can acomplish the same just declaring a method, a variable, or even a Class! using final keyword - unkiwii
(1) Not true. "final" for methods and classes has different meaning than "final" for variables. For variables, "final" is not the same as "const" in C++, see… There is simply no "const correctness" in Java, you can declare an array as "final" and modify its contents. - quant_dev
[+2] [2009-06-12 23:25:49] Frank Schwieterman


1) static methods must be a member of a class

2) static extension methods can only be added to static classes

3) The implementation of interface functions are not marked with something like 'override' to show they are from a base class or interface (making it hard to ensure you're overriding the method you expect (with correct signature) with just code review).

I just have 3. I guess thats pretty good.

[+2] [2009-06-16 03:34:47] jimx


I am still a moderate user for python, so my complaints might just well be lock of knowledge or mis-usage. Comments are welcome. I do love this language.

  1. Poor thread support and GIL. If you'd like to take use of multicore platform, most of the python programmers would probably recommend multiprocessing or some sort, don't use threading. It wouldn't give you the performance you are expecting.
  2. property only for instance variable. _class_var = property(classmethod(some_method)) just wouldn't work. How can I get a property wrapped class variable?
  3. no access control. All access controls are syntax mangling. Like private is __private, protect is _protected, etc... And hope that everyone programs python follows the naming convention. Come on, we can do better than that.
  4. I agree the python philosophy of being simple and clear syntax but some simple and clear syntax not being supported seems lock of good judgement, in my opinion. Such as, a++, ++a, a-- and --a, self-de/increment, what's wrong with those? foo = (a > b ? a : b) unary operation, what's wrong with those? (I know py2.6 has something similar introduced, but given the massive support of almost every other language for those simple syntax, why reinventing the wheel? why not just follow the best practice? Shouldn't a good thing just keep in its good "form"?)
  5. Program to interface. Python has no interface or abstract class concept (py3k has something called abc), everything is concrete. Providing an "interface" or "abstract" keyword to build class skeleton and guard class inheritance and extension wouldn't be a bad idea I think. It helps on top-down design. Currently, I just have to fill the each of methods with NotImplementedError, quite a tedious job.
  6. I have to add this. version less than 3.x has str and unicode types. This is a true nightmare. It makes ascii and non-ascii/unicode mixing most likely to fail (bad, bad)

I saw people complains about speed. I don't get that. Its an interpret language, code not compile to machine code until runtime, that's just the nature of it. You can't compare speed from an interpret language to a compiled one. As far as I can see, among the interpret/scripting languages, python isn't slow.

4. You miss both ++a and a--? Heavens... If you get those, may I have inline assembler back please? 6. Ah, you're only used to 7-bit ASCII I take it. The mixing of ASCII and unicode will bite you sooner or later, badly, and in a way hard to debug. Explicit is very much better than implicit in this case. - kaleissin
agreed. that's why I said its a nightmare because you can't 100% sure when you are dealing with pure ascii and when you are dealing with unicode. Luckly is that py3k treats them all unicodes with utf-8 encoding as default (instead of ascii). And that, we are all talking about just unicodes... ++/-- do not seem to be very evil to me.. :) short than i += 1. the thing is i += 1 is a statement which can't be used in expression, where ++/-- is expression. - jimx
for #4: foo = a if a>b else b --That probably looks better when surrounded by parenthesis. I like that syntax because you can read it as "foo equals a if a is greater than b, else b", foo = (a > b ? a : b) is harder to decipher. - Wallacoloo
You can create class properties, but it can be non intuitive. See my question here:… - Jason Baker
The problem is that ++ and -- can be used in expressions like a=b*++a+c[a++], which IMO is hard to predict the resulting value of a. I have no problem with just a++ (even though you're only saving 1 character). But if it was chosen to allow the later and not the former, it could be more confusing to programmers with background knowledge of a language that has full support for pre/post increment. - Wallacoloo
[+2] [2009-06-05 17:35:45] A. Scagnelli

VBA (because you thought your language was bad)

  1. Whitespace inside a line is rigidly enforced.
  2. Statements just end, and require a " _" to break to the next line, but not every line can be broken.
  3. No ++,--,+=,-= statements. Seriously?
  4. Arrays can begin at any index, not just 0.
  5. Some types (i.e.: fixed-point "Decimal" value) must be subtypes of Variant, and aren't available as their own type.
  6. != and <>.
  7. "=" is used as both comparator and assigning, instead of splitting into "=" and "==".
  8. "Option Explicit".
  9. UI hasn't been updated since 2000.
  10. Office2k7 didn't upgrade to VB.NET
  11. Most object models are non-sensical and overly verbose.

I haven't used VBA much, but the = for comparison and assignment sounds horrible! I use == all the time in math expressions, and I'm guessing something like x=x+(x=0) is a syntax error (or unpredictable)(Though I'd never actually use this example). - Wallacoloo
[+2] [2009-04-10 12:45:34] TokenMacGuy



dict comprehensions are available in py3k - SilentGhost
@SilentGhost: I did see that, and I'm happy about that and other changes, but until py3k receives widespread acceptance, It's pie in the sky. - TokenMacGuy
(1) dict((f(k), g(k)) for k in keymaker) - Jonas Kölker
[+2] [2009-11-25 07:17:56] Eldalië


• Community is too small. It's next to impossible to get a good language-immersion program going when there's no easy to find another speaker nearby.
• Irregular verbs. Yes, I know English and Spanish mentioned them, too, but Quenya was invented. Why does there still need to be irregular verbs?
• No Unicode support. I have to have three different Tengwar fonts on my computer before I can read most messages, and several of them are poorly kerned. This wouldn't really be a huge issue given the existence of a Romanized transcription, but Tengwar is so beautiful, you don't not want to use it.
• Not all concepts can be easily referenced in Quenya, leading to annoying circumlocutions, or resorting to Sindarin, Númenórean, or (Manwë save me) Klingon to get my point across.

[+2] [2010-03-22 17:58:56] Robert Davis


  • Lack of multiple dispatch based on the runtime type of the method arguments. dynamic should solve most of this, but it hasn't been released yet.
  • Interface implementation is declarative not structural. I really like the way Google's Go language is doing types
  • Making asynchronous method calls is really bulky (and I'm pretty sure all threads are OS threads, not lightweight threads)
  • No macro system. I'm not talking about C-style macros here; I'm talking LISP/Scheme style macros
  • Operators are static methods and their signatures are overly constrained (and you can't create new ones).

  • You mean nominative not structural instead of declarative. - Dario
    [+2] [2010-05-23 18:01:53] Ken

    Common Lisp

    [+2] [2010-05-23 12:07:39] Eamon Nerbonne


    Whoof!!! Thats a really long list!! - Bragboy
    C#'s pretty practical and my primary language - but after using a more niche language for a particular subproblem I'm often left wondering why C# has some of these limitations - particularly since some of these issues result in the overall language being rather more complex than less complex - risking C# growing towards the C++ end of the spectrum in terms of complexity. Honestly though, I don't think it'd be good thing for C# to actually address most of these issues. Better to fix em in a new language than deal with an ever more complicated compatibility scenario. - Eamon Nerbonne
    One that I hate is the difference between (Class) and as Class. Mainly to do with the whole nullable-or-not thing. - Nick Bedford
    [+2] [2010-05-23 12:08:59] Don Reba

    Five things I resent in Nemerle:

    [+2] [2010-05-23 12:46:35] Zak


    [+2] [2010-05-23 13:27:45] e-satis

    Python, again:

    1. No switch keyword. And NO, dictionary is not a replacement for it. Not even a bunch of elif statements.

    2. Inconsistent line break handling. Why can I do:

       test = (1,

      And not:

      from itertools import cycle,

      Why can't I do:

      if stuff \
         and foo \
         or bar:
          return "Formated string with %(arg)s" % \
                 {'arg': "bloody slash"}

      without using slashes?

    3. There is not one obvious and only one way to do it. Python fails on its motto just like Java failed on "Write once run anywhere".

      # what somebody from an another language would do
      if not test.has_key('foo'):
          test['foo'] = 0
      n = test['foo'] = test['foo'] + 1


      # what an agnostic beginer would do 
          test['foo'] += 1
      except KeyError:
          test['foo'] = 1
      n = test['foo']


      # what you end up after looking for dictionary default value in the python doc
      test.setdefault('foo', 0)
      n = test['foo'] = test['foo'] + 1


      # what I would do
      n = test['foo'] = test.get('foo', 0) + 1

      And the worst is that they don't do exactly the same thing. There are subtle differences.

    4. Choice between spaces and tabs. There should be no choice. Pick on, set it in stone and stop fighting.

    5. Why can you do that:

      test = {}
      test['foo'] = 0

      but not:

      test = []
      test[] = 0

    P.S: " ".join(l) is fine people. Stop complaining about it, it's not obvious but with the iterator pattern in mind, it's just the right way to do it.

    Use parentheses for all your line continuation needs. -
    [+2] [2010-05-08 22:03:38] percent20


    This was inspired a bit by the Chinese and English responses

    1) Has not one, not two, but three writing systems.
    2) For every verb you can do about 50 conjugations to mean almost 50 different things
    3) Sooooooo many double negatives
    4) Particles
    5) on-yomi and kun-yomi

    Funny enough 1, 2, and 4 are reasons I also like it.

    [+2] [2008-11-14 00:00:49] community_owned

    Objective Caml

    1. Lack of namespace facilicty.
    2. Wordy class and object nortation.
    3. Complex build system.
    4. Inconvenient to make infix.

    [+2] [2008-11-11 22:35:19] Uri

    I use Java, and my biggest beef is the inefficiency of string operations. when you use the + operator. Seriously, can't the compiler figure out how many strings I'm adding and then generate the StringBuffer stuff in the background for me?

    Often code that uses + is more readable than a sequence of StringBuffers operations.

    Also, I hate the redundancy between native arrays and the collection framework. The syntax for .toArray() is extremely ugly.

    If you use "+" for String concatenation within a single statement, it is converted to StringBuilder.append() by the compiler. However, this doesn't happen across multiple statements. - Don
    I was referring to the multiple statement situation. I would like to be able to write a series of concatenations of variables and constant string literals, and have the compiler figure out which literals to combine at compile time and which ones to then automatically add the stringbuffer stuff for. - Uri
    I only see one thing, the question asked for five. - Brad Gilbert
    Actually, there were two.... My other beefs were already mentioned by others, so this is the delta :) - Uri
    (1) You should probably use StringBuilder rather than StringBuffer, if you don't have multiple threads accessing it. It's faster. - rlovtang
    (1) I really don't like this kind of micro optimization. Most of the time, the compiler is clever enough to use StringBuilder, and when it's not I usually don't mind the extra microsecond anyway. I prefer readability, and optimize when there is need for it. - rlovtang
    [+2] [2009-01-03 03:08:09] cgranade


    [+2] [2009-01-03 13:33:55] Breton


    1. the dynamic binding of "this" is very confusing and dangerous if you don't know exactly what you're doing.
    2. a function declaration requires the keyword "function". It's not the typing I object to, it's the reading it when I want to do something slightly clever. Hrm now I think of it maybe that's a plus. Discourages me from doing clever things.
    3. As a result of number 2, it's often less code (in terms of characters) to just copy/paste a code segment than to declare it as a function, if it's a fairly short idiom. This unfortunately promotes bad practice, especially in my own code.
    4. Javascript makes motions at being a functional language by having first class functions and closures, but there's no way to verify referential transparency in a function, at either runtime or compile time. Without this, some architectures become either risky or bulky.
    5. Its fantastically bad reputation, and thus my inability to say "I program in javascript" to anyone without being laughed at.

    [+2] [2008-12-05 17:32:47] skiphoppy

    Perl 5:

    1. All the really good stuff nowadays seems to require mod_perl, which has low availability everywhere I want to go.
    2. Some really incredible functionality can be encapsulated in modules, but what is under the hood is often fragile or frightening: source filters, typeglobs, whatever Moose is doing...
    3. DateTime is brilliant but still made some very bad design decisions ( not returning a stopwatch duration when subtracting two DateTime objects [1])
    4. Dual-lifed modules in core and on CPAN still cause conflicts
    5. module authors still put interactive stuff in their module configuration scripts so that they can't be automatically installed

    (1) None of that has anything to do with the actual language of Perl :) - brian d foy
    Yeah ... Perl's a pretty good language ... :) I'll think and see if I can come up with some more language-specific answers. - skiphoppy
    Okay, here's a real one: even when I do a test compile with perl -c, perl still can't tell me that it's going to blow up on an undefined subroutine. That really sucks. - skiphoppy
    Why would you want -c to tell you that? Perl's a dynamic language. That means perl can't know everything you are going to do at runtime. That's the point. :) - brian d foy
    [+2] [2008-12-10 01:53:22] Henk


    [+2] [2008-12-04 08:17:58] Norman Ramsey


    I love programming in Lua, but here's what burns me:

    1. There's no way to write down an API in the language---nothing like a C .h file or Java interface
    2. The language has first-class functions but somebody forgot to tell the people who designed the libraries.
    3. The syntax for writing a function is way too heavyweight.
    4. Syntax is split between statements and expressions.
    5. The expression form is impoverished: there's no 'let' form, there's no true conditional expression, ...

    Despite all of which I will insist that Lua is fabulously great :-)

    [+2] [2008-11-15 10:48:55] leppie


    No dynamic scoping, no bignums or complex numbers in some implementations, non-portable type declarations, no native hash tables. - Daniel Cassidy
    [+2] [2008-11-14 06:27:52] Adam K. Johnson


    1. Global Interpreter Lock - Dealing with this complicates parallel processing.
    2. Lambdas functions are a bit clunky.
    3. No built-in ordered-dictionary type.
    4. Depending on how Python is compiled, it can use either UCS-2 vs UCS-4 for the internal Unicode encoding, many string operators and iterators may have unexpected results for multi-byte characters that exceed the default width. String slicing and iteration depend on the bit width rather than checking and counting characters. (Most other programming languages do similar things as well and have similarly odd behavior with these characters.)
    5. There are inconsistencies surrounding GUI frameworks for Python.

    I don't have many problems with Python. I love the language. But #3 is so needed. - Echo
    GIL doesn't complicates parallel processing. Exactly the opposite is true. GIL just restricts your script to one CPU if you don't use multiprocessing or similar. - J.F. Sebastian
    It's not built in (yet) but the 3.1.1 collections module has the OrderedDict class. - Don O'Donnell
    [+2] [2010-09-09 17:06:57] Thorbjørn Ravn Andersen

    EL - Expression Language, the ${...} and #{...} thing in JSP pages and JSF 2.0 Facelets which is used to pull data up from the underlying Java code.

    [+2] [2010-05-25 20:47:35] Ikaso

    Regarding C#:

    1. I hate that there is no keyword to specify which exceptions are thrown from a method like in java. Its a much better way to document exceptions than using an XML comment.
    2. I would also want a much better syntax for generic constraints like oring and anding of constraints.
    3. Why a method can't return more than one value?
    4. Lack of support for aspect oriented programming in the language.
    5. Why can't you annotate each one of the property accessors with an attribute?
    6. Lack of builtin regexp support like in perl.

    +1 for exceptions documented on the method itself. It sucks having to go to the API to see what could possibly be thrown from some call I make to ensure I handle all the cases. Even better: a code snippet that can add catch()es for all exceptions that can be thrown. - drharris
    [+2] [2010-05-25 22:06:21] Tomas Sedovic

    Python 3

    [+2] [2010-05-25 22:25:40] ch0wn


    1. Standard library disobeys their own style guidelines in many places. (PEP-8)
    2. Py3k's super keyword is full of unwanted magic (you can't assign it to a different name, works without self, why do we have this explicit parameter at all?)
    3. Unicode support is incomplete in Py2k and sucks in Py3k (standard input in unicode, no binary data! WTF? Creating a new WSGI standard is hacky.)
    4. The GIL. Very limited multi-threading support (with CPython)
    5. PyPI (Python Package Index) sucks. Envious glance at rubygems

    re-open stdin in binary mode? -
    [+2] [2010-05-26 00:37:18] Josh


    [+2] [2010-05-26 01:53:17] Davinel


    1. There is no Django for Python 3.
    2. Static typing. Yes, dynamic typing is great thing, but sometimes I do want to make it static.
    3. Proper unicode support (fixed in Python 3)
    4. Construtors naming. I hate all this underscores __in__ my code.
    5. Threads are not very efficient

    (1) +1 for the underscores - RCIX
    [+2] [2010-05-25 20:34:45] smerlin


    [+2] [2010-05-25 20:24:25] Matt R

    Five things I hate about C++

    #define STR_LINE2(x) #x
    #define STR_LINE(x)   STR_LINE2(x)
    #define LINE_NUMBER STR_LINE(__LINE__)

    [+2] [2010-05-25 18:35:50] user350201


    1. Sometimes the type system feels backwards. What if I don't want the compiler to infer types for my variables? What if I want the opposite, where it does constraint checking on said variables? For example, instead of inferring the type of the elements of a list, it instead makes sure that they all belong to a particular typeclass. This is a subtle but huge difference that makes it difficult for me to program UIs. It can be done, but it takes more effort than it does in some other languages. Haskell rocks for the non-UI parts, but the UI I leave to an untyped language.

    2. Allowing the construction of infinite values leads to some really frustrating errors sometimes.

    3. NoMonomorphismRestriction.

    4. Bytestring handling bites me in the ass sometimes and you don't know it until your program crashes because you mixed them up improperly. Something is wrong here, when we are losing type information that should have prevented this.

    5. Typeclasses should be automatically derived for trivial cases, like witness types, but there's a strong potential for abuse there.

    (2) Re #1, do you mean there are type constraints that you want to impose that you can't using the likes of foo :: SomeTypeClass a => [a]? - j_random_hacker
    [+2] [2010-05-25 18:41:19] Sir Graystar


    I know its stupid, but I'd like datatypes to convert to what I want on their own, without me having to add (int) or Convert.ToInt32 or whatever. It would just save me time. And it annoys me that if I write something to output an int and then it turns out that I need a long, then often I have to go through and change everything I've done to make it work. Just do it for me!

    Sorry, couldn't think of five, but I'm new to it, so maybe I'll come back and add more later :P

    [+2] [2011-01-27 04:44:15] WReach

    By far the thing that I hate most about my favourite language is that my choice keeps changing. Every time I think I've found The One, I find five (or more) things that I hate about it. And then the grass looks greener over there...

    I know this feeling! :| - j_random_hacker
    [+1] [2010-05-25 19:05:44] CountCet


    1. No easy way to check if a type is Numeric
    2. It means you are probably stuck using most of the microsoft stack, IIS and MSSQL
    3. Instead of being a specific tool for a specific problem, C# tries to be a language for every paradigm.
    4. Lack of community. Sure, there are starting to be open-source frameworks and libraries for C#. The same ones that have been available to Java developers for years.
    5. Hard to find good help. The internet is littered with poor examples of how to solve problems with C#. This goes back to problem #3.

    [+1] [2010-05-25 20:38:42] Bremer

    VB .NET, but only because VB6 poisoned an entire generation of programmers

    I work in a VB .NET shop that used to be a VB6 shop, and every person working here who used to be VB6 developers stubbornly refuses to learn anything about .NET. They code as if it’s still VB6, and their apps suck just like VB6 apps did. My boss actively discourages any use of LINQ because she fears it’s too difficult for others to understand, which is true because nobody wants to understand it.

    I think we would have all been better off if MS just went with C#, which kills me to say because I think curly braces are far inferior to VB’s verbose closing statements.

    I agree (and I'm coding in VB.NET). If you look around forums and boards you find a lot of code written in VB.NET which looks like VB6 or even VBScript...the people just think "It's the same as always" and just refuse to learn anything about the framework or the new features. It goes even so far that someone told me that OOP is "hard to write, read and understand" and VB6 would be way easier. For some reason I only see this behavior in the VB-Community, and in my opinion dragging the VB6-Namespace along was the worst decision Microsoft made with VB.NET. - Bobby
    I agree that they went a little too far in backwards compability, bringing in a lot of junk that shouldn't belong in a modern language. What makes me sad is they can't really fix it now, they missed their chance and like you say C# has it's own problems. We have a few die hards writing vb6 code using .net but not too bad. I remember 10 years ago the old-timers were writing cobol/fortran programs in VB6, now that was some really awful code to maintain. Everything in 1 function and lots of gotos! - dwidel
    [+1] [2010-05-25 20:30:30] thejefflarson


    From the ECMAScript 5 spec:

    OK, I kinda enjoy the last one, but it's 7 kinds of confusing

    Prototype inheritance is great but you have to know what you're doing :). JavaScript is great instrumentaion language but for implementing some logic I prefer something more type-checked and use only thinh JS layer around it. - binary_runner
    Yeah, the thing that always messes me up about it is setting the inheritance chain, but this is a sweet way to do it:… - thejefflarson
    All those things make good sense to me... How come some people find those concepts so difficult/annoying? I love the loose and strict comparisons and using instanceof. Also having numbers as floats means they just work like real life. And prototype inheritance is my favorite feature... Having reasons in your post on why they annoy you would be nice. - balupton
    I don't see the need to defend #1. == is a superflous operator, as it does type coercion and is almost never what you want. I do think that while it's correct, having an impossible value (NaN, null, undefined) not equal another is not pragmatic. I agree that god intended numbers to be floats, but checking bounds on float math (j<i+theta && j>i-theta) to make sure that we have acceptable values for operations gets real old real fast. And the last one was a joke, but I do find it confusing (and awesome). These are all letters of love to a language I would code in almost exclusively if I could. - thejefflarson
    [+1] [2010-05-26 00:03:02] Peter Donis


    1. No standard GUI toolkit (the community goes round and round about this but never seems to settle on anything).

    2. The evolution of tools and methods to distribute and install Python apps and libraries has been, well, rocky. (Although lately this seems to be moving closer to getting fixed.)

    3. CPython is still slow as interpreters go (although PyPy is looking pretty good these days, if it becomes the "standard" Python this problem goes away).

    4. You can't subclass built-in classes (e.g., list and dict) without overriding a lot of methods, even if all you want to do is a simple hook into an event (e.g., to hook into an item being added to or removed from the list, you need to override delitem, append, extend, insert, pop, and remove--there's no subclassable "change" event notification, nor any "protected" methods that factor out common code used by all the above methods).

    5. Up until virtualenv was invented, keeping separate Python environments for different purposes on one machine was a real pain.

    [+1] [2010-05-25 21:22:51] jes5199


    1. Strange scoping rules - variables, constants, and methods each behave differently from each other. The rules change also depending on which keyword you used to create a closure. Or on whether you're in a class, eigenclass, object, module, or module's self. Then there's instance_eval, which changes the rules to a different set of rules. And they change again when a module is "included" or "extended", which themselves do different things to scope. And some sets of rules can't be emulated by metaprogramming, so you have to use eval. Unless you're on ruby 1.9, where all of this is different.
    2. Namespacing is basically useless. If you have Foo::File, then the stdlib File is probably broken for all of Foo.
    3. require statement is broken. If two files require eachother, the behavior of those files can change dramatically depending on which is loaded first from elsewhere.
    4. libraries change APIs dramatically and suddenly, so you have to require specific minor revision numbers of all of your dependencies. For every single ruby application on your system.
    5. The rubygems package system overrides "require" rather than putting files in the search path - because why use a system when you can replace it?

    [+1] [2010-05-26 08:30:07] binary_runner

    Java - no support for composition on language level

    [+1] [2010-05-29 18:57:57] Shaken_Earth


    1. Very inconsistent.
    2. Graphics APIs are sometimes a pain to use
    3. NullPointerExceptions don't tell you what's null
    4. Programs I write sometimes don't work on a different JVM which is a huge pain and contradicts Java's "Write once, run anywhere" statement.
    5. Swing isn't as good as it should be.

    [+1] [2008-11-15 08:18:54] community_owned


    1. No type inference
    2. Methods/functions are not first-class objects
    3. Scope of variables is not lexical although scope of block variables is lexical
    4. def inside def
    5. the difference between super and super()

    [+1] [2008-11-14 01:13:38] Joshua Swink


    (3) If you want fast Ruby, have you tried maglev? Languages are never slow. Only their implementations can be slow. :) - brian d foy
    @brian, most languages have only one implementation. This applied to Ruby until recently, so yes languages can be slow. - finnw
    [+1] [2008-11-24 04:12:33] Demur Rumed

    I feel that a favorite language is impossible to choose. Dynamic typing and static typing can't quite be compared, so I'll just list which of which I use



    alist = list("abc"); alist[4] = "b"; ... in Python. - J.F. Sebastian
    [[0]*width for _ in xrange(height)] instead of [[0]*width]*height - J.F. Sebastian
    use sys.setrecursionlimit(20) for debugging recursive functions - J.F. Sebastian
    How exactly should python make hash a mutable in order to make that dict key? If you want a sequence for the key, use a tuple, or a frozenset. - Gregg Lind
    [+1] [2008-12-17 03:40:18] Soviut

    MEL (Maya Expression Language):

    These and several other reasons are why AutoDesk adopted Python as a secondardy scripting language, which brings up a few other annoying factors:

    [+1] [2009-01-03 14:09:53] community_owned

    C is my favorite but it is also horrible.

    Incidentally, GCC supports ranges for cases in the switch statement. - mipadi
    [+1] [2008-12-07 02:33:46] Tetha

    I can add another one for Python:

    Given a list l = [l1, l2, ..., ln], then repr(l) = [repr(l1), repr(l2), ..., repr(ln)], but str(l) != [str(l1), str(l2), ..., str(ln)] (str(l) = repr(l)). This was decided because there could be obscure entries in the list like l = ["foo], [bar,", "],["] and str(l) would return "[foo], [bar, ], []" which "could confuse users". However, this makes str impossible to use for just dumping data, since list kills the "just dump data in a readable format". Augh!

    [+1] [2008-11-11 22:52:34] Marty

    Python: Array part-selection doesn't give you what you asked for.

    a[1] gives you one element
    a[1:2] gives you one element, not [ a[1], a[2] ]
    a[1:3] gives 2 elements

    I hate that, but maybe that's just because I mostly work in Verilog.

    Okay, you only have four more to go! - brian d foy
    That one counts for all 5 in my book! - Marty
    It makes sense when you do [0:2] or a[2:4], it is much better than PHP's array_slice(). - too much php
    I remain unconvinced, Peter! You get 2 elements for both of those, which is exactly the behaviour which annoys me. I would (and did) expect that [2:4] would return elements 2 to 4 inclusive. - Marty
    I believe it's easier to understand in a graphic manner: [0:2] -> |0 1 |2 3 4 5 6 7 -> [0,1] [6:7] -> 0 1 2 3 4 5 |6 |7 -> [6] [6:] -> 0 1 2 3 4 5 |6 7| -> [6, 7] [-3:-1] -> 0 1 2 3 4 |5 6 |7 -> [5, 6] The numbers represent a limit rather than a specific location: [2:8] -> 0 1 |2| -> [2] - I GIVE TERRIBLE ADVICE
    Here's the trick I learned: subtract the first number from the second number. That tells you how many elements you're slicing. So [5:6] will contain one element because (6 - 5 == 1) and [12:87] will contain 75 elements because (87 - 12 == 75) - benjismith
    At least it is consistent with the range() functions, so you can put a mental alert like "watch out! the last element will be left out" - Mario
    (2) @Marty: It is a standard practice to left out end element when defining a range, e.g. in C++: iterator.end() is pointer after the last element; in C: for (int *p = a; p != &a[n]; ++p) here's &a[n] points to next to the last array element. See Dijkstra's article - J.F. Sebastian
    If it was inclusive, it'd prevent many good python idioms. First off, s[0:len(s)] would actually give more elements than exist (Though most builtin types will actually treat it like s[0:len(s)-1]). Also, how do you select 0 items? maybe s[2:1]? What about s[0:-1]? Currently, it will not return 0 items, but instead return all but the last element. And yes, I do often take slices of length 0 from arrays (when the indices are calculated from variables) - Wallacoloo
    [+1] [2008-11-14 00:24:12] orip


    [+1] [2008-11-12 08:54:43] Enrico Campidoglio



    Primitive data types aren't objects: what is the problem with this? Since Java 5 you have autoboxing/unboxing - nkr1pt
    Well, .NET everything is an object, including the primitive datatypes (the only difference is that they are allocated in the stack). The advantage of this approach is that behavior (methods) can be added directly to primitive types, instead of having to use a separate "utility" class like in Java. - Enrico Campidoglio
    Autoboxing sucks. Make everything an object. Allow access to primitives in rare cases. The problem is objects can't override many operators like - and * etc. So can't make it work on Integer objects. What about Java's Generics. Can't cast when using generics, have to ungenerify objects. Its stupid. - Dmitriy Likhten
    [+1] [2008-11-12 01:14:31] user35978


    1. It takes so much time to make a simple snippet of code.
    2. for(std::vector::const_iterator iter = [...]
    3. vector.remove() doesn't remove.
    4. vector.push_front() doesn't exist.
    5. header files
    6. No lambda
    7. No automatic empty virtual destructor if there is at least one virtual function.

    Boost solves at least #2 and #6. For the rest, I agree with you. - Martin Cote
    (1) #3, it does. It just doesn't delete. #4 use deque. - Jasper Bekkers
    #7. The reasoning is that you may not want a virtual destructor if e.g., your derived classes do not add any non-POD members. Explained here: I think it should force you to declare a destructor as "nonvirtual ~ClassName()" to let it know that you have thought this through though. - Neil G
    2. for_each(v.begin(), v.end(), foo); 3. std::vector has no remove member function. Perhaps you mean std::remove_if()? Use the member function erase to erase elements from containers, and remove_if to move elements to be erased by a predicate. 4. Thankfully, because then it wouldn't work as a linear array, or it would make the allocator much more complex. 6. Use Boost's lambda. - community_owned
    #4 cant be implemented effectivly for a vector. So dont blame C++ for that, but choose a container class which fits your needs. - smerlin
    [+1] [2010-05-23 11:21:20] Techpriester

    Rewrote this after some more thinking ...

    Five things I hate about PHP although I love it (in no particular order):

    Those are the language features (or lack of) that annoy me but the much bigger problems are these more people/community related things:

    1. The fact that a lot of people who use PHP, don't know anything about programming and good practices in general and produce really messy code. JavaScript has the same problem.

    2. The huge amount of tutorials/book that teach really bad practices and style. This may be the main cause of #3.

    3. The bad reputation it has developed mostly because of #3 and #4.

    [+1] [2010-05-23 14:59:59] ssg


    I'm very happy with C# but these two really annoy me:

    Sorry for the ignorance, but what is the problem with constructor-based initialization for immutable types? - devoured elysium
    First you have to write one and write all redundant assignment statements in it. On the other hand, mutable classes support inline initialization syntax by assigning properties just after constructor directive, much easier. Second, with parameterized constructors it's hard to know what you assign to what. Inline initialization shows you that. .NET 4.0 cures this partially with named parameters. In many functional languages, constructors of immutable classes actually act like "member definitions" at the same time, saving you a lot. See F# or Scala. - ssg
    [+1] [2010-05-23 12:15:35] Niklas R

    Having to assume we have a language. Do we?

    [+1] [2010-05-23 16:54:33] Richeve S. Bebedor

    Java is slow according to many but I agree to a certain to degree of usage.

    Java is dramatic. They have lots of classes just for a single thing you wanted to do. But you know flexibility property XD.

    Java is hard at first but fun as always.

    When you are writing a simple code for printing "Hello,World!" PLEASE DO NOT USE JAVA! XD I'm sure I am justified.

    Java is a mixture so don't say it is purely an OOP language.

    There's many more but I am only restricted to five XD. Thanks!

    [+1] [2010-03-23 17:09:28] Tom

    My 5 for Delphi:

    1. Procedures and functions aren't necessarily distinguished from variables if not parameterized (eg, I can have statement such as x := GetPositionOnScreen; instead of x := GetPositionOnScreen();)
    2. Try/Finally and Try/Except needs to be nested (stated once before, but it's still one of mine as well).
    3. Not case sensitive.
    4. Can have a multiple objects (functions, global variables, local variables) named the same and Delphi will happily try to figure out what you mean. names should be unique.
    5. Odd if condition rules. a single conditional check doesn't require a () around it, but if I do multiple checks, I need a () around each one, and sometimes multiple nested sets for bigger checks.
    6. No inherited includes. If I need to reference functionality from the Windows unit in a base and an inherited form, I have to include Windows in both.

    [+1] [2010-05-04 07:57:12] Joey Adams


    As an aside, I think one of the coolest features unique to HyperTalk is the special it variable:

    ask "How many years old are you?"
    answer "You are " & it*12 & " months old."

    [+1] [2010-02-07 21:23:28] Brendan


    Ones that I just don't understand ...

    Ones that make sense based on the implementation but are annoying ...

    and a couple that are fixed in Python 3

    (2) For #2, I believe len(instance) just calls the method instance.__len__() - Wallacoloo
    @wallacoloo Sure but in terms of syntactic sugar, __len__() should just be aliased to len() - Brendan
    I completely agree with you. I'm just saying that if you ever truly need it as a method, you can use it as a method. - Wallacoloo
    I don't really know too much python but I imagine floor and ceil return floats for the same reason C# does. Math.Floor(double.MaxValue) > int.MaxValue returns true in C#. - Robert Davis
    In C#, that would be the case, in C too (which CPython is written in) however Python int's are automatically cast to arbitrary length 'longs' when the int limit is reached - this effectively means a Python programmer almost never has to think about integer overflow. It seems to me that the CPython is built on the C implementation of floor and ceil and the step of converting to appropriate Python variables was not implemented. - Brendan
    +1 for #4, my biggest annoyance with Python. - missingfaktor
    the math module is just a very thin shell over C's math.h. -
    [+1] [2010-02-16 12:50:21] thSoft


    "the hard-coded FunctionX, TupleX classes" -- What other alternative did they have? - missingfaktor
    Nothing. Just it would be elegant in a parametric way. - thSoft
    [+1] [2010-01-02 08:27:14] John Stewien


    The number one all time pet hate of C# has to be:

    (1) Events have strong references to all listeners thus preventing garbage collection of anything that listens to an event. If you want to see the problems this has caused just search on the net for all the people who have tried to solve the problem by creating some sort of "weak referenced event handler".

    (2) Needing to check if an event equals null before you call it seems like something that should be handled by the language.

    (3) The XML serializer has no way of reading/writing comments in an XML file. Not great in an environment where XML files are modified both by hand and by the tool written in C#. Can be worked around by just using a raw XmlDocument, but would be nicer to be able to abstract that away to a class.

    (4) The build process doesn't let you directly access things like xsd files, instead you need an intermediate step where you create a C# partial class. This also causes issues with XAML files where you need to rebuild twice sometimes to get changes to flow through properly.

    (5) No support for CPU intrinsics like MMX and SSE 1,2,3,4 and thus these valuable CPU features go unutilised when running C# apps.

    Others that didn't make my top 5:

    (6) Can't tag fields as properties, all properties have to be explicitly implemented from the get go:

    E.g. currently has:

    public class MyClass {
        private int someInt;
        public int SomeInt {
            get {
                    return someInt;
            set {
                    someInt = value;

    Would like

    public class MyClass {
        [IsProperty(public, get, set)]
        private int someInt;

    (7) No support for multiple return values e.g:

    public int, string, double MyFunction()
        return x,y,z;
    public void TestMyFunction()
        int x, string y, double z = MyFunction();

    (8) No support for covariant return types

    I have some gripes about the generics implementation, but I'll cut it there. I think C# is a great language for doing all the GUI, networking and configuration plumbing and is my number one language for getting things up and going quickly in a way that can be supported in the long run.

    [+1] [2009-10-12 16:34:16] Brad


    1) Lack of practical ability to write generics for value types. For example, any idiot (well most idiots) can write a routine that calculates the standard deviation of a list of int, float, double, etc in C++, it is straightforward to write, easy to read and performs as fast non-generic code. I think if you can write something in C# that is close to hitting any one of these 3 without being ridiculous on the other 2, you are a really great programmer.

    2) Covariance and contra variance, although this is being added to 4.

    3) Extremely poor documentation of LINQ (alright, not really part of the language).

    4) Trying to use foreach/iterators when I want to do the same thing every time except something slightly different the last time (such as concatate a bunch of strings with commas between them and the word and between the last two). If I write it with an IEnumerable, it is hard to write and read, and with a for (int i=0 i < ...) it isn't much better and it is less efficient.

    5) I know I am going to get complaints about this, but lack of checked exceptions. This does not need to be implemented the way it is in java (The framework developers do make some very good points on why they didn't do this), but I would be happy with a compiler warning users who don't like checked exceptions can turn off.

    If you want to concatenate strings with commas do it differently in the first iteration (you prepend the strings in all but the first iteration with a comma). That's IMO a lot easier than doing it different in the last iteration. - helium
    [+1] [2009-06-12 23:18:11] Gregory Higley


    REBOL is among my favorite languages. I can't say that I have a favorite, though Haskell ranks pretty high as well.

    1. Its odd syntax scares off many developers before they even give it a try.

      use [email rules url] [
      ; A small DSL that sends email to people about URLs.
      rules: [
          some [
              into [
                  set email email!
                  set url url!
                  (send/subject email url reform [ "Check Out" url ])
      ; Global context
      notify: func [ [catch] dsl [block!] ] [
          unless parse dsl rules [
              throw make error! "You screwed up somehow."


      notify [ [ ] [ ] ]

    2. Recursive dialects are very easy to validate with PARSE but very difficult to evaluate. (Stacks can be helpful here.)

    3. REBOL has very poor integration with many popular technologies, particularly XML. I suspect this is partly arrogance, because the REBOL BLOCK! datatype can do almost everything XML can do. However, the real world has XML in it.
    4. No Unicode.
    5. Thanks to AltMe, REBOL's user community is very insular. I can understand why they want to use AltMe. It's written in REBOL and shows off its strengths. Unfortunately it also puts them off on their own little island.

    The upcoming REBOL 3 will hopefully fix many of these issues, except for the last one.

    [0] [2009-05-28 08:52:52] community_owned


    1) It's a scripting language and not a fully compiled one (I'd prefer to be able to compile binaries—I don't care about bytecode). This is very annoying if I have to use very many libraries (i.e. everyone who uses my program has to install all the libraries, and this basically means no normal people will be able to, or have the patience to, properly set it up—unless I do a ton of work that should be unnecessary). I know ways to make binaries, but they don't always work, and I'm guessing they bundle the interpreter in the binaries anyhow (and I don't want that). Now, if I could get a bytecode compiler that would include copies of all the files that I imported (and only those) to be placed in my program's folder, that might be a suitable compromise (then no one would have to download extra libraries and such). It would also be nice if the compiled python files could be compressed into a single file with one specified as the file to run the program before this is done.

    2) It seems a bit buggy at times; there have been a few times when code that was supposed to work simply did not (there were no programmer errors), particularly code relating to such as "from moduleX import *", and other import-related issues, as well as some issues pertaining to global and local variables.

    3) Maximum recursion depth could be higher. There has been at least one time when I felt that I needed it to go higher.

    4) No switch statement (let alone one that allows for numbers, strings and ranges)

    5) The newer Python versions seem to be doing away with a lot of useful string operations, and they don't seem to have simple documentation on how to do the same things without them.

    6) Forced automatic garbage collection (I'd like to be able to do it manually, although not necessarily forced to do so).

    7) No pre-made Timer class without the use of a GUI (well, there might be one, but after all the searching I've done, it's sure not convenient to find! I actually did find something, but it didn't work at all when I tried it.) By a timer, I mean the sort that will execute a specified function every x seconds, with the ability to turn it off when desired, etc.

    8) People in the community who give examples rarely tell what modules they imported, and how they imported them.

    9) There's not a lot of support for integration with Lua.

    10) There doesn't seem to be a way to add an extra function to a particular instance of a class (and not the entire class at large), unless you dynamically add an object variable to that class with the object having the needed function (but still, you have to make another class just for that).

    for #10: if c is an instance, and f is a function, then c.newFunction = f.__get__(c) -- Just don't forget that f needs to have 1 extra argument (self) - Wallacoloo
    3. sys.setrecursionlimit(limit) -- 4. Thank god for no switch statement! -- 5. You mean the string module? All those operations are available as methods on string objects. -- 6. gc.disable() Believe me, you don't want to do it manually. Just one session of debugging gc problems and you'll know what I mean. -- 7. +1 Though pyqt does this pretty well with QTimer. -- 8. You must not have been looking on SO. -- 9. ?? -- 10. Sounds like a terrible idea, but you can add staticmethods to instances at runtime. For bound methods, this could be done with overridden __new__, or __metaclass__. - Brendan
    You can easily add a method to a class with Class.method = some_method. I just tested it with IronPython, and I think it works with CPython as well. - Bastien Léonard
    +1 just for point #1 - Lo'oris
    [0] [2009-02-05 00:18:34] WolfmanDragon


    [0] [2009-11-25 07:13:12] tster


    5. The null-coalescing operator

    The ?? operator allows you to write:

    x = y ?? z;

    instead of:

    x = (y == null) ? y : z;

    I like this operator, but I want another one:

    x = y ??? :;

    instead of

    x = (y == null) ? :;

    I use this kind of thing all the time, and I find it annoying to type the == null part.

    4. Equals should have better support

    I have having to start every Equals(object obj) method with: MyClass other = obj as MyClass; if (other == null) return false;

    You should only have to write:

    public override bool Equals(MyClass other) {...}

    And the language should take care of providing the Equals(object obj) method.
    NOTE: other should be guaranteed to not be null.

    3. Cannot use ternary operator with different types

    This doesn't compile, and I think it should!

    string foo = "hello";
    int bar = 4;
    object baz = foo == null ? foo : bar;

    2. Lack of namespace private

    I like the internal protection, but I wish there was a protection which would only allow access from within the same exact namespace. This would be nice to better control access in large class libraries.

    1. No multiple inheritance

    I really only use implementation (class) inheritance for default implementations of an interface, but there are plenty of times when I want to do just that.

    (2) Your first one is actually easy to implement with the null coalesce operator: x = (y ?? z).foo(); I also tend to do this alot with ToString and an empty string: x = (y ?? "").ToString() - Pete McKinney
    Nice idea! (any more) - tster
    [0] [2010-05-25 17:56:11] Paul Sweatte

    [0] [2010-05-04 08:53:05] Brendan


    ([f for f in os.listdir('/file/path') if os.path.isfile(os.path.join('/file/path', f))])

    [0] [2010-05-04 09:39:28] egarcia


    You can use an environment-based function to dodge #2 by creating a function that will automatically set all new files to their own env. This doubles as a file-cache. I'm surprised you didn't add "incredibly poor CAPI" to the list. - DeadMG
    Well, those where the 5 that bugged me the most. I don't use the C API. - egarcia
    re 1: the problem with that is that you have one data structure for everything (including classes) and a class is just a special table. Thus, you're just calling a function in a table to lua. Though having the environment set itself to whatever you're in (instead of a global scope) on function call would be nice. - RCIX
    @RCIX: I'm sorry, I don't follow you. What does "you're just calling a function in a table to lua" mean? - egarcia
    Yea, i didn't word that very well. I meant to say, "to lua, "you're just calling a function in a table" - RCIX
    I see. On point 1, I didn't mean that the "not self" behaviour should be eliminated from the language - I said it should be switched; so,2) passes "self" and foo:bar(1,2) doesn't pass self. I believe that the first is the most common case, and should use the most common syntax. - egarcia
    [0] [2010-05-04 10:13:49] Midhat

    I just discovered I cannot use Enum as a type constraint when creating a Generic method in c#.

    Microsoft has a good enough explanation as to why, but still. I'm MAD

    public static T MyFunc<T>(string arg) where T:Enum //wont work :(

    [0] [2010-05-04 11:46:27] Helper Method


    [0] [2010-05-08 21:37:48] acidzombie24


    re 1, see WeakReference... - RCIX
    [0] [2008-11-14 00:29:15] MattK311


    1) If Not x Is "foo" (instead of <> "foo")
    2) "OrElse" and "AndAlso" short circuit (instead of simply "Or" and "And", which act differently)
    3) Nothing (instead of Null)

    [0] [2008-11-24 15:18:20] Mike Dunlavey

    The lack of a preprocessor in C#.

    I know they left it out because some folks can abuse it, but I think they threw the baby out with the bathwater. Code generation is regarded as a good thing, and in C++ the preprocessor was my first-line code generator.

    (1) -1, it's essentially a bad thing. That another language has it, does not mean it is a good thing to include in C# - oɔɯǝɹ
    @oɔɯǝɹ: Bad thing? Who told you that? Professors will say anything. I was one. Just because the inventor of Java thought it was too hard to do and found a way around some of its uses, does not mean it doesn't have some really good uses. One thing these kinds of people don't tell you is how to think for yourself. - Mike Dunlavey
    You want C's preprocessor? It's just a simple text replacer. If anything I want real lispy macros like you can find them in Nemerle (a very C#-like language for .net as well). - helium
    (1) @helium: no contest. Lisp macros are the best. - Mike Dunlavey
    [0] [2010-05-27 18:51:59] pduel


    1) line continuation syntax: "...\" works, but "...\ " does not, and that trailing space is generally invisible, without unusual eol-marking by editer.
    2) a bare 'raise' is invisible in the stack trace, as the stack trace looks like the previous raised exception.
    3) slow
    4) poor integration into web-servers (mod_python: dead, mod_wsgi: limited scope of operation). This is complicated by 3], requiring daemonization or some sort of memory-persistance to perform well.
    5) overly tolerant of mixed tabs and spaces, allowing changes to control flow to sometimes remain hidden. (maybe fixed in recent versions)

    [0] [2011-01-22 12:06:51] Hach-Que


    [0] [2011-01-26 11:23:22] Manish



    [0] [2010-05-26 08:22:09] Adde

    Object Pascal:

    This is just the language, the sorry excuse for a standard library and flaky IDE deserve their own lists.

    [0] [2010-05-26 08:08:32] Andrei Taptunov

    I have only one but I believe it worth sharing.

    CSharp / .NET

    We have Length property to get number of elements in array and Count property to get number of elements in collection. It looks more stranger if you consider the fact that CLR automatically adds IList, ICollection, IEnumerable to zero-based one-dimenssonal arrays behind the scene.

    I believe CLR team and BCL team had hard times discussing this subject ;)

    [0] [2010-05-26 19:30:29] icodestuff

    Objective-C 2.0

    Sticking strictly to the language and runtime, and not the libraries, and not in any particular order:

    1. Lack of cVars.
    2. No modules. I'm not terribly unhappy with a lack of namespaces, but modules would be nice to have.
    3. Ivar-based property syntax requires declarations using the variable name in 3 places. It's fairly hideous.
    4. C heritage. Anything to hate about the C language, except for OO and GC, is present.
    5. Objects can't live on the stack. Not a problem with Obj-C so much as what it does to programming practices in other languages. I find it strange when I get a return value on the stack in C++, for instance. If I'm not actually looking at the library documentation when I write the code, I'll assume that every function returns a pointer, which often makes for some siginificant cleanup later.

    [0] [2010-05-26 05:31:06] drhodes


    [-1] [2010-05-26 19:43:32] Chris L

    C# 4.0

    The "dynamic" keyword, ripe for abuse. If you want/need to use Reflection, use and make it obvious that you're using it, don't try and disguise it with dynamic.

    (1) -1: there are very valid uses for dynamic (and goto and var and break and for and if and...), plus that's not 5 things. - RCIX
    [-1] [2010-01-19 12:12:48] Bobby


    [-1] [2009-02-19 06:48:55] Andrew Szeto


    The default recursion limit is 1000, try: sys.getrecursionlimit(); and you can change it with: sys.setrecursionlimit(). - Don O'Donnell
    [-2] [2010-05-04 08:21:37] Lo'oris

    Things I hate about Python:

    Things that annoy me about Python:

    Five things I hate about PHP:

    (1) The goto thing got me amazed. Can you explain why not having it is a bad thing? - egarcia
    (1) goto is sometimes useful. Many people don't know how to use it, use it in a bad manner, abuse it, or blindly teach other people that goto is the Dark Lord Satan. It isn't. It's just a tool, which you have to know to use properly, that's all. Anti-goto crusaders are just retarded people that don't know how to do something hence want nobody to be able to do it. - Lo'oris
    (1) The goto operator is available as of PHP 5.3. - nico
    What's wrong with the references. You put an "&" in there and it's a reference. Without it, it's not. Where's the problem? - Techpriester
    they are bugged: - Lo'oris
    [-2] [2010-05-25 20:27:01] john

    SAS [1]