Slashdot Mirror


Fighting the Culture of 'Worse Is Better'

An anonymous reader writes: Developer Paul Chiusano thinks much of programming culture has been infected by a "worse is better" mindset, where trade-offs to preserve compatibility and interoperability cripple the functionality of vital languages and architectures. He says, "[W]e do not merely calculate in earnest to what extent tradeoffs are necessary or desirable, keeping in mind our goals and values -- there is a culture around making such compromises that actively discourages people from even considering more radical, principled approaches." Chiusano takes C++ as an example, explaining how Stroustrup's insistence that it retain full compatibility with C has led to decades of problems and hacks.

He says this isn't necessarily the wrong approach, but the culture of software development prevents us from having a reasoned discussion about it. "Developing software is a form of investment management. When a company or an individual develops a new feature, inserts a hack, hires too quickly without sufficient onboarding or training, or works on better infrastructure for software development (including new languages, tools, and the like), these are investments or the taking on of debt. ... The outcome of everyone solving their own narrow short-term problems and never really revisiting the solutions is the sea of accidental complexity we now operate in, and which we all recognize is a problem."

240 comments

  1. Since when... by gnasher719 · · Score: 1, Informative

    is a blogger who thinks about stuff and posts it "news"?

    1. Re:Since when... by Anonymous Coward · · Score: 0

      I know you are new around here, but Slashdot has had opinion pieces in it since almost the beginning even predating the user account system.

    2. Re:Since when... by Anonymous Coward · · Score: 2, Funny

      It's true. I read it in AC's blog.

    3. Re:Since when... by mcgrew · · Score: 4, Insightful

      Since when has slashdot ever been news? Its masthead may be "news for nerds" but its news is seldom very new. It's about seeing one's fellow nerds' views on that topic.

    4. Re:Since when... by rwa2 · · Score: 1

      I think this article might be a direct response to the unveiling of JSONx

      http://www.reddit.com/r/progra...

    5. Re:Since when... by Anonymous Coward · · Score: 0

      I thought from the title that this would be a lamentation of how time-to-market concerns force developers to take shortcuts and write hacky code that deliberately avoids best practices and will have scalability and long-term maintainability issues (not to mention security holes). Or maybe how the absence of industry regulation allows practices like this to perpetuate the ongoing trend of major businesses having private customer data hacked, to the detriment of said customers.

      But actually it was just someone whining that C++ is hard. Lame.

    6. Re:Since when... by gnasher719 · · Score: 1

      Since we can represent JSON in XML, we should be able to also represent XML in JSON. Once that is achieved the nuclear option is available: We define JSON(n) = JSON, represented as XML, represented as JSON, n times. JSONx(n) = JSON(n), represented as XML. XML(n) = XML, represented as JSON, represented as XML, n times. XMLj (n) = XML(n), represented as JSON.

    7. Re:Since when... by Anonymous Coward · · Score: 0

      It becomes news in the very moment the blogger posts link to his blog into slashdot.

    8. Re:Since when... by carnivore302 · · Score: 1

      worse, it's nothing but bullshit. I think a lot of developers, architects and what have you will be offended by this article. Worse they'll probably think something along the lines of "here we go again, another nitwit with no real experience in solving practical problems things he needs to say something".

      --
      Please login to access my lawn
    9. Re:Since when... by TapeCutter · · Score: 2

      I started developing software for a living in 1990, I used to teach C programming to second year engineering students. I'm not offended when someone displays their ignorance, and there's no shortage of arrogance in the software industry. Truth is, we all look at the code and think "surely there's a simpler way than this". Experience teaches you that there usually isn't.

      --
      And did you exchange a walk on part in the war for a lead role in a cage? - Pink Floyd.
  2. Pushpolling to ease minds about SystemD? by Anonymous Coward · · Score: 1, Insightful

    This sounds a lot like the mantra of the FreeDestkop.org folks and/or Redhat with the "moving Linux into the 21st century". I'm not going to call it a 'planted' article, but you know.

  3. But in a society by Anonymous Coward · · Score: 0

    that values 100% employment, what else is there left to do when everything else is either automated or so productive that you only need a few people?

    You make terrible systems that require tons of people day and night just to keep going.

  4. New langauge by Anonymous Coward · · Score: 0

    Create a new language if you feel a radical change is necessary. I switched jobs for the "worse is better" mindset around me, but I do not agree with the post, Stroustrup is a bad example. I would not use C++ if I couldn't tie it to a C code/library. Standing on the shoulders of giants is often good. Only Einsteins should be allowed to invent new languages.

    1. Re:New langauge by wed128 · · Score: 1

      There's a difference between linking C libraries (Many non-c++ languages can do this) vs Stroustrup's insistance that a c++ compiler must be able to compile C code. this requirement is one of the reasons C++ is such a mess.

    2. Re: New langauge by Anonymous Coward · · Score: 0

      Except that you dont have to link a full library if you simply can call a single or few functions.

    3. Re:New langauge by NotDrWho · · Score: 4, Informative
      --
      SJW's don't eliminate discrimination. They just expropriate it for themselves.
    4. Re:New langauge by fisted · · Score: 1

      ...which hasn't been the case in a long time.
      Pulling two examples out of my ass:

      int *foo = malloc(sizeof *foo); /* correct C, incorrect C++ */
      and
      int bar(void); /* correct C, incorrect C++ */

      C++ and C are two different, incompatible languages.

    5. Re: New langauge by Anonymous Coward · · Score: 0

      C++ is a mess because it is often not developed to solve actual problems but because some genius extrapolates where no man should extrapolate. Just like in math and physics.

    6. Re:New langauge by Anonymous Coward · · Score: 0

      Um, int bar(void); is also correct C++.

    7. Re:New langauge by Anonymous Coward · · Score: 0

      The two languages are not incompatible. There are differences, but that's not the same thing.

    8. Re: New langauge by Anonymous Coward · · Score: 0

      Are you trying to imply that math and physics does not solve actual problems?

    9. Re:New langauge by X0563511 · · Score: 1

      I don't see what a compiler's ability to do with other formats/languages has to do with a different format/language.

      GCC can compile fortran, and that has nothing at all to do with C++.

      --
      For large sets, this will be our guide even unto death, for the LORD will work for each type of data it is applied to...
    10. Re:New langauge by jythie · · Score: 1

      And yet C++ is not a strict superset of C and thus compatibility has been broken for decades anyway. Meanwhile ObjectiveC, which did keep to a 'strict superset' pattern has remained a pretty clean language. The problem with C++ is not C compatibility but of trying to keep expanding it to include new and incompatible patterns or indecision regarding which patterns to use. Stoustrup wants C++ to be the mega language including all features of every other language, THAT makes it a mess.

    11. Re: New langauge by jythie · · Score: 1

      I am kinda with you on that 'actual problems' issue. C++ would be a good language if they focused on minimal changes that address real issues instead of designers seeming to add stuff for the sake of designing. Maintenance is never sexy I guess.

    12. Re:New langauge by Anonymous Coward · · Score: 0

      It's valid but not idiomatic.

    13. Re:New langauge by Anonymous Coward · · Score: 0

      Much simpler:

      int class;

      Contrieved example? Nope, a real world one. The Xlib header files have a lot of

      int
      #ifdef __cplusplus
      c_class
      #else
      class
      #endif

    14. Re:New langauge by Anonymous Coward · · Score: 0

      The OP said it wasn't correct C++. It IS correct. It is allowed by the standard. You considering it not "idiomatic" is an opinion and is irrelevant.

    15. Re:New langauge by Spazmania · · Score: 1

      If it didn't meet the requirement to be fully compatible with C, it wouldn't be C++.

      Like the man says, you're welcome to fork a new language that's C++ without C compatibility. Frankly I don't see the point. If you don't need C compatibility there are far better OO languages than C++.

      --
      Moderating "-1, Disagree" is simple censorship. Have the guts to post your opinion.
    16. Re:New langauge by fisted · · Score: 1

      Is it actually correct or is it "but gcc allows it anyway!"?

      Either way, we might as well do it the other way around and consider int foo(); in C and in C++. In one of those languages, foo does take any arguments.

    17. Re:New langauge by Wootery · · Score: 4, Insightful

      The two languages are not incompatible

      That's vague. The real question is whether C++ is a strict superset of C. Answer: it is not.

      Some constructs valid in C are invalid in C++. Some valid C code is also valid C++, but behaves differently.

      See Section 1 and Section 2 of this Wikipedia article.

    18. Re:New langauge by TheRaven64 · · Score: 2
      My favourite one is:

      #include <stdio.h>
      int x;
      int main(void)
      {
      struct x { void *a, *b; }foo;
      printf("%ld\n", sizeof(x));
      }

      Try compiling this as both C and C++. It's completely valid in both languages, but the output will be different in each.

      --
      I am TheRaven on Soylent News
    19. Re:New langauge by kthreadd · · Score: 1

      Is it actually correct or is it "but gcc allows it anyway!"?

      Yes.

    20. Re:New langauge by david_thornley · · Score: 1

      In contrast, Objective-C is a superset of C (all the new stuff is embedded in things that are syntactically incorrect in C). There's advantages to both approaches.

      --
      "When you have eliminated the unacceptable, whatever is left, however improbable, must be the truthiness" - Holmes
    21. Re:New langauge by david_thornley · · Score: 1

      The best attempt at C++ - C I've see so far is D.

      --
      "When you have eliminated the unacceptable, whatever is left, however improbable, must be the truthiness" - Holmes
    22. Re:New langauge by Spazmania · · Score: 1

      And D's "broad adoption" should tell you what value folks place on removing C from C++.

      --
      Moderating "-1, Disagree" is simple censorship. Have the guts to post your opinion.
    23. Re:New langauge by TapeCutter · · Score: 2

      Neat, but what's the problem? The code is valid in both languages and the output is correct in both cases.

      --
      And did you exchange a walk on part in the war for a lead role in a cage? - Pink Floyd.
    24. Re:New langauge by eric_harris_76 · · Score: 1

      We love standards. We have at least two for everything.

      --
      There's no time like the present. Well, the past used to be.
  5. The whole point of C++ was its C compatability by Viol8 · · Score: 4, Insightful

    Back in the day. The clue is in the name. If it wasn't compatible but simply similar then it would have been called something else. Java perhaps.

    1. Re:The whole point of C++ was its C compatability by Anonymous Coward · · Score: 1

      Although compatibility is important, it is not complete and it is not exact between C and C++.
      The restrict keyword does not exist in C++.
      The handling of "void *" is different (as a void pointer needs no cast in C when assigned to another pointer).
      A reference to clog is different (complex logarithm in C or logging output stream in C++).
      Function declarations are mandatory in C++ but in C it is assumed that an undeclared function will return an int and take variable numbers of arguments.
      There are probably many other differences.

    2. Re:The whole point of C++ was its C compatability by Anonymous Coward · · Score: 0

      Also the whole point of C was to not be so damn complicated by being easier to read than Assembly.

      C++, which has it's moments, is not a ~better~ language than C or OBJC, or anything else that developers might believe is great for a time.

      Java is a "worse" C++

      And here I bring up this point again... Please quit turning "easy to learn" languages into clusterf**k's by introducing C++'isms

      I can not even think of a single person who actually likes C++ or Java, let alone any Object programming that was bolted onto Perl, PHP, or other scripting languages.

      OOP programming is the death kick-in-the-nuts to projects that switch. Fullstop.

      You go from having 10% good C programmers and 90% mediocre programmers to 1% good C++ programmers 9% C programmers who just keep doing what they are doing, and 90% mediocre programmers who might know C enough but will break your C++ stuff.

      There is a reason we keep using C bindings for libraries... that's the only way any language can interact with another.

      If you want C or C++ to be "obsolete" and replaced wholesale with a better language, you have to start by writing the OS in that language. If you don't, then there will be no incentive to NOT use C

      Let me show you the can being kicked down the road.
      Back in 1998 or so, Java was being touted as the next big thing, Compile once, run everwhere. What happened? Well Sun and Oracle happened. Microsoft tried to co-opt the language (and later Google did.) However the language has never had OS support. It has to run completely in user-space, and is subject to quirks of the operating system, which includes being bound to 32-bit limitations, even on a 64-bit runtime, because the developers of the Java software never expect it to work on a 64-bit OS.

      Java is dead. It will continue to be used where there's an entrenched interest in keeping existing software working, but other software has moved away from Java because it's just too f**king slow. Minecraft could be a AAA title if it just threw away the Java. But that horse has left the barn, unless Microsoft turns around and makes that a MMO like "Minecraft Online" and takes it much much further, that game is toast.

      My one wish for developers, programmers and would-be game designers would be to take a step back and design your game engines completely black-boxed from the server environment. The game engine should only receive data, and only transmit commands, it should not transmit commands that it shouldn't know about, and the server should not send data the game client shouldn't know about.

      So many games OOP development rely on interfacing with objects the server is keeping track of, but letting the game client keep track of too many things in parallel, resulting in hacking, cheating and rampant botting (primarily to destroy the game or the game's economy.) What would be better? Quit using C++
      Develop the game client so that it interfaces with a blackbox server... the client should not know ANYTHING except what the server tells it. We could go one further and start having "rendering" clients located at the server side, so everyone gets their own personal viewport into the game, and all that the end-user's game client does is show a UI and a the rendered video. Bandwidth has to improve by an order of a magnitude for this to work.

      But getting back on track...
      For ef's sake, C++ lovers quit trying to stuff it down the throats of those of us that want to use straight C, or the least amount of C++ possible.

    3. Re:The whole point of C++ was its C compatability by Half-pint+HAL · · Score: 1

      And here I bring up this point again... Please quit turning "easy to learn" languages into clusterf**k's by introducing C++'isms

      I can not even think of a single person who actually likes C++ or Java, let alone any Object programming that was bolted onto Perl, PHP, or other scripting languages.

      OOP programming is the death kick-in-the-nuts to projects that switch. Fullstop.

      ...

      My one wish for developers, programmers and would-be game designers would be to take a step back and design your game engines completely black-boxed from the server environment. The game engine should only receive data, and only transmit commands, it should not transmit commands that it shouldn't know about, and the server should not send data the game client shouldn't know about.

      So many games OOP development rely on interfacing with objects the server is keeping track of, but letting the game client keep track of too many things in parallel, resulting in hacking, cheating and rampant botting (primarily to destroy the game or the game's economy.)

      It sounds like what you're looking for is... object oriented programming!

      Seriously, the problem with OOP is bad teaching, which leads to bad implementation. I never understood OOP until I found a task that was best modelled in it (and none of the tasks I was presented at uni were). But more to the point, everyone forgets the principle of Smalltalk -- OOP as "message passing". You weren't supposed to be thinking of calling code (which can arbitrary) but of sending messages to other "agents". Does it make sense for me to change someone's clothes? Not really -- I should be asking them to do it. When you're thinking in terms of what is a reasonable message to send, you naturally restrict the interface. When you think in terms of "calling code", you tend to favour flexibility without considering what purpose it serves.

      --
      Got them moderator blues I blieve I walk out the do', With these mod-points I been gettin', I 'most never post no mo'
    4. Re:The whole point of C++ was its C compatability by david_thornley · · Score: 1

      C++ never tried to emulate the Smalltalk idea of object orientation. The original C++ was actually called "C with Classes", and was Stroustrup's attempt to put Simula 67-type classes into C. Smalltalk went a different way starting from Simula 67.

      --
      "When you have eliminated the unacceptable, whatever is left, however improbable, must be the truthiness" - Holmes
    5. Re:The whole point of C++ was its C compatability by Half-pint+HAL · · Score: 1

      True, but the AC was conflating "C++isms" with "OOP". That's like looking at one country with a malfunctioning parliament and declaring democracy a bad idea.

      --
      Got them moderator blues I blieve I walk out the do', With these mod-points I been gettin', I 'most never post no mo'
    6. Re:The whole point of C++ was its C compatability by TapeCutter · · Score: 1

      Watcom's (circa 1991) C++ compiler was simply their C compiler plus a layer of C macro's. Yes you read that correctly, the C++ language features were all implemented with C macros. I had to fight with the thing for two years, there was no other option for "PenOS". The GUI classes and other major chunks of the SDK were implemented with these macros, you could not just ignore them, nor could you avoid them with straight C workarounds.

      --
      And did you exchange a walk on part in the war for a lead role in a cage? - Pink Floyd.
    7. Re:The whole point of C++ was its C compatability by TapeCutter · · Score: 1

      I was taught OO was a design methodology, smalltalk was the only well-known implementation at the time, however it was made clear to us that most of the examples in K&R are also excellent examples of OO thinking. The fundamental dogmas of OO are encapsulation and reuse and this is a good thing when applied properly, the problem is that in the real world everything is interconnected and copy-paste-edit is often much more efficient in time/money than genuine reuse. Once you have generalized things to the point where the model is more complex than the subject of the model, then you have gone way too far. Personally I think the OO jargon just obfuscates some very simple and powerful design tools, it would have been more enlightening to reuse the existing engineering terminology and call it "modular design"

      --
      And did you exchange a walk on part in the war for a lead role in a cage? - Pink Floyd.
    8. Re:The whole point of C++ was its C compatability by Anonymous Coward · · Score: 0

      Exactly! And rename Java would have been called something else too. Perhaps Non-visual BASIC.

  6. Author of TFA is an idiot by Anonymous Coward · · Score: 1, Informative

    C++'s strong compatibility with C was one of its strongest selling points relative to other object oriented languages back in the '80s.

    And that compatibility still is important today. For one thing, APIs can be written in C (starting with the POSIX API) and be used by programs written in either C or C++.

    Here's an idea: if you don't know shit about C++, don't post shit about C++. Save your precious insights for systemd maybe?

    1. Re:Author of TFA is an idiot by Anonymous Coward · · Score: 0

      Well then if he does know about programming, he doesn't know how to write a blog about it. He puts forth all sorts of conjectures as facts yet doesn't support them in any way. It makes him look stupid.

  7. Easy to say when not dealing with customers by NotDrWho · · Score: 5, Insightful

    It's easy for a programmer to say "We should stop worrying so much about compatibility and interoperability" when they don't have to deal with customers, support, or actually selling the end product. When a customer calls up and says, "Hey, how come this new version of Windows doesn't work with any of my old Windows software?" you can't just tell them "Because our programmers thought it was better to get a fresh start."

    --
    SJW's don't eliminate discrimination. They just expropriate it for themselves.
    1. Re:Easy to say when not dealing with customers by Anonymous Coward · · Score: 1

      Exactly. Yes it is nice to dream of a perfect world (especially if one is young), but in reality one has to deal with customers and even worse with budgets.
      Limited budgets/resources means one has to make compromises.

      Making compromises and shipping something that is useful == "Worse is Better"

    2. Re:Easy to say when not dealing with customers by Anonymous Coward · · Score: 0

      In my experience, a programmer is quite well off in trying to make a code base that only he or she can understand, but is still functional. The reason for this is that management views coders as fungible resources (thus H-1Bs and offshoring), so if they realize they can't toss a senior coder because he is making more than a $15,000/year H-1B fresh off the boat, said veteran coder is able to actually feed their family.

      This goes counter to everything taught in CS. I've even had interesting debates with CS profs about this exact subject. Their main mode of thinking is having a codebase good enough that someone else can pick up exactly where you left off when the previous dev gets promoted somewhere. However, the "promotion" bit usually is replaced by the dev getting booted because a H-1B or an offshore coding place can replace them for pennies on the dollar. Of course, there is the issue of missed deadlines and code quality... but those are not up-front costs that PHBs have to account for this quarter.

      All and all, I'd blame the crappy code on how shitty developers are treated and how they have to resort to any means necessary to keep their job.

      Of course, there is the comparison of programmers to other trades. People wouldn't replace a master plumber with some guy from Elbonia with a Harbor Freight pipe wrench, nor would they replace an electrician wiring up a 2000 amp building circuit with someone off the street. Why do businesses think going cheap on coders, forcing developers to take defensive measures [1] to feed their families, is any different?

      [1]: I've known some devs to actually have their own build tree with their stuff commented, and on check-in to the real one, have a utility that strips comments out, as well as does some basic obfuscation (same variable name in different scopes.) I'm not condoning that, but in this job market where "just offshore" is the keywords for businesses, it is an understandable behavior.

    3. Re:Easy to say when not dealing with customers by Anonymous Coward · · Score: 1

      From the fact 'there is no faultless software' we drew conclusion that as long as it does something it is a shippable product. So most of software is in grey area between ideal state of almost perfect and shit that does not do anything useful.

    4. Re:Easy to say when not dealing with customers by Anonymous Coward · · Score: 0

      Actually it used to and does happen all the time, it's called "minimum requirements".

      Not so fast on computers, but happens in phone apps all the time now. It's simply a calculated trade-off of support costs vs customers gained.

      Programmers would still support a 386 if it paid off. But it doesn't.

    5. Re:Easy to say when not dealing with customers by Anonymous Coward · · Score: 0

      Programmers don't make that choice, fool. Management deliberately cripple projects like this because they are told to by suppliers who wine-n-dine them.

      If you believe a programmer gets to make these calls on a whim, you are an absolute twat.

    6. Re:Easy to say when not dealing with customers by NotDrWho · · Score: 2

      Yes, and this is precisely WHY programmers don't get to make those decisions. Someone who actually understands the customers and the business has to come in and set boundaries. It's all well and good for the OP to call for radical change, but a real-world manager has to come in an some point and say "Look guys, if you want to be revolutionaries, go somewhere else. We are here to sell software to customers who don't give a shit about your revolution."

      --
      SJW's don't eliminate discrimination. They just expropriate it for themselves.
    7. Re:Easy to say when not dealing with customers by NotDrWho · · Score: 2

      Yeah, but minimum requirements are usually on the application side of things and say "If you want to run this latest version of the software you'll need a relatively new computer to do it." That's a lot different than saying "This software will no longer read any legacy files from older versions, it will no longer work the same way it used to, it will no longer be compatible with the OS's it used to work with" etc.

      Yeah, I'm sure programmers around the world would just love to throw all their legacy code out and start fresh with solid new code, and say "Fuck compatibility!" "Fuck interoperability!" But in the real world, no one is going to buy a version of Windows that doesn't work with any older Windows software. No one is going to "upgrade" to a new version of a program that won't even import files from the previous version, or support older add-ons that the company/consumer paid good money for. No one is going to accept "Our programmers got tired of kludging in the legacy code" as an excuse for why Photoshop CS200 can no longer read files from Photoshop CS199 or earlier.

      --
      SJW's don't eliminate discrimination. They just expropriate it for themselves.
    8. Re:Easy to say when not dealing with customers by Anubis+IV · · Score: 2

      When a customer calls up and says, "Hey, how come this new version of Windows doesn't work with any of my old Windows software?" you can't just tell them "Because our programmers thought it was better to get a fresh start."

      "Hey, how come this new version of Mac OS doesn't work with any of my old Mac OS 9 software?", said Mac users in response to Classic support being dropped with the release of Mac OS X 10.5.

      "Hey, how come this new version of OS X doesn't work with any of my old PowerPC software?", said Mac users in response to Rosetta being dropped with the release of OS X 10.7.

      Both of those are from just the last 7 years, and I wouldn't be surprised if we could rattle off more, both for OS X and iOS. The fact is, you can tell your customers that a fresh start was necessary, but only if it's part of your business. "Windows everywhere" isn't just a marketing phrase: it's their ideology. And if you can't keep it compatible, you can't have it everywhere. That's why Microsoft can't ditch the old as easily (and why Windows 8 was so exciting, even though it ended up being a dud, more or less). Some companies are built around ditching the old when there's something better, and their customers are much more willing to tolerate these sorts of changes since they generally knew what they were getting in for. Some companies are built around compatibility and stability, and their customers are much less willing to accept changes that break things.

    9. Re:Easy to say when not dealing with customers by tlhIngan · · Score: 1

      When a customer calls up and says, "Hey, how come this new version of Windows doesn't work with any of my old Windows software?" you can't just tell them "Because our programmers thought it was better to get a fresh start."

      "Hey, how come this new version of Mac OS doesn't work with any of my old Mac OS 9 software?", said Mac users in response to Classic support being dropped with the release of Mac OS X 10.5.

      "Hey, how come this new version of OS X doesn't work with any of my old PowerPC software?", said Mac users in response to Rosetta being dropped with the release of OS X 10.7.

      Both of those are from just the last 7 years, and I wouldn't be surprised if we could rattle off more, both for OS X and iOS. The fact is, you can tell your customers that a fresh start was necessary, but only if it's part of your business. "Windows everywhere" isn't just a marketing phrase: it's their ideology. And if you can't keep it compatible, you can't have it everywhere. That's why Microsoft can't ditch the old as easily (and why Windows 8 was so exciting, even though it ended up being a dud, more or less). Some companies are built around ditching the old when there's something better, and their customers are much more willing to tolerate these sorts of changes since they generally knew what they were getting in for. Some companies are built around compatibility and stability, and their customers are much less willing to accept changes that break things.

      No, what happened is Apple and Microsoft went two separate ways.

      First off, developers are crap and will take any shortcut they can to get what they want. With that in mind, let's take the scenario of having to rev an OS.

      There's two ways to do it - be like Apple and say any program must use the APIs as documented or things will break. So when Apple makes a new OS (this has happened since Classic MacOS), programs that relied on hidden APIs and other stuff? Well no surprise, they broke!

      This has carried on through OS X as well - many applications did low-level hooking into the OS (input managers, anyone?) and each new OS revision, things broke because Apple's policy is that unless it's officially documented as part of the API set, you can't rely on it.

      Of course, there are times Apple revises an API... or fixes bugs in them.

      It's why iOS generally doesn't suffer so much - Apple's approval process generally catches a lot of attempts at using hidden APIs, but it still misses a few.

      And hidden APIs are aplenty. Back in the iOS3 days when Voice Control came out, it supported at least 2 completely incompatible APIs, and from what I can tell, it was revised constantly, which is why apps never could use it because it would break often.

      Microsoft's stance has been one of compatibility - that no matter what devs did, they could work around it. Well, it results in a lot of hacks in Windows - you still have "Program Manager" (root window), some DLLs have had ordinal entrypoints fixed because people were calling by ordinal instead of name, certain resource DLLs are now hardcoded because developers just couldn't be bothered to get at them the right way.

      And you have hard links all over the hard drive because people hardcoded "C:\Documents and Settings" instead of using the proper API call. If you want to see what happens when Microsoft actually tries a fresh start, see Windows Vista. Where UAC introduced unprivileged by default operation (breaking so many apps that assumed users were admins and bombarding them with dozens of elevation dialogs).

    10. Re:Easy to say when not dealing with customers by Anonymous Coward · · Score: 0, Insightful

      Apple can get away with that kind of shit because they have a cult-like following who will still eagerly buy their products no matter how much Apple screws them over. The vast majority of software companies can't get away with that, especially those who serve a lot of enterprise customers (like MS).

    11. Re:Easy to say when not dealing with customers by Actually,+I+do+RTFA · · Score: 1

      If you want to see what happens when Microsoft actually tries a fresh start, see Windows Vista. Where UAC introduced unprivileged by default operation (breaking so many apps that assumed users were admins and bombarding them with dozens of elevation dialogs).

      Yeah, but obviously that would break things, look at how little warning they gave developers. They only released an API/standards that UAC played well with in 2001 with Windows XP. Surely that's not enough time to modify their code.

      Seriously, I remember being forced to use that architecture in 2004 by what I thought was an overly anal programming lead. Low and behold, come Vista, that software is still chugging along painlessly, but our expensive tools all suddenly require admin access.

      But MS will break their backs to maintain backwards compatibility.

      --
      Your ad here. Ask me how!
    12. Re:Easy to say when not dealing with customers by Anubis+IV · · Score: 2

      Near as I can tell, you've pointed out an additional difference between Microsoft and Apple, rather than addressing or contradicting anything I was discussing.

      Basically, while Apple does indeed slap developers for misusing APIs, as you stated, it also frequently deprecates features and APIs that are working as intended while their customers are still using software that's dependent on those features and APIs, which is what I was pointing out. Both Classic and Rosetta were working as intended and were being used properly by the developers who suddenly discovered that their apps simply no longer worked, which is quite a bit different than the scenarios you're discussing.

      I don't know why you started off with "No" as if to contradict me, when the entirety of your post is wholly unrelated to what I was talking about, and something with which I actually agree.

    13. Re:Easy to say when not dealing with customers by jellomizer · · Score: 1

      For the most part we get these compatibility issues from someone trying to make something the previous system wasn't designed to do well, so they did some hacks to get it to work.
      When we wen't from DOS to Windows. The idea of a common drivers came into play. Before you needed to do assembly calls to support your devices.

      Now the real trouble makers are the sales men who push the product as something to solve all your needs, while it was made to solve particular problems.

      --
      If something is so important that you feel the need to post it on the internet... It probably isn't that important.
    14. Re:Easy to say when not dealing with customers by Anonymous Coward · · Score: 0

      Bingo. Apple has pretty much fronted the attitude of "if it breaks, touch luck." while Microsoft has bent over backwards to keep compatibility as long as possible (a relative mulled about not being able to run some software on a new Windows computer, seems said software dates from either late Win3.1 or early Win95).

      Linux has been a bit back and forth, but largely stayed with the compatibility idea on core parts (Torvalds will verbally rip you a new one if you break userspace compatibility), but the attitude seems to be shifting as of late. Systemd seems to up front have compatibility in place, as it can reuse sysv init scripts. But that compatibility have all manner of corner cases and caveats that show up when they are least welcome.

    15. Re:Easy to say when not dealing with customers by DuckDodgers · · Score: 1

      Legacy codebases in languages like COBOL, Fortran, and C++ might run from today until hell freezes over. But if you've got two million lines of code behind your operation and someone wants to tweak a few of the input fields and do some surgery on the user interface, you're going to need three geniuses and five months to get it done. If you want some more serious modifications, you might be spending a few million dollars, waiting a year, and sacrificing animals to some Aztec deity before it gets done. So you have something rock solid, but like anything else rock solid it's damn difficult to move.

      That's where a rewrite done well has some chance of being a better choice. Haskell, Ocaml, F#, Scala, Clojure, Rust, Go... pick your new tool, vette it carefully. Pick your developer team even more carefully. Maybe they can give you something that has all of the useful features of your existing monolithic built out of languages that manage to have more features, more corner cases, and more cruft and write something smaller, just as fast, and far more flexible.

      Now to be fair, if you cherry pick your developers and your language features very carefully a clean rewrite in C++11 or Fortran 2008 might get you the same advantages. I suspect world class Haskell developers (for example) might to better than equally world class C++ developers, but that's a hard call.

      Sometimes "backwards compatibility at any cost" has a cost of being able to innovate.

    16. Re:Easy to say when not dealing with customers by Virtucon · · Score: 1

      yes revenue keeps the business going. I've worked with a lot of developers who get frustrated with old codebases and true there is some code that should be abandoned. It's always good to have an architectural vision of where the code is going because it doesn't exist in a vacuum.

      --
      Harrison's Postulate - "For every action there is an equal and opposite criticism"
    17. Re:Easy to say when not dealing with customers by Anonymous Coward · · Score: 0

      It's easy for a programmer to say "We should stop worrying so much about compatibility and interoperability" when they don't have to deal with customers, support, or actually selling the end product. When a customer calls up and says, "Hey, how come this new version of Windows doesn't work with any of my old Windows software?" you can't just tell them "Because our programmers thought it was better to get a fresh start."

      If only programmers had this kind of power. Most of the time you have programmer striving for compatibility which is generally lost on management. In fact, management looks at this as being an opportunity to sell new product.

    18. Re:Easy to say when not dealing with customers by Anonymous Coward · · Score: 0

      "First off, developers are crap and will take any shortcut they can to get what they want."

      Windows devs piss me off in their inability to adapt.

      A few years ago I was brought into an office to update their network. Some of the computers had industry-specific booking software on them, software that was still being sold and maintained.

      The software kept its settings files in "Program Files".

      IN FUCKING "PROGRAM FILES".

      What was this? 1997? I could have sworn it was 2011.

      You had to have local admin rights simply to RUN it. Which sucks, because the office had college interns running it.

      I called up the developers, who charge like $1000 for the software, plus a subscription, and they just said "Deal with it. We're not changing it."

      That cemented my image of Windows developers.

    19. Re:Easy to say when not dealing with customers by david_thornley · · Score: 1

      One problem with a rewrite to Haskell, etc., is that there's no reason to believe those languages will hang around in a significant way. The ones I know about from that list are fine languages that have good things going for them, but as a manager I'd be concerned that it would be difficult to find good Rust programmers in ten years, while I know there will be good C++ programmers around.

      Another is that Rewrites Are Dangerous. Intermixed with the cruft of decades is stuff that went in there to solve a certain problem that wasn't immediately obvious, so your first rewrite is going to have a host of bugs. (I assume the software is badly documented and has bad design, otherwise it wouldn't be much of a problem to modify the user interface and input fields.) Any specification documents that are left will be seriously obsolete, so the rewriters will be trying to figure out what it was originally intended to do, and often making mistakes. At the end of a long and arduous process, the result will be something in Scala that is roughly equivalent to the old COBOL system, and no business value added. That can be a real problem.

      --
      "When you have eliminated the unacceptable, whatever is left, however improbable, must be the truthiness" - Holmes
    20. Re:Easy to say when not dealing with customers by david_thornley · · Score: 1

      Except that adhering to published APIs would not have helped in some Apple OS changes. (Note in following history: this is according to my memory of the time, and may be inaccurate in places.)

      Up through MacOS 8 or so, there were a lot of published APIs, documented in many volumes of Inside Macintosh. Some of these were well designed and some of them were not (IIRC, there were something like four versions of the file management software near the end, all official).

      With MacOS9, Apple introduced Carbon, which was basically a cleaned-up version of the old Inside Macintosh stuff, which got called Classic. It wasn't completely compatible, but it was similar enough to make conversion reasonable. When they moved to MacOSX, they added Cocoa, the NextStep-derived framework, which was a good deal different from Classic or Carbon. Early versions of Mac OSX ran Classic (if a little eccentrically), Carbon, and Cocoa. Come the x86 (if not earlier), Classic was eliminated, and after a while they started moving away from Carbon.

      Therefore, there was nothing that would run on MacOS8 and an x86 Mac, regardless of how closely a developer stuck to the published APIs.

      I'm not getting into Hypertalk and OpenDoc here, some other development initiatives that went right into the trash a few years after they appeared, and (at least in the case of Hypertalk) became fairly popular.

      --
      "When you have eliminated the unacceptable, whatever is left, however improbable, must be the truthiness" - Holmes
    21. Re:Easy to say when not dealing with customers by david_thornley · · Score: 1

      Not just developers. My wife had to fight to have two Windows logins, one with administrator rights and one without, just so she could test what she'd written and see if actual users could actually run it. Apparently, nobody in the department realized that that could be a problem, and that includes management.

      --
      "When you have eliminated the unacceptable, whatever is left, however improbable, must be the truthiness" - Holmes
    22. Re:Easy to say when not dealing with customers by Half-pint+HAL · · Score: 1

      It's easy for a programmer to say "We should stop worrying so much about compatibility and interoperability" when they don't have to deal with customers, support, or actually selling the end product. When a customer calls up and says, "Hey, how come this new version of Windows doesn't work with any of my old Windows software?" you can't just tell them "Because our programmers thought it was better to get a fresh start."

      But he isn't talking about user software -- he's talking about programming languages. He's pointing out what every university computer science department has been saying for decades: there are vastly better ways of programming that have been researched and developed, and no-one's using them because they're unwilling to leave decades-old programming design behind. Design decisions that were a practical compromise made when memory was measured in kilobytes and compilers didn't have the grunt to optimise. Right now, programmers are going through a painstaking process of telling the computer each and every step to take and in what order, and the compiler is increasingly ignoring them, because it can easily refactor the code to be more efficient. We spend half our lives working out how to code up trivial little bits of code that are required for the "big idea" to work.

      Now while this is not about incompatibility in the user space, in the end it does indeed have a knock-on effect. Userspace incompatibility arises when the source of the previous version is so hacked-up, patched and kludged that the coder of the new version can't see how it works. Not understanding the source code means he can't replicate the behaviour. The sort of good practice my uni lecturers always went on about would eliminate the problem. In current architectures, though, it would take too long and be too expensive... which is why we need architectures based around those good practices, actively promoting them.

      --
      Got them moderator blues I blieve I walk out the do', With these mod-points I been gettin', I 'most never post no mo'
    23. Re:Easy to say when not dealing with customers by Half-pint+HAL · · Score: 1

      Exactly. Yes it is nice to dream of a perfect world (especially if one is young),

      Actually, young folk do tend to see hacking as a perfect good coding style. It's the grey heads in the universities that keep beating the drum for better practices, and they're occasionally joined by seasoned devs who just get sick of the utter slackness of current coding practice.

      --
      Got them moderator blues I blieve I walk out the do', With these mod-points I been gettin', I 'most never post no mo'
    24. Re:Easy to say when not dealing with customers by Half-pint+HAL · · Score: 1

      As I'm saying all over this thread, TFA is about programming languages, not user applications. Incompatibility in user space happens when the application gets unmaintainable and new code can't be added without breaking old code, because the old code is poorly understood and poorly programmed. If you don't know how the code works, not only is it unmaintainable, but its behaviour is not replicable. The problem is in the programming, and possibly even in the programming language. Cleaner, neater programming paradigms would make maintenance easier, and increase the backwards compatibility of user applications.

      --
      Got them moderator blues I blieve I walk out the do', With these mod-points I been gettin', I 'most never post no mo'
  8. Huh by JanneM · · Score: 5, Insightful

    So.. preserving backwards compatibility and interoperability across versions is a bad thing? If he's unhappy with the feature set of C++ (and I wouldn't blame him for that), then how about simply picking up a different language instead? That's what a new, non-compatible C++ version would be in any case.

    Look at how great it has worked out for Python. It's been six years since the only mildly incompatible version 3 was released, and it has still not managed to become dominant over the legacy version 2. A more radical break would almost certainly have had an even tougher road ahead.

    --
    Trust the Computer. The Computer is your friend.
    1. Re:Huh by Anonymous Coward · · Score: 1

      > So.. preserving backwards compatibility and interoperability across versions is a bad thing?

      This straw-man argument already appears set to dominate the thread.

      But it's not what he's saying. He's saying that compatibility is not (or rather, should not be) the sole consideration. Incompatibility has a cost, but it's far from the only factor.

      The problem with the worse-is-better culture is that it assumes /a priori/ that the cost of change will inevitably exceed the cost of stasis, and that any attempt to even consider the facts will be shouted down using straw-men and fallacies.

      In that regard, you're doing a good job of proving his point.

    2. Re:Huh by i+kan+reed · · Score: 1

      And the stupid thing is that everything python 3 changed were things the language desperately needed.

      Exactly one function parsed as a statement instead?
      Exception handling syntax different from every other block format?
      Defaulting strings to unicode?

      I mean, you're right that 3 never truly recovered, but those were all things the language desperately needed.

    3. Re:Huh by thesuperbigfrog · · Score: 1

      > A more radical break would almost certainly have had an even tougher road ahead.

      This is why we are still waiting for Perl 6, if it ever gets released.

      It's just too radical a break from what the Perl community expects. Even if you've never used Perl, you can tell from the drastic difference between Perl 5's dependable Camel to Perl 6's Camelia.

      --
      42
    4. Re:Huh by LWATCDR · · Score: 2

      Once you change a language enough it is no longer the same language.
      I just do not see the issue. If you want C++ without C create a new language that fits that description. Apple created Objective c without c and called it Swift. So make C++ without c and call it Sure.

      --
      See my blog http://ilovecookes.blogspot.com/ for light hearted technical information.
    5. Re:Huh by NotDrWho · · Score: 1

      He's saying that compatibility is not (or rather, should not be) the sole consideration.

      In that case, he's making a needless argument, because that has NEVER been the sole consideration with any software development project, and never will be.

      --
      SJW's don't eliminate discrimination. They just expropriate it for themselves.
    6. Re:Huh by JanneM · · Score: 1

      > This is why we are still waiting for Perl 6, if it ever gets released.

      I suspect in the case of Perl 6 (and perhaps also for Python) it may have been better to give the language a new name, and allow even more radical changes. Keeping the name strongly signals that it's still the same language. Breaking compatibility is exactly what makes it a different one.

      --
      Trust the Computer. The Computer is your friend.
    7. Re:Huh by Anonymous Coward · · Score: 0

      Look at how great it has worked out for Python. It's been six years since the only mildly incompatible version 3 was released, and it has still not managed to become dominant over the legacy version 2

      Backwards incompatible changes in dynamically typed languages are far harder to deal with and the changes to Python strings made it even worse.

    8. Re:Huh by TheDarkMaster · · Score: 1

      Paul Chiusano is in the wrong job or is too young to remember why we geezers are so concerned about compatibility.

      --
      Religion: The greatest weapon of mass destruction of all time
    9. Re:Huh by TheDarkMaster · · Score: 1

      Hum... Correcting myself, after reading TFA (i know, I know, bad idea) I have not seen anywhere the author wrote something clearly against compatibility, seems to me a misinterpretation of the anonymous who created the summary.

      --
      Religion: The greatest weapon of mass destruction of all time
    10. Re:Huh by Anonymous Coward · · Score: 0

      things the language desperately needed.

      Exactly one function parsed as a statement instead?

      That was an infelicity in 2.x, certainly, but a desperate need for change?

    11. Re:Huh by i+kan+reed · · Score: 1

      Yes. Absolutely. If you can't treat print as a regular old function, it causes problems. You can't pass it as a __call__able argument to methods, you can't wrap and replace it for special situations, you can't use any number of language features for function calls(like *args).

      The language has powerful tools that are more obscure to fiddle with functions, and not nearly as many for statements. Unifying print with the rest of the language was absolutely a necessary, if painful, step.

    12. Re:Huh by istartedi · · Score: 1

      Python can't hold a candle to Perl in this regard. The Perl 6 design process started in 2000.

      --
      For all intensive purposes, "whom" is no longer a word. That begs the question, "who cares"?
    13. Re:Huh by sjames · · Score: 1

      All great reasons to add a proper print function, but not necessarily to break comparability with a program that uses the old print statement.

    14. Re:Huh by DuckDodgers · · Score: 1

      The biggest problem with Perl6 was that it was incredibly ambitious, so much so that nobody has successfully implemented most of it. Python3 has the advantage that it came out, so I think it's a better illustration of the points under discussion. Perl6 couldn't be widely adopted because even people who love the cutting edge are reluctant to try something only half-done.

    15. Re:Huh by Anonymous Coward · · Score: 0

      python 2.8? python 2.7 is ok at compatibility.

    16. Re:Huh by sjames · · Score: 1

      The topic was Python 3.x

    17. Re:Huh by david_thornley · · Score: 1

      And why we keep seeing increasing sub versions of Perl 5, since that's what people actually use, and it is actively developed.

      --
      "When you have eliminated the unacceptable, whatever is left, however improbable, must be the truthiness" - Holmes
    18. Re:Huh by RightwingNutjob · · Score: 1

      The two sides are talking past each other. The "ooh shiny" crowd sees compatibility as an albatross and can't fathom why anyone would consider incompatibility as anything other than a cost of doing business on the path along forward progress. The other side can't fathom how anyone who's worked in software or engineering can be so cavalier about sacrificing compatibility for what may well be a passing fad.

      Here's a hint: there's a right answer, and the reason one side doesn't see it is because they don't seem to share the experience and the background in engineering real solutions to real products that motivates one strongly to not want to do the same job twice when it's been done right once, at no small cost in sweat and tears.

      I don't think there's a way to bridge that divide other than with time. Kids around my age and down, having grown up with participation trophies, tend to be hostile to learning from the mistakes of their predecessors, and haven't quite gotten to the phase of their careers when they can make and learn from their own mistakes just yet. I'm just getting there, but I work with hardware which is much less forgiving and makes you learn quicker. Pure software types in the "ooh shiny" crowd may not all be at the age yet where they've had their trial by fire and enough pushback from reality to temper their enthusiasm with an appreciation of the facts on the ground in regard to compatibility loss. Hence bullshit like systemd, binary format log files, and an "optional" attitude to POSIX.

  9. hmm... by buddyglass · · Score: 1

    Seems like someone (or a consortium of someone's) should take C++, drop the C compatibility requirement, make whatever "cleanup" changes that allows, and call it C+++. Just make sure there's a module ready to go for gcc.

    1. Re:hmm... by serviscope_minor · · Score: 2

      Seems like someone (or a consortium of someone's) should take C++, drop the C compatibility requirement, make whatever "cleanup" changes that allows, and call it C+++. Just make sure there's a module ready to go for gcc.

      Yeah and basically you also clean up the syntax since if you're breaking compatibility then you may as well make it parsable. What you get is D or Rust.

      Both of them seem like fine languages.

      Howeve, I end up always reaching for C++, because then I can reuse my old code and keep using my libraries. Some code in there hasn't been touched since 2004 and it still works perfectly. Why would I want to write and debug it again?

      --
      SJW n. One who posts facts.
    2. Re:hmm... by buddyglass · · Score: 2

      Haven't looked at D in any detail, but I was under the impression it was more different than C++ than what I had in mind. I was imagining C+++ as staying as close as possible to C++ but with whatever modest improvements are enabled by the omission of C compatibility. But maybe that's in fact what D is.

  10. I didn't rtfa by Anonymous Coward · · Score: 0

    What was his suggestion to fix this problem? Because if it wasn't to open his own company, and 'do thigs the right way', then he's kind of a Hypocrite.

  11. TLDR by Afty0r · · Score: 2

    "Technical Debt is a thing, people"

    1. Re:TLDR by JaredOfEuropa · · Score: 2

      I am rather saddened that "TLDR" is a thing, and a big one these days...

      --
      If construction was anything like programming, an incorrectly fitted lock would bring down the entire building...
    2. Re:TLDR by mcgrew · · Score: 1

      It's always been that way. Fewer than 1% of Americans are illiterate, but something like 97% are aliterate. When I was in school, very few kids wore glasses; no computers or cell phones and the TV was across the room. Reading (or any other close up work) at a young age makes you nearsighted.

    3. Re:TLDR by Anonymous Coward · · Score: 0

      When I was in school, very few kids wore glasses; no computers or cell phones and the TV was across the room. Reading (or any other close up work) at a young age makes you nearsighted.

      That is a myth; do some research before posting drivel as fact.

    4. Re:TLDR by Anonymous Coward · · Score: 0

      I don't wear glasses, and I read voraciously as a child.

    5. Re:TLDR by Anonymous Coward · · Score: 0

      i wear very thick glasses, and it has nothing to do with reading. i just stopped what i was doing after by vision degraded but before i went blind.

    6. Re:TLDR by Anonymous Coward · · Score: 0

      Reading (or any other close up work) at a young age makes you nearsighted.

      Suffering from nearsightedness, probably from using a computer at early age, I've never found proof of this. Got a link, article reference, or similar?

  12. Worse is Better doesn't mean that. by FilmedInNoir · · Score: 1

    I never heard the term before, had to wiki it, then realized it was a fundamental of software engineering that I was taught decades ... ago :( so old
    Don't create app functionality that the user won't use. More bells and whistles mean more dev time, test time and more to maintain, it's a simple concept.
    That's why apps now have functionality metrics (Firefox seems really big on it for example).

    --
    Sig. Sig. Sputnik
    1. Re:Worse is Better doesn't mean that. by JohnFen · · Score: 1

      That's why apps now have functionality metrics (Firefox seems really big on it for example).

      Are you talking about products looking at the functionality that people are using in the field to determine what features to drop or keep? If so, then these metrics are a bit of a plague today, since the assumption seems to be that you can determine how important a feature is by how often it's used. This results in very important, rarely used features getting dropped. (The obvious most recent example is the Windows start menu).

  13. You keep using that word.... by king+neckbeard · · Score: 1, Informative

    Worse is better is basically the KISS principle for software. C++ is not an example of that, but C is. This guy is an idiot.

    --
    This is my signature. There are many like it, but this one is mine.
    1. Re:You keep using that word.... by mcgrew · · Score: 1

      Worse is better is basically the KISS principle for software.

      Huh? It seems the opposite of the KISS principle. Making my old code no longer work is hardly keeping it simple. Most modern, ugly web design is as confusing and complicated and bloated as they can make it.

      I always followed the KISS principle, it's the easiest way to write bug-free code. Hard to write a buggy version of "hello, world".

      This guy is an idiot.

      I certainly don't disagree there.

    2. Re:You keep using that word.... by king+neckbeard · · Score: 1

      This guy has no clue what 'worse is better' actually means despite linking to a wikipedia article explaining it, hence why I'm calling him an idiot. One of the most commonly cited examples of worse is better design is Unix. Instead of having a few large, comprehensive programs, Unix systems and Unix-like systems have a ton of small programs that do one thing. cd is 'worse' than explorer.exe because it doesn't do as much, but it's better because if something is broken with cd, you just fix cd a lot easier.

      --
      This is my signature. There are many like it, but this one is mine.
    3. Re:You keep using that word.... by Anonymous Coward · · Score: 0
      Except that cd is not and cannot be a separate program.

      In unix, the current directory is a per-process thing, so spawning a separate process to change it will do exactly shit.

      And if something is /broken/ with cd, you better fix the fucking kernel; the cd shell command is just doing a simple system call and printing a error message if it fails.

      I don't think you have much clue either.

  14. I disagree with the premise... by QuietLagoon · · Score: 5, Insightful
    "Worse is better" is little more than Chiusano's opinion of what is happening.

    .
    So he thinks that compatibility and interoperability are not features which he likes. OK, I'm OK with that.

    However, that is his opinion, nothing more, nothing less.

    There are reasons why interoperability and compatibility are desired. It is not the easiest path to provide those characteristics, on the contrary, it is easier to just say, ~screw compatibility, screw interoperability~, and you'll probably finish your task more quickly.

    So then the question becomes, why do people invest extra effort in order to assure interoperability and compatibility?

    ...which we all recognize is a problem....

    And now he presumes to speak for everyone....

    Overall it sounds like he just got out of a bad meeting in which someone told him that his opinions are not worth the air used to utter them, and now he's trying to convince the world that he is right and the world is wrong.

  15. Yes, but you are even worse. by fisted · · Score: 4, Informative

    And that compatibility still is important today. For one thing, APIs can be written in C (starting with the POSIX API) and be used by programs written in either C or C++ or in language X, or language Y, or language Z.

    FTFY. This is due to calling conventions, not due to a 'language compatibility'

    Here's an idea: if you don't know shit about C++, don't post shit about C++?

    Here's an idea: If you don't know shit about the basics of programming, don't post, like, at all. Especially avoid calling others idiots when you're at the same time making clear you're even less competent.

    1. Re:Yes, but you are even worse. by __aaltlg1547 · · Score: 4, Insightful

      Backward compatibility isn't just important, it's paramount. It's not 1957.

      Nobody wants to upgrade their build system to a newer version of the language and find out it breaks the code all over the place. Nobody has time for that. New versions of the same language need to ONLY
      (1) fix errors
      (2) add new features that you invoke with new code that would be rejected by the old version's parser.
      If you change how old code will behave, that's not a new version. It's a new language.

      Likewise other systems, such as operating systems and even user-exposed interfaces, because ultimately programs depend on them working a certain way.

    2. Re:Yes, but you are even worse. by Anonymous Coward · · Score: 0

      FTFY. This is due to calling conventions, not due to a 'language compatibility'

      Understanding calling conventions doesn't let you inline C code and work on native data structures without marshaling or excessive usage of jump instructions. You can use C libraries from many languages, but never as efficiently as a cross-compilable language without either a performance penalty or re-implementing portions of the library you are binding to.

    3. Re:Yes, but you are even worse. by jythie · · Score: 4, Insightful

      This is why Python3 is still struggling. It is great if you are writing new stuff from scratch, but a real pain if you have an existing code base that is doing work. Incompatible compiler changes increase the barrier to upgrading since developers (and schedules) need an increasingly large incentive to justify the time and energy, esp when even minor (supposedly compatible) updates are already risky and potentially time consuming endeavors.

    4. Re:Yes, but you are even worse. by Chibi+Merrow · · Score: 2

      Dude, by your argument, "compatibility" counts as "place your arguments in registers A, B, C..."

      The compatibility between C and C++ goes a bit deeper than that.

      --
      Maxim: People cannot follow directions.
      Increases in truth directly with the length of time spent explaining them
    5. Re:Yes, but you are even worse. by T.E.D. · · Score: 1

      And that compatibility still is important today. For one thing, APIs can be written in C (starting with the POSIX API) and be used by programs written in either C or C++ or in language X, or language Y, or language Z.

      Sort of. You do (generally) have to write an interface specification in languages X, Y, and Z. In Ada, we call these "bindings". The thing about C and C++ is that the API vendor can typically write themselves one reference specification (".h file") that works for both of those languages. By writing C++ with this level of compatibility, they instantly gave themselves access to all the C-interfaced APIs in existence. The rest of us using languages X, Y, and Z have a lot of drudge work (and debugging. Forgot to pass a parameter somewhere by reference? Kablowie!) ahead of us to get ourselves access to those same APIs.

    6. Re:Yes, but you are even worse. by Half-pint+HAL · · Score: 1

      Backward compatibility isn't just important, it's paramount. It's not 1957.

      Nobody wants to upgrade their build system to a newer version of the language and find out it breaks the code all over the place. Nobody has time for that.

      This premise is correct.

      But...

      New versions of the same language need to ONLY
      (1) fix errors
      (2) add new features that you invoke with new code that would be rejected by the old version's parser. If you change how old code will behave, that's not a new version. It's a new language.

      Likewise other systems, such as operating systems and even user-exposed interfaces, because ultimately programs depend on them working a certain way.

      ...your conclusion is wrong. With massive hard drives, we can in fact have our cake and eat it. Any modern compiler is a tiny piece of code compared to the average project built with the same compiler, so there is no reason we can't have a compatibility mode. Have a look at the first line of any shell script -- it tells you what shell it needs. A Bash script can call a Korn shell script, which can call a C shell script, which can in turn call a Bash shell script, and all without any knowing what goes on inside the others. They can do this because they are all built on the same typing system and function call system.

      We could apply this principle to programming languages: when a new version will not compile the previous version's code, you don't want a whole new compiler -- instead you keep the old one alongside a modified version of it. If a file header identifies it as v 1.53, compile it with the latest compiler for version 1. If another file in the same project is v 2.04, compile it with the latest compiler for version 2. All you need to do is keep the type system and function calling backwards compatible, and the two will happily communicate. No code is broken. Old code stays as old code until and unless the update is needed, and new code can be written in the new way.

      Of course, the change to the object model between Python 2.x and 3.x means that this wouldn't work with Python, but that's only because Guido chose not to develop it that way.

      --
      Got them moderator blues I blieve I walk out the do', With these mod-points I been gettin', I 'most never post no mo'
  16. You can't say you want you want a reasoned... by Anonymous Coward · · Score: 0

    discussion and then say your oponents have a "worse is better" mentality, well not unless you want to succeed.

  17. Radical changes are not (always) good. by 140Mandak262Jamuna · · Score: 1
    Take a look at evolution. Sexual reproduction has so many hurdles to jump through before a beneficial mutation could find a toehold. In asexual reproduction individuals can rapidly and radically adjust to the changing environment and pass on the beneficial mutations to the next generations. They produce teeming masses of viruses, bacteria, fungi, insects, and at most reptiles. (A confirmed case of parthenogenesis of a shark sent shock waves through the biologists. But I think it has never happened among mammals).

    Sacrificing backward compatibility and interoperability for radical changes would lead a large population of rapidly mutating code and runtime environment. You see this both in biology and software. Malware proliferates, ditches backward compatibility and interoperability and tries to adapt as quickly as possible to exploit newly discovered vulnerabilities. Giant organisms and big pieces of software change slowly, spend enormous amount of energy and effort in maintaining a thriving eco-system.

    Radical changes (saltations) has its advantages but also limitations. Slow incremental changes has its limitations but also advantages.

    --
    sed -e 's/Chuck Norris/Rajnikant/g' joke > fact
    1. Re:Radical changes are not (always) good. by Anonymous Coward · · Score: 1

      Even superior changes are not (always) good.

      This short story by Arthur C Clarke used to be required reading for a particular industrial design course at MIT
      Superiority

    2. Re:Radical changes are not (always) good. by mcgrew · · Score: 1

      Take a look at evolution. Sexual reproduction has so many hurdles to jump through before a beneficial mutation could find a toehold. In asexual reproduction individuals can rapidly and radically adjust to the changing environment and pass on the beneficial mutations to the next generations.

      The late writer and biochemist Isaac Asimov would have disagreed with you vehemently. Asimov held a PhD in biochemistry and did cancer research at Boston University.

      The above linked short sci-fi story was originally titled "Playboy and the Slime God".

  18. Simple != worse by pla · · Score: 4, Insightful

    Once upon a time, I wrote "clever" code. Truly beautiful, almost poetic in its elegance. Note I said "elegance", not "simplicity".

    I don't know who to credit for this (probably read it on Slashdot), but a single perspective completely changed the way I view coding:
    It takes substantially more effort to debug than it does to write code in the first place. If, therefore, I write code as clever as I possibly can - I can't effectively debug it (without investing far more time than I should) if something changes or goes wrong.

    Now, that doesn't mean "worse is better"... I can still produce good code; I can even still write the occasional clever function when performance demands it. But for the 99.9% of code that has almost no impact whatsoever on performance, I can just say "if X then Y else Z" rather than using cool-but-cryptic bitmasking tricks to avoid executing a conditional instruction. And hey, whaddya know, I can actually read it at a glance six month later, rather than praying I didn't forget to update my comments.


    On the flip side of this, a few weeks ago I helped a friend put together a spreadsheet with a few complex formulas in it. I love me some IFSUMS, arguably the best new feature of Excel in the past decade. Note that clause, "in the past decade". This weekend, she called me because her nice helpful spreadsheet wouldn't work - On Excel 2003. It seems that while 2003 has IFSUM, MS didn't add IFSUMS until 2007. The choice of one seemingly harmless backward-compatibility-breaking function made the whole thing useless in a given context. Now, in fairness, I can hear you all screaming "just upgrade already!"... But in the real world, well, we still have people using Windows 95.

    1. Re:Simple != worse by u38cg · · Score: 1

      That stuff is why they invented pivot tables.

      --
      [FUCK BETA]
    2. Re:Simple != worse by Vellmont · · Score: 1

      I don't know who to credit for this
      .
      .
      .
      If, therefore, I write code as clever as I possibly can - I can't effectively debug it

      Based on your quote, probably (originally) Don Knuth.

      “Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” -Don Knuth.

      --
      AccountKiller
    3. Re:Simple != worse by Jeremi · · Score: 1

      But for the 99.9% of code that has almost no impact whatsoever on performance, I can just say "if X then Y else Z" rather than using cool-but-cryptic bitmasking tricks to avoid executing a conditional instruction.

      ... and even in that other 0.01% of the time, it's likely that your compiler will optimize the pretty human-readable code into the cool-but-cryptic bitmasking trick at the assembly level anyway. There's no need for the human programmer to do that sort of obfuscatory wizardry at the source code level, when the compiler can do it for him -- and likely do it more reliably as well, since compiler writers pay more attention to what is strictly language-legal vs what-seems-to-sort-of-work-today.

      --


      I don't care if it's 90,000 hectares. That lake was not my doing.
    4. Re:Simple != worse by pla · · Score: 1

      If you want to fix their broken spreadsheet problem, maybe they should use SUMIFS

      Heh, SUMIFS. Not IFSUMS. Duh, thanks. And no, I didn't charge her anything - I did say "friend", not "client". Just doing her a favor, took a whopping five minutes of my time.


      Although my solution and insight was worth much more than yours.

      You can approach any given problem in two different ways:
      You can work with the conditions of the problem as given and find a solution under those conditions, or,
      you can whine about uncontrollable factors and make excuses for why you can't help.

      More to the point, my solution did work, as implemented; I gave that as an example where TFA's "worse" solution would have beaten a "better" one - I used a function unavailable in an (unexpected) 11 year old version of Office, and as a result, it broke.

    5. Re:Simple != worse by Garen · · Score: 1

      It sounds like what you're referring to may be a reference an oft-quoted piece from Brian Kernighan (originally via "The Elements of Programming Style"):

      “Everyone knows that debugging is twice as hard as writing a program in the first place. So if you’re as clever as you can be when you write it, how will you ever debug it?”

    6. Re:Simple != worse by Actually,+I+do+RTFA · · Score: 1

      and even in that other 0.01% of the time, it's likely that your compiler will optimize the pretty human-readable code into the cool-but-cryptic bitmasking trick at the assembly level anyway

      That's almost universally untrue. The 99.9% is made up of the union of "code that executes infrequently enough" and "code that the compiler can auto-optimize."

      Now, predicting what's in that 0.1% is tricky, which is why it is often better to optimize later after profiling reveals it. And may someone protect you from me if your cool-but-cryptic bitmasking doesn't comment what the "if X then Y else Z" logic is.

      Now, often times, that 0.1% then can get incorporated into a language feature, or the compiler can automate. Over time, that content will drift smaller and smaller.

      --
      Your ad here. Ask me how!
    7. Re:Simple != worse by Darinbob · · Score: 1

      For me, I see the "worse is better" as the attitude to write the code that is just barely good enough to work and then check it in and never touch it again. No planning for the future (ie, making the API easy to use or portable), no optimization ("premature optimization" is so taboo that it means never optimize), not even thinking that someone else might need to read the code some day. And it's not just devs doing this, managers also tend to have a decision making process that revolves around getting stuff to ship by Friday and then fix it later (or never).

      In other words the attitude of "let's write the best code we can" is nearly non existent in the software industry.

    8. Re:Simple != worse by pla · · Score: 1

      I agree completely with what you wrote here, but the linked article doesn't describe that. It specifically refers to shunning revolutionary changes in favor of incremental ones, citing the classic example of making C++ backward compatible with vanilla C (with a side-trip to bemoan the failure of Lisp).

  19. Yes, but you are even worse. by Anonymous Coward · · Score: 3, Informative

    Wrong.

    C++ has zero problem dealing with structs as function parameters (usually pointers to structs) which have arbitrarily complex internal structure, including embedded pointers. Since C does not provide OO encapsulation, it is often useful for calling code to manipulate pointers directly.

    In Perl, you've got to wait until someone provides a binding for these complex cases... or, yeah, "why don't you do it yourself? It's open source."

  20. Bad example, interesting points. by w3woody · · Score: 1

    I think the author's original focusing on C++ as an example of "worse is better" is a sad distraction. Clearly C++ was designed with the goal of being compatible with C. There are plenty of examples of languages which attempted to solve object-oriented programming but threw away backwards compatibility as a design goal: D, Java, and C# come to mind.

    That said, I think he does have an interesting point about our unwillingness to sit down and carefully consider our response to problems as they arise during development--that we are constantly chasing incremental changes without considering the technical debt that arises. I've seen it particularly inside many of the companies I've freelanced to; they consider their software an asset rather than a depreciating liability, that must be preserved at all costs--even if that cost is increased technical debt that makes maintenance nearly impossible.

    But the real source of the problem, in my opinion, is not a culture which thinks "worse is better." It may appear that way, because many companies engage in tradeoffs which, to the casual observer, seems like they really consider "worse" as "better." The real problem is that many corporations and many organizations don't necessarily reward competence, because they are often run by the incompetent. The Dunning-Kruger effect extends beyond self-assessment. Thus, they treat software as an asset rather than as a depreciating liability: management is unable to properly assess their internal processes and the value of the result. All that work, and we're supposed to throw it away?

    The scary part is that to many of the organizations I've freelanced to, too much competence creates organizational friction. The places where I've done work who've ranked my work the best are exactly the places where I've "phoned it in", so to speak, only going a little bit above the call of duty. Go too much above the call of duty, pause everyone to have a considered response and to carefully do what is right, and you find yourself up against very powerful forces who, thanks to their inability to self-assess, push back hard.

    1. Re:Bad example, interesting points. by Simon+Brooke · · Score: 1

      Clojure is designed to be be compatible - not backwards compatible, but intercalling compatible, with Java. The consequence is that a Clojure program can crash out of stack when it still has masses of heap. Why? Well, the JVM was designed for small embedded devices which would run small programs, which weren't expected to do a lot of recursion; and were low power with limited memory so allocating stack as a vector was seen as an efficiency win. The fact that most of the time we don't run Java on small embedded low power limited memory systems is beside the point: Java is designed to work in those circumstances, and therefore it allocates stack as a vector of fixed (limited) size. When it hits the top of that stack it's stuck, and falls over hard.

      Clojure doesn't need to be like that. Even running on the JVM, it would be possible to implement a separate Clojure spaghetti stack in heap space. But the design decision was to make Java interoperability easy at the expense of limiting recursion depth. Similarly Clojure does not automatically fail over from storing integers as java Integers to storing them as bignums, as many much older Lisps are able to do. It easily could have, but it doesn't. Again, I think this is for interoperability with Java; otherwise it looks like a really odd decision.

      Easy Java interop is not a bad thing. It's a good thing. It allows access to a wealth of pre-existing Java libraries. But it's a choice, and one should not blind oneself to the fact that other choices could have been made - and would have had significant merits.

      --
      I'm old enough to remember when discussions on Slashdot were well informed.
  21. About my book.... by LoRdTAW · · Score: 1

    So Paul, is this a plug for your book or yet another argument for functional programming?

    Not much useful information or examples as to why or where "Worse is better" is harming the world of computing. There is always a better tool to help solve a problem. But for many reasons they may or may not be appropriate. You the programmer should know when and where to use them.

    One of my favorite quotes (the bold text at the end is the good part):

    Plan 9 failed simply because it fell short of being a compelling enough improvement on Unix to displace its ancestor. Compared to Plan 9, Unix creaks and clanks and has obvious rust spots, but it gets the job done well enough to hold its position. There is a lesson here for ambitious system architects: the most dangerous enemy of a better solution is an existing codebase that is just good enough.

    -Eric S. Raymond

    That applies to not only Unix and operating systems but any tool that is made to solve a problem. Just replace the word codebase with the tool name of choice.

    1. Re:About my book.... by Anonymous Coward · · Score: 0

      I find actually working in a functional programming language sucks bigtime. If you want to know why I feel this way, try writing a program in a language like C or C++, writing functions as needed but limiting yourself to only ONE statement (a return statement) for each function you write.

      While I see the elegance in this, often it's a lot more practical to tell the computer *how* to do something, step-by-step. I don't want my programming language to limit me to one statement per function. Give me the choice, but don't force me.

      Come to think of it, arguably SQL can be seen as a functional programming language. Which is probably the reason that PL/SQL exists.

    2. Re:About my book.... by Anonymous Coward · · Score: 0

      PL/SQL is a horrible language and I have to deal with that pile of excrements daily

  22. Fresh start / the opposite is happening. by jbolden · · Score: 1

    I think we are seeing fresh starts. We've seen a shift away from desktop applications towards web as a common framework, that's become remarkably more useful. And now we are seeing moves towards mobility. Both web and mobility have forced a genuine separation between view systems and business logic that in the desktop world was a goal often not met. Then with the rise of devops architectures are becoming even more factory component where the parts are interchangeable and thus design mistakes can be corrected.

    In terms of the languages themselves as fewer of the languages outside view languages need to be performance front ends, nor need to have a broad audience they've been able to specialize into particular domains. So if anything I see the opposite.

    The author if this article is a Scala guy. Scala is architected the key compromise of free intermixing of imperative and functional code so that programmers don't have to cross the conceptual barrier switching to functional. Which means that it effectively introduces programmers to functional concepts at the line level but not the program design level. It is really an imperative language with lots of functional data manipulation structures you don't see the full power of functional. It is hard to think of a language which more directly followed in C++'s footsteps of bolting object-orientation onto C, then Scala which bolted functional onto a Java type language.

  23. What hacks? by AqD · · Score: 2

    Does anyone have any idea of the hacks he's talking about?

    Since C++ is intended to and has always been a superset of C, how could there be any problems and hacks caused by compatibility with C? How could it be any better by discarding part of the language itself?

    1. Re:What hacks? by Anonymous Coward · · Score: 0

      C++ isn't strictly a superset of C, but they're close enough for that not to be an issue here.

      The issues caused by compatibility with C boil down to things like having to use awkward syntax because the "natural" syntax would, in some cases, already have an existing (and completely different) meaning in C. E.g. the syntax of C++11 lambdas can't be justified on any basis other than "all of the better options were incompatible with C". And even if it's possible to develop syntax which doesn't strictly collide with C, anything which would requires the parser to have unbounded look-ahead is realistically a non-starter.

      Also, "features" such as arrays decaying to pointers when used as expressions. This was enough of an issue that TR1/C++11 added the std::tr1::array/std::array templates (which are just C arrays wrapped in a class so that they don't trigger the decay-to-pointer behaviour), but the "natural" declaration syntax (e.g. "int x[H][W]") is already taken so we have to use "array,H>" instead.

  24. It's Not Even That by Greyfox · · Score: 2
    I've been finding C++ pretty nice lately. Back when I started, the STL and templates weren't really a thing. They just added classes to C and called it good, and working with it then was a pretty shitty experience. I wandered off or a while and when I came back they'd added the STL,which provided some badly-needed data structures and language capabilities. Between that and boost and the tweaks to the syntax they made in C++11, it doesn't really feel like a bad language to work with. It can still be pretty bad if a programmer that's new to it goes crazy with operator overloading or tries to write it like Java or C. The streams library also feels pretty clunky, but you can always fall back to using the C file I/O or possibly boost's asio library if you hate it.

    A problem I've been seeing lately is that everyone seems to think software is carved in stone. In the past 3 or 4 years I've heard a LOT of excuses why some flaw in one system or another made a feature impossible. In these cases, fixing the flaw would be pretty trivial. Instead of doing THAT, people just build another layer of crap on top of the previous layer of crap and try to kind-of get something working. Code is not immutable. If it doesn't do something you need it to do, MAKE it do what you need it to do. Write a library, redesign a layer, simplify an interface, whatever. Don't just wring your hands and make the problem worse! Code is made to change. No design is ever perfect right from the start. If you try to make your design perfect from the start, you'll just end up paralyzed, afraid of doing anything because you might do it wrong. Start with a design that seems reasonable and adjust it as needed. Write small, decoupled libraries that can support that, and write unit tests to insure that each component behaves as expected. It's really not that hard, people!

    --

    I'm trying to teach myself to set people on fire with my mind... Is it hot in here?

    1. Re:It's Not Even That by meustrus · · Score: 1

      You must work in a pretty dedicated corner of open source to think that you can actually get all your flaws fixed. I myself write and post patches to fix bugs and my patches are ignored like the bug doesn't exist. I've got a nice suite of patched open source projects since the flaw was in my way and I needed it gone. Getting other people to do stuff you want, even if it's as simple as accept a patch to make their own project work better, is non-trivial. 100x as much when you're dealing with proprietary code.

      --
      I sometimes ask revealing, often ignorant-seeming questions. Maybe they're harder to answer than you think.
    2. Re:It's Not Even That by Jeremi · · Score: 1

      Code is not immutable. If it doesn't do something you need it to do, MAKE it do what you need it to do. Write a library, redesign a layer, simplify an interface, whatever.

      I completely agree in principle, but in practice, the more software that is using the current version of the code, the more things will break when you change the design. That has the effect of making the code less malleable, proportional to the number of its dependents.

      So for a function that is used only by your own program, it's no problem at all. For an in-house library that is used in several programs across your company, it's a bit of a hassle but doable. For a new computer language that is being used by a small number of devotees, it can be disruptive but worthwhile. For a library that is used worldwide by thousands of corporations, it has to be managed extremely carefully. And finally, for a ubiquitous computer language (e.g. C++) that has billions of man-hours of code that needs to keep working, breaking backwards compatibility might not be practical at all, no matter how great the benefits might be.

      I think the moral of the story is: rewrite and redesign your code to make it as awesome as possible before it gets too popular, because afterwards you'll be stuck with it. :^)

      --


      I don't care if it's 90,000 hectares. That lake was not my doing.
  25. managers, portable, documented code by Anonymous Coward · · Score: 0

    As someone who manages several small ($2M) software development projects, and who gets developers pulled off to work on more important projects, I have a different view point than Parent, and more similar to the CS profs.
    On my projects, my devs are typically assigned to my project for some fraction of their time (30-50%) and they have other projects that they also work on.

    I'm willing to pay for slightly less efficiency, but in return get good code that someone can leave and someone else can pick up and run.

    And I'm tired of "let's just get it working" crummy code and worse documentation. The reason *I* have to suffer through losing my 30% programmer is often because their previous project ran into a problem, and "Mr. I don't do docs" dev is the only one who can come in and make the quick fix needed, during which time I am dead in the water. And because he's a "just read the code, it's obvious" kind of person, I can't get someone else to fill in the hole. Project Gods forbid that he should be hit by a bus or take a job somewhere else, because I'll basically have to start from scratch.

    1. Re:managers, portable, documented code by Anonymous Coward · · Score: 0

      And because he's a "just read the code, it's obvious" kind of person, I can't get someone else to fill in the hole. Project Gods forbid that he should be hit by a bus or take a job somewhere else, because I'll basically have to start from scratch.

      Which is good for the developer isn't it?

    2. Re:managers, portable, documented code by Anonymous Coward · · Score: 0

      You haven't provided any reasons why the developers should care about any of this. Put another way, these are problems for you not problems for them.

    3. Re:managers, portable, documented code by Anonymous Coward · · Score: 0

      If it's that much of a problem, hire someone who can read code to document it. Then make it a policy never to hire someone who doesn't do documentation again. No point bitching about your own mistake for hiring the guy in the first place.

  26. most programmers are at the mercy of the customer. by nimbius · · Score: 1

    Worse is better, or interoperability, is often mandated at the behest of the customer who often doesnt understand what theyre really asking for and its context. Customers dont understand that interoperability and compatibility fundamentally alters the scope and performance of a project. Often legacy features get included at the request of PHB's that become stakeholders out of fear, meaning feature X is only included because some irrational end user doesnt want change. Healthcare records are an excellent example as the driving force for their presentation and feature set are a typically a group of elderly physicians who just want what theyre used to using without the inconvenience of losing face over a technology they dont understand. Banks command interoperability and compatibility for different reasons, mainly because financial systems are predicated upon very basic yet powerful and secure mainframe systems that arent negotiable for upgrade.

    the sad solution is to learn the objective of the application, ignore the customer, and focus on training after the system is developed. Work inside the maintenance cycle of the programs existence to identify flaws, but try to restrict increases in scope and vigilantly fight back against changes that are pedantic and clearly for the benefit of a single individual or flawed process.

    --
    Good people go to bed earlier.
  27. worse is better isn't the problem by slashdice · · Score: 1

    worse is worse is the problem.

    worse is better: a bunch of lisp/haskell weenies complaining that people use C

    worse is worse: node.js

    --
    Copyright (c) 1990 - 2014 Dice. All rights reserved. Use of this comment is subject to certain Terms and Conditions.
  28. Python by Daniel+Hoffmann · · Score: 3, Insightful

    How did breaking compatibility worked out for python 3?

    1. Re:Python by jythie · · Score: 1

      Pretty badly. My project has pushed back upgrading for something like 5 years now and it is doubtful we ever will. The only thing that could push us over is if something project we depend on switches exclusively to it, and scientific python libraries show little interest in doing that.

    2. Re:Python by Anonymous Coward · · Score: 1

      Can you explain to me why people don't upgrade though?
      It's not like there are that many changes to the language, and most of them can be handled by 2to3 it seems to me.

    3. Re:Python by Anonymous Coward · · Score: 0

      python != perl

    4. Re:Python by jythie · · Score: 1

      For any given project it is hard to say how difficult the upgrade is. For our's it was not a simple matter of running 2to3.

      More generally though, upgrades like this not only take time, but require proper validation and testing afterwards. Granted I am talking about professional rather then hobby projects, ones that you have a budget department that you are answerable to and customers who care when results change.

      So upgrades can be costly for projects, then add to that the rather minimal advantages of moving to 3, ones that do not really contribute to an improved final product in terms of functionality nor cost to produce more changes. And when cost outstrips benifit, you shouldn't do it.

    5. Re:Python by Anonymous Coward · · Score: 0

      I suspect it's mainly because there is little in Python 3.x to get excited about yet as little new functionality has been added to date. Up until 3.4 I really saw nothing of value in the releases to date, and with 3.4 that main thing of interest was the async stuff. However, there a libraries providing that for 2.7, so even that isn't really that compelling.

    6. Re:Python by Anonymous Coward · · Score: 0

      I keep to Python 2 because print is a statement and % works for formatting. I find these more convenient than their replacements, especially when trying stuff out in the interpreter.

      If I had to switch to Python 3, I would, but since there's no pressure...

  29. Worse is worse by Geoffrey.landis · · Score: 3, Insightful

    I would assert precisely the opposite. "trade-offs to preserve compatibility and interoperability" do not cripple the functionality to users-- failures to engineer compatibility and interoperability is what cripples functionality.

    The number of times that there's been a new feature and I've said "oh, excellent, it's true that my old files no longer work, but this is so wonderful I don't care" has been very close to zero. The number of times there's been a new feature and I've said "those assholes, I have twenty thousand files that don't work any more, what in the world were those idiots thinking?" is decidedly not zero.

    --
    http://www.geoffreylandis.com
    1. Re:Worse is worse by scamper_22 · · Score: 1

      I had an interesting talk with an accountant friend of my wife. Being on the accounting side, she was completely puzzled by IT projects. Time isn't book properly on projects, budget overruns, time overruns, no one can give proper estimates because no one knows the backend...

      We had a really good discussion actually, and one thing that actually came to my mind is there is a real accounting deficit on the engineer/IT side.

      Here's the example that we both really understood.
      She wanted some field added to some web application. In her head, it's a simple field... you know like adding a new column in Excel.

      She goes to IT. They say, it's complicated. They need to interface with some backend system that no one knows anymore. It takes like 6 months.

      The real issue here is a lack of accounting on the IT side. When this backend system was commissioned, it was viewed as a 'project'. Like building a building. You build it, and it is done.

      Yet, maintenance is not really accounted for, when it absolutely should be. There should be an accounting cost for every piece of software so someone 'knows' that software. So that when a field needs to be added, there is a person there that knows it.

      I gave the crude analogy that basing IT on a per project basis is like building a washroom, and not planning for cleaners. It's going to result in a lot of sh*t.

      There is a similar cost to maintaining interoperability. Somehow, because it is 'software', people seem to think they have a natural right to simple 'upgrade'. When you buy a new Honda Civic, there is no general expectation of being able to update to a new engine. Yes, you can do it if you're a modder or really into things, but the general expectation is you buy a new car.

      Now I understand all too well that providing such cost estimates is beyond my scope, but I can surely tell you there is such a cost.

      Honestly, the most I've seen is 'agile' when it works properly, which is basically assume a fixed cost (fixed number of developers/tests... and hours) and then do what work can be done using those resources. And that's basically accepting the reality of not being able to properly cost things out, which might very well be a good solution, but it's not how most places operate.

      Similarly, there is a cost to not hiring long term engineering minded people to think about compatibility, interop...

    2. Re:Worse is worse by RabidReindeer · · Score: 1

      Here's the example that we both really understood.
      She wanted some field added to some web application. In her head, it's a simple field... you know like adding a new column in Excel.

      "All You Have To Do Is..."

      The most deadly words in Information Technology.

      A lot of the missed deadlines and cost overruns are because of the AYHTDI effect. Because people won't believe that the jobs isn't as simple and straightforward as it appears in their pointy little heads. They forget - and worse yet - the DEVELOPERS forget that computers are STUPID. And that you have to allow extra time and effort to take what's a simple job for humans and make it simple enough for computers.

      And to compound the issue, no one wants to hear a reasonably accurate resource estimate. They'll pressure you until you give one that they can believe, no matter how unrealistic it is.

      That, indeed is one advantage of the Agile approach. By breaking up the project into smaller milestones, it means that the amount of estimate deflation in absolute terms is reduced. And it means that people don't expect it to be perfect within 6 weeks.

      I'll save the maintenance cost rant for another time. The deadly phrase there is "If it ain't broke, don't fix it".

    3. Re:Worse is worse by Anonymous Coward · · Score: 0

      I think this is what they did with Python.

      Python 3 breaks backward compatibility, but python 2.7 is still being bug-fixed. Plus they created automated script updaters that should remove MOST of the problematic things.

    4. Re:Worse is worse by sjames · · Score: 2

      Part of the problem is that people wrongly equate creating software with building something when it is actually more like designing something.

      Yes, once a building is designed, it is possible (and expected) that a very close estimate is provided for the cost to build the thing. For some reason, people expect to be able to get an exact time and cost for designing a combination canopener/jumbo jet/submarine (oh, and can it have interchangable designer steering wheels and make a dolphin noise when it surfaces? KTHKSBYE).

    5. Re:Worse is worse by Half-pint+HAL · · Score: 1

      But what about having compatible sub-systems? Why can't I write a new piece of software in Foo#++ v2.0 and have it call code written in Foo#++ v1.53? Why can't the compiler or interpreter be left to deal with calling the correct language subsystem? In that case, the only part of the code that needs to be backwards compatible is the semantics of function calls.

      --
      Got them moderator blues I blieve I walk out the do', With these mod-points I been gettin', I 'most never post no mo'
    6. Re:Worse is worse by TapeCutter · · Score: 1

      I would assert precisely the opposite.

      Python 3.0 - QED.

      --
      And did you exchange a walk on part in the war for a lead role in a cage? - Pink Floyd.
    7. Re:Worse is worse by TapeCutter · · Score: 1

      people wrongly equate creating software with building something

      Let's be honest, most software is a work of fiction.

      --
      And did you exchange a walk on part in the war for a lead role in a cage? - Pink Floyd.
  30. meh. Whatever. by Anonymous Coward · · Score: 0

    People have been hating on C++ for over 20 years.

    The biggest issue seems to be that it lets bad programmers blow things up.

    Well...DUH.

    It's a systems programming language. Always has been. C++ 2014 is starting to add some of the safety features found in higher-level languages, but it still has all the direct access stuff that freaks out people that want to hire inexperienced programmers (read: "cheap"), and set them to work on system code.

    Here's a protip: If you want to hire cheap kids right out of college, don't give them C++ as they inaugural language. They probably learned on Java, which is the software development equivalent of "NerfWorld." They will almost instantly blow up C++.

    If you have a project that NEEDS the power and access of C++, then, for Hastur's sake, DON'T give a n00b the job.

    Otherwise, you have lots of choices with higher-level languages. Use one of them.

    Stop whining about C++. If it won't fit the bill, then it will wither away, like so many other languages.

    1. Re:meh. Whatever. by meustrus · · Score: 1

      OK, so we can't give the tasks to fresh recruits. So we give them to people who have 5+ years with C++. What happens when those people disappear? What happens when you can't find enough engineers anymore with the kind of experience? How do you get from zero knowledge to competence in not blowing up C++, if not by actually blowing it up a few times?

      --
      I sometimes ask revealing, often ignorant-seeming questions. Maybe they're harder to answer than you think.
    2. Re:meh. Whatever. by Anonymous Coward · · Score: 0

      I say if you have problems picking up C++, then maybe software development is not for you.

    3. Re:meh. Whatever. by Anonymous Coward · · Score: 1

      You can pick up C++ in a couple of weeks. Most programmers can. However, it takes years to become proficient in it. The same can be said for most languages.

      What happens when those people disappear? What happens when you can't find enough engineers anymore with the kind of experience?

      That's Management's job. If they run a sweatshop that churns through brogrammers, then they shouldn't be using a dangerous language like C++.

      There was a posting a number of months ago, where there was hand-wringing about bad Software Development Managers. Good managers hang onto good talent. They run a shop that attracts and keeps that talent. There's no "One Rule to Rule Them All" in good management. Different companies have different environments, different cultures have different expectations and drivers. Way too big a topic in the standard "C++ is the Devil" screed. Folks aren't interested in that stuff anyway. They just want to bang their own private drum about the language. Good management requires a level of "soft" thinking that seems to escape most commenters here.

      If you are one of our competitors, then I heartily recommend C++ as a great learning language. You should use it for all your projects, and start off those bright, shiny new engineers on your core libraries.

      Have fun!

  31. Features matter. by Karmashock · · Score: 2

    If being perfect means not having critical core features then you're confused about what is and is not perfect. Compatibility is important. In many applications it is vital. Period - end of story. Does maintaining compatibility make the project more complicated? Yep. Coding is hard.

    Next issue.

    --
    I've decided to stop wasting my time responding to AC trolls/sockpuppets... so if you want a response from me... login.
  32. BS by Charliemopps · · Score: 1

    Interoperability is king.
    I don't care how awesome your new application is, if I can't get my data into it and out of it, it's worthless to me. I've been down this road. If I have to start a massive project just to start using your application, or plan for a massive one to stop using it, that's a cost to me... a big one. And if my people have to go to training just to be able to use it because you didn't want to bother meeting a standard... or I have to hire people strait out of college? Again, that's a huge cost. If your application is 10% slower because of interoperability, even that's inconsequential... I can order server cores off the internet, it's not that big of a deal. Got an idea for a new feature? Great! But if you can't get that feature to work inside the existing standard, you don't have a new feature. There's likely a reason it's not allowed.

  33. "GNU C compiler" versus "GNU Compiler Collection" by Millennium · · Score: 4, Informative

    I don't see what a compiler's ability to do with other formats/languages has to do with a different format/language.

    Ordinarily, it doesn't. But the thing is, there are two things called GCC: the GNU C compiler (which handles C) and the GNU Compiler Collection (a set of compilers which, though they share the same backend, are still separate entities).

    GCC, the C compiler, cannot handle Fortran. GCC, the set of compilers, can handle it via g77 (the old compiler) or gfortran (the new one), but the C compiler can't. This is considered the traditional way of doing things.

    What makes C++ different from many languages is that its maintainers insist that C++ compilers must be able to handle C code. It's not enough to have a different compiler in the set, the way GCC does: it must be doable with the C++ compiler itself, in the same application. And so g++ can do it too, because that's what the standard requires of it.

    That's what makes the difference. Ordinarily, as you say, a compiler's ability to handle multiple languages shouldn't affect any of the languages in it. But C++ was defined in a way that not only makes those effects possible: it makes them mandatory.

  34. Too bad by meustrus · · Score: 1

    If you don't like the mess in C++, find a better language and use that. C++ is actually the most popular language for performance-critical code? Hm, I wonder how that happened? Because of or despite its C compatibility?

    The world is full of bad technology that is popular because its version 1.0 was really popular at the time. The fact we still use all of it says something about the market for technology; apparently, backwards compatibility to a fault makes for more long-term popular systems than do-it-right-this-time. It is, unfortunately, the way of the computer industry. Or fortunately, if you need a job.

    --
    I sometimes ask revealing, often ignorant-seeming questions. Maybe they're harder to answer than you think.
  35. It's bigger than that... by Anonymous Coward · · Score: 3, Insightful

    It's a combination of 'Standards are never finished being implemented' combined with features never being explicitly declared.

    Both C and C++ have been hobbled for years not by their backwards compatbility, but rather than features that are intentionally ambiguous or undefined because those are 'Implementation specific details', without regards to the effect of those lacking declarations effects on both cross platform compatibility as well as auditability of the resulting code. If there is no guarantee as to the functional equivalency of code produced by two compilers on the SAME arch (nevermind on different ones) how can you expect there to be the opportunity to 'start over' by dropping legacy support without a stable and documented legacy codebase for the new designs to be developed on?

    Just as an example: Look at K&R, ANSI, C90, C14, etc. Many of these standards were never fully implemented in any particular compiler. K&R was supported in early gcc releases but deprecated and then dumped in gcc-2.95->early 3.x releases. Many of the later releases break features of the earlier ones piecemeal despite the original standard never having had a 'stable' release that could properly generate code for all applications (While rare, there are still many corner cases, even in perfectly 'valid' C programs that thanks to developer error, or mistake implementation of standard features resulted in code generation bugs. Some of which weren't fixed before a standard was deprecated or altered for compatibility with C++ for instance in a manner that broke a formerly 'conforming' application.)

    Point being: Lots of compatibility has been thrown by the wayside in the name of forward progress, but it hasn't SOLVED anything because nobody seems willing to bother taking time out from their new features to ensure a stable and standard complete/compliant codebase from which to iterate into the next generation. The result of this is a constant churn of mostly working code with all sorts of corner cases resulting in unexpected operation, security errors, or simply some 'end user' being unable to compile an old version because the new compiler can't bootstrap the old one, the old one requires since-lost voodoo to compile the new one, and the amount of work and digital archeology to determine what changed in the standards to make the old code properly operate under the new ones may not be worth the expense in time/knowledge to do so.

    Apologies if this is overly verbose, meandering, or obtuse. I figure if nothing else this might provide a basis of concepts someone more articulate can turn into an acceptable discourse on the shortcomings of the 'development culture'.

    1. Re:It's bigger than that... by Anonymous Coward · · Score: 0

      Apologies if this is overly verbose, meandering, or obtuse. I figure if nothing else this might provide a basis of concepts someone more articulate can turn into an acceptable discourse on the shortcomings of the 'development culture'.

      Not only is it overly verbose, it also didn't contain any practical examples of what features were left out.

    2. Re:It's bigger than that... by TheRaven64 · · Score: 2

      Look at K&R, ANSI, C90, C14, etc. Many of these standards were never fully implemented in any particular compiler. K&R was supported in early gcc releases but deprecated and then dumped in gcc-2.95->early 3.x releases. Many of the later releases break features of the earlier ones piecemeal despite the original standard never having had a 'stable' release that could properly generate code for all applications (While rare, there are still many corner cases, even in perfectly 'valid' C programs that thanks to developer error, or mistake implementation of standard features resulted in code generation bugs. Some of which weren't fixed before a standard was deprecated or altered for compatibility with C++ for instance in a manner that broke a formerly 'conforming' application.)

      There is no such thing as C14. C90 isn't really a thing either (it's C89, with a few errata fixed). C89 was the first ISO standard C. K&R wasn't a standard, it was just the documentation of a specific implementation. To claim that it wasn't implemented is nonsense - it was implemented, it was never standardised.

      After C89, both versions of the C standard (C99 and C11) have been backwards compatible. They are not always backwards compatible with vendor extensions. C99, for example, added an inline keyword (which was bad because inline was in the space of identifiers reserved for the user) that had different semantics to the GNU extension. Code compiled by gcc with -std=c89 would work with -std=c99, but code compiled as -std=gnu89 would break. Both gcc and clang have a -fgnu89-inline flag to work around this limitation. Every valid C99 program is also a valid C11 program.

      --
      I am TheRaven on Soylent News
    3. Re:It's bigger than that... by TapeCutter · · Score: 1

      features that are intentionally ambiguous or undefined because those are 'Implementation specific details

      Such as the specific value of NULL or NAN? - Why would you want to dictate that sort of thing in a standard?

      --
      And did you exchange a walk on part in the war for a lead role in a cage? - Pink Floyd.
  36. Wrong lens by jythie · · Score: 2

    I phrase I picked up years ago seems to apply here, 'standard is better then the best solution'. It is not a culture of 'worse is better', but of competing interests where the pure joy of developing languages is not the primary metric for determining what the best course of action is.

  37. Probably implying... by Anonymous Coward · · Score: 0

    That for every problem solved another dozen are created thanks to people needing busywork.

    Some of that busywork translates into added work for the rest of us with no practical benefits.

    Kind of like various changes to C and C++ standards over the years and the legacy software that has resulted in us having to maintain/repair/replace.

  38. Simple != worse by Anonymous Coward · · Score: 0

    It's a Kernighan quote:

    ÃoeEveryone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it?Ã

  39. Worse is better is better by russotto · · Score: 1

    Without worse-is-better, you make sure the job is completely done before release. So, it takes years to make progress, you end up building an extremely complex system to cover every possibility. Because of that very complexity it is difficult to extend for new requirements, which become apparent after the system is specified and before it was built.

    If you want to build a nuclear power plant control system or something equally as critical and unchanging, sure, go ahead and engineer everything out the wazoo. Otherwise, get things done, even if they are "worse".

  40. Keeping it Simple by Prototerm · · Score: 1

    I'm with you on this. As a programmer, the thing I hate the most is "Gee, Mom, look what I can do!" code -- obtuse code written to impress rather than be simple, obvious and functional. And yes there are indeed times when something mind-bendingly complex is needed to achieve the required goal, but by and large, the KISS principle applies. As to the article's main point, I have to ask what is the purpose of breaking backward compatibility: Making it faster to produce readable, easily maintainable code, being the first one on the block to use something new and shiny, or simply to appear to be one of the Elite? Always keep in mind, however, that programing is more an art than a science, and creativity often comes from the simplest of tools, not the most expensive or the trendiest. And creativity is why we fiddle with all these bits, right?

    --
    "My country, right or wrong; if right, to be kept right; and if wrong, to be set right." --Senator Carl Schurz (1872)
    1. Re:Keeping it Simple by Zalbik · · Score: 1

      I agree, but I also think there needs to be a balance between KISS and other principles (e.g. DRY). I've come across developers who use KISS as an excuse to be lazy.

      I recently came across some code from a colleague where it was hundreds of lines filling in object properties from data in a spreadsheet. Each property being filled in was coded as a separate line, calling a one of five different routines based on the data type to be parsed.

      I asked "why didn't you just add a configuration (or just an array) that lists the fields to be parsed, then use reflection to fill in the properties" (performance was not an issue). His response was it violated KISS as reflection is "complicated".

      Yes reflection isn't as simple as direct property access, and yes adding a config parser/loop is a bit more code, but at least:
      - The code is readable (reading 10 pages of code in a single routine makes my eyes bleed)
      - Its easier to modify (we had a change where we needed all decimal values to be parsed differently. Suddenly 50 lines of code need to change rather than 1)
      - It's immediately obvious where the exception cases are (we had a bug due to a typo where 1 of the fields was being parsed incorrectly in certain edge cases. This filtered down to some calculations later on and was quite the pain to find the culprit).

      As in most programming tasks, balance is key.

    2. Re:Keeping it Simple by Anonymous Coward · · Score: 0

      Ding, ding, ding! Exactly. I've seen 'keeping it simple' used as an excuse not to employ good engineering practices more than anything else. While copying an entire project and tweaking it is simpler than refactoring out the shared parts into a common library, it definitely does not make it simpler to maintain resulting collection of projects. Especially when this occurs several times. Never imagined any engineering org would do that as a matter of course these days. Got out of there quickly, and now I have some new questions I ask that I never thought it would be necessary to ask.

  41. Fresh start / the opposite is happening. by Anonymous Coward · · Score: 0

    IMO scala has similar problems to C++. Compared to Java, it's type system is very dense and hard to get into.
    Scala is easy when you write simple things, but hard when APIs force you to use the language's more advanced features or if you want to write an API yourself.
    Just look at some of the method signatures in the collection API, they look like Perl scripts instead of argument lists.

    Then there is operator overloading, which is sometimes usefuly (like for BigDecimal arithmetic), but often leads to Perl syndrome as well.

    Now that Java 8 has some functional support as well, I don't think that Scala will gain much ground any more.

  42. Database upgrades by mcgrew · · Score: 1

    We had FoxPro 6 and Windows 98, when XP hit our desks, FoxPro no longer worked. They made me use (ugh!) MS Access.

    So I have a few dozen Access apps when they "upgraded" to Office '03, and not a single one would run. Access had become a completely different program with completely different code and was completely incompatible with Access '98. I had to rewrite every God damned program!

    OTOH the NOMAD mainframe databases seldom had glitches. I'd been a PC kind of guy, but NOMAD on the mainframe and Microsoft's stupid, anti-user bullshit started changing my mind.

    1. Re:Database upgrades by CastrTroy · · Score: 2

      On one hand, I can see where you're coming from. Breaking changes should not happen in this way. At the very least, it should detect that you're trying to open an old file and either continue to work the way it did on the old system without the new features, or have an automated upgrade tool that does the work of upgrading the file for you.

      On the other hand, I would say that's what you get for using something like Access or FoxPro as a tool for developing ongoing projects. They are great for things like whipping up a quick program because you need some numbers and a quick report for this afternoon, but they fail when you have to use the resulting application on a day-to-day basis.

      --

      Anthropic principle: We see the universe the way it is because if it were different we would not be here to see it.
    2. Re:Database upgrades by DocSavage64109 · · Score: 1

      What are you talking about? We still use a foxpro based database and it works even on Windows 8.1!

    3. Re:Database upgrades by Half-pint+HAL · · Score: 1

      So I have a few dozen Access apps when they "upgraded" to Office '03, and not a single one would run. Access had become a completely different program

      [my emphasis: program]

      We have the dichotomy here of user-space vs dev-space. But unfortunately a lot of things aren't one or the other. Access is a development tool, but it still qualifies as an office application. Certainly, maintaining backwards compatibility for users is great, but maintaining backwards compatibility indefinitely for devs is questionable.

      Unfortunately, the problem in languages clearly isn't backwards compatibility per se, as the proliferation of new languages recently has given plenty of opportunities to start over without expecting codebase compatibility, but the new languages always seem to inherit far too much of the features in existing languages that hold them back.

      How many languages have "functional programming features" without including the most important feature of functional programming: true determinism with immutable variables, hence easier testing and less debugging?

      --
      Got them moderator blues I blieve I walk out the do', With these mod-points I been gettin', I 'most never post no mo'
    4. Re:Database upgrades by mcgrew · · Score: 1

      They are great for things like whipping up a quick program because you need some numbers and a quick report for this afternoon, but they fail when you have to use the resulting application on a day-to-day basis.

      That wasn't my experience at all, except for Access. I wrote very large applications in dBase and FoxPro that I used for years.

      One application I wrote for a Chicago hospital in Clipper (Clipper produced executables from xBase code) had been in use for six months when they had a problem; large amounts of data had gone missing.

      I looked at both code and data and couldn't figure it out, but saw from a hidden entry date field that there was no data for a two month period. They gasped when I told them than and they immediately saw the cause of the problem -- that was when an intern was supposed to be entering data but obviously didn't and thought he or she could get away with it.

      They used that application for a couple of years after that with nothing but praise for the app.

    5. Re:Database upgrades by mcgrew · · Score: 1

      FoxPro 8, back in the late '90s.

    6. Re:Database upgrades by mcgrew · · Score: 1

      How many languages have "functional programming features" without including the most important feature of functional programming: true determinism with immutable variables, hence easier testing and less debugging?

      Certainly not Access, I hated that damned program. dBase, FoxPro, NOMAD were all easy to maintain, Access was a pain in the ass. It's one of the reasons I love being retired.

  43. Backwards Compatibility - Backward Languages by DavidHumus · · Score: 4, Insightful

    So far, I don't think I've seen a single comment here that got the point of the essay.

    He's not talking about incremental "improvements" to existing languages, he's pointing out that the common attitude of "we'll make this language easy to learn by making it look like C" is a poor way to achieve any substantial progress.

    This is true but everyone who's invested a substantial amount of time learning the dominant, clumsy, descended-from-microcode paradigm is reluctant to dip a toe into anything requiring them to become a true novice again.

    I've long been a big fan of what are now called "functional" languages like APL and J - wait, hold on - I know that started alarm bells ringing and red lights flashing for some of you - and find it painful to have to program in the crap languages that still dominate the programming eco-system. Oh look, another loop - let me guess, I'll have to set up the same boilerplate that I've done for every other loop because this language does not have a grammar to let me apply a function across an array. You want me to continue doing math by counting on my fingers when I've got an actual notation that handles arrays at a high level, but I can't use it because it's "too weird". (end rant)

    There have been any number of studies - widely ignored in the CS world - going back decades (see this http://cacm.acm.org/magazines/...) - pointing out how poorly dominant programming memes mesh with the way most people think about problems and processes. Meanwhile, the 1960s called - they want their programming languages and debugging "techniques" back - "printf", anyone?

    1. Re:Backwards Compatibility - Backward Languages by serviscope_minor · · Score: 3, Insightful

      Meanwhile, the 1960s called - they want their programming languages and debugging "techniques" back - "printf", anyone?

      What's wrong with printf?

      printf has some very nice features. Firstly you get the histroy of what happened at previous iterations of your algotrithm, right there, which is something you don't get with a setpping debugger. Secondly, you can use a second language, suc as awk to process it very easily to find things out.

      I find debugging numeric code without printf to be a major pain. Sometimes it's worth plotting things a bit more dynamically, but you can do that with awk+gnuplot on the stream of data coming out with printf.

      --
      SJW n. One who posts facts.
    2. Re:Backwards Compatibility - Backward Languages by sundarvenkata · · Score: 1

      Yeah. Functional languages are so much better.. like the elegance of breaking out of a for loop... (oops... not possible... resort to clumsy workarounds). Or handling exceptions....

    3. Re:Backwards Compatibility - Backward Languages by T.E.D. · · Score: 1

      He's not talking about incremental "improvements" to existing languages, he's pointing out that the common attitude of "we'll make this language easy to learn by making it look like C" is a poor way to achieve any substantial progress.

      Perhaps, but writing a language that nobody uses doesn't really achieve much progress either.

      I honestly think I got his point, but I think he misses the fundamental point of Worse Is Better. Having something that's 80% of what you want and being improved is always going to be better than that 100% perfect system that should be ready any day now. If his argument ventures much outside of those parameters, he's arguing over something else, not Worse Is Better.

    4. Re:Backwards Compatibility - Backward Languages by Anonymous Coward · · Score: 0

      It's called a trace instrumentation. It's like printf but without the ridiculous inefficiency of converting your trace output from machine format to ASCII and back again. It requires adding a few extra functions to your program at the beginning and makes debugging much easier and more efficient.

      What else is wrong with printf? The fact that it uses a literal string to encode the arguments and until recent non-standard compiler extensions, provides no warning whatsoever that your format string doesn't align with your argument list, causing stack corruption.

      Pretty much everything wrong with unix mentality stems from this boneheaded idea that the best interchange format between machines is ASCII text, due to some mistaken belief that writing formatters to convert X into ACSII is in any form difficult. Trace buffers are much easier to work with than text, because you avoid writing the initial formatter and all the bugs within it, and you avoid writing the reader and all the bugs within that. It's pretty much impossible to screw up a binary file parser, where as it's beyond trivial to screw up a text parser.

    5. Re:Backwards Compatibility - Backward Languages by rdnetto · · Score: 1

      Yeah. Functional languages are so much better.. like the elegance of breaking out of a for loop... (oops... not possible... resort to clumsy workarounds). Or handling exceptions....

      For loops are an imperative construct - you wouldn't find one in a functional language. Depending on what you were trying to achieve, you might express a similar concept using a fold and an algebraic type (Either or Maybe) to indicate when to ignore the rest of the elements.
      I do agree that error handling is more inconvenient than in languages with exceptions though - wrapping the result in a type that can contain the result or an error is only a minor improvement on C-style return codes.

      Personally, I've settled for a compromise between the two - Rust and D are both imperative languages with excellent functional programming support.

      --
      Most human behaviour can be explained in terms of identity.
  44. I agree!! by Rob+Riggs · · Score: 1

    All of my competitors should adopt the author's philosophy of software development immediately. His ivory tower FP idealism is worthy of emulation by all.

    I will keep muddling through based on years of experience, leveraging existing code and know-how, maintaining backwards compatibility, planning long-term changes that sometimes take years to complete, deprecating unneeded features in as non-disruptive a manner as possible. And then, when the opportunity arises to do something radically different (like with the C++ "auto" keyword), make it happen. We're called pragmatic programmers. We are clearly losers. Do not emulate what we do.

    --
    the growth in cynicism and rebellion has not been without cause
  45. Bonds and Derivatives by Anonymous Coward · · Score: 0

    If only we could somehow encapsulate that technical debt as bonds and sell those forward to an organization which then would use the bonds to back up some technical derivatives of sort and sell them forward, saving the middle management from ever thinking about the whole thing. The place of this trading could have a sexy name like "The Cloud", or something.

  46. Worse is worse by kick6 · · Score: 3, Insightful

    I would assert precisely the opposite. "trade-offs to preserve compatibility and interoperability" do not cripple the functionality to users-- failures to engineer compatibility and interoperability is what cripples functionality. The number of times that there's been a new feature and I've said "oh, excellent, it's true that my old files no longer work, but this is so wonderful I don't care" has been very close to zero. The number of times there's been a new feature and I've said "those assholes, I have twenty thousand files that don't work any more, what in the world were those idiots thinking?" is decidedly not zero.

    And this is why there are so many programming languages with massive overlap in usage. Because once you start down a path, you can never, ever, everver change. If you want something that 42 years down the road that breaks with convention, go create a new language.

  47. It's a rant against by kilodelta · · Score: 1

    Backward compatibility. Which btw Microsoft has broken a time or three.

  48. silliness by silfen · · Score: 4, Interesting

    To accuse the C++ community of not having engaged in "reasoned discussion" about backwards compatibility is silly. Chiusano may not like the tradeoffs that C++ makes (I don't), but they are the result of a glacially slow and tedious community process and discussions. Whatever C++ is, it is by choice and reflection. Furthermore, "worse is better" refers to keeping things simple by cutting corners, and you really can't accuse C++ of keeping things simple.

    (Charges about too much backwards compatibility are ironic from someone who promotes Scala, a language that makes many compromises just in order to run on top of the JVM and remain backwards compatible with Java.)

  49. Sounds like ... by PPH · · Score: 2

    ... the Wayland/systemd PR team is shifting into high gear.

    --
    Have gnu, will travel.
  50. Worse is better? by Anonymous Coward · · Score: 0

    So, we're obviously talking about the post-Jobs UIs on iOS and the Mac OS, right?

    Well, in that case, worse is worse.

  51. Rule of Thumb by Anonymous Coward · · Score: 1

    I found that I can determine how bad a programmer is by how much he hates C++. There is a direct correlation. If you hate C++ or find it difficult to learn, there are many job opening for janitors.

    1. Re:Rule of Thumb by Anonymous Coward · · Score: 1

      I found that I can determine how bad a programmer is by how much he hates C++. There is a direct correlation. If you hate C++ or find it difficult to learn, there are many job opening for janitors.

      I thought it went the other way around. The better someone knows C++, the better they realize how horribly misguided language it is, compared to alternatives. For every good way to use C++, there are 10 easier ways to abuse it, and if you don't know them, you don't really know the language.

  52. Your example is bad I think by gerald.edward.butler · · Score: 1

    Clojure should solve the problem of using too much stack through recursion by properly impelementing tail-recursion. When writing recursive functions, the programmer should always write the function so that it can be "properly tail-recursive". If not, you are saying at the outset that you are creating something that will use unbounded memory to do a computation that *could* always be done in a fixed memory size. Writing a recursive function that is not properly tail-recursive is simply bad programming and an anti-pattern. Either refactor the algorithm into something iterative or make it properly tail-recursive. Then, the max stack size will never be an issue.

  53. C++? Seriously? by Anonymous Coward · · Score: 0

    "Worse is better" is usually related to LEAVING OFF features which would be considered extraneous. I dare you to find any language with more features than C++. That's a hilariously bad example, if anything, he's complaining about the existence of a feature, namely reverse compatibility... Which the software would be (in his opinion) better without. So he's basically arguing FOR "worse is better" in TFA, although he doesn't seem to realize it.

  54. Too much of a good thing by Alomex · · Score: 1

    Backwards compatibility is a good thing, but too much of it can be bad. There are glaring errors in languages which have not been fixed in the name of some faux backwards compatibility argument.

    I'll start with one that was fixed.... thirty years after the fact, all the while arguing that it couldn't be fixed, in the name of backward compatibility. The example? ANSI C gets the right answer for sqrt(2) while the original C didn't.

    An example of things that C got wrong and have yet to be fixed? the bug inducing = assignment operator, the lack of arrays bound check and the completely unnecessary and time wasting #include <stdio.h> at the beginning of every program.

    Observe that those glitches were blindly copied by most C language derivatives (C++, Java, C#, Scala).

    I'm not a big fan of Go, but at least if goes back to the := assignment operator.

    1. Re:Too much of a good thing by david_thornley · · Score: 1

      The original idea behind the = assignment operator was that there were a lot of assignments and = was easy to type. := requires one shifted and one unshifted character in every keyboard I've used, making it awkward to type. = would not cause any problems if the equality comparison operator weren't ==, or if = produced an invalid comparison. (Some compilers are pretty bad about finding it and issuing a warning.)

      In at least some C derivatives, the assignment operator(s) either do not return a value or return a non-bool value, and are invalid as a condition in a conditional statement.

      Bounds checks for arrays are available in most derivatives. In C++, you have to ask for it if you need it, since Stroustrup thought that you could make a checked operator if you had a fast operator, but not a fast operator if you had a checked operator. I believe most C derivatives do generally have bounds checks on arrays.

      I don't know why you're complaining about the #include. Most languages require some sort of include or other statement to use their standard I/O facilities, or they're loaded in regardless. Not all C files are going to need it, and if you habitually put it in when you don't need it you're the problem. C++ programs typically include iostreams instead.

      Are you complaining about the .h file structure? It's awkward, and a hangover from when it looked like a good idea. C++ had to retain it, but other C derivatives don't.

      --
      "When you have eliminated the unacceptable, whatever is left, however improbable, must be the truthiness" - Holmes
    2. Re:Too much of a good thing by Alomex · · Score: 1

      I know how = came to be and it was the wrong choice. A large number of bugs originate with it, and simply stating how the mistake was made in no way justifies it.

      Bounds check should be the default mode in any decent language and it should take quite a bit of effort to turn off (syntactic salt).

      What's wrong about including stdio.h? That a proper default configuration has all the main primitives enabled. You don't need to include <while.h> to use a while loop. You don't need to include <mult.h> to use multiplication. Those are basic primitives that should be enabled by default. When C was created text terminals were still rare and one can excuse string operations not being included by default, but derivatives thereafter have no excuse to repeat this anachronism. Really think about it.

    3. Re:Too much of a good thing by sfcat · · Score: 1
      if (0 == foo) { /// do something }

      Make your comparisons with the constant on the left side of the comparison operator...that way you can't accidentally put = where == should be because the compiler won't compile 0 = foo but will compile 0 == foo. Surprised you haven't heard of that one before...doesn't handle all cases but it does handle 95% of them. In 20 years of professional programming I've never made the dreaded = instead of == mistake because of that simple idiom.

      --
      "Those that start by burning books, will end by burning men."
    4. Re:Too much of a good thing by Alomex · · Score: 1

      Dude you are suggesting ways in which I can cope with a design flaw in the language, whereas it should be obvious to anyone that this is the job of the language designer, not the programmer.

      Look, let me put it in simple terms: programs have bugs and languages have design flaws. It comes with the territory. That's why we issue patches for software and that's why we should release new language standards every so often cleaning up said bugs, particularly when designing a new language.

      It might be too late for C, but designing a new language is a particularly apt time to fix flaws such as the = and == rigamarole. Go managed to do it, but neither Java nor Ceylon cleaned up that mess. Too much backward compatibility that we could have easily done away with,

    5. Re:Too much of a good thing by david_thornley · · Score: 1

      My explanation was not how a bad choice was made, it was intended to show that there are tradeoffs here. Having := as the assignment operator is awkward. I'd be more interested in replacing the equality operator, which would accomplish the same thing.

      You can reasonably argue that .at() and [] notations should have been reversed in C++. There is no reason to make it actually difficult to turn off bounds checking, while there is reason not to make it the obvious choice.

      I/O and while loops are entirely different things. While loops are created by the compiler, and I/O involves potentially heavyweight libraries. C and C++ explicitly label I/O as library-based, and provide the opportunity to substitute other I/O systems. Moreover, C has both hosted and freestanding implementations specified in the Standard (last Standard I looked at, anyway), and the freestanding one doesn't require stdio.h. It's easier to say that a freestanding implementation doesn't need to implement a certain library than to say that a freestanding implementation doesn't need to include certain language features.

      Some of your complaints strike me as personal preference. You can provide reasons for preferring := for assignment and default bounds checking, but I don't see any reason to have the I/O embedded in the language.

      --
      "When you have eliminated the unacceptable, whatever is left, however improbable, must be the truthiness" - Holmes
    6. Re:Too much of a good thing by Alomex · · Score: 1

      I'd be more interested in replacing the equality operator, which would accomplish the same thing.

      The problem is that C usage of = goes against elementary school ingrained math usage. Any UI expert will tell you that this alone is a source of confusion. The supposed time savings of having to type := over = are bogus. You spend about 0.25s extra time typing the colon. Now let's say you've written a 100K lines of code a year. This means you spent 7 hours typing that extra character. A single nasty = bug will easily exceed the 7 hours just in terms of finding it, before we account for the cost of the security breach.

      There is no reason to make it actually difficult to turn off bounds checking

      Again you are mistaken. Any UI designer will tell you that dangerous options should not be easy to activate (i.e. the three finger salute), or the double turn key for nuclear launch. Given how dangerous buffer overflow is in terms of security it shouldn't be easy to deploy code that does no bounds checking.

      Your argument for stdio is non-sense. All you say applies equally to malloc. Other languages do not require loading the I/O library in the header to do the linking. If you are writing a bare bones high-level assembler as C was originally meant to be I can see why you would like to load as little as possible, but heavy footprint languages such as C++ and Java have no excuse for this cumbersome call.

  55. The Free Market? by kilfarsnar · · Score: 1

    The outcome of everyone solving their own narrow short-term problems and never really revisiting the solutions is the sea of accidental complexity we now operate in, and which we all recognize is a problem.

    It strikes me that this describes our economic system as well.

    --
    "What the American public doesn't know is what makes them the American public." -Ray Zalinsky (Tommy Boy)
  56. Shitty is good enough by gelfling · · Score: 1

    No need to get all twisted up over quality and function. I was just on a major health insurance provider website and it's seemingly unable to produce lists of providers nor even display the right coverage that I have or even the plans I signed up for. But luckily logon was a bitch and the whole thing is clunky slow.

    I think we're going with shitty is good enough, and if it's not, then fuck you anyhow.

  57. I can answer these, as I was there. by tlambert · · Score: 1

    I can answer these, as I was there.

    "Hey, how come this new version of Mac OS doesn't work with any of my old Mac OS 9 software?", said Mac users in response to Classic support being dropped with the release of Mac OS X 10.5.

    Because Apple was unwilling to port the Classic 68K emulator to Intel because of the difference in processor byte order, among other things, making such a port not worthwhile in terms of performance of the Classic software. The user experience would have been crap, and so the decision was made by upper management to not support Classic going forward on Intel.

    For the PPC versions of Classic, they could have been supported under Rosetta, but it would have meant an approximate doubling of the number of APIs that were dragged forward onto Intel, for the dubious benefit of "Some Classic software will run, and some won't; sorry the stuff you personally care about doesn't".

    "Hey, how come this new version of OS X doesn't work with any of my old PowerPC software?", said Mac users in response to Rosetta being dropped with the release of OS X 10.7.

    This one was more related to the lack of a willingness to "freeze-dry" old versions of the libraries. The Mac OS X B&I ("Build and Integration") process required building from scratch the libraries, when building them fat, even though this was a process decision, rather than a technical one.

    Effectively, it's not practically possible within the Apple process to reproduce a binary build that's identical to a previous binary build. This is because Mac OS X builds are hosted on a system where the builds depend on being incrementally built into the host environment, rather than actually cross-built to the target. What this means is that the "build from scratch" process to produce the PPC portion of the fat binaries for all the system libraries couldn't be pegged at a particular Mac OS X version, while moving forward with the Intel portion of the binaries, and therefore it was not possible to maintain binary backward compatibility - which was what both Rosetta, and before it, Classic, existed to do.

    Debian Linux has this same problem when you build in a chroot to avoid "polluting" the host build environment. It's one of the reasons a build chroot is used by Linaro to support ARM architecture builds on Intel, and that's the same reason that ChromeOS for x86 is built in a chroot environment on a debian variant maintained internally for desktops at Google, rather than being simply directly cross-built into a directory tree hierarchy.

    Unlike FreeBSD, neither Linux nor Mac OS X is capable of targeted cross-builds, without pollution of the build/host environment, and without using build products as part of the build.

    So technically, the answer for both Linux and Mac OS X is the same: poor build environment engineering - "Worse is Better", exactly what the original article talks about - infects both operating systems.

    1. Re:I can answer these, as I was there. by Anubis+IV · · Score: 1

      If Intel support for Classic was the issue, then why not ditch Classic after 10.5, instead of 10.4? After all, PowerPCs were still supported for 10.5, so Classic could have been kept around without needing to port it to Intel. Post-10.5, PowerPCs were no longer supported, so Classic support could have been dropped at the same time. As it was, I ended up keeping a Hi-Res PowerBook G4 around running 10.4 for years, just so I could play a few of my old games that hadn't been ported to OS X, rather than being able to bump it up to 10.5.

      No comment on Rosetta, since I simply enjoyed learning something new and don't disagree with you.

    2. Re:I can answer these, as I was there. by Anonymous Coward · · Score: 0

      Not trolling, just a serious question: why can I compile any software from early 90's to today on any Linux distro I've attempted without issue? It sounds like I shouldn't be able to, but it takes less than 20 minutes of finagling to compile ancient POVray software from the 90's on literally any current Linux distro. That is not possible on Mac OSX (I've tried repeatedly, even with homebrew).

      I would like to agree with you, maybe I don't understand what the problem truly is, but there is definitely a difference between compiling software for Linux vs Mac OSX. As in, one is so easy a talented kindergartener can do it, while the other is literally impossible without rewriting Mac OSX. Why is that?

    3. Re:I can answer these, as I was there. by tlambert · · Score: 1

      Not trolling, just a serious question: why can I compile any software from early 90's to today on any Linux distro I've attempted without issue? It sounds like I shouldn't be able to, but it takes less than 20 minutes of finagling to compile ancient POVray software from the 90's on literally any current Linux distro.

      Technically, you can't. A lot of people were still using pre-ANSI C compilers in the early 1990's, so the code will be K&R C rather than ANSI C.

      Any software that uses a function name or variable that uses what's now a keyword in C89 or later won't compile correctly, it'll barf. Try naming a function "void" or "restrict" or "const" or "volatile" or typdef'ing something named "_bool". Likewise, you should try compiling most of the contents of the comp.unix.sources archive, and noting the fact that -std=c89 requires ANSI C constructs, rather than K&R C constructs.

      Global variables may be caches in registers in later compilers, while depending on changing a value from another thread of control (either a thread, or from a signal handler, etc.), where changing the backing value won't modify the register contents because the contents are not re-fetched on reference... i.e. compiling with a compiler that depends on the "volatile" keyword for the validity of its optimization assumptions (technically compiler writers could have introduced a "nonvolatile" keyword instead, but didn't because they wanted to lazily make the assumption and have the programmer correct it, rather than being conservative about their assumptions).

      I expect that you will also see a lot of "cast discards qualifier", "comparison si always true" and similar warnings that would be errors, should you enable -Werror.

      Additionally, you're going to find incompatibilities in the use of pty's, and in the use of trmio vs. termios, and other SVR4-ism's vs. BSD-isms (example: do system calls automatically restart after a signal handler fires, or do they terminate the function call with EINTR?). You will also find threads differences (such as PTHREADS_MUTEX_INITIALIZER) which will bear on your ability or inability to declare an initialized pthread_mutex_t, or need to call pthread_mutex_init(). You'll also find that OOB signalling on TCP/IP sockets behaves differently on BSD 4.2g based TCP implementation - and the code that expect a 4.2g sockets implementation - vs. later 4.3 sockets interfaces. For SVR3 and SVR4.0.2 code through 1994, you'll also see portability problems with ntoa vs. the libTLI interfaces, which lost out to the BSD interfaces for socket and host name lookup.

      If you are using setuid/seteuid/etc., you will also find that older code assumes the non-existance of POSIX saved IDs - in other words, it believe that you can flip back and forth easily. Not only will this not work without jumping through an additional hoop, you're going to have security holes if you were to "fix" the system call interfaces to behave in the old way.

      What you actually mean is that you haven't *noticed* any problems, in doing a not very exhaustive survey of older software. If you tried to use an older gcc that supported the K&R C dialect as a -std= argument, you'd find that the system header files with ANSI C prototypes wouldn't compile correctly.

      That is not possible on Mac OSX (I've tried repeatedly, even with homebrew).

      I would like to agree with you, maybe I don't understand what the problem truly is, but there is definitely a difference between compiling software for Linux vs Mac OSX. As in, one is so easy a talented kindergartener can do it, while the other is literally impossible without rewriting Mac OSX. Why is that?

      Are you only trying to use POSIX interfaces on Mac OS X, or are you trying to use additional libraries supplied by the OS historically, but not supplied by the current OS version? If the answer is the latter, then the problem is that your software isn't portable, because it doesn't engage in minimal use of

    4. Re:I can answer these, as I was there. by tlambert · · Score: 1

      If Intel support for Classic was the issue, then why not ditch Classic after 10.5, instead of 10.4? After all, PowerPCs were still supported for 10.5, so Classic could have been kept around without needing to port it to Intel.

      10.5 ran on Intel. Making Classic run, but only if you were using PPC hardware, was not an option, due to the large amount of kernel and interface changes necessary to support Intel. It would have basically required a complete rewrite of Classic. At the time there were just two people supporting Class vs. changes to the main OS (Alex Rosenberg and one other person), it would have require dedicating a team of people to work under them in a non-protected mode environment in order to do the work.

      Most of the original Classic team had either already escaped to the iPod division, to avoid having to learn how to deal with the "inconvenience" of memory protection (think "thePort"), or they'd buckled down, and learned to live with protected mode restrictions, or they had left Apple for other companies (Adobe, etc.).

      It would have required a lot of hiring to deal with the amount of change that Intel brought to all of the Mach interfaces and other parts of Mac OS X, and frankly, it would have taught them bad/obsolete programming habits, and provided little value to the company, while at the same time making the trade-off between the Intel and PPC value propositions in the wrong direction, when both types of systems were still for sale. This would have not only caused new PPC sales to cannibalize Intel sales, it would have also stretched out the support timeline for the PPC another 2 years.

      All in all it would have sucked, a lot, from many perspectives.

    5. Re:I can answer these, as I was there. by Anubis+IV · · Score: 1

      10.5 ran on Intel. Making Classic run, but only if you were using PPC hardware, was not an option, due to the large amount of kernel and interface changes necessary to support Intel.

      Back up for a moment though, and you're recall that 10.4 supported Intel, which I believe would mean that those changes had already been made, wouldn't it? The way you guys avoided having to do a rewrite of Classic was by maintaining separate builds for PPC and Intel Macs during Tiger's run, with the PPC builds featuring Classic support and the Intel builds lacking it. Couldn't that pattern have been carried forward into 10.5, given that PPC hardware was not long for the world anyway? Instead, Apple merged the builds in 10.5 (which only lasted for that one version), which necessitated dropping Classic for the reasons you said.

      This would have not only caused new PPC sales to cannibalize Intel sales, it would have also stretched out the support timeline for the PPC another 2 years.

      All in all it would have sucked, a lot, from many perspectives.

      Absolutely no disagreement from me. While I've been quibbling about the technical stuff, I was doing so to point towards the idea that Apple's primary motivation for dropping Classic support was because it made good business sense, and that any other considerations were secondary. I actually think they made the right decision, and that they did so for exactly the reasons you outlined (even if I was a little put off at the time that I never got the nice 10.5 features on my old PowerBook :P).

    6. Re:I can answer these, as I was there. by tlambert · · Score: 1

      10.5 ran on Intel. Making Classic run, but only if you were using PPC hardware, was not an option, due to the large amount of kernel and interface changes necessary to support Intel.

      Back up for a moment though, and you're recall that 10.4 supported Intel, which I believe would mean that those changes had already been made, wouldn't it? The way you guys avoided having to do a rewrite of Classic was by maintaining separate builds for PPC and Intel Macs during Tiger's run, with the PPC builds featuring Classic support and the Intel builds lacking it. Couldn't that pattern have been carried forward into 10.5, given that PPC hardware was not long for the world anyway? Instead, Apple merged the builds in 10.5 (which only lasted for that one version), which necessitated dropping Classic for the reasons you said.

      The 10.4 Intel builds were "a" versions. The intent was always to integrate them, but they were run as a separate "build train". This is the same way that development versions are handled, and it was the same way that Mac OS X Server versions used to be handled.

      To carry it along, it was necessary to build and designate an entire "build fleet" - systems in a server room used to do the builds - and to staff build engineers, and integration engineers, and duplicate roles between Intel and PPC development, etc.. So there was a significant cost associated with it, including that things were not being "built fat". This meant that if you made a change in the PPC code that happened to break the Intel build, since you personally didn't have an Intel system, to do the test builds on, let alone try to run the code to make sure it still worked, someone had to clean it up for you so that it worked on both Intel and PPC. It was incredibly burdensome, and it meant that those people, who were bright people, were stuck working on that, rather than the next great thing.

      Technically, it could have been done, but it didn't make economic sense, and it didn't make resource sense (at the time, in Silicon Valley, the feeling was that Google was hiring all available talent so nobody else could hire them, regardless of whether or not Google actually had anything useful for them to do with their time or not).

      I'd agree that it was an economic decision, as part of getting people to stop buying PPCs, and to stop waiting on buying Intel, when a purchase was going to happen, but there was still a choice of one or the other. But it was also a resource and process overhead problem.

  58. A precedent from another profession by Marginal+Coward · · Score: 1

    From TFA: "Other professions, like medicine, the law, and engineering, have values and a professional ethic, where certain things are valued for their own sake." Evidently the author is unfamiliar with common law, in which the law evolves over time via practical application, much as programming languages evolve and mutate. This is contrast to statutory law, which is created from whole cloth, much as one might create a new programming language which has roots in other languages but is fundamentally different from any of them.

    If the analogy is apt, "warts" presumably appear in the law. Lawyers, judges, or legislators might wish to remove them. However, practical considerations such as disruption of some existing body of law might prevent that. Also, warts are, by definition, subjective. So, one man's wart might be another man's treasure.

    Going back to programming, the use of pointers in C++ is both a wart inherited from C, and a useful feature that can't be removed without fundamentally changing the language. Thus, we have C++ templates for smart pointers, which seek to ameliorate the wart without actually expurgating it.

  59. C/C++ polyglot interface definition headers by tepples · · Score: 1

    It's idiomatic in a C++ header that uses extern "C" { ... } to define an interface to be used by both programs written in C and programs written in C++. (When the properly constructed header is included in a C program, the preprocessor eliminates the extern "C" { ... } block.)

  60. Benefit vs. cost by Todd+Knarr · · Score: 1

    The problem is that you don't have to consider just benefits, desirability, goals and values. You have to consider the other side of the equation: cost. And for programming languages like C++, the cost of breaking compatibility can be huge. If you change C++ in a way that isn't compatible with existing behavior, you have to check every single program written in C++ for bugs, errors and just plain failure to compile anymore. The cost of that's going to outweigh just about any benefit short of "creates a literal Heaven on Earth for every single person in the world". It'd be simpler to create a new language based on C++ with the desired changes made to it, which is what tends to happen. The same applies to software frameworks and architectures.

  61. Hmmm... by Viol8 · · Score: 1

    "I wandered off or a while and when I came back they'd added the STL,which provided some badly-needed data structures and language capabilities"

    Most of the common STL containers would be a few hours work to write something reasonably functional. Binary tree maps perhaps a day to get working properly but nonetheless, nothing a competetant programmer couldn't do. In fact this was done in C for years without the STL so your complaint is a bit weak.

    1. Re:Hmmm... by david_thornley · · Score: 1

      One of Stepanov's goals in writing the STL was performance. He wanted the performance to be as good as hand-written code, performance being considered important in C and C++. I haven't seen another mainstream language that was well suited for it. (C++'s std::sort is inherently more efficient and easier to use than C's qsort, since qsort has to handle everything indirectly and requires a comparison function definition with an odd interface. Further, std::sort works as is on other data structures, while qsort only works on arrays.)

      The important thing about the STL was not just the containers, but the iterators and algorithms, which all worked together. If you wrote a new container, you could define appropriate iterators (think pointers into the structure), and then the algorithms would automatically work. That, to the best of my knowledge, was not actually implemented previously.

      --
      "When you have eliminated the unacceptable, whatever is left, however improbable, must be the truthiness" - Holmes
    2. Re:Hmmm... by Greyfox · · Score: 1

      I've written a linked list library in C at pretty much every company I've ever worked for. Yes, you could spend a few weeks re-implementing the STL, and all the unit tests you'd need to make sure it's functioning properly, and do that again on your next project. And again on your next project. Or your language could just supply those relatively uninteresting components and you could spend your development time on something you haven't done before.

      --

      I'm trying to teach myself to set people on fire with my mind... Is it hot in here?

  62. The horror of the new languages by Anonymous Coward · · Score: 0

    But when you throw out backwards compatibility, you get syntax horrors like Erlang and R.

  63. Python 3 anyone? by Anonymous Coward · · Score: 0

    No? I rest my case.

  64. Funny, coming from a UX guy by JohnFen · · Score: 1

    Judging by the output of the UX crowd over the past few years, they actually seem to believe that worse is better. It's kindof funny seeing him arguing against the proposition.

  65. Re:"GNU C compiler" versus "GNU Compiler Collectio by david_thornley · · Score: 1

    Not all C++ compilers handle all C code. Visual C++ never did fully implement C99 (Herb Sutter, in charge of Visual C++, said that those looking for a C99 compiler for Windows should go elsewhere). Since C and C++ are so similar, many implementations will compile C code if presented as C code, for convenience.

    This is NOT part of the standard. The standard lays out what a C++ implementation must do, and compiling C programs is not one of them. Many C programs are also valid C++ programs that do the same thing, so those must be compiled. There is a standard way to say that things should be compiled in a way compatible with a C compiler (C has a de facto ABI, unlike many languages). There is no requirement that a C++ compiler compile a C program that is not valid C++.

    --
    "When you have eliminated the unacceptable, whatever is left, however improbable, must be the truthiness" - Holmes
  66. why won't it just die.die.die? by epine · · Score: 1

    Almost all the hacks imposed on C++ to remain compatible with C are linear hacks that don't combine combinatorially. That's what makes these hacks ugly: bending over backwards to achieve hack containment. The C++ standardization literature contains many of the fiercest debates ever waged among pointy hats concerning hack containment. Purity wasn't an option. Impurity segregation was.

    The hacks in C++ that do have combinatorial complexity pertain to features of the C++ language completely unrelated to C, such as templates and namespaces.

    The bending over backward to avoid non-linear hacks due to compatibility with C got the standards committee into a wee bit of time pressure. Both the template and namespace features were added "on the fly" against the stated policy of the standardization group to only standardize after there was enough experience on the ground to avoid the worst mistakes.

    If the standard isn't finished on a timely basis: market fail.

    If the standard is finished without templates and namespaces: paradigm fail.

    If the standard makes blunders in defining templates and namespaces: an eternal witch's brew.

    The committee members rather sanely (and unhappily) chose the least of several competing evils.

    There's never been a language like C++ to get otherwise smart people to say stupid things.

    * C++ contains many ugly hacks due to its C legacy
    * most ugly hacks are combinatorial
    * C++ contains many combinatorial hacks
    * therefore C++ is riven with combinatorial hacks due to its C legacy

    Yes, but the ugly hacks to support C are not the combinatorial hacks, and the combinatorial hacks to support templates and namespaces before their time are not the hacks to support C.

    Of course, if you don't delve deeply enough to figure this out, one might just conclude that C++ was concocted by a brigand of insane ideologues. You'd be stupid and wrong, but if your surround yourself with an echo chamber of the equally lazy, there's hardly any detectable social downside (near you).

    There's remains, however, this irritating tendency of the world around you not to adopt your favourite "clean" language and put C++ out to pasture once and for allâ"due exclusively to inertia, incompetence, and mendacity. Of course.

    The next rank of fierce debate during standardization concerned the elimination of all proposed features where adopting the feature imposed a performance penalty across the board even when it isn't used. A few performance points here and there on a heavy-lifting, industrial programming language quickly adds up to entire data centers. Elegance was never a sufficient argument, unless the performance tax imposed was—at most—barely measurable.

    Elegance looks like such a great thing until one begins writing an application at industrial scale. The hacks inherent in making any computational system work efficiently on industrial scale (with smooth degradation around the edge cases, and no crippling instabilities) instantly dwarfs the hackishness of the C++ language itself.

  67. Oh dear by spongman · · Score: 1

    scroll, scroll, "lisp", back.