Which programming language makes you most sad/angry/annoyed/... - add a note in any comments on the language you most like, so we can do some correlation.
The programming languages that would make me the most sad/angry/annoyed I don't use, so it's difficult to make a choice. I suppose I'll have to go with Javascript because it's the de facto 'Web language' which people use to force me to evaluate arbitrary code whenever I want to read anything on the Web. Even with a sandbox that seems a terrible idea.
If we're talking about programming languages I hate but still use, I'd have to go with Python. I spend most of my time writing Haskell, and Python's dynamic typing puts me on edge. I might spend half an hour evaluating a Python script only for it to throw an AttributeError because I mistyped some function name or passed the wrong type.
Does anyone know a static analysis tool for Python? I found one a while back but when I tried it it threw (you guessed it) an AttributeError on NoneType.
Editra with the PyStudio plugin has become my favorite development environment. It runs pylint every time you save a file and highlights lines with errors.
I'm going to sign in as a partisan here. I firmly believe that Python is the worst language that people actually use.
DuckTyping is the most deeply misguided aspect of python. With the discover of Hindley-Milner type inference 40 and 30 years ago, this sort of sloth is simply inexcusable.
Pythonistas will say "Oh, I don't care if it's a duck or a swan, as long as it quacks." Guess what? You can treat function calls as a statement that an object is an instance of some typeclass and that typecheck that. With a sufficiently intelligent compiler/interpreter author this is transparent to the programmer.
With fairness, no you can't, not truly. Please point me to the version of HM the works with inheritance. Plus, due to stuff like __getattr__, the interpreter may not know until the method is called if it even exists.
It would be totally possible in python to write a class where when any arbitrary method is called on a class, a function is randomly generated and called, with a random number of arguments, etc. It doesn't even have to be consistent from call to call. How on earth would H-M type inference cope with that?
The point is you can't just bolt on H-M to a typical scripting language and expect it to work, like, at all. It's a pretty huge sea change, and it would warp the underlying language to the point where you'd just end up with some of non-lazy, non-pure Haskell.
Well, duck typing can still be statically checked, so I'd argue that dynamic typing is more misguided. That said, I do agree that duck typing is fundamentally flawed. I think swans actually don't quack, they honk, but so does a car. Here we can see a problem with both synonymous and homonymous verbs.
I think it comes down to namespacing: we use modules to prevent naming conflicts, allowing us to compose two modules, but if we do the same with objects their attributes conflict. In Haskell everything has a namespace — there are no methods, only functions — and type classes provide polymorphism without (henceforth) 'quack conflicts'.
Two terrible examples of quack conflicts from the Python standard library are '+' meaning both "add" and "append" (the latter being non-commutative), and the comparison operators '<', '<=', '>=', '>' actually meaning ⊂, ⊆, ⊇, ⊃ when dealing with sets.
Yeah, most people know M4 from Autotools, which is a poor use of it really. M4 was created by Brian Kernighan and Dennis Ritchie, the same team that created C. So there was some expertise behind its design. I've only use it for assembly programming, where is was very handy. But yeah, Autotools is probably why most people hate it.
It won't be at the top of the other poll. It's getting about as much votes there as Haskell. If we consider the size of userbase for both languages, it's pretty clear that it's not liked in this community. With good reason, it's utterly mediocre.
thedailywtf.com usually posts horrible code bases that developed gradually over time. But their collection of MUMPS horror stories has convinced me that any project in MUMPS is already doomed. http://thedailywtf.com/gsearchresults.aspx?cx=00708007008730...
Those are horror stories, recall. If you want to write bad code then you can do it in any language. These stories don't resemble what I have experienced. (I work for a healthcare software company in Wisconsin.)
In particular, a sensible coding style and sensible development practices (yes, name your variables sensibly! yes, use source control! yes, have code review and automated tools to catch common errors) can remove the bad. It also helps if your company wrote its own (quite good) IDE for the language so you don't have to use Intersystems'.
Honestly the most fun thing about M/MUMPS/Caché is that there's very little boilerplate and you can write sensible code quickly. It's like being stuck with Java and then suddenly moving to Python or Ruby. (With, yes, a few pitfalls that these languages don't have, and quite a few features missing. I still prefer modern languages for personal projects. But you quickly pick up a sense for practices to avoid.)
I can't say all companies that use Mumps are great places to work. But mine honestly is. </soapbox>
MUMPS still has a healthy user base at that. MGH is obviously a large user base (interview with a hospital in Boston and it'll eventually come up in conversation), but the fun is when you get into the dialects of it. For example, MEDITECH has their own dialect named MAGIC, and at least one of their employees has attempted to make things better.
I should try to get him to post to talk about it, but he created an object-oriented version of MAGIC that supported longer identifier names and other more modern constructs, as well as an interpreter that spewed out perfectly standards-compliant MAGIC. Originally he was barred from using on existing, but eventually got approval to use it on new projects and I guess some portion of the MEDITECH developer population uses it over plain-jane MAGIC now since it's substantially easier to write and maintain.
Though recently he's reached out asking about the job market. He's been there since his early 20s and now is in his mid-30s and feels as if he's dead-ended himself on the job market unless he gains familiarity with something else. I think he's finally looking to break away from MUMPS.
I came in here to add MAGIC as my "most disliked" language.
I spent a few months writing reports in MEDITECH and their macro language is a variant of MAGIC. Documentation is a closely guarded secret but you can get a taste of what it looks like here: http://www.99-bottles-of-beer.net/language-meditech-magic-38...
I use Perl a lot, but I have a problem with it. And it's not for the usual reasons. I dislike Perl because it amplifies how much I dislike working with other people's code. In something that constrains expression like C, it's easy to read most people's code. And in more expressive languages like Python, I at least feel like we're communicating. But to read someone else's Perl code, you have to get inside their heads! It's like you're not even speaking the same language.
You have to stop worrying and learn to love the bomb ;p In all seriousness, I feel that a lot of people(me included) go through a period of hate for javascript until they find that it's actually has some impressive expressiveness using very small set of things.
You must be right. It is like I still have the stigma of the early days of Javascript in the browser.
I do mainly PHP so it's not like I can't overcome bad design. I routinely try to get a fresh perspective of JS but it does little. I praise jQuery everyday though.
Get a hold of Douglas Crockford's 'JavaScript: The Good Parts' book. JS is so incredibly pervasive you're going to have to put up with it, so you may as well see if you can get along with the nice features like closures, functions as first class objects and prototypal inheritance.
I definitely have a very strong love / hate relationship with javascript. On one hand, you can be very expressive with Javascript and it absolutely can be an incredibly flexible language with a lot of power.
On the other hand, there's a LOT of warts in the language. Random reserved words like 'class' that don't even fit the language's approach, variable scoping that can very easily bite you in the ass if you don't know what you're doing, optional line terminators that seemingly exist for no reason other than to create bugs, stuff that should be avoided at all costs like 'with'. And that's just scratching the surface.
Yeah I agree on a lot of the points you mentioned. Block scoping would have been better in my view also. But there are tools, like in other languages, to ease that pain. I never forget a semicolon due to using js2-mode which makes missing semicolons stand out. JSLint and other tools of the sort help find bad code too. And the in browser tools like the Chrome dev tools with a debugger,tracing,console really make it much easier.
Javascript without the tools would be a real pain.
You know, what I hate is the JS community. It seems JS is split into two camps:
1. Ordinary people trying to get something done. Often not professional programmers. These people account for most JS on the internet.
2. JS hipsters. The kind of people who use Node.js and worship Crockford. They refuse to accept that anybody might want to use a language other than JS on the web, or that if you only accept the "Good Parts", you'll be set for life (where's my static typing, bitch?).
Languages are as much people as they are technology. I use Python because I like the people who use Python. I use Haskell because the people who use Haskell are really gentle and humble.
Good, reasoned people lead to good, reasoned code. I don't see that with the JS community.
Perhaps the JS community you portray doesn't just exist in two discrete attitudes. As far as I see it, JS is a fact of the current web so trying to get the best from it is the easiest way to dull the pain of what is often clumsy and irritating. There are certainly places and uses where static typing would be great and the web is no exception but JavaScript isn't suddenly going to go away just because it's easy to write bad code, or because a load of 'hipsters' are making some flavour of it popular at the moment.
Actionscript, Java, Objective C, Rexx, Visual Basic and any language that claims to be god's gift to developers without delivering. But my most hated has to be Java for all the extra condescending syntax and verbosity, enterprise "mambo-jambo" cruft, native code through jni circus, and general ugliness...
I use VBScript almost daily because I support an old proprietary system that offers 3 choices for business logic scripting (VBScript is actually the best of the three).
Agreed 100%. In addition software written in it seems to have the following other problems frequently
- Using Oracle
- Rarely contributing to FOSS
- Using very non-agile development methods
- 9 to 5 corporate culture
- Bad UIs and boring software overall
- Terrible web accessibility and standards conformity
- Hearing people say, "Its better than Delphi" as a comparison point
But those are just my experiences in working with teams using .NET. My run-ins with .NET have only gotten worse since I moved to Columbus, Ohio. I don't know anyone in the Valley using it, but people working for insurance companies seem to love it.
I was originally taught VB in school and thought it was amazing. Of course, I needed to get a student license for Visual Studio...and I needed to wait an hour to install it everytime I bought a new computer...oh and what I created could never be used by anyone on a Mac or Linux system.
A couple weeks later I discovered the wonderful world of Linux and never looked back.
My first exposure academically to a programming language was Visual Basic. This was what they "force-taught" at school.
I already had experience with Java/PHP/C, and just wreethed inside with disgust at the rationale for learning Visual Basic. It was a horrible experience that was forced upon me by my school's teacher. (I was about 16-17 at the time I think).
As a form of silent defiance, whenever I had to declare a variable, I would call it `dim $%something%`. Ha.
My first academic (and non academic in fact) language are C... and I still find it nice ! And for the short exposure of Java, I find it distastefull with lot of cruft. Especially since I've met Common Lisp and Haskell...
My first language (after basic) was 68000 assembler (unless you count digital logic), followed by C and C++. When I went to college, they were imposing Object Pascal, which seemed a clunky and pointless language overall. It's possible that the language wasn't as bad as I made it out to be, but first impressions tend to be lasting impressions.
Had a similar experience when learning languages at the school I went too. There tehy started out with Perl (ya I dont' know why either), then VB6, and then ended with Java. It's probably the only time I've ever looked at Perl or java so fondly, and the VB6 experience was so bad it tainted my opinion of the .NET platform for years afterwards.
Objective-C. The syntax of this language is hideous. In most cases with languages like C#/Java/Python/Ruby etc. even if you don't know them you can understand a few things by looking at the code. Every-time I look at Objective-C code it hurts my eyes. What a convoluted piece of crap.
I'd encourage you to play around with Obj-C a little more before writing it off. It's actually a pretty simple, compact and concise language once you dig into it. Apple's APIs, on the other hand... :facepalm:
I’d give it a try if it worked on Windows or Linux. I’m not willing to buy a Mac just to be able to study a language-I could build a Hackintosh but it’s too much trouble for what it’s worth. Most of the languages out there work on any platform. Even C# works on Unices through Mono. But for Apple’s products its always the same story, our way or the highway.
You are correct. GNUstep would be the most well known project to make use of ObjC outside of the Apple world. Also, since it implements the OpenStep API, you could use it to get a basic feel for Mac development without jumping in to the Apple fog.
Which APIs do you dislike? I think Apple's Cocoa and Cocoa touch frameworks are some of the best. Cocoa is old and less polished, but Cocoa touch is pretty awesome.
My only complaint would be how hacked on Core Animation is in comparison with UIKit. For example, WebView doesn't like having a layer, but this isn't mentioned anywhere in the documentation:
Objective C is the 6th C-like language I've used professionally. It took a bit of getting used to, but now that I know the overall design goals, and how everything's implemented under the hood, I find it to be quite an elegant language. Properly designed APIs are a joy to use in Objective C since it's very easy to describe your intent.
I don't expect that the responses to this will be enlightening. In fact, I can predict right now that the winner of this poll will be the most commonly-used language which isn't widely considered to be "nice". Depending on the precise demographics of this site, that's either going to be Java, C++ or Javascript, despite the fact that there are clearly worse languages out there (Fortran, COBOL, Brainfuck...)
The reasoning is explained well in a post by Terence Tao [1] in the context of 'List of the worst movie of all time'. Briefly, assuming that there is at least some correlation between programming language quality and uptake of that language (which doesn't seem to be controversial, especially among the users of HN) then you expect that languages which are generally worse will not be used so much, and so there will be fewer people who are able to vote for them as being "the worst".
For example, I have never used Delphi (to pick an example at random). I know literally nothing about it. It could be a stinking ball of crud that irreparably crushes the soul of anyone who tries to use it, but because it's not that popular, I've never used it, and so I'd never get to vote it down for being the horrendous pile of fecal matter that it may well be (I repeat again that I know nothing about Delphi, and it might be wonderful - I'm using it to illustrate a point).
If you make some simplifying assumptions about the probability that someone has used a language given its quality, then you can demonstrate that the language which will end up topping polls like this is whichever one is "just good enough" to be popular - which in this case means Java, C++ or Javascript.
Brainfuck is not a bad language, it just has different goals. Esoteric languages in general can't be compared with general purpose languages designed to be useful.
I would call Brainfuck (and other esoteric languages) as an instance of what "critical design" as described by Anthony Dunn. The goals of critical design are to produce artifacts that get you to think vs. "affirmative design" which is meant to create usable artifacts.
I refute that Fortran is axiomatically worse than Java. I've spent a few years working in each, so I got to know them decently well.
Fortran is like C with great math support; that is to say, C is like Fortran with great systems facilities. In each language's domain, it is more expressive and more performant than Java. Outside its domain, you don't want a bad programmer going near it for too long, but you can absolutely still get things done.
On the other hand, Java fills me with such dread that I would write a post defending Fortran just to kick it in the nuts.
The issue is that both C (portable assembler) and Fortran (portable math library) solve some problem pretty well.
What problem is it that Java solves well? That is what makes java such a shitty language to program in, for any particular problem you encounter there are much better languages to solve that problem in, C# comes to mind immediately as to what Java should be.
Note: Yes I realize that Java has excellent cross platform support and a huge ecosystem, but we're talking about languages, not the ecosystem.
The goal of Java was always to be able to "write large programs quickly." In some ways that sounds terrible by itself, but I think it turns out to be legitimate.
I've been on python projects that need to grow but struggle b/c all the things that make it easy to get a lot done the first few weeks become liabilities very soon. Adding developers to a project that doesn't declare types and encourages just passing around hashmaps is brutal. All the stuff you can't do in Java makes it easy for someone else to understand it and edit it.
I would believe that C# might be a bit better but only being fully supported on MS is a non-starter for many server side situations.
> The goal of Java was always to be able to "write large programs quickly."
That wasn't the goal of Java, not by a mile. The goal of Java was to build a language that runs everywhere, and to facilitate Sun's "everything(your watch, toaster, pc) is networked" ambition.
All the things that people flout about Java saying that how it helps them manage large projects(completion, re-factoring, ide integrated debuggers, good libraries) wasn't even a twinkle in anyone's eyes who was involved with Java development. Java's initial release was terrible - it didn't even have decent stdout facilities, was interpreted and as a result dog slow, took a long time to load the jvm, and essentially failed it's "write once, run everywhere" motto as it became "write once, debug everywhere" in practice.
Java has evolved, mainly because people bought in the hype. I don't know why people stopped questioning the hype.
"Look, we are totally object oriented."
I am not sure what it means for me as a developer. So, what about classes? Are they objects? Packages? Are value type objects?
"Ummm. No it doesn't matter. Just listen to us. We are object oriented."
"Our goal is 'write once, run everywhere."
Your awt looks like dog shit on both windows and linux, and is slow.
"Hey. We didn't say anything about 'looking good'. I can bet it looks equally crap. That's platform independence."
> In some ways that sounds terrible by itself, but I think it turns out to be legitimate.
If that's the actual goal, it isn't terrible at all. Why do you think writing large programs quickly is a terrible goal?
> I've been on python projects that need to grow but struggle b/c all the things that make it easy to get a lot done the first few weeks become liabilities very soon.
And those things which make it easy to get lot done in first few weeks but are liabilities would be?
> Adding developers to a project that doesn't declare types and encourages just passing around hashmaps is brutal.
I understand time complexity, space complexity, and api of dictionaries. If you needlessly wrap it in your class, I couldn't know anything without reading through your wrapper. What exactly do you gain by wrapping dictionaries?
> All the stuff you can't do in Java makes it easy for someone else to understand it and edit it.
Examples please. If your developers have an easier time understanding implementing an interface to sort, rather than saying persons.sort(key=lambda a: a.name) then I don't know how that can be remedied.
> I would believe that C# might be a bit better but only being fully supported on MS is a non-starter for many server side situations.
The list of things which aren't supported on mono is small, and basically includes things which won't run outside of windows(office interop) or are deliberately dropped(WPF).
> Yes I realize that Java has excellent cross platform support and a huge ecosystem
Java's cross platform support is awful if you go anywhere beyond Windows, Linux, OS X and Solaris (and even there both OS X and Linux have second-class status at best and suffered from serious issues at least until recently). Even Python and plain old C (if you know how to write portable code) are much more portable than Java ever will be.
And many would say the "huge ecosystem" of incredibly big and complex "frameworks" and tools is part of the problem with Java, or at best one of the symptoms of Java's problems. As others have pointed out, IDEs are language smells, and with Java using the language and surviving in its 'ecosystem' basically requires it.
I personally would even say that Java the language is considerably better than Java-the-ecosystem, but using the first without the later is almost impossible, and there are much better languages around anyway.
This has probably been the most senseless post I will read in a while:
- C only got a memory model in C11. So you can't be sure your code does what you think it does, without compiling and testing with every compiler for every platform you intend to target.
- C is a low-level language which has its niche. But most of the time you want quite different features, like runtime monitoring, inspection and debugging.
- In C you can't just move your binary to a different architecture and run it there, same thing in Python: You can't just deploy your pyc or pyo files on a different machine and expect it to work, especially not if the versions differ.
- You can't even do that for source files: Python breaks compatibility frequently, and because it is dynamically typed, you can't just check the signatures that nothing has changed and chances are you won't even see breaking changes until it crashes at runtime.
- Python is not nearly as fast as a decent JVM.
- Both languages lack a cross-platform UI toolkit, although yes, AWT and Swing suck, and JavaFX isn't that great either.
I agree though, that the whole "framework" stuff has grown out of proportions in Java. It is just a disease if a simple application ships with 40 MB of JAR files because the developer couldn't write any non-trivial functionality himself.
> IDEs are language smells
This smells like envy from someone whose "favorite" language lacks good IDE support, but yes, Java-the-language is just outdated.
> Java the language is considerably better than Java-the-ecosystem
WUT? Java-the-language is the weakest part. You don't have to use any Java library or framework at all and Hotspot is probably the only freely available VM which is fast, mature and stable.
>>Even Python
Why "even"? Python is the most portable language today. It's portability between OSes superb and it "almost portable" between VMs (IronPython, Jython, PyPy).
Java is good for enterprise IT consultancies. It requires a lot more detail to attention to implementation most enterprise app features, yet it still works acceptably in the end, maximizing consultancy fees.
In the end it rarely works acceptably, but that just helps sell support contracts, so it is also good for enterprisey software vendors and consultancies.
In general when people hate on Fortran I assume it's because they had to deal with f77. 90/95/2003 aren't perfect or anything but aren't generally offensive.
You can't ignore context. Fortran is a very strong language for a specific application - you can't compare it to Javascript.
Delphi was a framework using Pascal. It was a revolution at the time - and you can see it's influence in many software tools available today.
You could argue that the current SQL/Rails API/JSON/Backbone/JQuery/CoffeeScript/HTML/CSS abomination we've created could be improved or replaced with something as disruptive as Delphi was at the time.
I wish there was some way to vote for that abomination in the poll. Personally, writing Java/Html hybrid templates that are served as html documents and then further manipulated by dynamically altering the DOM in javascript on the client is the stupidest programming style I can imagine.
Out of curiosity, what is your favored alternative for web applications? Server-side rendering of complete pages? Client-side manipulation of pure HTML?
A redesigned transport model other than HTTP? Continuations? A saner front-end language that can also be used at the server side and it's not the Node.js failfest?
That's a good point. How come we are still using http? I mean, the closest we've come AFAIK to something almost useful is ajax, but that's still not very good considering it's javascript... Maybe I'm unaware of some secret google development.
MIDI is very slow and has a very limited message set. There are better alternatives, like OSC, but it seems like the chances of the music industry collectively acting in its own best interest again and approving a new standard are very slim.
Given that websockets don't even work reliably yet, and are not even implemented in all popular browsers of the day, that's hardly a proposition. Not to mention that everybody implementing his own HTTP replacement from scratch with websockets instead of a common standard is a highway to hell.
As for what's wrong with it:
- better support for non-blocking requests
- better support for streaming media
- better support for caching
- better content negotiation (e.g for "retina" x2 assets)
- better authentication mechanisms
- better support for encryption
True, but the original question was not "what is the worst programming language" but rather "what is the most disliked". So I do believe we'll get the results that you've predicted (you should add PHP to the list) but at least we're answering the question at hand.
We wont be incredibly enlightened but it will be interesting to see the results and what that tells us about HN readers. Perhaps we'll learn some interesting stuff from the comments as well.
I agree this poll by itself is a little misleading, but if we take this poll and the poll on the favorite languages, we will get a better picture of what people are thinking. Here are the numbers for a few popular ones, as of now: C:780,22; C++:424,213; C#:658,42; Haskell:431,14; Java:435,389; Javascript:1125,149; Python:2484,39; PHP:516,334; Ruby:1373,84; VB:34,249. There are still multiple ways to interpret the results, but I really think this poll is extremely enlightening combined with the other poll. I like them.
You're actually not too far off on your assessment of Delphi. Compared with all the .NET languages that sprang up to replace it, it's painfully verbose, inexpressive, and starved for community support.
On the other hand, what it still does well, decade after decade, is pump a 30MB native standalone executable from millions of SLOC in minutes, one that will run on any Windows box without installing any libraries or runtimes. That is, in its own way, impressive. Many businesses still depend on it and instead of an OSS community you wind up licensing libraries from the few remaining dev shops.
I don't know what the state of Delphi is now, but I remember there was a good community around it 6-7 years ago, plenty of Open Source components that filled the gaps in the VCL.
And back in the day, when .net was awkward to use and Java was too slow, Delphi was the king of RAD. Unfortunately they didn't even try to keep up with .net/Java, for example, proper Unicode support wasn't added until Delphi 2009.
The current state of Delphi is very good. I picked it up about 6 years ago, and it's a wonderful language to use for native Windows development. They just released cross-platform compilation for native OS X GUI and console applications, have 64-bit and 32-bit support.
In fact, the same person that invented C# first created Delphi (Anders Hejlsberg), and you can see how C# has borrowed much from Delphi.
Delphi, in the past 3 releases, has added native generics, anonymous methods, Unicode throughout the language by default, compiling native OS X applications, compiling iOS applications, and writing native 32-bit or 64-bit applications.
In addition, Pascal (and Delphi) does not have many of the serious security issues C/C++ developers have experienced, by design; e.g., format string bugs are non-existent because Delphi allocates strings on the heap.
Also, the Delphi community is alive and well over at StackOverflow. Unfortunately, many new developers in the US aren't familiar with Delphi...but it's extremely popular in European countries. It really is worth considering if you are writing native Windows applications that require complex GUI's done easily.
Easily C# and Java, I don't think the virtual machine adds anything other than another abstraction layer to get in the way. Just because code is native doesn't mean you can't have all sorts of built in bounds checking to ensure safety, but when you're in a VM, taking off the training wheels when you need to actually make shit fast is such a pain.
I especially don't understand the point of a VM like the CLR that only runs on one platform. It's fucking retarded.
On top of that, after having worked in an "enterprise C#" project for an unfortunate year, the kind of person who thinks C# is a really neat idea just doesn't get along with my style of programming.
I had to reiterate constantly "Do the simplest thing that will work". And they would get pissed at me whenever I inserted something at the wrong layer of their pointless abstraction hierarchy. Delegates, XML, and design patterns abstracting ONE thing where everywhere. It was fucking horrible and it took the team forever to get anything done.
Good point, the language felt like Visual Basic wrapped in Java's syntax, or maybe a reaction to Java with subtle improvements. There were some nifty things baked in like events and lambdas, but for the most part it didn't feel like I was exploring any fundamentally new constructs or gaining much in the way of expressiveness over C++ with boost. The whole language just feels milquetoast.
It was also difficult to get stuff across the managed/unmanaged boundary without a lot of verbosity and overhead, so optimization was unduly difficult.
But really, it's not the language I hate, the language is mediocre, its the ecosystem around it that's terrible.
I work in C# quite a few days a week, and I share your pair regarding the simplest thing. We have a couple of astronaut architects on the team (both of whom are actually good programmers, but they tend to get starry-eyed about MS frameworks and patterns), and I have trouble understanding why even a relatively "simple" web application requires nearly 30 Visual Studio projects.
Personally, I don't mind C# much (I do work at an MS-centric shop), but some of the baggage that comes along with the .NET framework can get bothersome.
I have had the same experience with C++. But it is not the language’s fault. It is people who use it and call themselves “architects” who know shitload of “patterns” and “good practices”, and make all these unnecessary abstractions and distractions.
Sounds like your complaint is against mediocre programmers and enterpriseyness, not C# (which in my opinion is a technically superior language to Java). I use it all the time for simple one-off tasks and while it can be a bit verbose it's never really been a hindrance.
365 comments
[ 3.4 ms ] story [ 319 ms ] threadIf we're talking about programming languages I hate but still use, I'd have to go with Python. I spend most of my time writing Haskell, and Python's dynamic typing puts me on edge. I might spend half an hour evaluating a Python script only for it to throw an AttributeError because I mistyped some function name or passed the wrong type.
Does anyone know a static analysis tool for Python? I found one a while back but when I tried it it threw (you guessed it) an AttributeError on NoneType.
DuckTyping is the most deeply misguided aspect of python. With the discover of Hindley-Milner type inference 40 and 30 years ago, this sort of sloth is simply inexcusable.
Pythonistas will say "Oh, I don't care if it's a duck or a swan, as long as it quacks." Guess what? You can treat function calls as a statement that an object is an instance of some typeclass and that typecheck that. With a sufficiently intelligent compiler/interpreter author this is transparent to the programmer.
And to confuse matters, Python 3 added optional type annotations that are ignored by the runtime!
It would be totally possible in python to write a class where when any arbitrary method is called on a class, a function is randomly generated and called, with a random number of arguments, etc. It doesn't even have to be consistent from call to call. How on earth would H-M type inference cope with that?
The fact that Python allows you to do something absurd is simply an argument against its design.
Edit: Uh oh, looks like I ruffled some snakeskin!
I think it comes down to namespacing: we use modules to prevent naming conflicts, allowing us to compose two modules, but if we do the same with objects their attributes conflict. In Haskell everything has a namespace — there are no methods, only functions — and type classes provide polymorphism without (henceforth) 'quack conflicts'.
Two terrible examples of quack conflicts from the Python standard library are '+' meaning both "add" and "append" (the latter being non-commutative), and the comparison operators '<', '<=', '>=', '>' actually meaning ⊂, ⊆, ⊇, ⊃ when dealing with sets.
Terrible language that produces (seemingly automatically) terrible software. It also rots the brains of those that are forced to use it.
All of those listed have their charms - seems hard to dislike them in the main.
In particular, a sensible coding style and sensible development practices (yes, name your variables sensibly! yes, use source control! yes, have code review and automated tools to catch common errors) can remove the bad. It also helps if your company wrote its own (quite good) IDE for the language so you don't have to use Intersystems'.
Honestly the most fun thing about M/MUMPS/Caché is that there's very little boilerplate and you can write sensible code quickly. It's like being stuck with Java and then suddenly moving to Python or Ruby. (With, yes, a few pitfalls that these languages don't have, and quite a few features missing. I still prefer modern languages for personal projects. But you quickly pick up a sense for practices to avoid.)
I can't say all companies that use Mumps are great places to work. But mine honestly is. </soapbox>
I should try to get him to post to talk about it, but he created an object-oriented version of MAGIC that supported longer identifier names and other more modern constructs, as well as an interpreter that spewed out perfectly standards-compliant MAGIC. Originally he was barred from using on existing, but eventually got approval to use it on new projects and I guess some portion of the MEDITECH developer population uses it over plain-jane MAGIC now since it's substantially easier to write and maintain.
Though recently he's reached out asking about the job market. He's been there since his early 20s and now is in his mid-30s and feels as if he's dead-ended himself on the job market unless he gains familiarity with something else. I think he's finally looking to break away from MUMPS.
I spent a few months writing reports in MEDITECH and their macro language is a variant of MAGIC. Documentation is a closely guarded secret but you can get a taste of what it looks like here: http://www.99-bottles-of-beer.net/language-meditech-magic-38...
Like anything, practice makes perfect. Read more Perl and reading Perl will become easier.
I do mainly PHP so it's not like I can't overcome bad design. I routinely try to get a fresh perspective of JS but it does little. I praise jQuery everyday though.
On the other hand, there's a LOT of warts in the language. Random reserved words like 'class' that don't even fit the language's approach, variable scoping that can very easily bite you in the ass if you don't know what you're doing, optional line terminators that seemingly exist for no reason other than to create bugs, stuff that should be avoided at all costs like 'with'. And that's just scratching the surface.
Javascript without the tools would be a real pain.
1. Ordinary people trying to get something done. Often not professional programmers. These people account for most JS on the internet.
2. JS hipsters. The kind of people who use Node.js and worship Crockford. They refuse to accept that anybody might want to use a language other than JS on the web, or that if you only accept the "Good Parts", you'll be set for life (where's my static typing, bitch?).
Languages are as much people as they are technology. I use Python because I like the people who use Python. I use Haskell because the people who use Haskell are really gentle and humble.
Good, reasoned people lead to good, reasoned code. I don't see that with the JS community.
I use VBScript almost daily because I support an old proprietary system that offers 3 choices for business logic scripting (VBScript is actually the best of the three).
- Using Oracle - Rarely contributing to FOSS - Using very non-agile development methods - 9 to 5 corporate culture - Bad UIs and boring software overall - Terrible web accessibility and standards conformity - Hearing people say, "Its better than Delphi" as a comparison point
But those are just my experiences in working with teams using .NET. My run-ins with .NET have only gotten worse since I moved to Columbus, Ohio. I don't know anyone in the Valley using it, but people working for insurance companies seem to love it.
A couple weeks later I discovered the wonderful world of Linux and never looked back.
My first exposure academically to a programming language was Visual Basic. This was what they "force-taught" at school.
I already had experience with Java/PHP/C, and just wreethed inside with disgust at the rationale for learning Visual Basic. It was a horrible experience that was forced upon me by my school's teacher. (I was about 16-17 at the time I think).
As a form of silent defiance, whenever I had to declare a variable, I would call it `dim $%something%`. Ha.
I wouldn't have cringed so much if I hadn't have been developing in nodejs and php prior.
http://developer.apple.com/library/mac/#documentation/Cocoa/...
The reasoning is explained well in a post by Terence Tao [1] in the context of 'List of the worst movie of all time'. Briefly, assuming that there is at least some correlation between programming language quality and uptake of that language (which doesn't seem to be controversial, especially among the users of HN) then you expect that languages which are generally worse will not be used so much, and so there will be fewer people who are able to vote for them as being "the worst".
For example, I have never used Delphi (to pick an example at random). I know literally nothing about it. It could be a stinking ball of crud that irreparably crushes the soul of anyone who tries to use it, but because it's not that popular, I've never used it, and so I'd never get to vote it down for being the horrendous pile of fecal matter that it may well be (I repeat again that I know nothing about Delphi, and it might be wonderful - I'm using it to illustrate a point).
If you make some simplifying assumptions about the probability that someone has used a language given its quality, then you can demonstrate that the language which will end up topping polls like this is whichever one is "just good enough" to be popular - which in this case means Java, C++ or Javascript.
[1]: https://plus.google.com/114134834346472219368/posts/TPjSPPd1...
If you want a language that was designed to be bad look at Malbolge or INTERCAL.
Fortran is like C with great math support; that is to say, C is like Fortran with great systems facilities. In each language's domain, it is more expressive and more performant than Java. Outside its domain, you don't want a bad programmer going near it for too long, but you can absolutely still get things done.
On the other hand, Java fills me with such dread that I would write a post defending Fortran just to kick it in the nuts.
What problem is it that Java solves well? That is what makes java such a shitty language to program in, for any particular problem you encounter there are much better languages to solve that problem in, C# comes to mind immediately as to what Java should be.
Note: Yes I realize that Java has excellent cross platform support and a huge ecosystem, but we're talking about languages, not the ecosystem.
I've been on python projects that need to grow but struggle b/c all the things that make it easy to get a lot done the first few weeks become liabilities very soon. Adding developers to a project that doesn't declare types and encourages just passing around hashmaps is brutal. All the stuff you can't do in Java makes it easy for someone else to understand it and edit it.
I would believe that C# might be a bit better but only being fully supported on MS is a non-starter for many server side situations.
That wasn't the goal of Java, not by a mile. The goal of Java was to build a language that runs everywhere, and to facilitate Sun's "everything(your watch, toaster, pc) is networked" ambition.
All the things that people flout about Java saying that how it helps them manage large projects(completion, re-factoring, ide integrated debuggers, good libraries) wasn't even a twinkle in anyone's eyes who was involved with Java development. Java's initial release was terrible - it didn't even have decent stdout facilities, was interpreted and as a result dog slow, took a long time to load the jvm, and essentially failed it's "write once, run everywhere" motto as it became "write once, debug everywhere" in practice.
Java has evolved, mainly because people bought in the hype. I don't know why people stopped questioning the hype.
"Look, we are totally object oriented."
I am not sure what it means for me as a developer. So, what about classes? Are they objects? Packages? Are value type objects?
"Ummm. No it doesn't matter. Just listen to us. We are object oriented."
"Our goal is 'write once, run everywhere."
Your awt looks like dog shit on both windows and linux, and is slow.
"Hey. We didn't say anything about 'looking good'. I can bet it looks equally crap. That's platform independence."
> In some ways that sounds terrible by itself, but I think it turns out to be legitimate.
If that's the actual goal, it isn't terrible at all. Why do you think writing large programs quickly is a terrible goal?
> I've been on python projects that need to grow but struggle b/c all the things that make it easy to get a lot done the first few weeks become liabilities very soon.
And those things which make it easy to get lot done in first few weeks but are liabilities would be?
> Adding developers to a project that doesn't declare types and encourages just passing around hashmaps is brutal.
I understand time complexity, space complexity, and api of dictionaries. If you needlessly wrap it in your class, I couldn't know anything without reading through your wrapper. What exactly do you gain by wrapping dictionaries?
> All the stuff you can't do in Java makes it easy for someone else to understand it and edit it.
Examples please. If your developers have an easier time understanding implementing an interface to sort, rather than saying persons.sort(key=lambda a: a.name) then I don't know how that can be remedied.
> I would believe that C# might be a bit better but only being fully supported on MS is a non-starter for many server side situations.
The list of things which aren't supported on mono is small, and basically includes things which won't run outside of windows(office interop) or are deliberately dropped(WPF).
I agreed with him.
Minute later he understood what he said <grin/>
The aging Cobol cohort.
Java's cross platform support is awful if you go anywhere beyond Windows, Linux, OS X and Solaris (and even there both OS X and Linux have second-class status at best and suffered from serious issues at least until recently). Even Python and plain old C (if you know how to write portable code) are much more portable than Java ever will be.
And many would say the "huge ecosystem" of incredibly big and complex "frameworks" and tools is part of the problem with Java, or at best one of the symptoms of Java's problems. As others have pointed out, IDEs are language smells, and with Java using the language and surviving in its 'ecosystem' basically requires it.
I personally would even say that Java the language is considerably better than Java-the-ecosystem, but using the first without the later is almost impossible, and there are much better languages around anyway.
- C only got a memory model in C11. So you can't be sure your code does what you think it does, without compiling and testing with every compiler for every platform you intend to target. - C is a low-level language which has its niche. But most of the time you want quite different features, like runtime monitoring, inspection and debugging. - In C you can't just move your binary to a different architecture and run it there, same thing in Python: You can't just deploy your pyc or pyo files on a different machine and expect it to work, especially not if the versions differ. - You can't even do that for source files: Python breaks compatibility frequently, and because it is dynamically typed, you can't just check the signatures that nothing has changed and chances are you won't even see breaking changes until it crashes at runtime. - Python is not nearly as fast as a decent JVM. - Both languages lack a cross-platform UI toolkit, although yes, AWT and Swing suck, and JavaFX isn't that great either.
I agree though, that the whole "framework" stuff has grown out of proportions in Java. It is just a disease if a simple application ships with 40 MB of JAR files because the developer couldn't write any non-trivial functionality himself.
> IDEs are language smells
This smells like envy from someone whose "favorite" language lacks good IDE support, but yes, Java-the-language is just outdated.
> Java the language is considerably better than Java-the-ecosystem
WUT? Java-the-language is the weakest part. You don't have to use any Java library or framework at all and Hotspot is probably the only freely available VM which is fast, mature and stable.
Any language that requires six spaces at the start of the line in order to maintain legacy punchcard compliance makes me gag.
fortran90 or hpf on the other hand are pretty useful in their domain.
Delphi was a framework using Pascal. It was a revolution at the time - and you can see it's influence in many software tools available today.
You could argue that the current SQL/Rails API/JSON/Backbone/JQuery/CoffeeScript/HTML/CSS abomination we've created could be improved or replaced with something as disruptive as Delphi was at the time.
I guess, it's the agreeing on something and then adopting it and then having it catch the market part that's making this difficult.
On another field that I follow, we haven't had anything better replace MIDI for like 30 years...
That means if you want an analog like continuous change from 0 to max for some audio property, you get stepping instead.
It's also not very fast for todays work with tons of channels.
I doesn't know about audio at all, etc.
OSC is a better replacement, but not widespread enough.
As for what's wrong with it:
- better support for non-blocking requests - better support for streaming media - better support for caching - better content negotiation (e.g for "retina" x2 assets) - better authentication mechanisms - better support for encryption
Also check: http://static.usenix.org/event/usenix99/invited_talks/mogul....
We wont be incredibly enlightened but it will be interesting to see the results and what that tells us about HN readers. Perhaps we'll learn some interesting stuff from the comments as well.
On the other hand, what it still does well, decade after decade, is pump a 30MB native standalone executable from millions of SLOC in minutes, one that will run on any Windows box without installing any libraries or runtimes. That is, in its own way, impressive. Many businesses still depend on it and instead of an OSS community you wind up licensing libraries from the few remaining dev shops.
And back in the day, when .net was awkward to use and Java was too slow, Delphi was the king of RAD. Unfortunately they didn't even try to keep up with .net/Java, for example, proper Unicode support wasn't added until Delphi 2009.
In fact, the same person that invented C# first created Delphi (Anders Hejlsberg), and you can see how C# has borrowed much from Delphi.
Delphi, in the past 3 releases, has added native generics, anonymous methods, Unicode throughout the language by default, compiling native OS X applications, compiling iOS applications, and writing native 32-bit or 64-bit applications.
In addition, Pascal (and Delphi) does not have many of the serious security issues C/C++ developers have experienced, by design; e.g., format string bugs are non-existent because Delphi allocates strings on the heap.
Also, the Delphi community is alive and well over at StackOverflow. Unfortunately, many new developers in the US aren't familiar with Delphi...but it's extremely popular in European countries. It really is worth considering if you are writing native Windows applications that require complex GUI's done easily.
I especially don't understand the point of a VM like the CLR that only runs on one platform. It's fucking retarded.
On top of that, after having worked in an "enterprise C#" project for an unfortunate year, the kind of person who thinks C# is a really neat idea just doesn't get along with my style of programming.
I had to reiterate constantly "Do the simplest thing that will work". And they would get pissed at me whenever I inserted something at the wrong layer of their pointless abstraction hierarchy. Delegates, XML, and design patterns abstracting ONE thing where everywhere. It was fucking horrible and it took the team forever to get anything done.
It was also difficult to get stuff across the managed/unmanaged boundary without a lot of verbosity and overhead, so optimization was unduly difficult.
But really, it's not the language I hate, the language is mediocre, its the ecosystem around it that's terrible.
Personally, I don't mind C# much (I do work at an MS-centric shop), but some of the baggage that comes along with the .NET framework can get bothersome.