May i ask why everyone hates JavaScript so much? It’s not ironic it’s a real question, i can’t really get it, is it just because it doesn’t have types? Or there’s more?
I believe the amount of hate and mockery Javascript receives is heavily skewed, simply because almost every programmer who is active today has at least some experience with the language, and with more users there are also more people capable of complaining about it.
I work with languages that are much worse than Javascript, yet they don’t receive nearly as much hate because hardly anyone uses them.
As you may know SAP is a German company and the name originally was an acronym for SanduhrAnzeigeProgramm, which translates to “hourglass displaying program” - a nod to when busy software would change the mouse cursor into an hour glass - since it was initially conceived as a hardware stress test software - expanding to employee stress tests was just the logical next step.
Things got weird when scammers found a new hustle charging hundreds of dollars per hour pretending it was an ERP solution or similarly outrageous ideas that non-technical people in all kinds of business fell for.
Imo, both methods should set the same value for x. That’s madness. 🤪
Just look at awk for example. There’s a dedicated substr() and it doesn’t care about spaces. But then awk is quite loose in everything… and niche… But I love it.
Because it’s inescapable. Web development is by far the most common type of programming work and even if you’re a backend developer you tend to have to touch javascript at some point, so everyone knows the pain of javascript’s foot guns and javascript has a lot.
The fact that it’s mandatory to do your work invokes bitterness in people. For backend, you can kind of switch around until you find a language you like. For frontend, it’s javascript or nothing at all.
Javascript as a language is very out of sync with other commonly used languages. Its footguns are very easy to run into. As a result you have a lot of rituals around just not shooting yourself in the foot. The rituals, libraries, and frameworks around avoiding Javascript’s foot guns have been very shifting and changing. Of course, because the javascript ecosystem changes far faster than other languages, there are a lot of rakes for developers to step on to add to the naturally existing foot guns.
Javascript as a language probably shouldn’t be the sole language of the internet for a variety of reasons. It’s a very hateable language because of how easy it is for newbies to make new terrible code and how common it is. Until something like WASM takes off, the downpour of hate for javascript will continue.
Javascript as a language is very out of sync with other commonly used languages.
How so? Moving back and forth between Typescript and C# / Java is pretty natural imho, as long as you understand the compiled vs interpreted differences.
The vary concept of truthy and falsy makes it very out of step. The triple equals only partly negates that foot gun. Const and let also only partly negate the footgun of hoisting, lexical scope, and the non-obvious impacts of currying. Prototype inheritance would be truly bizarre to people used to more standard inheritance style and many people don’t know that javascript’s classes are syntax sugar over that system and it leads to foot guns. Many people don’t understand destructuring, because they don’t understand that javascript objects are all dictionaries in a trenchcoat. Honestly there’s a lot of cargo cult behavior in javascript that comes because the language is bizarre given what most people would have experienced.
it has a lot of cruft and gotchas and lacks a good standard library (which is why npm is a thing). That means there’s a lot of bad javascript code out there and a lot of people who have had bad experiences with it. But, if you take care to not shoot yourself with the included footguns and you know your way around npm, it’s a perfectly fine language for its purposes in front- and backend development IMO
It’s wild that Python is getting a shoutout over javascript despite being an even bigger loosely typed mess.
I think it’s partially because Python has a reputation as being a serious language for serious people because it’s popular amongst data scientists and academics, whereas Javascript is still seen as being popular amongst script kiddies and people building crappy websites for $100 / pop.
That being said, most of the time i hear javascript jokes at work they’re pretty tongue in cheek /ironic / the dev isn’t really hating on it. I have heard a dev or two make those javascript jokes with a more serious critical tone, and everyone tends to ignore them and not engage because they’re pretty clearly just haters who have a general tendency to dislike popular things.
If by «loosely typed» you mean weakly typed, then that’s not true. Python is a dynamically and strongly typed language. Attempting to do an operation with incompatible types will result in a TypeError.
>>> "3" + 9
Traceback (most recent call last):
File "", line 1, in
TypeError: can only concatenate str (not"int") to str
You may be thinking of the following, but this only works because the __mul__ and __add__ methods of these objects have been written to accept the other types.
But it is in no way worse than javascript in that regard, though?
I don’t think static typing in Python is really so essential. I see it above all as a scripting language, so its applications don’t benefit as much from static typing as other languages do.
Maybe a better hypothetical python would have used some kind of type inference system, like in haskell, which allows for static typing while still allowing to write code unencumbered from types and stuff, but I really think, for Python’s target domain, its type system is actually adequate or good. Maybe its documentation could benefit from type hints, though.
But it is in no way worse than javascript in that regard, though?
No, but OPs original post was implying that it was better than JavaScript, when in my mind they’re pretty similar in that regard, with the major exception that there is no python equivalent of Typescript which is rapidly passing JavaScript in professional settings.
I don’t think static typing in Python is really so essential. I see it above all as a scripting language, so its applications don’t benefit as much from static typing as other languages do.
For a scripting language it’s fine, but problems arise when you start building giant applications with it (which does happen).
It has a lot of gotchas and an unstable ecosystem.
A lot of basic stuff is confusing of weird. How do you loop over an object? There’s like five ways. How do you declare a function? There are two very different ways that behave differently, and the new one has like five variations in its syntax that can throw you.
Here’s an example of something that continues to bother me:
const foo = "hello";
const bar = { foo: "world"}
What do you think bar looks like? If you thought it had a key of “hello” and a value of “world”, that’s sensible but wrong. It has a key of “foo”. Object keys don’t need to be quoted in JavaScript. If you want the key to be a variable you have to write it like { [foo] : "world" }. Which looks like a list.
There’s a lot of this kind of stuff in the language. Small things that once you know you can work around, but are still weird, annoying, and prone to causing errors.
The standard library historically hasn’t been very good. This has lead to many libraries being maintained by the community. But the community is fickle, and the quality of libraries is not guaranteed.
The standard library was bad at some basic operations, so underscore was created. But then someone made lodash, and most people (but not everyone!) moved to it. But then the standard library caught up some more, so maybe you don’t need either? When you start working on a new-to-you project you don’t know what you’re going to get.
Dates were a mess so momentjs got big, but now that’s deprecated. Move to datefns, which has a completely different interface.
Node releases a new major version every six months. Every six months! Python has been on major version 3 for years and has no plans for a version 4, for comparison. The constant version releases is a potential source for headaches.
In my experience many libraries are kind of fast and loose with major releases, too. It can be a pain to keep up, especially if you have peer deps.
The debugger is kind of bad. Sometimes it will pause but you typically can’t like treat it like a repl. Python’s, for comparison, blows it out of the water.
Many things are async in JavaScript. Sometimes you don’t expect a particular call to be async or you forget, and you have a bad time. The async/await keywords were a godsend. The giant stack of “then…then…then…” was not fun. Combine with the weak debugger and you have an extra bad time. I bet there are a lot of console.log(“code is here”) debug calls out in the wild because of this.
For your actual front end view layer, react is the current hotness. But older projects are still out there with angular, backbone, probably some with just jQuery. React isn’t terrible but how long is it going to be king? What breaking changes are they going to put out in the next version? The ecosystem is unstable.
Also redux kind of sucks. Not a fan of global variables. I think the community has moved on from redux though? Again, the ecosystem is unstable.
In my experience there are many developers who only know JavaScript, and they want to use it for everything. It is the dungeons and dragons of languages. Much like how it is frustrating when your friends want to run a cyberpunk murder mystery in Dungeons and Dragons, it can be frustrating when your team wants to write everything, even your backend, in JavaScript.
We had browser tests at one job. They’re a very synchronous thing. Open the browser, load the page, enter name and password, wait for login. We had all of this written in python working fine, but people wanted to switch to a JavaScript toolset. Sorry, I mean they wanted to switch to JavaScript but there were three different browser testing tools the different teams wanted to use. Because the javascript ecosystem is like that. After a more candid talk with one of the guys I knew personally, he admitted it wasn’t because JavaScript was the best tool but rather he didn’t want to use python.
I can’t authoritatively say this is typical, but in my experience I’ve had a lot of resistance from JavaScript devs using other languages. Again, I think it’s like DND. DND is a unnecessarily complicated game full of exceptions and gotchas. If that’s what you learn first, you probably think everything is like that, and why would you want to go through that again? But of the popular languages/games, javascript/DND are exceptional for their weirdness.
In fact, thinking about it for more than a minute, my current team lead is a JavaScript main and he’s great. Super willing to learn other languages and has never been pushy. So it’s definitely not everyone.
The stack traces tend to be kind of bad. In production shit is probably minified so you might get “error on line 1, column 4737373”. In other contexts you may get a few hundred lines of node_modules to sift through before finding your actual code.
At least jest and (react) testing library aren’t bad. Mocha + chai were annoying. Enzyme is not great. Again, things change rapidly. You might join a company and find they’re still using mocha and enzyme, and switching never gets prioritized. If JavaScript made things better without breaking changes or swapping to an entirely new toolset it wouldn’t be a serious problem, but the standard mode seems to be “fuck it let’s make an entirely new tool”.
The lack of type hints isn’t great. You can use typescript but that’s a whole new set of stuff you have to set up. Python also doesn’t have types but they managed to add them as an option without making us switch to like TypeThon. But that’s not the JavaScript way. If you’re not making a breaking change are you really doing JavaScript?
I could go on, but my cat is getting up to some bullshit and I need to see what he’s screaming about. Probably not JavaScript.
tldr:
standard library kind of bad
ecosystem unstable and of variable quality
unpleasant personal experiences with JavaScript developers wanting to use it for everything
Gotta say thar for someone who is currently following a JavaScript course this is pretty descouraging ahaha
I gotta say i also fell in that category of people trying to use JavaScript for stuff that is not exactly JavaScript suited. For example i’m writing a little script that changes markdown links in some files using the fs node, this is probably better suited to do in bash or other languages but the first thought was: i know a bit of JavaScript and that took a lot of time, what would be the point of learning a new syntax with all the stuff i will have to learn only on js!
If it makes you feel better, many of the things you learn in JavaScript will be helpful in other languages. You already know what functions are, for example, so you don’t need to relearn that. Even though JavaScript has some weirdness about functions.
It has a rocky start, and a lot of cruft from that era sticked around.
There are also a lot of horrible legacy projects from the pre-ES5 era which are a pain to work with. Often older projects were coded either before people knew how to do javascript right, or before the devs who wrote it knew how to write javascript right.
I’m a backend engineer. My biggest issue with JavaScript is environments that use it in the backend.
JavaScript is designed to run in a way that continue to try to do things even when it’s running in to errors. But it does that because I’m a front end that’s what you want. In the front end, working but ugly is better than not working at all. In the backend that can be catastrophic, though.
My problem with it is that it gives people too much freedom. They can write the code in very, VERY ugly ways… And they do. It’s a language that let’s you write a mess pretty easily.
That’s really my only complaint. The ugliness happens mainly in:
callback hell. For some reason some people still do callback hell in 2023.
functions as objects. This is pretty neat actually, one of the best things in Javascript, but some people just abuse the hell out of it.
I think you’re misunderstanding what “everything” means (it was “everything needed for a hello world”) and trying to divert the discussion to whatever Web has devolved into, which is an abomination that’s definitely unsuited for learning the ropes of software development.
All ECMAScript is standardized because that refers to the standard.
I think you’re discounting the different environments that JS runs in. Something like C runs in a much more uniform environment (the OS) while JS must be able to run in different runtimes. It’s like how windows has APIs that C can access, but obviously you can’t access them when running C from other OSes (forgive me if that’s inaccurate, I don’t use C often).
May i ask why everyone hates JavaScript so much? It’s not ironic it’s a real question, i can’t really get it, is it just because it doesn’t have types? Or there’s more?
I believe the amount of hate and mockery Javascript receives is heavily skewed, simply because almost every programmer who is active today has at least some experience with the language, and with more users there are also more people capable of complaining about it.
I work with languages that are much worse than Javascript, yet they don’t receive nearly as much hate because hardly anyone uses them.
One that comes into my mind is ABAP:
What the fuck
My colleagues and I joke around that SAP stands for Sadness and Pain.
As you may know SAP is a German company and the name originally was an acronym for SanduhrAnzeigeProgramm, which translates to “hourglass displaying program” - a nod to when busy software would change the mouse cursor into an hour glass - since it was initially conceived as a hardware stress test software - expanding to employee stress tests was just the logical next step.
Things got weird when scammers found a new hustle charging hundreds of dollars per hour pretending it was an ERP solution or similarly outrageous ideas that non-technical people in all kinds of business fell for.
(copied from reddit before it gets deleted)
“Joke”
that’s a crime against humanity
Goddamn, now I’m glad I didn’t go forward with an ABAP developer job offer
Oh boy…
Imo, both methods should set the same value for x. That’s madness. 🤪 Just look at awk for example. There’s a dedicated substr() and it doesn’t care about spaces. But then awk is quite loose in everything… and niche… But I love it.
Because it’s inescapable. Web development is by far the most common type of programming work and even if you’re a backend developer you tend to have to touch javascript at some point, so everyone knows the pain of javascript’s foot guns and javascript has a lot.
The fact that it’s mandatory to do your work invokes bitterness in people. For backend, you can kind of switch around until you find a language you like. For frontend, it’s javascript or nothing at all.
Javascript as a language is very out of sync with other commonly used languages. Its footguns are very easy to run into. As a result you have a lot of rituals around just not shooting yourself in the foot. The rituals, libraries, and frameworks around avoiding Javascript’s foot guns have been very shifting and changing. Of course, because the javascript ecosystem changes far faster than other languages, there are a lot of rakes for developers to step on to add to the naturally existing foot guns.
Javascript as a language probably shouldn’t be the sole language of the internet for a variety of reasons. It’s a very hateable language because of how easy it is for newbies to make new terrible code and how common it is. Until something like WASM takes off, the downpour of hate for javascript will continue.
How so? Moving back and forth between Typescript and C# / Java is pretty natural imho, as long as you understand the compiled vs interpreted differences.
The vary concept of truthy and falsy makes it very out of step. The triple equals only partly negates that foot gun. Const and let also only partly negate the footgun of hoisting, lexical scope, and the non-obvious impacts of currying. Prototype inheritance would be truly bizarre to people used to more standard inheritance style and many people don’t know that javascript’s classes are syntax sugar over that system and it leads to foot guns. Many people don’t understand destructuring, because they don’t understand that javascript objects are all dictionaries in a trenchcoat. Honestly there’s a lot of cargo cult behavior in javascript that comes because the language is bizarre given what most people would have experienced.
In my experience (Javascript and PHP, which both have plenty of footguns), these pitfalls can be avoided by using good practices.
Just because they are dynamically typed doesn’t mean you have to use dynamic typing. Don’t type switch your variables.
Just because you don’t have to use brackets in a certain scenario doesn’t mean you can’t. Use them as needed for clarity.
That kind of thing.
it has a lot of cruft and gotchas and lacks a good standard library (which is why npm is a thing). That means there’s a lot of bad javascript code out there and a lot of people who have had bad experiences with it. But, if you take care to not shoot yourself with the included footguns and you know your way around npm, it’s a perfectly fine language for its purposes in front- and backend development IMO
It’s wild that Python is getting a shoutout over javascript despite being an even bigger loosely typed mess.
I think it’s partially because Python has a reputation as being a serious language for serious people because it’s popular amongst data scientists and academics, whereas Javascript is still seen as being popular amongst script kiddies and people building crappy websites for $100 / pop.
That being said, most of the time i hear javascript jokes at work they’re pretty tongue in cheek /ironic / the dev isn’t really hating on it. I have heard a dev or two make those javascript jokes with a more serious critical tone, and everyone tends to ignore them and not engage because they’re pretty clearly just haters who have a general tendency to dislike popular things.
Python programmers, brace yourself for this…
Oh wait.
If by «loosely typed» you mean weakly typed, then that’s not true. Python is a dynamically and strongly typed language. Attempting to do an operation with incompatible types will result in a TypeError.
>>> "3" + 9 Traceback (most recent call last): File "", line 1, in TypeError: can only concatenate str (not "int") to str
You may be thinking of the following, but this only works because the
__mul__
and__add__
methods of these objects have been written to accept the other types.>>> "A" * 4 + "H" 'AAAAH'
I meant that you do not declare types and a variable’s type can change at any time.
Regardless of semantics, it results in code that is not scannable.
But it is in no way worse than javascript in that regard, though?
I don’t think static typing in Python is really so essential. I see it above all as a scripting language, so its applications don’t benefit as much from static typing as other languages do.
Maybe a better hypothetical python would have used some kind of type inference system, like in haskell, which allows for static typing while still allowing to write code unencumbered from types and stuff, but I really think, for Python’s target domain, its type system is actually adequate or good. Maybe its documentation could benefit from type hints, though.
No, but OPs original post was implying that it was better than JavaScript, when in my mind they’re pretty similar in that regard, with the major exception that there is no python equivalent of Typescript which is rapidly passing JavaScript in professional settings.
For a scripting language it’s fine, but problems arise when you start building giant applications with it (which does happen).
It has a lot of gotchas and an unstable ecosystem.
A lot of basic stuff is confusing of weird. How do you loop over an object? There’s like five ways. How do you declare a function? There are two very different ways that behave differently, and the new one has like five variations in its syntax that can throw you.
Here’s an example of something that continues to bother me:
const foo = "hello"; const bar = { foo: "world"}
What do you think bar looks like? If you thought it had a key of “hello” and a value of “world”, that’s sensible but wrong. It has a key of “foo”. Object keys don’t need to be quoted in JavaScript. If you want the key to be a variable you have to write it like
{ [foo] : "world" }
. Which looks like a list.There’s a lot of this kind of stuff in the language. Small things that once you know you can work around, but are still weird, annoying, and prone to causing errors.
The standard library historically hasn’t been very good. This has lead to many libraries being maintained by the community. But the community is fickle, and the quality of libraries is not guaranteed.
The standard library was bad at some basic operations, so underscore was created. But then someone made lodash, and most people (but not everyone!) moved to it. But then the standard library caught up some more, so maybe you don’t need either? When you start working on a new-to-you project you don’t know what you’re going to get.
Dates were a mess so momentjs got big, but now that’s deprecated. Move to datefns, which has a completely different interface.
Node releases a new major version every six months. Every six months! Python has been on major version 3 for years and has no plans for a version 4, for comparison. The constant version releases is a potential source for headaches.
In my experience many libraries are kind of fast and loose with major releases, too. It can be a pain to keep up, especially if you have peer deps.
The debugger is kind of bad. Sometimes it will pause but you typically can’t like treat it like a repl. Python’s, for comparison, blows it out of the water.
Many things are async in JavaScript. Sometimes you don’t expect a particular call to be async or you forget, and you have a bad time. The async/await keywords were a godsend. The giant stack of “then…then…then…” was not fun. Combine with the weak debugger and you have an extra bad time. I bet there are a lot of console.log(“code is here”) debug calls out in the wild because of this.
For your actual front end view layer, react is the current hotness. But older projects are still out there with angular, backbone, probably some with just jQuery. React isn’t terrible but how long is it going to be king? What breaking changes are they going to put out in the next version? The ecosystem is unstable.
Also redux kind of sucks. Not a fan of global variables. I think the community has moved on from redux though? Again, the ecosystem is unstable.
In my experience there are many developers who only know JavaScript, and they want to use it for everything. It is the dungeons and dragons of languages. Much like how it is frustrating when your friends want to run a cyberpunk murder mystery in Dungeons and Dragons, it can be frustrating when your team wants to write everything, even your backend, in JavaScript.
We had browser tests at one job. They’re a very synchronous thing. Open the browser, load the page, enter name and password, wait for login. We had all of this written in python working fine, but people wanted to switch to a JavaScript toolset. Sorry, I mean they wanted to switch to JavaScript but there were three different browser testing tools the different teams wanted to use. Because the javascript ecosystem is like that. After a more candid talk with one of the guys I knew personally, he admitted it wasn’t because JavaScript was the best tool but rather he didn’t want to use python.
I can’t authoritatively say this is typical, but in my experience I’ve had a lot of resistance from JavaScript devs using other languages. Again, I think it’s like DND. DND is a unnecessarily complicated game full of exceptions and gotchas. If that’s what you learn first, you probably think everything is like that, and why would you want to go through that again? But of the popular languages/games, javascript/DND are exceptional for their weirdness.
In fact, thinking about it for more than a minute, my current team lead is a JavaScript main and he’s great. Super willing to learn other languages and has never been pushy. So it’s definitely not everyone.
The stack traces tend to be kind of bad. In production shit is probably minified so you might get “error on line 1, column 4737373”. In other contexts you may get a few hundred lines of node_modules to sift through before finding your actual code.
At least jest and (react) testing library aren’t bad. Mocha + chai were annoying. Enzyme is not great. Again, things change rapidly. You might join a company and find they’re still using mocha and enzyme, and switching never gets prioritized. If JavaScript made things better without breaking changes or swapping to an entirely new toolset it wouldn’t be a serious problem, but the standard mode seems to be “fuck it let’s make an entirely new tool”.
The lack of type hints isn’t great. You can use typescript but that’s a whole new set of stuff you have to set up. Python also doesn’t have types but they managed to add them as an option without making us switch to like TypeThon. But that’s not the JavaScript way. If you’re not making a breaking change are you really doing JavaScript?
I could go on, but my cat is getting up to some bullshit and I need to see what he’s screaming about. Probably not JavaScript.
tldr:
Gotta say thar for someone who is currently following a JavaScript course this is pretty descouraging ahaha
I gotta say i also fell in that category of people trying to use JavaScript for stuff that is not exactly JavaScript suited. For example i’m writing a little script that changes markdown links in some files using the fs node, this is probably better suited to do in bash or other languages but the first thought was: i know a bit of JavaScript and that took a lot of time, what would be the point of learning a new syntax with all the stuff i will have to learn only on js!
If it makes you feel better, many of the things you learn in JavaScript will be helpful in other languages. You already know what functions are, for example, so you don’t need to relearn that. Even though JavaScript has some weirdness about functions.
It has a rocky start, and a lot of cruft from that era sticked around.
There are also a lot of horrible legacy projects from the pre-ES5 era which are a pain to work with. Often older projects were coded either before people knew how to do javascript right, or before the devs who wrote it knew how to write javascript right.
I’m a backend engineer. My biggest issue with JavaScript is environments that use it in the backend.
JavaScript is designed to run in a way that continue to try to do things even when it’s running in to errors. But it does that because I’m a front end that’s what you want. In the front end, working but ugly is better than not working at all. In the backend that can be catastrophic, though.
My problem with it is that it gives people too much freedom. They can write the code in very, VERY ugly ways… And they do. It’s a language that let’s you write a mess pretty easily.
That’s really my only complaint. The ugliness happens mainly in:
callback hell. For some reason some people still do callback hell in 2023.
functions as objects. This is pretty neat actually, one of the best things in Javascript, but some people just abuse the hell out of it.
Let me suggest a simple exercise for you.
I’ll wait.
I think you fail to understand the very basics of web development if you’re operating on the assumption that everything you need is always reachable.
I think you’re misunderstanding what “everything” means (it was “everything needed for a hello world”) and trying to divert the discussion to whatever Web has devolved into, which is an abomination that’s definitely unsuited for learning the ropes of software development.
In the browser you cannot access stdout, but you can use
console.log
to write to the dev console which is basically the same thing.In Node, you can use
process.stdout
.Both are available from the top-level
globalThis
objects that are part of each platform’s respective default library.And in GJS? All other runtimes?
In, say, C, such basic stuff is right there, in the standard.
Javascript isn’t even standardized, some ECMAScript is, so I don’t even know what we’re talking about.
All ECMAScript is standardized because that refers to the standard.
I think you’re discounting the different environments that JS runs in. Something like C runs in a much more uniform environment (the OS) while JS must be able to run in different runtimes. It’s like how windows has APIs that C can access, but obviously you can’t access them when running C from other OSes (forgive me if that’s inaccurate, I don’t use C often).
Making it an excellent choice for a programming beginner --sarcasm