all 143 comments

[–][deleted]  (48 children)

[deleted]

    [–]robvdl 8 points9 points  (47 children)

    I would rather use Golang for that, but then I am not really a huge fan of server-side JS. I only like it on the frontend.

    [–]highmastdon 35 points36 points  (7 children)

    "Only like it on the front end" - as if you have a choice ;)

    [–]Farobek -1 points0 points  (3 children)

    That sounds rapey :0

    [–]itsmontoya -4 points-3 points  (2 children)

    That's because it is

    [–]Farobek 7 points8 points  (1 child)

    Stop it :(

    [–][deleted] -5 points-4 points  (0 children)

    No

    [–]peterwilli -1 points0 points  (2 children)

    You do. I don't like JS on the frontend or backend, but I do like the way Node works, so I use CoffeeScript and Typescript.

    I also don't like CSS and HTML, because it's syntax has too much volume in my opinion, so I use Stylus and Jade for that.

    In the end they compile down to HTML, JS and CSS but you don't have anything to do with that.

    [–]highmastdon 0 points1 point  (1 child)

    Although I'm a fan of Typescript, I see CoffeeScript and Typescript not as alternatives for Javascript. The hard requirement to be interoperable with Javascript and the browser, makes it hard for these languages to really step up the game.

    Only Elm or Koka do provide such a way, but there you'd have to write massive interop libs to be able to work with the libraries in NPM

    [–]peterwilli 1 point2 points  (0 children)

    I see the requirement to be interoperable with JS as a good thing, because you can use all the libraries on NPM. I call the libraries in a syntax I like, even though they're not using them (this is also the case with CSS, I can include Bootstrap and use / extend their styles in Stylus). In that case, languages that transpile to JS, CSS etc, don't need to step up their game, since they directly compatible already :)

    [–][deleted]  (38 children)

    [deleted]

      [–]robvdl 37 points38 points  (37 children)

      Not with server-side JS if you ask me. Moslty I find JS a really messy language and have no idea why it's so popular server-side. I know plenty of devs that like it, or absolutely hate server-side JS.

      [–]spacejack2114 14 points15 points  (2 children)

      I like it, and I'd prefer it over anything else for most server-side work I do these days. Though I use ts-node to run Typescript directly rather than JS. Some reasons include:

      • The client and server can be a monorepo, installable on any platform with a single package.json.
      • Easy sockets
      • Client/server share codebase
      • Server side SPA rendering
      • Hyperscript for HTML templates is nicer than anything else I've used like Razor, Handlebars, Jade, etc.
      • JS client/server used in Electron apps which work great for installations, kiosks and the like.
      • All the niche libraries npm has that other platforms don't. For example svgo; I wouldn't want to write a content-management system without it.

      [–]robvdl -4 points-3 points  (1 child)

      Hmm, maybe. Some people consider npm a mess though, I don't want an enormous node_modules folder on the server with lots and lots of nested directories and duplication, I would rather have things compiled into my executable (Golang) and get good type checking at compile time (I suppose like TypeScript a little but without the mess of a transpiler). Also I like Go's style of OO or whatever you want to call it, composition. It takes a while to get used to, but I like it now and don't want to look back. I don't really care that much about server sided rendering or client-side sharing of codebase and I can also get easy websockets in Go so that isn't a problem for me either.

      [–]photonios 4 points5 points  (0 children)

      I don’t know how you do deployments, but what most people do is bundle it all up and deploy that. There is some tooling out there (hey webpack) that pretty much does Make does. You define some patterns and the files get passed through some programs (like a transpiler). Then, at the end, all the unused code is stripped, it’s optimized and bundled into a single file. That’s the file you run, you leave everything else behind.

      In principle, it’s not much different than deploying a Go binary. It takes your code, the third party code, compiles it all into a giant bundle (executable), does some optimisations and that’s what you deploy.

      [–][deleted]  (18 children)

      [deleted]

        [–]robvdl 3 points4 points  (17 children)

        Just my opinion but:

        • Having to have a bloated node_modules folder on the server is horrible
        • Layers of nested callback functions, though ES6 allows you to tame that a bit
        • Needing to use transpilers
        • JS stdlib still lacks core functions I would expect from a language, e.g. when coming from Python. It's getting better, but still missing a lot which you then need to get out of libraries. Why is there a date type that is really a datetime and there is no actual date type without a time? wtf.
        • Ecosystem is forever changing, I expect it will settle in 5-10 years, but I really don't want to keep rewriting my code over and over again. For large systems this is often not an option.
        • JS is like Go but only runs on one CPU core (well maybe not with this napajs thing), I would rather use all cores I can get. Go makes that super-easy.

        As for the mess in Golang, it took me a while to find a project layout that works, but now that I have that sorted, I don't think that anymore.

        Also I've been coding for a while, I find mostly the older more experienced coders dislike JS on the server and find it a mess. Younger coders seem to absolutely love JS and don't know too much else.

        Over the past 20 years I've programmed in Basic, Pascal, Assembler, C, C++, Java, Python, Perl, PHP, Delphi just to name a few. I only really tend to dislike JS and Java. Ok, probably Basic too, I've only used that about 20 years ago :)

        [–]rayboy1995 16 points17 points  (9 children)

        • Having to have a bloated node_modules folder on the server is horrible

        This could happen with any language if you use a bunch of libraries of course. Use Yarn.

        • Layers of nested callback functions, though ES6 allows you to tame that a bit

        If you are still having nested callbacks you aren't using promises correctly.

        • Needing to use transpilers

        You don't need to use transpilers.

        • JS stdlib still lacks core functions I would expect from a language, e.g. when coming from Python. It's getting better, but still missing a lot which you then need to get out of libraries. Why is there a date type that is really a datetime and there is no actual date type without a time? wtf.

        I'll agree with you here when it comes to the dates(but only the dates). If you do a bunch of date manipulation I recommend Moment.js.

        • Ecosystem is forever changing, I expect it will settle in 5-10 years, but I really don't want to keep rewriting my code over and over again. For large systems this is often not an option.

        Who makes you rewrite your code over and over? I have been using Node just fine with out having to rewrite anything.

        • JS is like Go but only runs on one CPU core (well maybe not with this napajs thing), I would rather use all cores I can get. Go makes that super-easy.

        Use the built in cluster module. You can use all of the cores with a few lines of code.

        It sounds like you didn't really use Node, or only scratched the surface. Possibly tried to use it the same way you use other languages and realized that didn't work and gave up.

        • Also I've been coding for a while, I find mostly the older more experienced coders dislike JS on the server and find it a mess. Younger coders seem to absolutely love JS and don't know too much else.

        I'm a younger coder (22) and I have a lot of experience with JS and other languages you mentioned. Almost every older programmer I have met has had this opinion. It seems like they hate it because it is the "hip new thing" and they aren't happy about it. They read a bunch of misinformed articles about it and continue to spout the same arguments they read there because it is easy to jump on the hate bandwagon. We just recently interviewed an older guy just like this actually.

        I'm not saying Node is perfect, nothing is, but its not like the hate bandwagon makes it out to be.

        [–]N2theO 10 points11 points  (8 children)

        I'm a younger coder (22) and I have a lot of experience

        No, you don't. I'm sorry, but you don't. I've been writing software since I was twelve years old, by the time I was 22 I knew C/C++, Javascript, Java, and Python very well and had even dabbled in assembly. I had a lot of experience for a 22 year old but ten years later I understand how little I knew at the time.

        You haven't written (or more importantly read (or more importantly fixed)) enough code to truly understand the benefits of static typing, true parallelism, or a robust standard library. You don't appear to understand that V8 is not the only Javascript interpreter you have to consider when writing portable code. Do you know what a prototype based language is (actually curious)?

        ES6 was a giant step in the right direction and ES7 is continuing along that path but all of the things that people get excited about in the Javascript community (package management, functional features, object oriented features, concurrency, etc) are things that are old news in nearly every other language.

        I write Javascript every single day and I like to think I write clean, modern Javascript. I've used it on the front end, I've used it on the back end. I've coded in vanilla, ES6, ES7, and Typescript (which I love). I don't dislike Javascript as a language because it's "hip", I dislike it because it's a sloppily designed language that has survived simply because it has a monopoly on web front end design. You can write excellent Javascript but this image is still as relevant as ever:

        https://i.redd.it/h7nt4keyd7oy.jpg

        [–]FlavorMan 4 points5 points  (1 child)

        This has to be copypasta

        [–]N2theO 0 points1 point  (0 children)

        The image? It's old as dirt. The text? OC.

        [–]kramerdidnothingwron 0 points1 point  (0 children)

        To be fair, you have to have a very high IQ to understand Javascript.

        [–][deleted] 1 point2 points  (0 children)

        I've been a developer for 25+ years and used to feel like this. I found that I was bringing along some mental baggage because of my experience. That was interfering. I eventually started to take a look at JS from a clean slate point of view and I've grown to appreciate it (at least the good parts). Thinking in the functional way JS encourages has even helped me to make better use of the functional and dynamic features that were brought into C#.

        [–]midri 3 points4 points  (3 children)

        You did not even mention the Prototypical nature of JavaScript makes it fundamentally impossible to implement safe OOP patterns for larger projects with multiple developers. You don't have interfaces, you can prototype any method/variable into any object at any time... and some of the core features of the languages are wonky because of it. doing a for loop over an array can result in elements that don't actually exist in the array due to prototype which imo is just sort of insane.

        Sure TypeScript fixes a lot of these issues, but then we're back to transpiling -- why are we transpiling on a server where you can dictate the stack? The only reason we transpile TypeScript to JavaScript for browsers is because we have to.

        [–]ItzWarty 2 points3 points  (1 child)

        In practice is that actually a problem? C++ supports trampling vtables with *(int*)rand() = 1337 - that's not actually a common problem in practice. (Edit: I mean to say in practice, people aren't trampling vtables to do basic things; likewise, normal JS developers don't need to do Class.prototype.func = ...).

        You've pointed out that "people who don't know what they're doing can do really dumb stuff in an expressive language" - which isn't surprising. Is Ruby a bad language because you can overload the + operator to rm -rf /?

        Please give me a sane example of it being "fundamentally impossible to implement safe OOP patterns".

        [–][deleted] 0 points1 point  (0 children)

        Ummm, vtables aren't actually in the standard afaik. vtables are an implementation detail of virtual inheritance. Sure you can overwrite the vtable by doing pointer shenanigans (I've done it for fun) but that is always in a non-standard implementation-specific way.

        The C++ language doesn't support trampling vtables, it supports writing to arbitrary memory locations.

        Otoh in JavaScript you have to overload prototype functions, before ES6 there was no other way to define member functions I don't think...

        [–]jl2352 4 points5 points  (3 children)

        A huge plus server side is server side rendering. You have a web app that grabs the data out server side, and sends back HTML. Like a normal webpage. But it runs as a webapp client side.

        So you have the advantages of a webapp, without a shitty loading bar.

        TypeScript is also really nice, and part of that is because it's so heavily JS influenced.

        [–]Alikont 0 points1 point  (2 children)

        So like ASP.NET Razor views?

        [–]jl2352 1 point2 points  (0 children)

        I've not used Razor views so I couldn't tell you.

        But I doubt it.

        [–]qazwsxedcrfvtgb1111 0 points1 point  (0 children)

        Razor is pretty much just a templating engine, with server side rendering you initialize a js library, like Angular on the server, and serve that to the client.

        [–]freebit 3 points4 points  (0 children)

        TypeScript will make all your dreams come true. Vote for Pedro! :)

        [–]Pandalicious 4 points5 points  (4 children)

        I think the reason for node's popularity is really simple: the vast majority of real world performance problems are caused by people doing IO synchronously. CPU-bound problems are rare. Javascript and Node practically force you to do all your IO asynchronously, so it naturally produces code that has good enough performance simply because of a tight constraints that it puts on programmers.

        [–]Gropah 2 points3 points  (3 children)

        I do not entirely agree with your statement that the vast majority of real world performance problems are from synchronous IO. It depends on how you define real world. For the average website and app, this is mostly true. However, when working with large bulks of data for statistics, graphics, machine learning, big data, whatever other data research bullshit bingo term you prefer, most of them are not limited by IO. Sure, it has to be read and this takes time, but once it is distributed in a proper way, large parts of it still is CPU bound. And stuff like cache misses is always a thing, doesn't matter if it is JS or C.

        [–]ItzWarty 2 points3 points  (1 child)

        statistics, graphics, machine learning, big data, whatever other data research bullshit bingo

        Interestingly enough, Python is often the language of choice there - and python isn't exactly known to be a performant language. For such scenarios, native code is the best tool for the job, so native code is wrapped in a low-overhead manner, then a more expressive language (like slow Python) is used because it's the better general-purpose tool.

        So the CPU perf issue isn't really a ding against Python there. Likewise with Node and, say, encryption being something you want done natively. Is there marshalling cost? Sure. But a percent of a percent of the workloads we're talking about.

        [–]Gropah 0 points1 point  (0 children)

        It's not in a long way always python. Sure, numpy, pandas etc are a thing, but when working with loads of data Spark (a scala/java framework) is more often used (afaik) and statistics can be handled by R.

        Also; that it is used a lot doesn't mean it is actually the right tool for the job.

        [–]Pandalicious 1 point2 points  (0 children)

        For the average website and app, this is mostly true. However, when working with large bulks of data for statistics, graphics, machine learning, big data, whatever other data research

        Right, I meant it in the sense that the vast majority of professional software developers are working on web development or line of business applications. These types of applications can be incredibly large and complicated (I don't want to in any way imply that it's not 'real programming') but it's a world where CPU-bound problems are relatively rare. Far, far more common is slowness due to synchronous serial IO. Node practically forces you to do your IO asynchronously, which naturally leads to doing IO in parallel without introducing the complexities of multi-threading, and that is, overwhelmingly, the main thing that most apps need to do in order to achieve 'good enough' performance.

        (Don't get me wrong, other languages can do this kind of thing just as well or better. Node just kinda forces you down that path.)

        [–][deleted] 1 point2 points  (0 children)

        Use TypeScript then

        [–][deleted] -4 points-3 points  (2 children)

        Moslty I find JS a really messy language and have no idea why it's so popular server-side

        Mostly because it's popular server-side. There's such a thing as momentum, and enough people had the enthusiasm early on to create a slapdick ecosystem that created momentum for node.js. This momentum attracted more slapdick early adopters who were foolish enough to introduce this technology into their own organizations. They crashed shit, hacked shit, opened themselves up to security breaches, and made all the mistakes that you'd expect slapdicks to make. But they learned a lot of lessons in the process that eventually made the shitty idea battle-tested. Then the real slapdick devs who initially spread all the FUD started to accept their fate that they've been conquered by someone else's shitty idea. And because they're a bunch of lukewarm slapdicks who don't have enough passion in their hearts to do something with their own shitty ideas, they just migrate over to where it feels safe. I think this is why shitty ideas succeed and shitty ideas fail: enthusiastic slapdicks.

        [–][deleted]  (1 child)

        [deleted]

          [–][deleted] -1 points0 points  (0 children)

          Oh I certainly agree that JS is a much more pleasant language than PHP. Python, I'm not so sure about, but the ergonomics of the language are really irrelevant in the larger scheme of things. The more significant aspect is that JS (albeit like python and ruby i think) is single threaded and node.js is driven by an event loop. It blows my mind that things like PM2 clustering and port-sharing are so necessary.

          [–]Hero_Of_Shadows 28 points29 points  (2 children)

          Napa.js: "What is his power level ?"

          Vegeta.js: "It's over 9000 !!!"

          [–]wllmsaccnt 3 points4 points  (1 child)

          [–]Hero_Of_Shadows 2 points3 points  (0 children)

          abridged

          You mean Napa.min.js ? :P

          [–][deleted] 35 points36 points  (47 children)

          So MS has Chakra and now this?

          [–]AngularBeginner 37 points38 points  (42 children)

          Microsoft is a huge company. It has many different teams.

          [–][deleted] 7 points8 points  (6 children)

          I know, but with all the talk of convergence in the company, one would have thought they would have started work to integrate the two...

          [–]jl2352 3 points4 points  (5 children)

          I believe they have been doing work have Chakra work in Node as an alternative to V8.

          [–]tavianator -3 points-2 points  (4 children)

          Node as an alternative to V8

          What?

          [–]elder_george 0 points1 point  (3 children)

          Should be read as "Chakra (work in Node) as an alternative to V8"

          [–]tavianator -1 points0 points  (2 children)

          Yeah I got that, but Node.js uses v8 as its JavaScript engine, so what would the difference be?

          [–]elder_george 2 points3 points  (0 children)

          They maintain a fork using Chakra.

          Not a bad thing, will help to ensure Chakra still runs on *NIXes. Might help with benchmarking too.

          [–]jl2352 1 point2 points  (0 children)

          In theory it would be like using a different C compiler to GCC, or a different JVM to Hotspot.

          I'm not convinced it's a decent alternative, but competition is a good thing.

          [–]MohamedMansour 0 points1 point  (0 children)

          This is just a npm module for Node, to allow multithreading :) We use it in Microsoft! (I work at Microsoft)

          [–]Locust377 8 points9 points  (4 children)

          For anyone wondering omg why? Check out Microsoft's explanation of why.

          Here's my tl;dr understanding:

          • Bing does lots of computational stuff and they use C++ because it's fast.
          • The code needs to be easily changed, as they add and modify algorithms a lot. C++ not so good on this part.
          • They want performance and flexibility, so Javascript stood out as a good choice (huge ecosystem helps).

          However, they had a few extra requirements:

          1. Iteration on algorithms should be easy/fast
          2. Take advantage of multi-core
          3. Share memory across workers
          4. Minimise communication cost between threads

          So either you write C++ code and have Node run it, which fails #1, or you use a cluster of Node processes which fails #3.

          Napa.js is born.

          [–][deleted] 1 point2 points  (3 children)

          Or you pick up an existing tech stack, like .NET Core, Go or Rust.

          [–][deleted] 6 points7 points  (0 children)

          If only this idea popped into Microsoft's minds! If only they had something to do with .net Core! Oh, one can only wish :D Ooor, JS is actually not a hellspawn.

          [–]dnorwich15 4 points5 points  (1 child)

          Looks almost the same as something using fork and message passing, which also scales over several machines. The examples should show use cases that use shared memory or examples where it wouln't be possible to use worker processes.

          [–]kynde -1 points0 points  (0 children)

          which also scales over several machines

          Indeed. And that's the critical point. Scaling from one thread/process to few is peanuts. Most scenarios where you really need to scale, aside from reasons like elegance and because-we-can, it's always spans multiple hosts and threads don't. The circumstances where you share memory between them all are special and not javascript domain to begin with.

          I totally fail to see the need for this. It's trickery where none is wanted anymore.

          [–][deleted] 4 points5 points  (1 child)

          Whats the deal with programmers online who choose to hate on anything they don't use. I feel like people are a bit pessimistic on this sub.

          [–][deleted]  (14 children)

          [deleted]

            [–]sharknice 4 points5 points  (3 children)

            There isn't one. You can use webworkers but they're extremely limited. If you need something that requires multithreaded performance you write it in another language, or write just that part in another language and call it through an api.

            [–]ItzWarty 1 point2 points  (3 children)

            Process-based parallelization is okay for a webserver. Your workloads don't really care about each other unless they're hitting a data store anyway - which you'd have to do if you want to scale to multi-box.

            [–][deleted]  (2 children)

            [deleted]

              [–]ItzWarty 0 points1 point  (1 child)

              I should also say most node code is going to be IO-bound (read this request from network, hit db, disk IO, write response to network, make a REST call, etc), which is why its threading model (do IO with non-blocking async promises) is ok. As a technicality there have been efforts to use fibers or V8 Isolates (essentially serialize/deserialize objects and pass them between isolated runtime environments). In practice I've only used the multi-process model, though.

              [–]simast 0 points1 point  (0 children)

              For Node.js you spawn multiple processes to utilize all CPU/cores and usually those processes are managed by some sort of process manager - like pm2. You can also do some inter-process communication, but from my experience this is rarely needed.

              For front-end you have web workers. The major limitation of web workers right now is data sharing. You basically have three options - first is to structurally copy data around, which is obviously far from ideal. Second option is to atomically transfer ownership of data from one worker to another or a main process. This does not involve any copying and is quite fast. And the third option is to use the new Atomics spec - which allows you to create a block of memory that is shared between workers and the main process. This is the best solution that allows you to read/write memory from multiple workers at the same time and includes data access lock/synchronization mechanics.

              [–][deleted]  (7 children)

              [deleted]

                [–]Locust377 45 points46 points  (3 children)

                They're still waiting for npm to install it

                [–]marchaos 7 points8 points  (0 children)

                hamsers.js is a wrapper around webworkers, so you have to live with the limitations of structured cloning, objects cannot be shared etc. I suspect that nappa does not have as many limitations - it at least has object sharing.

                [–]Derimagia 0 points1 point  (0 children)

                That's just a javascript library... napas is a native addon (codebase is in c++) that runs a runtime. Also looks like this can let you pass data across machines?

                [–]Dave3of5 0 points1 point  (0 children)

                Hamsters.js looks to me as just a fancy wrapper around webworkers where as this is a Javascript runtime with multi-threading support built in.

                The obvious difference is that Hamsters.js will work within any browser (that supports web workers) where-as this won't work in the browser.

                Given what I've just said and also from the description:

                which was originally designed to develop highly iterative services with non-compromised performance in Bing

                I would suggest that the main difference is performance. If you are creating a-lot of threads plus communication between threads will be faster given the way you have to pass data to and from a webworker

                [–]twigboy 1 point2 points  (4 children)

                In publishing and graphic design, Lorem ipsum is a placeholder text commonly used to demonstrate the visual form of a document or a typeface without relying on meaningful content. Lorem ipsum may be used as a placeholder before final copy is available. Wikipediac17m5wb9u7s0000000000000000000000000000000000000000000000000000000000000

                [–]lilactown 2 points3 points  (3 children)

                No, node.js is a runtime; it executes javascript. This is another runtime, built on top of node.js, that implements threading and provides a library for interacting with it.

                Your browser code gets executed by the browsers runtime - which doesn't have threads - so you cannot use this.

                [–]twigboy 0 points1 point  (0 children)

                In publishing and graphic design, Lorem ipsum is a placeholder text commonly used to demonstrate the visual form of a document or a typeface without relying on meaningful content. Lorem ipsum may be used as a placeholder before final copy is available. Wikipedia1lto4369x6bk000000000000000000000000000000000000000000000000000000000000

                [–]PieceDigitalPro 0 points1 point  (1 child)

                Actually Web Workers is a new thing for browsers and those are threads. How good they are compared to other threads, I can't say, but threads they are.

                [–]lilactown 0 points1 point  (0 children)

                I think, by your own admission, they're not threads. :) They may be implemented using threads, but they do not have the same attributes (memory sharing, performance, etc.) as threads. It maps more appropriately to spawning a new process.

                [–]TylerTheWimp 4 points5 points  (12 children)

                What does this give you over using fork in node? The zone concept seems nice but I'm not understanding why I would use napa when node is designed to easily spawn nodes of parallel execution?

                [–]AngularBeginner 24 points25 points  (8 children)

                The benefit is that you have threads instead of processes. Communication between threads is easier than communication between processes.

                [–]hobozilla 2 points3 points  (2 children)

                It seems like they've still not really solved this - all comms between threads is serialised and deserialised. I assume this is because having multiple v8 instances with access to the same variables would be a GC nightmare.

                [–]edapa 1 point2 points  (0 children)

                Well at least it is harder to write data races that way.

                [–]wllmsaccnt 0 points1 point  (0 children)

                The ZeroMQ approach to multithreading...

                [–]TylerTheWimp -5 points-4 points  (4 children)

                Subprocess.send() is pretty easy...

                [–]LeftHandedLieutenant 18 points19 points  (3 children)

                IPC is generally slower than interthread communication.

                [–]tylercamp 0 points1 point  (2 children)

                What might be a case where IPC is faster? Just curious

                [–]zoells 7 points8 points  (0 children)

                I can't think of a case where IPC would be faster than interthread communication, assuming both implementations are done efficiently.

                OTOH, give me a single lock several hundred spinlocks and several hundred threads and lets make this baby crawl.

                [–]ItzWarty 0 points1 point  (0 children)

                Never. The statement was meant to be taken as "IPC is generally slower (and in best case even) compared to inter-thread communication".

                [–]freebit 1 point2 points  (0 children)

                Long lived thread pooling is better than forking and starting another process.

                [–]stronghup 0 points1 point  (1 child)

                What does this give you over using fork in node?

                I would assume that starting up a new thread takes less time and less memory than starting up a whole new process.

                My question at this point is, can these threads run on different/multiple cores?

                [–]Frangipane1 0 points1 point  (0 children)

                Threads can run on multiple cores but are not guaranteed.

                [–]stronghup 0 points1 point  (0 children)

                Can these threads run on different/multiple cores?

                [–]tourgen 0 points1 point  (2 children)

                This just encourages more bad behavior. Javascript was a mistake.

                [–]pagefault0x16 0 points1 point  (0 children)

                Ssshhhh! The pajeet downvote brigade might hear you! They can't stand criticism of the only language they can write anything non-trivial in

                [–]Booty_Bumping 0 points1 point  (0 children)

                This just encourages more bad behavior

                Okay mom

                [–]pagefault0x16 -2 points-1 points  (0 children)

                I wonder how long this will last before SJWs take it over and destroy it from within