Join devRant
Do all the things like
++ or -- rants, post your own rants, comment on others' rants and build your customized dev avatar
Sign Up
Pipeless API
From the creators of devRant, Pipeless lets you power real-time personalized recommendations and activity feeds using a simple API
Learn More
Search - "serious answers only"
-
Okay, story time.
Back during 2016, I decided to do a little experiment to test the viability of multithreading in a JavaScript server stack, and I'm not talking about the Node.js way of queuing I/O on background threads, or about WebWorkers that box and convert your arguments to JSON and back during a simple call across two JS contexts.
I'm talking about JavaScript code running concurrently on all cores. I'm talking about replacing the god-awful single-threaded event loop of ECMAScript – the biggest bottleneck in software history – with an honest-to-god, lock-free thread-pool scheduler that executes JS code in parallel, on all cores.
I'm talking about concurrent access to shared mutable state – a big, rightfully-hated mess when done badly – in JavaScript.
This rant is about the many mistakes I made at the time, specifically the biggest – but not the first – of which: publishing some preliminary results very early on.
Every time I showed my work to a JavaScript developer, I'd get negative feedback. Like, unjustified hatred and immediate denial, or outright rejection of the entire concept. Some were even adamantly trying to discourage me from this project.
So I posted a sarcastic question to the Software Engineering Stack Exchange, which was originally worded differently to reflect my frustration, but was later edited by mods to be more serious.
You can see the responses for yourself here: https://goo.gl/poHKpK
Most of the serious answers were along the lines of "multithreading is hard". The top voted response started with this statement: "1) Multithreading is extremely hard, and unfortunately the way you've presented this idea so far implies you're severely underestimating how hard it is."
While I'll admit that my presentation was initially lacking, I later made an entire page to explain the synchronisation mechanism in place, and you can read more about it here, if you're interested:
http://nexusjs.com/architecture/
But what really shocked me was that I had never understood the mindset that all the naysayers adopted until I read that response.
Because the bottom-line of that entire response is an argument: an argument against change.
The average JavaScript developer doesn't want a multithreaded server platform for JavaScript because it means a change of the status quo.
And this is exactly why I started this project. I wanted a highly performant JavaScript platform for servers that's more suitable for real-time applications like transcoding, video streaming, and machine learning.
Nexus does not and will not hold your hand. It will not repeat Node's mistakes and give you nice ways to shoot yourself in the foot later, like `process.on('uncaughtException', ...)` for a catch-all global error handling solution.
No, an uncaught exception will be dealt with like any other self-respecting language: by not ignoring the problem and pretending it doesn't exist. If you write bad code, your program will crash, and you can't rectify a bug in your code by ignoring its presence entirely and using duct tape to scrape something together.
Back on the topic of multithreading, though. Multithreading is known to be hard, that's true. But how do you deal with a difficult solution? You simplify it and break it down, not just disregard it completely; because multithreading has its great advantages, too.
Like, how about we talk performance?
How about distributed algorithms that don't waste 40% of their computing power on agent communication and pointless overhead (like the serialisation/deserialisation of messages across the execution boundary for every single call)?
How about vertical scaling without forking the entire address space (and thus multiplying your application's memory consumption by the number of cores you wish to use)?
How about utilising logical CPUs to the fullest extent, and allowing them to execute JavaScript? Something that isn't even possible with the current model implemented by Node?
Some will say that the performance gains aren't worth the risk. That the possibility of race conditions and deadlocks aren't worth it.
That's the point of cooperative multithreading. It is a way to smartly work around these issues.
If you use promises, they will execute in parallel, to the best of the scheduler's abilities, and if you chain them then they will run consecutively as planned according to their dependency graph.
If your code doesn't access global variables or shared closure variables, or your promises only deal with their provided inputs without side-effects, then no contention will *ever* occur.
If you only read and never modify globals, no contention will ever occur.
Are you seeing the same trend I'm seeing?
Good JavaScript programming practices miraculously coincide with the best practices of thread-safety.
When someone says we shouldn't use multithreading because it's hard, do you know what I like to say to that?
"To multithread, you need a pair."18 -
if i work on PussyBranch to build up a feature, and DickBranch is my main branch so if i merge directly from Pussy into Dick and then work on Dick, and then switch to Pussy again then surely i wouldnt be able to commit to Dick because Pussy isn't filled up with the new code, right? I'd need to pull the latest code from Dick into Pussy branch. but what if i dont want to merge Dick into Pussy code? because what Dick contains, Pussy should not and that would cause anomaly and break uhh how do u call it, the purpose of the branch itself right. So if I want to work only on Pussy and commit just that segment of the new code into Dick, how do I do that? Do i have to force pushing Pussy code into Dick every time or can i do it without force command? serious answers only pls
also what alcohol is good for a more productive and longer hour coding sessions thx6 -
Hi guys, i have a serious question
I have added port 22777 to UFW to allow ssh through that port then i notice that it wouldn't work, after some time wasting, i added the same rule to iptables, then it worked, why do I have to add the same rules here and there twice? Is Ufw just a decorative app? WTF is going on? How to get rid of iptables and use only ufw? why should i allow the port twice, I need your answers please18 -
I'll go with IDEs (and multiple answers) for this.
In my *opinion*, the best IDEs are:
- IntelliJ and the other JetBrains products for almost any serious work. It's just too good (even though there are some bugs every now and there)
- VS Code for quick coding, hacking
- micro, if only a shell is available
Worst IDEs:
- Qt Creator: I just hate it, it's hard to configure, hard to use, big nope for me.
- Some IDE for the Clean functional programming language, which I've only used once and I don't know its name, but it was a painful thing to try to use back then (~3 years ago)2 -
Would you rather:
A) Take a test consisting on Data Structures and Algorithms in C or C++ or heck even Java
B) Turn in as a final exam a screenshot of you completing Sekiro: Shadows Die Twice
I had an easier time passing Data Structures and algos when I was studying, even with a high grade vs the amount of ass whooping I got myself handed on that game the first playthrough (now it is easier, but still)12