
YourLanguageSucks - curtis
https://wiki.theory.org/index.php/YourLanguageSucks
======
lwansbrough
The site lists Microsoft being the defacto contributor to the C# language spec
as a negative. Honestly I think Microsoft has been an excellent steward of the
language, and their opinionated choices over the years have helped keep C#
succinct while also capable and modern.

I'm a bit of a fanboy, but when you compare it to the language that has been
around longer and is a direct competitor (Java), C# really blows it out of the
water for most common programming tasks (async, operator overloading,
pair/triple returns in C# 7, var keyword, superior generics, to name a few.)

~~~
kev009
Yup C# is definitely in the king position for application programming right
now. Between .net core, asp.net and xamarin you can target absolutely
everything. The main impediment to better quality software is devs raised on
Linux having irrational aversion to Microsoft still while thinking Google is
either competent or benevolent.

~~~
Gibbon1
I was very disheartened by the negative reaction of the Linux community to
attempts to bring C#/Xamarin to Linux. Since if there was anything the Linux
desktop really needed was simple ways to write GUI's for Linux. And semi cross
platform GUI's. Both of which Xamarin could provide.

------
kev009
The go section is great, it's such a derpy 1980s language:

"Go's error type is simply an interface to a function returning a string.

Go lacks pattern matching & abstract data types.

Go lacks immutable variables.

Go lacks generics.

Go lacks exceptions"

I've been searching for as succinct a criticism as this and now have it,
thanks.

~~~
dnautics
The defer interaction with named return values is going to give me nightmares.

We have a senior dev whose software caused a memory leak in prod. One of our
less senior devs (who has an engineering PhD in concurrent systems theory)
immediately identified that the senior was trying to do clever optimizations
for single threadedness that simply cannot work when concurrent... I wouldn't
be surprised if his code is causing a goroutine leak.

I am convinced that go is popular because it's comfortable to elder seniors
and makes them think they can use their aging python/c/c++ skills in something
flashy, new, concurrent, "supported by Google" and... Well at least it's
genuinely safer.

Disclaimer: I'm an aging dev myself.

~~~
jchw
I started writing Go at age 23, for what its worth. (That was a just a few
years ago.) I like Go because its simple. Obviously, that is also its
downfall. Overall, I would still hold it as one of the best languages for
writing various kinds of software (servers, CLI tools, and some odds and
ends.)

It’s true that you can write bad Go by trying to do things that are not a good
idea, but I’m not sure what you’d expect. The Go ecosystem is damning evidence
of the ease of writing pretty good code in the language.

Disclaimer: I work for Google (but I do not work on Go and I did not work for
Google when I first began writing Go.)

~~~
dnautics
No doubt. I strongly believe go is a major advancement over c/c++ for routine
work and an improvement over python.

There are, however major footguns, I find it hard to read other people's, or
even my own code (parsing nested if conditionals is no fun when you're
debugging under duress), and CSP is really just.... Not the best concurrency
paradigm.

~~~
otabdeveloper4
There's no such thing as "C/C++".

~~~
dnautics
Sorry c/c++ family. Explicit is better than implicit.

Pardon me. C was my second real language after Pascal and c++ came immediately
after that in a 6 month timespan, so for my underperforming and scelerotic
brain (aside from an ld_preload shim I wrote two years ago haven't touched
them since the aughts) they are "together" in my brain. Curly braces and all
that.

------
peteretep
"Perl 5 sucks because ... the regular expression syntax is horrid"

So horrid that it's become essentially standard :eye-roll:

------
jakear
Why is it that these lists seemingly always give JS a hard time for function
scoped variable declarations, but never give Python the same treatment?

Not to mention “nonlocal”...

~~~
moksly
Probably because everyone knows JavaScript, but not everyone use it by choice,
giving you a higher than average ratio of people who both dislike and know the
language.

This is actually one of the reasons I think every language except for
JavaScript sucks for open source web-development. Not that I particularly like
JavaScript myself, but everyone knows how to use it. I work for a Danish
municipality, we use a lot of open source software, but we’re roughly 10
developers and ops technicians that support 7000 employees and around 300-500
IT systems. As a result we can’t use every tech-stack. This is pretty standard
for average sized muniplacities by the way.

We don’t share tech stacks, but we do work together, and as you can imagine
that leads to wasted resources. We’re a C# shop our direct neighbour does PHP,
because of limited resources, we can’t utilise each others projects. That’s
just a silly waste. Good luck convincing anyone to change their overall and
often cohesive strategy for tech choices though.

The one technology we can all use, however, is JavaScript and everything build
within that ecosystem can be put to good use everywhere. So while the language
sucks at a lot of things, it’s also the only universal web language that we’ve
got.

~~~
BinaryIdiot
> We don’t share tech stacks, but we do work together, and as you can imagine
> that leads to wasted resources. We’re a C# shop our direct neighbour does
> PHP, because of limited resources, we can’t utilise each others projects.
> That’s just a silly waste. Good luck convincing anyone to change their
> overall and often cohesive strategy for tech choices though.

One suggestion, if you don't mind. When I did work for the DoD as a
contractor, because of small business rules in government contracting we were
pretty much forced to work with at least 10 other companies and all of them
had their own preferences for tech stacks, their own expertise, etc. So we
tried to go down the road of using things like thirft or avro so regardless of
what language / stack you used, as long as you could interface with those on
the same network (since we're talking about inter-service communication here)
it was still pretty quick.

It's not ideal but sometimes you gotta work with what you have. Sometimes you
can find unique ways to bridge gaps across platforms to re-use work. One time
a group we worked with tried to use a web app with multiple iframes as the
communication bridge between stacks. It _worked_ but it was pretty hacky and
slow.

~~~
moksly
We do have some solutions, if it’s meant to be run as a SaaS or it’s got a
major supplier doing updates and support, then we can use whatever.

The problem comes when we want to contribute or run things ourselves, in which
case I’m not sure stuff like avro would help us, because we genuinely can’t
keep X server technology secure or even updated with our available resources.
I mean, I’m sure our Azure and ADFS technician could learn how to operate a
JBOSS server on red hat, but he doesn’t have the time to do that and do his
regular job. He might not even be interested in doing it, being one of the
most talented Microsoft technicians I’ve ever met, he might simply move to a
place that let him work with what he enjoys. Those aren’t great engineering
arguments for not running JBOSS, I know, but that doesn’t mean it’s not part
of managing an IT team.

------
soganess
I get this is tongue in cheek, but I really wish this was a little more
focused. Something more along the lines:

(1) Language x claims these as its design principles/goals: P1, G1, P2...

(2) These y things subvert those aspirations.

(3) Modus ponens &x suxxxorzzz_Aslang__ __

I 'm not the biggest fan of Go for it's stripped nature or Rust for the
complex babysitting the type system needs, but I much prefer both to C. so
that is a win for me and hence both achieve that goal.

Similarly, I love how expressive Scala is, that seems like an unspoken design
goal of Odersky's. You can't get that without there being a million ways to do
something.

------
zelon88
Thanks for the read! I appreciate the thought and work you put into this. And
now my obligatory gripes!

Under the PHP section you claim

    
    
      "if an included file must return a value but the file cannot be included, include statement returns FALSE and only generates a warning. If a file is required, one must use require()."
    

How is that a negative? That sounds like expected behavior to me and I can't
imagine it working any other way.

    
    
      $error = include('script.php'); // Return FALSE and continue anyway.
      
      require('script.php'); // Die with error.
    

How is that undesirable/wrong? It lets you do things like...

    
    
      $error = include('script-A.php');
      if ($error == FALSE) require('script-B.php');

------
wruza
I’m not going to defend other js parts, but calls on 0.1 + 0.2 != 0.3 and the
type of nan both present the author as a non-skilled programmer at least. Big
numbers and exact decimal-point numbers are out of scope of almost any general
purpose language core for a reason. It is up to a programmer to decide whether
this reason is applicable or not, but not blindly dismissing. Math is a+b,
engineering is “%.14g”.

------
sdfjkl
Yay, Ada doesn't suck! :)

------
ohazi
In C++, std::map's operator[] will either return the element pointed to by the
specified key, or if the key is not in the map, _will default construct an
object and insert it into that key 's slot in the map_.

I really want to know who thought this was a good idea, because I've only ever
seen this behavior act as a footgun.

------
Lowkeyloki
Since there's not a section for _x_ , that must mean that _x_ doesn't suck. /s

~~~
lwansbrough
Closure has the shortest section and is therefore, obviously, the best.

------
sschueller
What ever language the site was written in sucks as the site is now down...

~~~
cuddlecake
To be fair, a site can go down in any language...

------
nurettin
python sucks because: default parameters are only evaluated once.

~~~
avip
Yes, weirdly missing.

Also omitted:

    
    
      my_dict.get('existing_key', foo())
    

does not short-circuits _foo()_. That always felt like a bug to me.

~~~
stefco_
Functions in most popular languages behave this way. `get` is just a method;
its arguments will never be short-circuited. If you wanted short-circuiting,
use the ternary operator:

    
    
      my_dict['existing_key'] if 'existing_key' in my_dict else foo()
    

You could also define a `get_lazy` method that does the above, taking a
nullary function as its key and evaluating it if the key is missing. But then
you would need to wrap your default values in a lambda, which would look
absurd for the common use case of calling `get` with some constant default
value. Seems unnecessary when the ternary operator works fine.

~~~
arijun
If I know my_dict doesn't hold values that that are false-like, e.g. 0 or [],
I use `or` to lazily alternate between options. This works because in python,
`or` returns the first value that has a truthy value. In this case it would be

    
    
        my_dict.get('existing_key') or foo()
    

This would also easily let you do multiple alternations (much more annoying
with the ternary operator).

~~~
majewsky
This is dangerous because sometimes you have legitimate values that are not
truthy.

    
    
      print(player_data['score'] or 'does not exist')
    

This will print "does not exist" when the score is zero.

~~~
stefco_
gp's approach works best when you know that the argument is a list or tuple
(something which can be empty). Of course, due to python's lack of typing, you
should only use that approach when the function is being used in well-
understood contexts.

------
majewsky
> XSLT/XPath sucks because [...] It starts numbering from 1. Unlike _every
> single other_ major programming language in use today.

Does Lua count?

------
devxpy
I wonder why anyone would be so cruel as to put so much content in a single
webpage.

Did they actually had the patience to write such a long article in a single
file, or did they write it in multiple files, and then compiled it down to a
single webpage for others to suffer?

------
factorialboy
What is Backbase? Google throws up a company and not a language.

------
SwiftyBug
As I thought, Swift doesn't suck at all :)

------
eafkuor
So basically clojure is awesome

~~~
arijun
Probably a similar effect that moksly said upthread about javascript vs
python:

"Everyone knows JavaScript, but not everyone use it by choice, giving you a
higher than average ratio of people who both dislike and know the language."

The only people using Clojure are those who _really_ like it.

From my end, the worst things about Clojure were the JVM (making
installation/configuration hellishly frustrating) and the poor error messaging
(making debugging the configuration extremely difficult).

------
SwiftyBug
> Camel case sucks

Why?

