[HN Gopher] Modern Javascript: Everything you missed over the la... ___________________________________________________________________ Modern Javascript: Everything you missed over the last 10 years (2020) Author : EntICOnc Score : 576 points Date : 2021-05-15 15:15 UTC (7 hours ago) (HTM) web link (turriate.com) (TXT) w3m dump (turriate.com) | flowerlad wrote: | 10 years ago JavaScript was an ugly language, with its clunky | prototypal inheritance and so on. Modern JavaScript is a | beautiful language, however, especially when enhanced with static | typing as in TypeScript. So much so, that Stanford has replaced | Java with JavaScript for its introductory programming course [1]. | | [1] | https://web.stanford.edu/class/cs106j/handouts/01-GeneralInf... | BenjiWiebe wrote: | I feel that being nicer than Java is a pretty low bar. | qsort wrote: | Which version? I feel like Java >=11 is absolutely fine, but | if you're talking about earlier versions you have a point. | lanstin wrote: | Someone brought up "while we do this move to EKS maybe it | would be a good time to port from Java 8" and the whole | room (virtual) groaned. | xhkkffbf wrote: | A number of schools like Dartmouth did this more than 15 years | ago. | criddell wrote: | Picking a language to teach programming and concepts in | computer science presents an interesting conundrum. Do you pick | a commercially relevant language (which most students want) or | go with one that might be better for academic purposes? I | probably lean mostly towards the former because time spent | learning something like Eiffel feels somewhat wasted. | dehrmann wrote: | To me, the dilemma is between a language that's easy to learn | and one that is useful once you learn the language. Most | languages have too many warts and footguns to be easy to | learn, but learning a toy language isn't good, either, | because it's not useful. | klibertp wrote: | No! Eiffel should be the default OOP language for any kind of | course. Being forced to think about pre- and postcoditions | and invariants _by the language_ is a really good thing for | beginner programmers. While the syntax is somewhat verbose | (mainly because of using keywords instead of most | punctuation) Not teaching about Design by Contract is yet | another billion dollar mistake in computer science. There are | DbC libraries or frameworks for just about any language, but | only very few programmers know about its existence, which | leads to criminal underutilisation of the technique in the | industry. | | I can't be sure, but I think there's a lot of thought, at | least, behind selecting a particular language for an | introductory course on programming. I don't know which | language I would choose, but I'd like something that would | broaden the horizons of student as much as possible. It could | be Mozart/Oz or something similar. | qsort wrote: | On the other hand, there are concepts (closures, objects, | pointers) that come more naturally with some languages, and | you absolutely need to learn the concepts even if you don't | end up using the language. | | Don't pick one, pick a healthy mix. | lanstin wrote: | No one should have a computer science degree and not know | multiple languages and multiple programming paradigms. | Prolog, lisp or scheme, C, JavaScript, Haskell. The long term | task of the professional software developer is to learn new | stuff. Helps if your awareness of the cool things you could | learn is already broad. I cannot explain how wrong it is to | graduate with Java only and think that is sufficient. To be | honest, I would also want people to understand the halting | problem and Godel's incompleteness theorem's proof, as | understanding the equivalence of apparent different systems | that can handle the integers is very fundamental. And these | days some knowledge of distributed theory is also good, the | Lamport time clocks paper and so on. Unless the student is | ambitious and doesn't really like programming and just wants | to program for a few years and then get into management or | something like that (product? bizdev? I'd that a thing?) they | will go thru many iterations of interesting new technologies. | The brain that enjoys learning mind-bending shit will have a | broader conceptual base and a better chance to see how lisp | macro type things can help with k8s configs. | | Or while lazy argument evaluation might not be in your | language, having it in your tool box for message processing | design or you know evaluation of user preference rule sets | against an event might be helpful. | geuis wrote: | Javascript is still based on prototypal inheritance. The newer | class syntax is just a wrapper. | dragonwriter wrote: | > Javascript is still based on prototypal inheritance. | | Protoypal inheritance and class-based inheritance where | classes are themselves first-class objects aren't really all | that different, anyhow. | axguscbklp wrote: | I think that it was beautiful 10 years ago, too, if you mainly | used a subset of it, relying heavily on closures and avoiding | constructors and "this" as much as possible. I think that | prototypal inheritance is elegant but in any case, there was | never much reason to use any inheritance syntax to begin with | other than perhaps in rare cases where one wanted to really | maximize performance. As for static typing, while it has its | uses, the idea that it makes things more beautiful is | subjective. | | Arrow functions really are a great bit of syntactic sugar. I | know that they are more than that, but since I avoid "this" | anyway, for me they may as well just be syntactic sugar. As for | the "class" keyword, I find it to be utterly pointless but of | course, tastes vary. | ksml wrote: | Actually, the class you linked was an experimental class, and | we ended up going with Python instead. (source: I was the head | TA for that class) | galangalalgol wrote: | Why a dynamically typed language to learn with? | ksml wrote: | I think there were two main reasons: choosing a popular | language (JS and python happen to be among the most | popular, accessible languages) and pedagogical simplicity | (it's nice to avoid burdening beginners with extra syntax | when they're already struggling to learn other things). | Some unscientific evaluation showed that students picked up | static types just fine in our second programming class | (which is in C++) | | Personally, I think we should be teaching static types and | I pushed for Typescript, but it didn't happen. | cogman10 wrote: | Always an option to push for something like mypy. That'd | at least give students exposure to types (even if they | don't have to write them) | jefftk wrote: | _> I think we should be teaching static types and I | pushed for Typescript_ | | Another option would be to introduce Python types: | def square(x: int) -> int: return x*x | | http://mypy-lang.org/examples.html | bruce343434 wrote: | I started programming in Lua which is dynamically typed. | It allowed me to experience why a type system would be | nice. I'm sure if I had started with a typed language, I | would have written it off as antiquated and unnecessary. | kaba0 wrote: | I am sure I'm absolutely nowhere near your knowledge and | expertise, but please bear with me sharing my opinion :) | | I think Java fits better as an introductory language -- | it is similarly popular as JS and python, and while I'm | sure static typing can be picked up easily, I think | fighting the compiler for a likely-correct program in the | end is a better alternative than understanding why the | program failed with this given input and not with another | -- so my not-backed-up-by-teaching opinion is that | dynamic languages are not necessarily a great fit. It | also features the basic OOP concepts, and modern java can | showcase plenty of FP ones as well. | | On the other hand, going lower level is similarly | detrimental, I've taken a class where C was used, and | that way you get cryptic runtime errors as well, while | memory management is not that hard to pick up later on. | ASalazarMX wrote: | > I think Java fits better as an introductory language | | Oh no, for a beginner just setting up the environment is | a huge hurdle. Sun's Java downloads page is utterly | confusing, and the IDEs are monstrous and complex too. | Past that, they have to learn about the JVM and compiling | to JARs before they can even run their first program. | Leave all that housekeeping to us seasoned, soul-crushed | developers ;) | | If we're starting to teach compiled, boilerplate-ridden | laguages to beginners, why not jump straight to C++ or | Rust? | bccdee wrote: | I think wrapping all your code in OOP boilerplate is | probably too much for an intro course. One of the nice | things about Python is that hello world is `print("Hello | world")`. No `public static void main(String[] args)`, no | nothing. And then on top of that, you can _add_ your | functions and classes and whatnot, but it 's easier to | wrap your head around a zero-fluff entry point. | bradlys wrote: | Intro classes don't need to overburden the student. The | biggest hurdle for students is thinking like a computer. | You start introducing all these extra things to just get | going and it becomes even more difficult. | | Explaining to students what public static void main means | is pretty annoying and seeing cryptic syntax littered | everywhere does not help students when they're first | learning. | | Dynamic languages make much more sense to beginners | because the idea of what a variable represents is more | abstract to them than tangible to you. To them, they | don't see the value of types because they're not going to | be building large programs where that is going to matter. | They know what their functions return and take in, | because they probably only have one or two. Performance | and compiling is also not as much of a concern, etc... | flowerlad wrote: | > _Explaining to students what public static void main | means is pretty annoying and seeing cryptic syntax | littered everywhere does not help students when they're | first learning._ | | C# has solved that with "top level statements" [1]. If | Java added that then problem solved, right? It's a simple | addition. | | [1] https://docs.microsoft.com/en-us/dotnet/csharp/whats- | new/csh... | kaba0 wrote: | I agree with you on the overburden part, but not on the | dynamic lang part. My very minimal experience is that the | hardest thing to get right as a beginner (or even as an | experienced developer) is to be able to follow the flow | of your code (Maybe introductory courses should employ | the debugger?), and the exact state it has at a given | point, eg. at an exception. Restricting the valid states | imo helps understanding. As well as not having to debug | at all at first, but the compiler notifying what is wrong | immediately. | hurflmurfl wrote: | I think that you're right in that it's hard to compose | all those parts of your program together without | accidentally mistaking a `Query` for a `string`, or god | knows what. I'm helping a friend learn web development, | and most of the issues they get stuck for long time at | are solved by making sure that functions you are calling | are returning what you think they are. | | On the other hand, I feel that most of the lessons I've | learnt that have really stuck are the ones where I first | do a thing wrong, and then find how to do it right. In a | similar fashion, letting the student create a steaming | pile of ... and then giving them a solution to their | troubles in a later course feels like a good idea. | | I personally have come a full circle: starting with | things like Pascal and C++, then going to C# and finding | type inference interesting, then getting a HUGE boost to | my knowledge and skills when I found Python and JS. A few | years later, my personal preference is having static type | checking, and Typescript does that pretty well, in my | opinion. However, every time I remember how much I | managed to learn and understand about programming when I | switched to Python, I think that if I had to teach | someone, I'd pick something expressive, intuitive and who | cares about types when you really want to maximize | exposure. | ylyn wrote: | > I think fighting the compiler for a likely-correct | program in the end is a better alternative than | understanding why the program failed with this given | input and not with another | | In my experience (having TAed a CS1 course) I think it is | better for introductory students to be able to figure out | what they are doing wrong, rather than having a compiler | point it out to them. | | In the first class, we want to focus on computational | thinking and being able to then express their ideas into | programs. So we intentionally use very little of the | language (JS in my case), because the language is not the | point of the course. | | OOP and all these models of abstraction and code | organisation come later, once they have a good grasp of | the fundamentals. | | This particular course I taught is only taken by CS | freshmen, so that other commenter's remark (that we | should teach a popular language) doesn't apply here. | kaba0 wrote: | > I think it is better for introductory students to be | able to figure out what they are doing wrong, rather than | having a compiler point it out to them. | | That's implying they will find it out, instead of having | a finished project that can randomly crash with a | slightly different input. | | Also, the compiler is basically just a shorter eval loop. | | But I agree with you that OOP should only come later | (though using objects is inevitable in most languages) | dclowd9901 wrote: | Having gone the other way (starting with JS and moving | into languages like Objective C), I actually disagree. | Having a solid foundation in software writing helped me | when I started to learn about the somewhat obtuse | abstract concepts that tend to be coupled with learning | strict typing. | | Then, when learning Flow and Typescript, where I'm | expected to have a meta understanding of typing itself, I | was ready to go. | bachmeier wrote: | > it's nice to avoid burdening beginners with extra | syntax when they're already struggling to learn other | things | | As someone that teaches college students to program (not | in a CS department) that statement is correct but doesn't | provide the full picture. It's good to get rid of the | extra syntax if and only if you don't need it - and that | means you're intentionally limiting what you're teaching | them. | extra88 wrote: | > you're intentionally limiting what you're teaching them | | Yes, that's the point. It's an introductory class, | choices have to be made about what to teach when. | bachmeier wrote: | Well, of course, but the point is that avoiding syntax is | not a great criterion for defining the fundamentals of | programming. A couple orders of magnitude more important | is to decide what concepts are useful for beginning | programmers to know. | flowerlad wrote: | Python is much more limited as an introductory language than | JavaScript. JavaScript is very versatile. Need to write | server-side logic? Use JavaScript and Node. Need to write a | native iOS app? Use JavaScript and React Native. Need to | write a command-line utility? Use JavaScript and Node again. | Need to make your web page interactive? Use JavaScript in the | browser. Python is versatile as well, but not to the extent | of JavaScript. JavaScript, when type-checked using TypeScript | also scales better to larger projects and development teams. | The one area where Python shines is in machine learning, | where Python is a de-facto standard. But here too, Python is | facing stiff competition from Julia. | nojito wrote: | None of these are requirements for a intro class | | Python excels as a teaching language. | flowerlad wrote: | The introductory course is not taken by just CS students. | In most colleges, introductory programming courses are | open to all majors. For many students this will be the | only programming course they will ever take. Why wouldn't | you teach a language that is not only well designed, but | also versatile, instead of just being a good "teaching | language"? | maleldil wrote: | > not only well designed | | JS, and its multitude of foot-guns, is not something I | would call 'well designed'. | sigzero wrote: | You are describing Python. | thrdbndndn wrote: | Can confirm. As someone who never formally learn | programming, the moment I learned Python I never touched | C# or Javascript again at will. | | The syntax of Python is just way, way more | straightforward. I do agree it may be a disadvantage for | serious software engineering, but as a hobby? I will pick | Python over others all day every day. | maleldil wrote: | It's an introductory course. The goal isn't to train | students to be able to do all those things. I'd wager most | professional programmers aren't able to do more than a | couple of them well. There's more to front-end/back- | end/CLI/mobile than just the language. | | > But here too, Python is facing stiff competition from | Julia | | You severely overestimate the significance of Julia in this | field. It's a great language, and I wish it were more | popular, but Python still dwarfs it. | [deleted] | 6gvONxR4sf7o wrote: | You seem to have limited visibility into python's | versatility. It's much much more than you describe, and I'm | saying that as someone who hates python with a passion (and | has been gainfully employed writing python for most of my | career). | neonological wrote: | Why did you guys switch to python instead of javascript? | XCSme wrote: | Some other important features and browser APIs released in the | last ~10 years: Web Workers, WebGL, OffscreenCanvas, Typed | Arrays, Web Audio, Web Notifications, WebRTC, Websockets. | dleslie wrote: | Does anyone have a handy reference for those, that they would | recommend? | meheleventyone wrote: | https://developer.mozilla.org/en-US/ | | MDN is amazing, coming from games and working on a web | project the level of documentation is incredible. | irrational wrote: | It should be considering who is backing it. | | https://www.infoq.com/news/2017/10/microsoft-google- | mozilla-... | meheleventyone wrote: | Even big companies such as those supporting MDN have | terrible developer documentation. MDN is something quite | special even given who supports it. | XCSme wrote: | To be honest, MDN docs were really good even before it | started getting support from other companies. | csbartus wrote: | I don't really know. For me, it's like PHP, or worse. Yes, this | modern javascript, the old one is even worse. | | I'm trying to get rid of it and move to a functional language | like Clojure (actively learning) or perhaps Rescript. | | Meantime I found Ramda.js and so far so good. No more javascript | fatigue. | | Ramda, React, and Typescript looks like a good patch for the | short term. On long term I definitely need something integrated. | | And something integrated with the running environment. Node, | Webpack, Babel are a real pain. | | I think the future is bright. We've learnt the pain making all | above work, and work together. Now something really new is | coming. | | Statically typed, functional (the good parts), focussing on | problem solving, and leaving the quirks behind. | bronlund wrote: | That whole Node thing was a huge mistake and people are starting | realize it. | | Using JavaScript on the server is bad for so many reasons and the | complexity Node introduces for doing the simplest of things, is | just just mind-boggling. | | For the future, I'm betting om Elixir with Phoenix LiveView, | pushing server-side rendered HTML through WebSockets. | lukicdarkoo wrote: | Professionally, I do embedded and robotics, but once a year I | find an excuse to create a simple web application (to stay | updated). Every time, I get impressed by power and simplicity of | the web technologies in general. In JavaScript those are things | mentioned in the article + WebComponents. For CSS those are | flexboxes, grids, and animations. In my opinion, React made a | revolution with hooks and contexts. I love the direction in which | the web world has been going! | biinui wrote: | May you kindly point me where to start learning robotics, and | recommendation for a starter robot arm? Maybe ~$300 if | something worthwhile exists at that price range. Take care. | fukmbas wrote: | Web tech is shit | antris wrote: | >In my opinion, React made a revolution with hooks and contexts | | I agree with your overall point 100%, but to be honest nothing | in React was / is innovative except for the virtual DOM | diffing, but even that is becoming increasingly irrelevant as | apps are moving towards more and more reactive architecture. | React made a huge impact on web dev and deservingly so, but all | of the other ideas have been implemented and used on the web | before. | | Of course it's great that React is bringing some of these good | ideas to mainstream, but they've been there way before they | have been distributed along with a VDOM algo. | warent wrote: | > but all of the other ideas have been implemented and used | on the web before. | | Is this true? I've worked in web dev for like 6 yrs now and | React has provided a significant number of concepts and | technologies I'd never seen before and still dont see | elsewhere. | | For example, JSX. Yes, it originated in php but React was its | first time being implemented in the frontend. | | Also the concept of hooks and functional components. The fact | that you explicitly define side-effects in the render of a | function, with memoization or execution dependent on | arbitrary state, is a new invention as far as I'm concerned. | antris wrote: | Yes, yes and yes. All of these concepts are variations of | what has been done before in a number of ways. Mostly by | "FP academics" who "live in fantasy land", until everyone | else starts using them too. | | Transpiling, hooks and components have all been done (and | done better) before React came along, but often they were | laughed out as esoteric toys that have nothing to with | "real programming". It's just hard to teach these concepts | until you actually use them, and it's hard to get people to | use these concepts unless they are included in something | else that you need. | | The same happened early with React, both JSX and VDOM were | laughed at by many developers because "they looked stupid" | to people who didn't understand them and were used to one | way of doing things. MVC+jQuery+templates was the flavour | of the day. | | Same thing with TypeScript, FRP and so on. | | Most likely, whatever concept is gaining momentum today, | it's an exact or approximate copy, or in rare cases a novel | remix of what has been researched 10-20 years ago, and used | in production for 5 years before you heard about it on HN | | These people who like to apply category theory etc. in | programming have heard this mocking of their work as stupid | esoteric fantasy (and then seeing them become mainstream | later) so often that they literally called one of their | specs "Fantasy Land" | https://github.com/fantasyland/fantasy-land | | There's still lot of work to be done. JavaScript doesn't | even have proper immutable data structures natively, which | would be a _REAL_ low hanging fruit. | ketzo wrote: | Well, isn't there something a little "revolutionary" about | mainstream adoption of cutting-edge techniques? | | After all, like you suggest, things like functional | programming and monads have existed for quite some time. The | thing that makes React special is how rabidly people adopted | it, and continue to adopt their major updates. | antris wrote: | >Well, isn't there something a little "revolutionary" about | mainstream adoption of cutting-edge techniques? | | Taking the example of hooks, React has hooks because it was | released with a bunch other stuff in addition to the VDOM, | people started using those things as a (poor) framework, | shot themselves in the foot repeatedly and finally hooks | had to be introduced as a fix on top of that. | | Calling that band-aid "revolutionary" or cutting edge | technology, kind of sounds wrong. They never would have | been there if it weren't for the bloated original release. | ptx wrote: | > virtual DOM diffing ... is becoming increasingly irrelevant | as apps are moving towards more and more reactive | architecture | | Could you expand on this? What was it that necessitated DOM | diffing before, and which architectural changes are making it | irrelevant? | user3939382 wrote: | The Winchester House was continuously added onto by a huge | construction crew for many years after the death of Mrs. | Winchester's husband. She believed her psychic who told her she | had to continuously add onto the house to repent for the people | killed by her family's rifles during the civil war. | | The result is a sprawling, very crazy looking house that no one | would have sat down and designed upfront. I think of JavaScript | as the programming language equivalent of this house. | nsonha wrote: | Most programing languages old enough have that problem: C#, | php, C++. | | And modern js does not look crazy, it's the es5 and bellow that | was a bit wacky. Typescript is much cleaner than the 3 | languages I mentioned, my opinion. | TchoBeer wrote: | Python is pretty old and (imo) doesn't have that problem | finiteseries wrote: | That's probably why they said most, not all. | dehrmann wrote: | Oh, yes it does. | | Built-in method and class naming is wildly inconsistent. OO | is bolted on, typing is bolted on. While not "the | language," the GIL and what it means for parallelism | (multiprocessing is a shit show) was a mistake. | Rapzid wrote: | > And modern js does not look crazy | | Heh, read the VueJS 3 code base. | | I haven't done much at the level of optimization I think is | going on there, and this is Evan's third iteration so I'm | guessing there is a lot of insights baked into it, but dang | if it's not hard to wrap your head around. Even if you check | it out and use VSCode to _try_ to figure it out. | | Individual sections of code make sense. But it's like a | deconstructed hamburger and you've never seen a hamburger in | your life. | kaba0 wrote: | That's on the library, not the language itself. I'm not | particularly fond of JS, but I think it has become a very | acceptable language over the years. | rikroots wrote: | To pick up on your tangent with a tangent, I think Tim Powers's | take of the Winchester House mythology, in his book Earthquake | Weather, is my favourite re-interpretation of the story. | | As to Javascript - I like the language because it a language | that fits best with my way of thinking about code. I'm not sure | if that's a good thing to admit. | ertucetin wrote: | ClojureScript, that's what you've missed... | qwertox wrote: | It's a great compilation, but I'd like to have each item to have | a link to the related caniuse.com page. | | Sometimes I can use Array.forEach() and sometimes not, and I | don't know why, even if I'm only using Chrome. So I just use | lodash. | sandrot wrote: | Try using Array.from(arrayish).forEach() to convert the thing | that looks like an array to an actual array. For instance, you | can't use map() on a NodeList (document.querySelectorAll | returns a NodeList), so you have to use Array.from(NodeList) to | first convert it to an array. | dragonwriter wrote: | > Try using Array.from(arrayish).forEach() to convert the | thing that looks like an array to an actual array. | | Spread syntax is my goto for that: | [...arrayish].forEach(...) | | But, it being JavaScript, there's probably a subtle | distinction in where Array.from(arrayish) works and where | [...arrayish] works. | rm_-rf_slash wrote: | JavaScript has grown a lot in the last 10 years, the last ~5 in | particular with ES5/ES6. | | There are still "fucking JavaScript" moments but those are few | and far between compared to what they used to be. The "..." | operator in particular has been hyper useful for neatly modifying | complex objects without turning into spaghetti code. | | SPA+node/express is a pretty solid stack these days because of | these improvements. I no longer find myself missing Rails for | Ruby's syntactic sugar and knowing that operations on the server | will work exactly the same on the client has been great for | browser console debug sessions. | | The holy grail would be for HPC JavaScript libraries to allow the | same ease of implementation to use something like NVIDIA RAPIDS | (especially RAPIDS itself) as easily as we get with Python. Given | how far js has come, I don't think that's an unrealistic | proposition. | lanstin wrote: | Adding existing c libraries to python is trivial, and very C | like experience for memory management etc. adding existing C | libraries into node engine requires more skill and delicacy due | to the C++ and the relatively more complicated v8 way of doing | things. | DrFell wrote: | JavaScript is a great browser scripting language because it's the | only browser scripting language. That's a whole realm of good | times, and people can and should go nuts with it there. | | The problem started a decade or so ago with Node. Too many people | only learn JavaScript, become psychologically dependent on it, | and they all collectively took it too far outside of a browser. | | ECMAScript is a general purpose standard, but it was invented | retroactively. Node is not ECMAScript in a server-side ECMAScript | engine, it's JavaScript in a browser JavaScript engine. That's | just too much of a force fit, and has wasted too much potential | for me to say anything positive about it. | hn_throwaway_99 wrote: | Couldn't disagree more. I was a Java programmer for my entire | career until about 2015 or so when I switched to Node, and | shortly thereafter to TypeScript. | | I've commented this many times before, but having a system | where _everything_ is on the same tech stack (i.e. front end in | TypeScript with React, back end with TypeScript on Node) has | resulted in gargantuan productivity gains, especially for a | small team where it 's trivial for people to cross front end to | back end seamlessly. For contrast, I know many teams with a | backend in Python and a frontent in React/JS, and I've worked | on some teams with that setup. In my opinion it's virtually all | downside compared to a backend in TS, as Python and TS are | quite similar from a web programming perspective (I'm not | referring to Python's advantage in data science tooling), so | all it basically is is a barrier to your front end folks being | able to make small enhancements on the backend quickly. | | Furthermore, TypeScript is a great language and I find myself | being so much more productive in it than I was in Java, | especially when it comes to refactoring. | | JavaScript most definitely has its warts and head scratchers | after being around for 25 years, but I feel like most of these | oddities (truthy/falsey, typeof null === 'object', undefined | vs. null, etc.) can be learned in an hour and written on a half | page. | dvt wrote: | > Furthermore, TypeScript is a great language and I find | myself being so much more productive in it than I was in | Java, especially when it comes to refactoring. | | I don't really see how. TS doesn't seem to solve _any_ | annoying problems I previously had in Java. As a concrete | example, it would be nice to have the concept of a DTO as a | first-class language feature, but alas, I find myself | constantly casting and re-casting, plucking, or writing | endless wrappers to make sure properties trickle down (or | up). Hell, sometimes I just give up and use `any`. I mean, | this is a web-first language that has no concept of sending | objects over the wire.. okay then. | | TypeScript's generics system is cute, but I think it's mostly | academic. And did you look at the toolchain? To get TS | working, you need babel or ts-node or webpack, and like 3 | different .json config files. Importing a package without TS | support? You need to write some stubs yourself in types.d.ts. | In fact, the best parts of TypeScript are actually JS | (await/async, arrow notation, spread operator, etc.). | hn_throwaway_99 wrote: | This biggest "aha" benefit I get from TypeScript is that it | is structurally typed, while Java is nominally typed. In my | experience it has proven much easier to refactor in TS | because I just need to ensure my objects have all the right | properties. With Java if I have a Thing1, but a library is | updated to add just a single new property so now there is a | Thing2 type, well now then all the places I need a Thing2 I | have to completely copy over from Thing1 - I can't just add | the property and be on my merry way. This happened to me | many times in my Java career - I still think I have PTSD | having to do a Jersey 1.x upgrade to a Jersey 2.x version | across a large codebase. It was a nightmare I've never had | anything come close to with Typescript. | | > I mean, this is a web-first language that has no concept | of sending objects over the wire.. okay then. | | I have no idea what you're talking about here. I use | GraphQL with auto typegen of my TS types and I get typed | data objects everywhere. | | > TypeScript's generics system is cute, but I think it's | mostly academic. | | TBH this remark just makes me thing you really don't know | much about TS. I use generics extensively, find them very | helpful and are easy to use. | | I'll give you the point on initial TS setup being non- | trivial. Hopefully advances in tooling (things like Deno, | which I'm not actually a huge fan of, or other projects | like Rome) will make this easier, but even then I found | this to be a "one and done" cost. | layer8 wrote: | There is a reason for nominal typing though, because | nominal types represent an interface contract that | generally goes beyond just having the right type | signature, but instead it is also about semantics. It's | about the parts not covered by the type system, which the | compiler therefore can't check. It depends on the kind of | objects you are generally working with, but beyond pure | data I find nominal typing preferable, because it makes | it explicit that an implementation X conforming to | interface contract Y is not just a matter of type | signatures. | eurasiantiger wrote: | Note that the upgrade pain with Java was not due to | typing; rather, it was due to using a library directly | instead of creating a class to interface with it. In | other words, inadequate abstraction. | city41 wrote: | The shock wave that TS sends through a JS stack is hard to | ignore. It's really annoying. Every tool added TS support | in a slightly different way and you always have to keep it | in mind no matter what you're doing. Sadly it's just the | reality we gotta face. I'm hoping Rome can live up to the | hype and be helpful here. | adamscybot wrote: | I think esbuild is basically already doing most of what | Rome promises | dvt wrote: | Oh man, so true, between TS mangling and whatever | framework you're using (Vue/React/etc.), the stack trace | ends up being literally worthless. It's kind of funny to | think about: when something goes wrong, I don't even look | at the trace (which is 100% what you'd do in any sane | language), but rather I just go back and look at the | "last thing I changed." | city41 wrote: | Ah that is true as well. When I said stack I meant like | Babel, Storybook, Webpack, Jest, etc. But yeah JS stack | traces aren't so fun these days. | wonnage wrote: | This is just you not being familiar with the language | adamscybot wrote: | People are talking the other points to death but on the | toolchain front, you might enjoy | https://github.com/evanw/esbuild, which is rapidly gaining | in popularity. Just 1 thing for bundling, transpilation | etc. And its terrifically fast since its written in Go | (ironic I know). | city41 wrote: | At my last company I created a few tools that became key to | my org, which was front end/JS oriented. Being able to write | them in JS meant anyone could contribute fixes and features | trivially, with zero ramp up time. That is a really nice | benefit of Node. Imagine if Rails developers couldn't use | Ruby for their tooling. Node really filled a nice gap here. | [deleted] | smoldesu wrote: | Either way you try to argue this, it's hard to make the case | that Java/Javascript is _better_ at any of those things than | another language. Productivity be damned, your dinky jar file | will get smoked on almost every quantifiable level if you pit | it against against a C++ or Rust rewrite. What GP is saying | is that the only reason people praise Javascript is because | it 's a unique language, and I think it's a fair appraisal. | Javascript is in a class of it's own, for better or worse, | and since it has no real competitors, it's easy to dismiss | detractors. | | Whenever I encounter Node, issues almost always follow. | Whether it's NPM's delightfully useless error messages or a | stream of neverending warnings filling up stdout, it quite | literally never fails to cause a problem. Maybe Node should | focus on saving it's reputation, because I for one run in the | other direction of it. Hell, especially in the case of Node, | I hope that Deno comes to replace most of it's core | functionality. Putting up with half-assed software on a half- | functional runtime only leaves me with a quarter of the | patience I started with. | creshal wrote: | > For contrast, I know many teams with a backend in Python | and a frontent in React/JS, and I've worked on some teams | with that setup. In my opinion it's virtually all downside | compared to a backend in TS | | Is there any Typescript backend framework as mature as | Django? | | > Python and TS are quite similar from a web programming | perspective (I'm not referring to Python's advantage in data | science tooling), so all it basically is is a barrier to your | front end folks being able to make small enhancements on the | backend quickly. | | So on the on hand, the languages are "quite similar", yet it | cannot possibly be expected that frontend people learn more | than a single language? Something doesn't add up here. | mxkvl wrote: | idk why people mentioned Next.js which is more Front End | framework than Back End, but no one mentioned Nest.js. It | is not old as Django but I think Nest is nearest framework | to RoR/Django in Node.js | williamdclt wrote: | Definitely. NextJS isn't a "backend framework", it's a | server-side rendering framework that has some backend | abilities to handle simple use-cases. | | NestJS is the most full-featured Node framework, but it's | lightyears behind Django. Yet I'd still use it given the | choice between both, because I prefer Typescript so much | better than Python and having a single language through | the stack is a game changer, enough that I'm willing to | compromise on the frameworak. | hn_throwaway_99 wrote: | Our backend is Apollo GraphQL in TS, and it is has provided | us numerous benefits: | | 1. The strong typing of GraphQL is a huge boon for | correctness and security. | | 2. Easy to autogen TS types from GraphQL schema, so we can | use the same types throughout our codebase, frontend and | backend. | | 3. Apollo has lots of features that make it easy to scale | projects. | creshal wrote: | And yet - Apollo advertises its easy Python | interoperatibility right on the front page, as one of the | features that makes scaling easier.1 | | GraphQL arguably makes decoupling frontend and backend | languages even easier than classic REST APIs, since the | GraphQL schema can serve as single source of truth across | language barriers. | | 1 https://www.apollographql.com/blog/graphql-python-api- | comple... | hn_throwaway_99 wrote: | OK, let's unwrap that: | | > And yet - Apollo advertises its easy Python | interoperatibility right on the front page | | Yes, absolutely, there is great support for GraphQL in | many different languages. | | > , as one of the features that makes scaling easier.1 | | To be clear, that is your own commentary and I didn't see | anything in the Apollo site that said implementing in | Python makes scaling easier. I.e you seem to be implying | that somehow implementing in Python is better for | scaling, but there is no background to support that. | | > GraphQL arguably makes decoupling frontend and backend | languages even easier than classic REST APIs, since the | GraphQL schema can serve as single source of truth across | language barriers. | | Yes, I totally agree with that. If you are, say, | providing an API to other developers GraphQL is a great | choice for a number of reasons, one of which is that | there is great language support across pretty much all | languages. | | But if you are starting a project _within_ a company, and | have the luxury of choosing technologies, having the same | ecosystem on the front and back ends makes it much easier | for people on either team to go across that "boundary" | if necessary. This is not just me hypothesizing. For the | majority of career, which really started right when web | apps started taking off, there was a separate language on | the backend (Java for the majority of my career, but also | sizable stints where Ruby and Python were the backend | languages). Yes, most backend folks understood JS and | CSS, and most frontend folks could understand the backend | languages, but it was still a huge barrier to people | being able to contribute across teams such that it rarely | happened. It's only in the past couple of years where | I've been in a "TypeScript everywhere" org where I've | seen the gigantic change in the team dynamic that this | allows. | spiderice wrote: | You are interpreting GP's comment very uncharitably, to the | point that it actually becomes a completely incorrect | interpretation. | | GP is pointing out that it is advantageous to have a single | language on both front end and backend. And somehow you | arrived at "developers cannot be expected to learn more | than one language." | | There ARE big advantages to having the exact same language | (as opposed to similar languages) on both client and | server, especially in an SPA where you want to render | something initially on the server, but then update it using | the same logic later on the client. | creshal wrote: | > GP is pointing out that it is advantageous to have a | single language on both front end and backend. And | somehow you arrived at "developers cannot be expected to | learn more than one language." | | Because he considers it a "barrier" to have to switch | between languages to do backend-only changes. Which is a | completely different use case than the one you're | describing. | | For an SPA where you're essentially doing frontend on | both ends, yes, that's obviously easier when you're only | doing it once. | | But that's not the general case, and I'd argue that | transitioning between different mental contexts for | components you're not regularly touching is always going | to be a hurdle to developers, regardless of the language | used. Blaming it on the language is an useless red | herring. | aranchelk wrote: | Having to write the same logic twice in two languages, | and then making sure both implementations behave the same | way. I don't know if I'd use the word "barrier", it's | certainly a significant pain in the ass. | | The classic example is of course validation, but plenty | of other places it can come up. | onei wrote: | Perhaps I'm overthinking things and HTML does this | naturally, but is there something for rendering that is | what Swagger/OpenAPI is to APIs? Some way of specifying | HTML that can be both rendered (and read back for inputs) | by multiple implementations. | Jarwain wrote: | I feel like switching languages adds extra friction too. | Switching contexts is still a hurdle, but using the same | language can make the hurdle shorter. | wonnage wrote: | It's definitely a barrier to have to switch languages. | You might be super familiar with Chrome's debugger UI | (which is excellent, btw), and feel lost when suddenly | getting dropped into IntelliJ's. | | Also, what if you just have frontend developers who | straight up don't know Java or vice versa? I don't see | how having a shared language could ever be a _bad_ thing. | austincheney wrote: | Learning is great. It expands horizons, potential, and | current capabilities. Learning is not producing though. | Learning is a cost center. If you want to increase | productivity start by minimizing required learning. That | exchange is called _usability_. | gentleman11 wrote: | Interesting phrasing, I like it. But you can also reduce | the cost by making learning easier, whether with good | interfaces or naming, or just good docs | creshal wrote: | > Learning is not producing though. Learning is a cost | center. | | Spoken like a true MBA. | | > If you want to increase productivity start by | minimizing required learning. | | Deciding your tech stack solely on avoiding having to | train people for a few days sounds like a terrible way to | organise projects. Is your employee churn so bad that you | can't afford even this little familiarisation? | austincheney wrote: | There are two fundamental practical problems with your | thinking. | | 1. Employers don't train on languages/frameworks. In most | circumstances employees are expected to learn on their | own or from a prior employer before applying for a job. | Worse, the last place I interviewed only asked about | learning from the current employer while never asking | about self learning outside the office. | | 2. Employees, in many cases, believe they can cheat | learning by using a tool or framework. That is largely | due to a lack of boundaries and experience in a given | environment or platform resulting in low trust of peers | and the technology. | | If you want to require learning then provide sufficient | learning material expecting a predefined structured | outcome. | creshal wrote: | We _are_ training our employees. Learning the ropes of a | new language /framework enough to make easy changes is | trivial, so why wouldn't we? Much better than crippling | our choices in software stacks we can use. | dfabulich wrote: | > Is there any Typescript backend framework as mature as | Django? | | No TS framework is as old as Django, and if you're looking | for "Django for TS" you won't find exactly that, but | Next.js is the current reigning champion for server-side | frameworks right now, according to the popular "State of | JavaScript" survey https://2020.stateofjs.com/en- | US/technologies/back-end-frame... Next is a "both-side" | framework, allowing it to do stuff you just can't do in | Django. | | If you want something much thinner than Next (and thus much | thinner than Django), there's Express. | | > yet it cannot possibly be expected that frontend people | learn more than a single language? | | The problem isn't learning two languages, it's interop | between two languages. | Kinrany wrote: | IIRC Next is a backend-for-frontend framework, not a | general purpose one. Unless that changed? | 1_player wrote: | Come on, as someone that has worked professionally with | Django and Next.js, the only similarity they have is that | they're both web frameworks. Django is light years ahead | than Next.js is it's not even funny. | | Here's a very simple metric: Compare the Next.js | documentation (https://nextjs.org/docs/getting-started) | with Django's | (https://docs.djangoproject.com/en/3.2/contents/) - | better yet, compare the actual API reference and exported | classes/methods. | | Yes, Next.js is one of the better Node/Javascript | frameworks, but it's incredibly inferior to any other | established framework in Python, Java, PHP, Elixir, etc. | -- unless you only need a static page with some dynamic | React components. I am in the unfortunate position of | maintaining a more complex Next.JS app, using most of its | "advanced" features such as dynamic routing, SSR, | GraphQL, API, and it's the most painful project I have | ever had the misfortune to work on, because the upstream | interface and API is so woefully under-documented, buggy, | changes too quickly it's hard to stay up-to-date, etc. | etc. I weep every time someone on this forum suggests to | start a new project with Next.js. | | In theory Javascript on the server and client is a | productivity boost, in practice it is not by any measure. | nicoburns wrote: | The similarly named (but completely different) Nest.js is | much closer to Django than Next. Still a ways behind in | terms of maturity, but it seems to be more or less on the | right path. | Silhouette wrote: | _I am in the unfortunate position of maintaining a more | complex Next.JS app, using most of its "advanced" | features such as dynamic routing, SSR, GraphQL, API, and | it's the most painful project I have ever had the | misfortune to work on, because the upstream interface and | API is so woefully under-documented, buggy, changes too | quickly it's hard to stay up-to-date, etc. etc._ | | Would you give some specific examples of where you've | found Next to be buggy or where it's introduced breaking | changes? We're evaluating a number of possible Node- | related libraries for a new project right now, including | Next, and there's no substitute for hearing from people | with real experience of using them in production. | sillyquiet wrote: | > Yes, Next.js is one of the better Node/Javascript | frameworks, but it's incredibly inferior to any other | established framework in Python, Java, PHP, Elixir, et | | This is like saying a screwdriver is incredibly inferior | to a impact hammer. | | > In theory Javascript on the server and client is a | productivity boost, in practice it is not by any measure. | | This is in direct contrast to my personal experience | across multiple projects and teams. In practice it _IS_ a | productivity boost, because JS does 99% of what anybody | needs a web server to do. | 1_player wrote: | > This is like saying a screwdriver is incredibly | inferior to a impact hammer. | | I'm sorry, isn't the goal of web frameworks, including in | this category Django, Next.js, Phoenix, Laravel, Nuxt.js | to respond to HTTP requests and present users with an | HTML page representing a document or a more complex web | application? | | > because JS does 99% of what anybody needs a web server | to do | | Brainfuck is Turing-complete and does 100% of what any | other language can do as well. I stand by the fact that | having to "know" only one language is great in theory, | but in practice it's not. Node and client JS/Webpack are | a leaky abstraction it's not very hard to get yourself | cut with. In non trivial modules, you'll find it hard to | be able to use the same code verbatim on the client and | the server. Then add the complexity of server-side | rendering, serialisation/hydration, React suspense, code | that mysteriously works only when server-side rendered or | viceversa, etc. and you'll ask yourself "is this really | worth it?" | sillyquiet wrote: | > code that mysteriously works only when server-side | rendered or viceversa, etc. | | It sounds like your opinion of server-side javascript | comes from experience with badly written and poorly- | understood server-side javascript, because none of that | jives with my experience in writing node-based web | applications. | creshal wrote: | > No TS framework is as old as Django, and if you're | looking for "Django for TS" you won't find exactly that, | but Next.js is the current reigning champion for server- | side frameworks right now, according to the popular | "State of JavaScript" survey | https://2020.stateofjs.com/en-US/technologies/back-end- | frame... | | So by that graph, it has a good chance of being entirely | deprecated and/or abandoned in the next 3 years, what a | wonderful foundation for a backend. | | And it doesn't even have any support for an ORM? Neither | does Express? Having to hand-write every single query and | migration like it's 1999 again is hardly the cutting edge | of IT stacks... | | > The problem isn't learning two languages, it's interop | between two languages. | | How so? | btgeekboy wrote: | Regarding ORM, it's typically paired with Sequelize or | Prisma. (I'm personally using the latter.) I've built | Django apps in the past (it's actually how I learned | Python in the 2.5 days), but what's nice about Node/TS is | that the frameworks are more loosely coupled so you can | pick/choose your best components. For example, while I | mentioned the ORMs above, you can even go one step | further and use a backend headless CMS like Strapi, which | will get you the ORM + admin interface that you'd get | from Django models. | creshal wrote: | > what's nice about Node/TS is that the frameworks are | more loosely coupled so you can pick/choose your best | components. | | For about two weeks, then one of them becomes deprecated | again and you have to migrate everything all over | again... | lhnz wrote: | This isn't really true though. There are plenty of open- | source modules in Node which were released more than 5 | years ago and are still in use today. People only move to | new ones, when they are clearly better. What exactly is | wrong with that? | creshal wrote: | > There are plenty of open-source modules in Node which | were released more than 5 years ago and are still in use | today. | | And how stable was their API over the last five years? It | hardly counts if over 5 years the APIs change so much | they're basically different libraries at the end. | | Django's code churn for even complex projects is on the | order of single digit hours per year at worst, the | remaining 99.99% of time can go into delivering things | customers care about. | | I can't say I've seen that sort of stability in anything | Javascript-related, apart from maybe jQuery projects. | (Which of course have their own problems because jQuery | is the wrong abstraction usually.) | nicoburns wrote: | On the backend, Express has had a very stable API for 5+ | years. On the frontend, React has. However, stable or not | there's nothing that competes with Django/Rails/Laravel | in the Node ecosystem. | maxrev17 wrote: | I kinda get this but syntax is one thing, understanding the | context you're working in is another. | inopinatus wrote: | If you've mainly worked in TS then it explains the blind | spot, because JavaScript is chock full of awful missteps | built up over the years. There's a reason my copy of | "JavaScript: The Good Parts" is extremely slim next to its | sibling, "JavaScript: The Definitive Guide". | | So you've come to it at a time when the syntax and | capabilities have a popular subset that actually starts to | fulfil the early promise. And yet, one may still be | enormously critical of the anemic and inconsistent standard | library, and don't even get me started on the horrifying | dependency shitshow of the node ecosystem that cripples | maintainability of anything over 18 months old. | | Just because we're all holed up in the throne room, doesn't | mean there aren't monsters still roaming the sewers, just a | few levels down, as illustrated by the article linked above. | | As for isomorphic code, I strongly encourage my competitors | to write backend code in the same fashion as the front-end, | because the resulting tight coupling and special-case-driven | technical debt makes them easy to outmanoeuvre when markets | shift. And if they're reading this then please also consider | microservices, graphql, and nosql data stores whilst you're | at it, for the same great reasons. | skeletal88 wrote: | It would be amazing if there were other languages available | for front-end development in the browser, no? Even if you | think that JS is so wonderful, then having competition would | still be good, or no? Currently JavaScript has a monopoly in | the browser and monopolies are always bad. Bad for innovation | and everything else. | | It would be better if there were no oddities in a language. | One of the reasons why everyone hates PHP is that it is full | of inconsistencies, odd design choices, weird naming and | unexpected behaviour. JS has at least some of these. | | If there was a second of third language available in the | browser, then that too could be used to develop back-end | applications and would have the benefits you describe - that | you can use the same language for both stacks etc. For | example - if you could front-end stuff in Python, would it be | amazing or bad? Or would the current JS devs just fear for | their jobs because of it? | tester756 wrote: | There are, you can write C# in browser easily. | twic wrote: | > having a system where everything is on the same tech stack | (i.e. front end in TypeScript with React, back end with | TypeScript on Node) has resulted in gargantuan productivity | gains | | How so? Is it just about being able to use a single set of | tools, libraries, habits, etc? Or are there particular things | which are easier when the language is common? Are you sharing | code between front-end and back-end. | | I do very lightweight front-end coding these days. It's | usually some variation on populating and updating a table | from a websocket, maybe with some simple filtering and | toggling in response to user interaction. There, i can't | think of any particular advantage to having both ends in the | same language, but then mine is quite an unusual use case. | eyelidlessness wrote: | There's a lot of compelling reasons to share code | _particularly_ at network boundaries. Using something like | io-ts /zod/etc gives you simple, declarative, type safe | validation. Being able to share that behavior is an | enormous productivity boost in and of itself. | twic wrote: | Sharing validation for forms is definitely really nice. | | It feels like it should be possible to do that cross- | language, generating some JS validation rules from Java | annotations, say, but i have never seen it done. | hn_throwaway_99 wrote: | Mainly it has to do with teams. In most orgs there is | something analogous to "a backend team" and "a frontend | team", because the concerns and expertise are quite | different. | | Oftentimes, however, a frontend dev may need some small | extra bit of data or functionality from the backend, and | vice versa. If the ecosystems are very different, then the | amount of time it takes to set up that separate ecosystem, | remind yourself of the relatively minor syntax difference | e.g. between TS and Python, update your dependencies, etc. | can be a big barrier, so often the answer is to just throw | a ticket over to the team on the other side and wait. | | If, on the other hand, you can just quickly get into the | other codebase, make a small PR and get it reviewed | quickly, it can drastically improve the team's overall | productivity. | twic wrote: | I've always had front-end and back-end owned by the same | team, and in the same repo, despite being in separate | languages. The repo has a single build script which | builds all parts of the project, whatever language they | are in. Implementing almost any feature involves touching | both front-end and back-end code, so people stay fresh. | All of this seems like table stakes to me. | | Maybe some organisations have separate teams working on | the two parts of an application, which honestly just | seems stupid, but that's not a necessary consequence of | using different languages. | sillyquiet wrote: | I agree with this - EXCEPT: | | In a backend where you need a heavy-duty, multithreaded | process to handle long-lived computations, node is _probably_ | not the way to go unless you want to pay for all the extra | instances you 'd need for the same amount of load. In my | experience, for example, a java-based graphQL server (that | spawned multiple connections to various services) needed much | much less in the way of resources than the node equivalent | serving the same amount of traffic - AND the latencies were | generally much better with the java server, depending on the | size of the JSON payloads that it was handling. | | All that being said, you can certainly architect your way out | of that problem and I imagine a relatively small percentages | of web applications even HAVE that problem. | hn_throwaway_99 wrote: | I agree with all of what you said. Note in terms of | "architecture your way out of that problem", that's exactly | what we did. We have an eventing architecture that uses | PubSub to publish to serverless functions that can then do | heavier processing asynchronously. And for us, this wasn't | a compromise, this architecture has a number of other | benefits. | | But again, I definitely agree with what you've written, | right tool for the job. | pricci wrote: | Where can I read more about that architecture you | aretalking about? | mattacular wrote: | Not op but I assume they mean: a main web server is | scheduling large jobs in the background by publishing an | event to whatever pub/sub system you want to use (there | are many!), lambdas can be subscribed to this system so | they trigger off these events and publish a corresponding | event back when they're done that the web app is | subscribed to etc. | bobthepanda wrote: | > For contrast, I know many teams with a backend in Python | and a frontent in React/JS, and I've worked on some teams | with that setup. In my opinion it's virtually all downside | compared to a backend in TS, as Python and TS are quite | similar from a web programming perspective (I'm not referring | to Python's advantage in data science tooling), so all it | basically is is a barrier to your front end folks being able | to make small enhancements on the backend quickly. | | How big of a problem is this? | | At the end of the day all that really matters is that the | external representations that get handed off are the same and | that everyone makes the same assumptions. Given the same set | of fields manipulating a POJO with Java streams is not all | that different from using modern Javascript on a blob. | gentleman11 wrote: | Typescript makes refactoring easier in what way? Can you do | renames without error prone string search and replace? Can | you get good autocompletions with ts? If so, that would be | really nice | Jarwain wrote: | Yup! Especially using VsCode, which feels optimized for TS | development. Click the var you want to rename, hit F2, | rename it, and it renames all instances of the var. If | you're renaming an import, it'll do it across all the files | automagically. Moving a file? Imports get updated too! | | Plus you've got MS's intellisense powering autocomplete. | Unfortunately, I don't think it can recognize different | foods, but as long as you've typed your variables the | autocomplete is pretty good! | | EDIT: the OP had a typo, saying food instead of good, for | context as to why I made a food joke | bcrosby95 wrote: | None of this is better than the experience in Java | though, which is what they were comparing it to. Maybe | they were using shit tools? | Jarwain wrote: | The gp made this comment | (https://news.ycombinator.com/item?id=27168048). | | > This biggest "aha" benefit I get from TypeScript is | that it is structurally typed, while Java is nominally | typed. In my experience it has proven much easier to | refactor in TS because I just need to ensure my objects | have all the right properties. With Java if I have a | Thing1, but a library is updated to add just a single new | property so now there is a Thing2 type, well now then all | the places I need a Thing2 I have to completely copy over | from Thing1 - I can't just add the property and be on my | merry way. This happened to me many times in my Java | career - I still think I have PTSD having to do a Jersey | 1.x upgrade to a Jersey 2.x version across a large | codebase. It was a nightmare I've never had anything come | close to with Typescript. | | Not so much refactoring as upgrading, but tis an example | of why duck typing is kinda nice | lhnz wrote: | Yes to all of your questions. | dclowd9901 wrote: | You forgot to ask, "can you get program flow analysis on | top of static analysis for free?" To which the answer is | also yes. | williamdclt wrote: | It's a bit sad that the bar is so low. If you don't have | these, what is your editor even doing for you? Might as | well use Notepad | dfabulich wrote: | Yes, both work. | dcposch wrote: | The first post also misses something fundamental about modern | software: servers programming is becoming more browser-like. | | > Node is not ECMAScript in a server-side ECMAScript engine, | it's JavaScript in a browser JavaScript engine. That's just | too much of a force fit | | And what makes V8 a "browser JS engine"? A focus on: | | - rapid startup. Code starts running immediately, JITs | quickly. The VM is designed for latency, not just for | throughput. | | - excellent sandboxing. The VM is designed to run untrusted | code. | | - no blocking code. Designed for callbacks and promises. No | threading, no thread.sleep(), no mutex, etc. Makes is much | easier for non-expert developers to write fast & reasonably | correct code. | | Now look at things like Cloudflare Edge workers, Lambda etc. | Modern server environments share all of those same design | goals. | | Server-side JS/TS not only has the advantage of a single | codebase. It also brings the design and engineering | advantages of a browser VM to the server. | kaba0 wrote: | Your examples doesn't really read as a prototypical server | application. | | Rapid startup: lambda is a tiny subset, and not really | server application. A server app could take minutes and | would still be okay, because they are designed to run for a | long time. Even in case of scaling minutes are more than | okay since deploying a new instance takes a similar amount | of time. | | excellent sandboxing: you usually only run your own code | connected to db and other very privileged services. If | there is a vulnerability it is a very big problem with or | without sandbox | | no blocking code: i'm not up to date, but node doesn't have | a strong parallelism story at all, compared to the JVM, Go, | .NET | Kiro wrote: | The only reason I'm using node.js is because I can do this: | let num = 0; route('/url').post(data => num++); | | What other languages can I do this in that are better? I simply | want to have a variable I can access and mutate from inside | closures and let it live in memory without the need for | databases or file systems. | merb wrote: | every language? | ptx wrote: | To be fair, threads complicate things. | franklampard wrote: | I am professional who used python, Java in my Career, and | TypeScript is simply the best. | | "Too many people only learn JavaScript, become psychological | dependent o it " is simply a false narrative from people who | are stuck with obsolete web dev tech stack and refuse to learn | better tools | koonsolo wrote: | > Node is not ECMAScript in a server-side ECMAScript engine, | it's JavaScript in a browser JavaScript engine. | | Why would your custom ECMAScript server be any faster or more | stable than any of the existing browser engines? If you look at | the resources behind those engines, I don't know who would | match that effort doing the same on the server. | paulryanrogers wrote: | My guess is the browser JS engines are optimized for quick | compilation and execution. While a backend engine could | optimize for longer, persist runtime. | overgard wrote: | 10 years ago I would have agreed with you, but in recent years | Javascript (and moreso Typescript) are just exceedingly | pleasant to use. I'm using Typescript in backend services | despite knowing Python and C# well just because I like it. | vletal wrote: | I can imagine that the original argument does not apply to | the languages which compile to JS. But IMO the fact that | there is so many derived languages covering the mess which JS | is only supports the argument against it. | nicoburns wrote: | TypeScript is just JavaScript with type annotations. The | runtime semantics are identical. JavaScript itself has | improved to the point where it's great to work with, and | arguably the nicest of the common dynamically types | "scripting" langauges (python, ruby, PHP, perl). | gmac wrote: | Completely agree. I used to work mainly in Ruby, and I | guess I miss its rich standard library, but overall | TypeScript is such a joy to work with that now I use it | for almost everything. | believeinskills wrote: | Well I know plenty of people that are similar to me in that in | our early years, we asked for resources and help, and the | response that was constantly given was "use what you know," | which was bad advice for people who made websites who were | looking to program. | | It's no wonder Javascript is the only thing used. I actually | love React and ES because it's the first time I feel like a | real programmer and not someone just writing Javascript. I | don't really care about people's opinions about JS, I simply | use what works. | | If you hated Javascript, maybe the anit-javascript community | should have wrote blogs, made videos, and created content in | the same way that the Javascript community did. | bastawhiz wrote: | > Too many people only learn JavaScript, become psychologically | dependent on it, and they all collectively took it too far | outside of a browser. | | Do you have any evidence for this? Because there's plenty of | reasons why you'd share the same code in the browser and the | server. Being able to do SSR and sharing validation logic are | two huge and obvious reasons. Ever try to exactly duplicate | validation rules between the browser and PHP? What about when | they use weird regexp rules? | | I have a site builder codebase that renders previews instantly | as you make changes, then uses the same code on the server to | render the HTML and CSS for visitors. That would be otherwise | be outright impossible to do without writing the same code | again in another language. | zozbot234 wrote: | > Being able to do SSR and sharing validation logic are two | huge and obvious reasons. Ever try to exactly duplicate | validation rules between the browser and PHP? What about when | they use weird regexp rules? | | PHP is adding support for FFI to any C ABI-compatible | language, and you can run the exact same code in the browser | via emscripten or a WASM polyfill. As a bonus, | emscripten/WASM compiled code will also be more efficient in | the browser than plain JavaScript or Typescript. | chrisbroadfoot wrote: | > As a bonus, emscripten/WASM compiled code will also be | more efficient in the browser than plain JavaScript or | Typescript. | | Small gains compared to the cost of implementing. 10-20%. | Now you're asking your full-stack developers to know PHP, | JS, C, and WASM. | gls2ro wrote: | Here is my perspective: There are plenty of reasons to use | the same language on FE and BE but for me the main problem is | the JS standard library. | | Let me give you one example: | | Lets say you want to validate if a string is a valid URL. | What is a good way to do this in JS? | | Just for reference in Ruby for example I can do: | URI.parse(input).kind_of?(URI::HTTP) | | No gems or any other engines needed. | hoten wrote: | The URL constructor. | gls2ro wrote: | Oh wow, how I missed that. I stand corrected! | | Seems like JS standard library is better than I thought. | yashap wrote: | TypeScript is a pretty good language for writing web servers, | as long as you don't need to do computationally heavy parallel | computing. And you can still do that, but it's very awkward. | | I've done plenty of backend work in all of TS, Scala, Go, | Python and PHP. Scala is my personal favourite, but it's not as | practical for teams as TS or Go, which are both very productive | languages, with good enough type safety and performance, that | new devs can learn quickly. And I'd easily choose TS over PHP | or Python for a large system. | | Plus, it IS pretty nice being able to use a single language | everywhere. My current company is TS RESTful services with | TS/React on the web, and TS/React Native on mobile, pretty hard | to beat how easy it is to do full stack dev work for most ppl | in this setup. | SavantIdiot wrote: | > computationally heavy parallel computing. | | JS has no parallel computing support, so it is not an option. | And when I say parallel computing, I don't mean distributed | computing, I mean utilizing hundreds (thousands) of cores on | a single die, like NVIDIA architectures. (It's a black art, | even addition algorithms can confuse the newcomer.) | | The best course is to do what every other language does when | it comes to simple-parallel operations, like Gauss-Jordan | elimination: use a dedicated, optimized library, like NumPY. | | I really hope some day there will be a numpy for JS. NumJS is | dead, and Google's TensorFlowJS is excellent for utilizing | GPUs, but a dog when trying to do simple operations (the | load/store async nature doesn't quite fit with most use | cases.) I suspect WebAsm will facilitate the parallel nature | of tensor operations without having to move | lhnz wrote: | It sounds like you want something a bit like WebGPU: | https://gpuweb.github.io/gpuweb/ | SavantIdiot wrote: | Close, but I don't want to have to switch memory models, | e.g. upload/download. What I want is the incredibly | diverse numerical computing support and logical syntax of | NumPY but in the same process & memory space. The W3C | endeavor is something a little different. Thanks tho!! | lhnz wrote: | I think you will be interested to read this article about | the future of data programming in JavaScript (http://bens | chmidt.org/post/2020-01-15/2020-01-15-webgpu/). | | I do think that this kind of thing will be able to be | built on top of WebGPU (I saw this experimental POC that | did so recently: https://github.com/milhidaka/webgpu- | blas). The only issue is that since JavaScript doesn't | support operator overloading even if a production-level | library was created the code would be a little less | readable. | grishka wrote: | ActionScript is also an ECMAScript language, and it's kinda | ridiculous to see that JS still hasn't quite caught up. Out of | things that modern JS lacks, AS had Java-like interfaces and | you could specify types on variables. | | (Yes, I know about TypeScript.) | SavantIdiot wrote: | NodeJS is important for more reasons than "it's just | JavaScript". It is asynchronous from the bottom-up, and it is | literally a challenge to force asynchronous patterns into a | synchronous ones, which is almost always a hack because async | requires a lot of thought. This is a boon to IIoT control, | where the pejorative "web server" is literally the endpoint for | 10's of thousands of IoT edge nodes. NodeJS fits in with this | architecture perfectly compared to the shoehorning required to | make it work with PHP, (C/C++), Python or Java. (N.B.: I am not | a java programmer, but we did review using Java, too, but it | was voted down for other reasons.) | | If there is another asynchronous language that is as well | defined as NodeJS and has as much library support, I would very | much like to study it. | ripe wrote: | This. I grew up with Lisp and Smalltalk, yeah I am that old, | but today I love Node to build web apps. | | It's a fantastic environment for asynchronous programming. It | also has a built-in REPL for a management interface via TCP | or Unix sockets. It doesn't really need any additional | packages (I hate the dependency hell that npm saddles you | with, and people don't seem to know that Node already has | http, https, and websocket upgrades built in, so you often | don't need any "frameworks" or libraries). | | Give me Node, and I can build an entire web app from scratch. | Most of the time you don't even need to use JS in the | browser. Just html and CSS are enough. Web apps the way God | intended. | | I don't use Typescript either. Its type checking isn't worth | the hassle of poor tooling and inscrutable stack traces. | austincheney wrote: | There are a couple of things that JavaScript got so incredibly | correct: | | * Lexical scope natively without syntax or conventions | | * Functions as first class citizens | | * Inheritance, classes, OOP are not forced on you and can be | ignored/omitted entirely from your code | | Those few things are what has kept me hooked on the language. | | > Node is not ECMAScript in a server-side ECMAScript engine, | it's JavaScript in a browser JavaScript engine. | | What does that even mean? The APIs are completely unrelated and | Node does different things that don't make sense in the | browser. | senthil_rajasek wrote: | >> Node is not ECMAScript in a server-side ECMAScript engine, | it's JavaScript in a browser JavaScript engine. | | >What does that even mean? The APIs are completely unrelated | and Node does different things that don't make sense in the | browser. | | I have taken the privilege of rewriting the quoted part of | the parent comment, | | Node runs javascript on the server side in an engine built | for the browser. It does not run ECMAScript with an engine | specially made for server side apps. | titzer wrote: | > * Lexical scope natively without syntax or conventions | | I assume you mean over the alternative, dynamic scoping like | in e-Lisp. But you realize that JavaScript's scoping rules | are entirely wonky, e.g. that "var" declarations are lifted | to the function level? | austincheney wrote: | To be more specific the term is _hoist_ which means the | declarations are pushed to the top of the scope at run time | for maximum availability, and _var_ is function scoped | instead of block scoped. Block scoping is often more | specific because a function body is a block as well. | errantspark wrote: | Right but we have `let` now which solves that problem. | titzer wrote: | Not completely, `let` also has a weird temporal dead | zone[1], which is basically a dynamic check. | | [1] https://www.freecodecamp.org/news/what-is-the- | temporal-dead-... | hwillis wrote: | var is a terrible example of that. Just don't use it. | | A good example would be the scoping in for loops and maybe | arrow functions. For loops are goofy but virtually never an | issue, and arrow functions are awesome. | dclowd9901 wrote: | And here I thought scope was kind of disaster in JS: | | - `const fooFunc = () => {}` is treated differently than | `function fooFunc() {}` in declaration and subsequent access. | | - A function's invocation context changes depending on how it | was declared (fat arrow vs. function declaration) | | Don't get me wrong: I love JS, but this is not one of the | things I felt made it intuitive. | austincheney wrote: | The _this_ context changes, but I recommend developers not | use _this_. That isn't a scope issue though. | mweberxyz wrote: | There would be no point in having two ways to do the exact | same thing if function-style declaration and arrow-style | declaration implementations were identical. Why would they | add a new feature to the language if it was purely | syntactic sugar? | hollerith wrote: | >a couple of things that JavaScript got so incredibly | correct: . . . Lexical scope natively without syntax or | conventions | | What language of the last 28 years _doesn 't_ "natively" | lexically scope its variables? | z3t4 wrote: | JavaScript is different in that it use the function as the | lexical scope rather then the angel brackets. This forces | you to think about the code as functions, rather then | blocks. And in turn helps you think of the code in three | dimensions where time is one dimension, making it easier to | understand code that runs asynchronously. | icedchai wrote: | Not Javascript. If I forget a var or let, it's global. | austincheney wrote: | Strict mode throws an error on implied globals. Use of | modules forces strict mode. | icedchai wrote: | And that's all "extra" syntax. | JoyrexJ9 wrote: | strict mode is the default in everything now and had been | for many many years. | icedchai wrote: | It isn't the default for a browser "<script>" tag. | xigoi wrote: | It's the default for <script type="module">, which you | should use anyway for anything serious. | galangalalgol wrote: | That last bullet is my main complaint with java and c#. | wvenable wrote: | C# just removed the requirement to start code with a class | or a main method; you can just start typing into the file. | metaltyphoon wrote: | I like this so much. In fact they are investigating the | idea of #!/usr/bin/dotnet on a .cs file! | nerdponx wrote: | From my perspective (mostly a Python user), Javascript is a | _fine_ language for general-purpose scripting and server dev, | and Node is more than fast enough to handle typical workflows. | | Why do you think it's not a good language for this? | | Also, I see a lot of value in using a one single language that | can truly do everything: frontend, server, and scripting. | | I guess you could use Python or Ruby like that with Wasm, but I | haven't seen evidence of people doing that. | lanstin wrote: | Like JavaScript, one can argue that the only thing wrong with | node is the ecosystem/developer community. Things like npm as | just not curated enough given the large number of JavaScript | developers and the attendant variability in quality of | output. Node itself is an almost perfect call-back driven | even loop for Unix network io, which till go and go | routines/channels was the conceptually simplest way to use | the CPUs you are paying for, saturate the network, and have | subtle threading issues. (Python gevent was also good at | that, but had more implicit magic which is bad for reasoning | about code). | | But I am hopeful that when I finish reading the article I | will not have to reuse my jquery / d3 based framework for | doing quick data viz things (which I only started doing with | great reluctance because people don't go wow over tabular | data even if the data is wow-ing. The first request to make | it pretty, i switched to mono space fonts. But jquery is | showing its age. | bennysomething wrote: | I don't know what's wrong with me. I hate JavaScript. I tried | learning react and redux and just gave up. All this to put a | button and a field on a page. React was basically invented by | John carmack to do doom 3 and copied to render web pages. Is | this really required!? It's not a 3d games engine. I've worked | on web apps that require a lot of page updates per minute and I | still hate react. I stay the hell away from front end web Dev | as it just feels like hell. Sorry drunken rant. | | Edit: I also worked on a node app that should have been written | in a staticall typed language. Bugs that could have been caught | at compile time literally caused me utter misery in on call | overtime. All because some guy in our team demanded we wrote it | in node. This was way before type script. I actually feel | physical pain thinking about. | schwartzworld wrote: | You should really try learning react first without redux. | Redux is for managing global state. It's rarely needed but | has become the defacto solution for react state for some | reason. | | React on its own is much simpler, once you grok the react | compositional model. I don't know how you can do that while | using redux too. | adamscybot wrote: | Perhaps give it another try, but with TypeScript. Im a front | end dev and yes, I feel the JS pain. I look back at how I | used to do things and think "wtf". TS completely changed this | and brought it back to sanity. | bobthepanda wrote: | at least part of the problem is that Javascript and webdev | have really low barriers to entry, which is positive in the | sense that anyone can do it, but the problem is that anyone | can reach that unhappy valley of knowledgeable enough to do a | lot of damage without realizing it. | | If you put bad developers on other languages they usually end | up running into some wall first but Javascript is pretty | forgiving. | vmception wrote: | This is wrong lol. V8 changed the whole paradigm. Thinking of | Javascript as still _just_ a browser language is the flaw. | Pfhreak wrote: | > The problem started a decade or so ago with Node. | | What problem, specifically? People enjoy writing Javascript. It | has a ton of fantastic resources online, it is easy to debug | and deploy, it's quick to pick up and forgiving of mistakes. | | > Too many people only learn JavaScript, become psychologically | dependent on it | | You sound like Immortan Joe warning people not to become | dependent on water in Mad Max. Let people enjoy the language | they enjoy developing in. | | > they all collectively took it too far outside of a browser. | | What does this even mean? What's "too far" even mean? People | want to write code, let them? | zackify wrote: | What I'm hearing is: | | Because the language wasn't planned to support all of this from | the start, we just shouldn't use it. | | There's lots of great reasons to use a full JS / TS stack. | There's lots of reasons not to. | | Doesn't mean it's inherently bad. This is the same logic used | against PHP every day yet it's used all over. | colordrops wrote: | Unbelievable that this is voted to the top on Hacker News. The | comment literally gives not one concrete example or reason by | JavaScript is "bad". I'd expect more from you all here. | cultofmetatron wrote: | Couldn't agree more. I started in this field as a javascript | programmer. I've since expanded my toolkit to include | typescript, elixir, plpgsql and now gaining proficiency in | rust. | | I'm continually frustrated by my colleagues refusal to step | outside the javascript ecosystem. Don't get me wrong, JS | certainly has its place but its not ALWAYS the best tool for | the job. I see a lot of people reach for node as their go to | backend tech choice simply because its the ONLY tool in their | toolbox. | | Unless you're building a small focused microservice where the | functionality involves calling out to a library with working | tested code that does what you want, I think node is honestly a | poor choice. To qualify my statement, I spent the first 7 years | of my professional career building software with nodejs. | | The sweet spot is much smaller than the scope of projects | people throw at it. | | * quick MVP? rails has more libraries that are drop in. | | * Performance? go and elixir have node beat for multicore perf | | * websockets? compared to phoenix channels, everything in node | for serving websocket apis are a toy. | | Lambda functions though? yea nodejs kicks but there! | beders wrote: | Looking forward to the next article 10 years from now. Will code | written now be incomprehensible then? | | One thing seems clear: We won't be using webpack, react or any | other current tool. I'm not sure how organization can shoulder | the costs associated with that kind of churn. | Cyberdog wrote: | I didn't know JS had `??` for a nil coalescing operator, or, more | specifically, I thought it already had `||` for that purpose, | since I've been using it for that for a decade or so without any | problems. How do the two differ? | TooCleverByHalf wrote: | ?? - returns right side operand if left side operand is null or | undefined | | || - returns right side operand if left side operand is any | falsy value | luftbbb wrote: | Null coalescing is far more concise and basically offers a | retroactive step in the case of a null. It's entirely different | from using an OR condition | qsort wrote: | > 0 ?? 1 0 > 0 || 1 1 | nailer wrote: | I like this answer because it's practical. Eg score 0 is a | different thing from score undefined (which means you don't | know the score). | frosted-flakes wrote: | ?? only coalesces nullish values (hence the name), which only | includes null and undefined. || coalesces _falsey_ values, | which include false, 0, and empty strings. || might work most | of the time, but it requires extra checks when falsey values | are valid. | beardyw wrote: | I think ?? only acts on null or undefined, || acts on any | falsey value. | ashdev wrote: | Great post. Learned something new even though I've been using | JavaScript for quite some time now. | elcapitan wrote: | Websites without Javascript are what I missed the most of the | last 10 years. | macando wrote: | _async await_ was the biggest breakthrough for me. Made | JavaScript code 3x more readable. | BenoitEssiambre wrote: | I really wish when things moved to async/await, that they would | have gotten rid of promises like I proposed here: | https://es.discourse.group/t/callback-based-simplified-async... | | As it stands it's layers of caching, state machines and | complexity. | contriban wrote: | Confirmed. Every time I convert an old Node project to promises | I constantly find bugs and situation that were just lost in the | hell. The result is also so much cleaner that sometimes you | realize you were doing something wrong entirely and you scrap | the whole thing. No other JavaScript improvement comes close. | Everything else is nice but only saves a few chars at most. | macando wrote: | And they announced promises like a big improvement over | callbacks :D Now that was hell! Fortunately, when I started | doing serious Node.js development, callbacks were already on | the way out. | sherr wrote: | Some typos : "paramaters" | lewisjoe wrote: | I made a similar detailed document to bring my team up on the | modern web dev workflows: https://bit.ly/3oi08M2 | YouthfulMarxism wrote: | I'm so disapointed by the committee. So many utterly useless or | easily bootstrappable features and yet, no pattern matching and | pipeline operator stage 3 proposals. 0 progress for so many | years. Lack of those roadblocks Typescript implementations. | | ReasonML and KotlinJS will faster become practical general | purpose web languages than committee would start doing something | usefull. | Cyberdog wrote: | > Lack of those roadblocks Typescript implementations. | | Is it JavaScript's job to improve the lives of transpiler | implementers instead of improving the lives of JavaScript | developers? | epmatsw wrote: | I think they're saying that TS won't add the feature until JS | does. Still kind of a strange take IMO, but makes a little | more sense. | YouthfulMarxism wrote: | First of all Typescript, is now more mainstream JS dialect | than vanilla-js itself and, honestly, the only one i care | about. | | And i thought it's kind of obvious for anyone, that until | *JS* proposals are staged far enough - Javascript won't have | those features too. There is a good reason why TS waits for | the stage 3. | anonymoushn wrote: | no coroutines no buy | osmarks wrote: | Generators are basically coroutines, aren't they? | halfmatthalfcat wrote: | It took 6 years to ship ES6. We've now had a new spec iteration | from every year after 2015. They are moving much, much faster | and, having lived through ES5 to much pain and angst, I'm | completely ok with them taking their time shipping these (very | nice to have) features. | cosmotic wrote: | Please stop calling it modern. Call it New Features in ECMAScript | 5 through 11. | soheil wrote: | It's nice to see JS improving, honestly all this improvement | primarily makes searching for how to do something a lot easier. | Now instead of copying and pasting 15 lines to, for example, | handle async calls from Stackoverflow you copy three lines. I | think learning new methods to do stuff in languages isn't | relevant anymore when most web programming involves googling | anyway. The only problem is sometimes answers on SO are outdated | and even the most voted answer may be giving a suboptimal | solution. This is something both Google and SO should have a huge | incentive to fix. | 29athrowaway wrote: | This article is very distant from "Everything"... | | - Modules | | - Set and Map, WeakSet and WeakMap | | - String interpolation | | - Private methods (# prefix) | | - Template literals | | - Typed arrays | | - Symbol type | | - Generators | | - Proxy / Reflect | | - Internationalization | | And more... | riho wrote: | Seeing a lot of distain for JavaScript in here, but not enough | examples of what's actually wrong with it. It's fine to criticize | the language, there certainly are issues with it, but I'd like to | see some actual constructive comments and examples from other | languages where it's done better. | indymike wrote: | Most of the complaints aren't really about the language syntax | or capabilities. Aside missing proper support for integers, | modern Javascript is pretty nice. The complaints mostly come | from developers being forced to use either Javascript (only way | in the browser), or being forced to change code because of | breaking changes in libraries. | toolslive wrote: | besides being really insane typing wise, javascript also both | really lenient and unpredictable in what it accepts as | expressions. Try to guess the result of the following | expressions: > [] + [] > > {} | + [] > > [] + {} > > {} + {} | | It means that if you feed it nonsense it does not stop you but | happily carries on and explodes a few milliseconds later | somewhere else. Another can of worms is the difference between | null, 0,undefined, '', .... | | Ok, you got me worked up. I need to go for a run to blow off | steam. | kentor wrote: | That is just javascript trivia that one rarely encounters in | real code, and shouldn't be used to dismiss the entire | language. | noir_lord wrote: | To borrow a Stroustrup quote | | > "There are only two kinds of languages: the ones people | complain about and the ones nobody uses". | | I'm not a fan of JavaScript but I do like TypeScript. | jpgvm wrote: | The tooling and ecosystem are the main problems from my | perspective. If you set yourself up with Kotlin + Gradle + | IntelliJ you now already have all the tools you need. | | Want to create/maintain a modern JS/TS stack? Well, you are | going to need npm, webpack, probably babel, linters, need to | understand how to setup source maps and get those working for | debugging server side. etc. | | It's a nightmare and it's all very fragile and that isn't even | touching on the poor quality of the libraries outside of | React/big ones. | [deleted] | tomcam wrote: | Fantastic! I admit I want the same article for C. I am like a | walking C89 standard but after that... | oweiler wrote: | Not a huge fan of JS but you can't deny that the language has | improved tremendously over the years while still maintaining | backwards compatibility. | montroser wrote: | Yes, indeed. It is really pleasant compared to how it was 10 | years ago, and still -- code written 10 years ago, even code | written 25 years ago still runs in modern browsers. It's | amazing and wonderful. | | JavaScript has quite effectively managed to avoid anything the | Perl 6 fiasco which greatly contributed to Perl's demise, or | the Python 2 => 3 timult, which turns out will not be a kiss of | death, but made for some rough years. JavaScript did almost | have its own trouble of the same sort with ES4, but it was very | wisely abandoned when it turned out to be too | ambitious/contentious... | merb wrote: | > Yes, indeed. It is really pleasant compared to how it was | 10 years ago, and still -- code written 10 years ago, even | code written 25 years ago still runs in modern browsers. It's | amazing and wonderful. | | sadly that is not true. some stuff broke over the years. most | often it was not javascript itself but changes in the dom | api. | GuB-42 wrote: | I wouldn't call Perl6/Raku a fiasco. | | I don't actively use it but I followed it. It is actually a | more modern language than pretty much anything else and it | seems to have great community that is not a bunch of zealots. | Also, it is far from dead. | | At the same time Perl5 is also still alive and from the | start, it was clear that the two will be maintained in | parallel. Perl6 was not intended to replace it, they changed | the name to Raku to clarify the situation. | | So while it may be a fiasco if you consider the market share, | it clearly isn't for the language. Perl5 doesn't really need | change, and if you want to change it anyways, it would be for | a whole new language, and that's exactly what happened. | ketzo wrote: | I dunno. If you walked into a sophomore-level computer | science lecture 15 years ago, most of the people there | would either have heard of Perl or be proficient in it | themselves. | | Now? I'd be amazed if a single student had written a line | of Perl, or ever _heard_ of Raku. | | That simply doesn't compare to where Python, Java, or even | PHP are in the popular mind, IMO. | | I would call that something of a fiasco, frankly. Market | share is everything for a programming language. The game | isn't zero-sum, but it's close; there's only so many | developers with so many hours to create libraries, guides, | new software. | superkuh wrote: | Backwards compatibility is one thing. But forwards | compatibility is something javascript devs have a terrible time | with. The standards change fast and new features are added | constantly. And unlike, say, Bash devs, javascript devs want | the latest and greatest and don't care if it doesn't run on | $software from 2 years ago. | swiley wrote: | I don't know if this is part of the standards but there was a | backwards incompatible change in the way regex worked around | firefox 73 and a bunch of sites crash in older firefox now. | dleslie wrote: | I'd like to say it's a testament to the original design; but I | can't overlook the hundreds of millions of dollars, perhaps | more, that has been spent to improve the language. | | It's nothing short of incredible that it is as fast as it is | and as useful as it is. It shows that many hands do make light | work; and money can buy that effort. | irrational wrote: | I don't have any numbers to back this up, but I'm pretty sure | that between Google, Mozilla, MicroSoft, etc. more resources | (both people and money) have been put towards improving | JavaScript (language and performance) than any other language | in the history of programming. Now I hope someone will | provide numbers to show why I'm wrong. | dleslie wrote: | I want to say that C has had more resources due to it being | the defacto compiler reference target; but honestly, I | doubt it. | epaulson wrote: | I'm years behind on Javascript (I'm circa 'AJAX is new' in my | knowledge) but I've been having good luck catching up using the | Babel REPL with small snippets to just see how the new features | get translated into the Javascript I know. Seeing what the | compiler renames is a good way to understand the new scoping | rules, etc. | | It's been especially helpful for yield and async/await, but I | wonder if there's a bug in Babel with async/await. Just using the | code sample from the article: function | fetchUserName() { return new Promise(resolve => | setTimeout(resolve, 500)) } async function | withAsync() { print("withAsync: fetching...") | await fetchUserName() print("withAsync: done") } | await withAsync() | | when I set the target to be 'ie 6', so hopefully I get output | that's only the Javascript that I know, most of this gets | translated to (a lot of) Javascript that looks normal for 2005 | Javascript - except the last 'await' line is still there. Is that | a bug/limitation in Babel or was 'await' present in Javascript | from years ago? | dclowd9901 wrote: | I don't know what the REPL you're running does with top level | functions, but my guess is that an `await` needs to run within | a function that is declared `async`. The reason (if so) would | be that then babel could then transpile the function | appropriately into a Promisory function. At the top level, what | function would be translated? | mweberxyz wrote: | Top-level await is very, very new and requires ES modules -- | you can only use this feature without warnings recently in Node | 15. For the foreseeable future, the final line should be | replaced with: withAsync() | .then(() => print("done") .catch((err) => | console.error(err); | sandrot wrote: | You're right, thank you for the explanation. My REPL runs the | code in the textarea in an anonymous Async function, which is | why top level async works in my examples. | paozac wrote: | Programming languages are tools, what matters is if they do their | job. And the current popularity of javascript means it works for | most people. But boy, how ugly and inconsistent it is. I wish I | could like it. | AegirLeet wrote: | I write PHP for a living and every time I look at the JS world, | I feel like they're exactly where PHP was 15 years ago, except | with 20 times the amount of incomprehensible tooling. | agumonkey wrote: | Can you give more details ? | AegirLeet wrote: | 15 years ago, PHP didn't really support any programming | paradigm very well, it was a huge untyped mess, the | standard library was missing a lot of stuff, reusing code | meant including individual files based on filesystem paths. | | Today, PHP offers a solid OOP experience, good gradual | typing, a larger and saner standard library and code | loading based on namespaced components. | | Now compare today's JS to PHP back in the day. It has the | exact same kinds of problems. Except with modern JS, you'll | end up adding TypeScript, webpack, Babel and a dozen other | tools as well as several hundred megabytes of libraries to | paper over all of those problems. But by doing that, you | make the build process and the code that ultimately runs in | a browser completely incomprehensible and undebuggable for | the average developer. And then you start adding even more | tooling (source maps that barely work) to try and solve | that problem... | agumonkey wrote: | I had the impression that beside gradual typing, ES6 | solved most of the mess (cleaner apis, modules) which was | happening at the same time PHP (and python) accelerated | their growth. | | I find it really unfair to compare es6 to php 15 years | ago, es6 is really cute (the babel/transpiling part is | peculiar, I admit it) | steve_adams_86 wrote: | I've worked with PHP and JS extensively and while I could | almost agree from some narrow perspectives, I think JS is | nowhere near where PHP was 15 years ago in any sense. | | I was writing PHP 15 years ago. It wasn't a great dev | experience and the tooling was awful. JavaScript today has | stellar tooling in comparison, and arguably less warts in its | standard library than PHP still has today. | | I really disliked JavaScript until I read some books that | helped me understand what it's doing under the hood. These | days I just don't have issues with it. Yeah, the ecosystem | thrashes a lot and the tooling experience can be bad in | regards to that, but otherwise it's impressive lately. Even | without TypeScript, intellisense on regular JS enables | extremely streamlined navigation of references and | implementations, refactoring, project navigation, tooling | integration, etc. Not to mention modern profiling and | debugging tools for JS are incredibly easy to use and benefit | from. | | PHP wasn't at this stage even 10 years ago. The debugging | story was still xdebug and tooling was improving but not | great. Composer was painfully slow and buggy - nowhere near | as nice as yarn and npm are now. | | Yeah JS has problems, but I don't believe it's nearly as bad | as old PHP. | BeefWellington wrote: | > JavaScript today has stellar tooling in comparison, and | arguably less warts in its standard library than PHP still | has today. | | There are a lot of reasons to like JavaScript as a language | and NodeJS as a particular implementation. The standard | library (or lack thereof) is absolutely not one of them as | things stand today. I'm not even sure what you'd compare | between them. | | If you meant to say "package available at the other end of | npm install" instead of "standard library" I could see that | being a different story. | effable wrote: | This may be a little off topic but your comment piqued my | interest: I am currently learning JavaScript and I was | wondering if you would like to recommend any of the books | you read. | sdfin wrote: | I re-learned JS recently, https://javascript.info/ was an | awesome resource and has almost anything you may need. | Also MDN is good. | gentleman11 wrote: | If people didn't like JavaScript for front end work, it's not | like they could just switch to python | tshaddox wrote: | Can't easily write Django code in JavaScript either. In | general it's not like working programmers get to choose any | programming language whatsoever for the hardware and platform | they're writing software for. | pessimizer wrote: | You don't have to use Django (you can choose one of the | billion alternative CMSes), but everyone has to use a | browser. Hell, Django itself has to write javascript. | sirsinsalot wrote: | Django is not a CMS | ironmagma wrote: | There are a wealth of alternatives though... ClojureScript, | Elm, ReasonML, and Purescript just to name a few. | globular-toast wrote: | I use both JS and Python for work and not a day goes by where | I don't wish history had taken a different course and Python | had ended up embedded in web browsers. | qbasic_forever wrote: | There was a strange time in the dark days of IE6 dominance | 20 years ago that you actually could write page scripts in | non-javascript languages. VBScript was a big option that | some people used, and IIRC there was a way to get python | support in IE (and Windows) script host too. When I was | first learning Javascript in ~1998 I remember all the docs | showed how to do stuff in both JS and VB script tags: | https://stackoverflow.com/questions/17483782/vbscript- | suppor... | paozac wrote: | Or Lua | fit2rule wrote: | This, a thousand times. | garyrob wrote: | This brand-new book on using Python (via Transcrypt) in the | browser to build a React app may be helpful in that regard: | https://pyreact.com. Just started reading it. Seems very good | so far. | gentleman11 wrote: | Is the result ie 11 compatible and performant? Honestly | curious | dragonwriter wrote: | > If people didn't like JavaScript for front end work, it's | not like they could just switch to python | | Sure, they can, both via compile-to-JS solutions like | Transcrypt [0], and via generate-the-frontend-with-backend- | Python solutions like idom [1], Plotly Dash [2], and others. | | [0] https://www.transcrypt.org/ | | [1] https://idom-docs.herokuapp.com/docs/index.html | | [2] https://dash.plotly.com/ | ad404b8a372f2b9 wrote: | That's not a solution if you end up with Javascript in the | end. (Also Dash is absolutely terrible, horrible | documentation, horrible code.) | vbsteven wrote: | Why is that not a solution? The concept of | compiling/transpiling a language into the target language | for the runtime is everywhere. | | Even native languages like C/C++/Rust compile their | language into binary format that the platform can run. It | just so happens that the web _runtime_ format is JS | instead of binary machine instructions. | HideousKojima wrote: | Because debugging your transpiled JavaScript becomes a | nightmare in a language you already hate | dragonwriter wrote: | > Because debugging your transpiled JavaScript becomes a | nightmare in a language you already hate | | That's what sourcemaps are for; you don't have to debug | compiled instead of source format on the web just like | you don't on other platforms. | dragonwriter wrote: | > That's not a solution if you end up with Javascript in | the end. ( | | It is, just as using compile-to-(or interpreted-by-a- | runtime-in-)-native-code languages is a solution to "I | don't like raw x86_64 machine code for desktop | applications", even if you end up running machine code in | the end. | | > Also Dash is absolutely terrible, horrible | documentation, horrible code. | | "X is not a choice people can make" is a different claim | than "One example of X is not something I personally | would recommend". | ad404b8a372f2b9 wrote: | The issue is that writing code that goes through a JS- | transpiler is more complicated than just writing | Javascript, unless the language you choose is Javascript- | adjacent, whereas writing code that compiles to machine | code is infinitely less complicated than just writing | machine code. | | As to your second point, that's why I put it in | parentheses, of course it doesn't refute your claim but | if you use as example a technology that has awful | documentation because of this two-language paradigm, and | leads to garbage code both at the Python stage and the | Javascript stage, to me it doesn't paint a good picture | of the whole concept. | esrauch wrote: | It turns out that even if you accept "Python is great and | JavaScript sucks" that "Python compiled to JavaScript" ends | up even worse than JavaScript. | dragonwriter wrote: | > It turns out that even if you accept "Python is great | and JavaScript sucks" that "Python compiled to | JavaScript" ends up even worse than JavaScript. | | Clearly, there are people that disagree with this value | judgement, and the existence of that disagreement is an | existence proof that Python for frontend is, in fact, a | choice people _can_ make, even if it is one you find | unattractive. | esrauch wrote: | I also have gotten DMs on Reddit from companies looking | for devs since I commented on a thread 10 years ago about | an obscure toy language: it doesn't mean thats a | reasonable choice for technology. | | I think theres legitimate reasons to compile Python to | JS, but "JS is bad" can't be one of them, since you | _still_ have JS that you have to worry about. It makes | sense for codesharing with server code or preexisting | business logic. | | Over the years I've debugged js compiled from various | languages, and it's seriously a terrible experience: | however bad you think debugging handwritten js is, | reading and debugging generated js is strictly worse (and | you will have to) | dragonwriter wrote: | > however crazy you think handwritten js is, generated js | is just obviously worse to try to read (and you will have | to) | | Or...maybe I won't; I've used plenty of compile-to-JS | languages (including what starts as "js" with JSX and | modern features but gets compiled to plain, and more | widely supported, JS), and I spend as much time reading | and debugging JS in its compiled form as I do reading and | and debugging .NET or Python bytecode instead of source, | which is none. | bobthepanda wrote: | WASM is supposed to unlock non-Javascript for the browser, | no? | | Also there have been attempts before but nothing really | stuck. How many non-Googlers use Dart? | irrational wrote: | No? WASM doesn't replace JavaScript. Think of it as a high- | performance library that JavaScript can make use of. | echelon wrote: | You can write Rust for the frontend right now. It's pretty | neat. | | Yew [1] is one of the early Rust frameworks for client side | work. It allows for multi-threaded (!) execution and | javascript interop. | | Not many other languages make sense as you have to pack in | the whole runtime, GC, etc. Rust is pretty well positioned | for WASM, and it's going to take off soon. | | [1] https://github.com/yewstack/yew | aphextron wrote: | >If people didn't like JavaScript for front end work, it's | not like they could just switch to python | | Sure you could. You can develop for the web in practically | any language you like these days. People use JavaScript | because it has native support for the DOM that nothing else | can match. Until we get away from the DOM for application | development, it will always be king. | magila wrote: | That has nothing to do with Javascript's merits as a | language though. It's simply the only language browsers | expose the DOM to natively. | aphextron wrote: | >That has nothing to do with Javascript's merits as a | language though. | | Sure it does. DOM support is built into the very core of | JS as a language, and that has shaped the entire history | of its' development and subsequent API choices. It's not | just a library that it happens to support, the way it | would be with any other language. | roofwellhams wrote: | Try to debug that nightmare. Usually you'll need to debug | compiled code. | gentleman11 wrote: | Do sourcemaps not help? I'm not experienced with python | to js, but they help with minified js | nsonha wrote: | Example of inconsistencies? comparing to what? If you're gonna | cherry pick some outdated es5 to make that point, dont bother. | makapuf wrote: | Iterating over an object keys, an array or a map? | kingdomcome50 wrote: | I would expect, given you have described an operation on 3 | different data structures using different words, that it | would also demand 3 different kinds of syntax/denotation | no? Your own language requires as much. Why not JS? | makapuf wrote: | Well in python by example you use for x in myobject to | iterate and that's it, no Object.entries(myobj) vs. | mymap.entries , lua is even more consistent, .. | [deleted] | frankenst1 wrote: | for(let x of Object.keys({a:1})) {...} // Object keys | for(let x of [1]) {...} // Array | for(let x of (new Map().set("a",1))) {...} // Map | neya wrote: | I maintain systems written in Ruby, Elixir and PHP over the | years. Every server side code written by me even as old as 5 | years ago, works with very little modification required for | today. | | But the Javascript part is the one that always causes me hours- | days worth of work into Rabbit holes. And by JS, I don't | necessarily refer to the language alone. It's the entire | ecosystem. | | Oh, `npm install`? You just found out you got like 1000+ | vulnerabilities. Alright, good thing it told me actually, let | me update. | | BOOM! Babel doesn't support this specification in this file | anymore because it's nonsensical so you have to do something | else now. Ok, BOOM! Babel deprecated that now, you have to try | this workaround. Oh, wait. Actually, there is no workaround. | You gotta downgrade your node version. | | Ok, let me downgrade. Oops, that package isn't supported | anymore on this node version. Oh, you need to replace this | because it's no longer maintained. | | I literally never had to go though this pain with any of my | Elixir backend projects. | | Fuck Javascript | [deleted] | Rompect wrote: | Sounds a lot like the external packages are the problem. | adevx wrote: | 1: Trying to fix every vulnerability in any nested dependency | is probably not what you want to do. In my experience only a | tiny fraction has an attack surface and most are duplicates. | 2: Webpack is a monster and updating webpack will always | result in a lot of work. If possible use a well supported | framework that incorporates Webpack, like Next.js or Nuxt.js. | Updating will be a breeze. 3: Don't wait years before | scanning for issues, update on a set schedule so it won't | become a huge task once a critical issue is found. | a1371 wrote: | You're comparing Elixir & Ruby with Babel, not vanilla | JavaScript. You are putting your code on non-standard | JavaScript, that's on you. | dragonwriter wrote: | > You're comparing Elixir & Ruby with Babel, not vanilla | JavaScript. You are putting your code on non-standard | JavaScript, that's on you. | | Babel is the only way to use modern _standard_ JS without | excluding older browsers. | austincheney wrote: | I completely disagree. The TypeScript compiler allows you | to specify a compile target against a version of | JavaScript. That means you can write modern TypeScript | and have it compile to ES3. | midrus wrote: | So npm gives you warnings about vulnerabilities and that's a | bad thing? | | You notice you have thousands of outdated dependencies and | that's a bad thing? | | I used to work a lot with python years ago, and the only | reasons we didn't have this problems was because the packages | management was so terrible that you didn't even notice you | had to update dependencies or that they had vulnerabilities. | heavyset_go wrote: | > _So npm gives you warnings about vulnerabilities and that | 's a bad thing?_ | | > _You notice you have thousands of outdated dependencies | and that 's a bad thing?_ | | This is a weird reply considering that the OP literally | said those were a good thing: | | > _Oh, `npm install`? You just found out you got like 1000+ | vulnerabilities. Alright, good thing it told me actually, | let me update._ | | The bad things are in the lines that follow. | lanstin wrote: | Diff being you usually have like five python deeps for | every hundred npm deps a d you can do the old school thing | and subscribe to the security alerts for those deps. The | difference in number of deps means you have the cognitive | space to understand them. Npm needed to automate because | the numbers are too high. One of python's old selling | points was "Batteries included". And the idea is fewer | large library rather than a bunch of tiny libraries. | | With a small number of deps where you skim the development | DL, you know if there is a security issue or a cool new | feature you want. Also it has more of the Unix C philosophy | of don't break stable APIs in new releases. So upgrading | mostly just worked. (Stuff like deliberately breaking old | SSL protocols aside). (Until python 3 of course.) | jonnycomputer wrote: | I got to pains to limit how many python external | libraries I use, for all these reasons. But because | Python is so capable on its own, it works. | Draiken wrote: | Most languages I've used don't *need* to have 1000 | dependencies like JS does. | | They also don't have thousands of projects depending on | ridiculous packages like left pad because they actually | have a standard library. | | The surface of vulnerabilities and the brittleness of the | entire ecosystem is the bad thing, not the warnings. | Waterluvian wrote: | I started just despising JS. But with discipline and a well- | configured linter, formatter, and ideally using Typescript, | I've found it to become my favourite language. | | Doesn't mean I'm saying JS is inherently beautiful. But if you | ignore the bad features and do a little setup, it has the | potential to be wonderful. | Cyberdog wrote: | So many people are bringing up TypeScript here as an example | of how JavaScript isn't so bad. I kinda feel like that's | cheating. Like saying eggs are absolutely delicious when | baked into a cake - you're praising something after it has | been turned into an entirely different product. | | Maybe TypeScript is great, but I just don't like the idea of | depending on transpilers to not suck when creating the final | code, and also having to debug that transpiled code, and then | the whole transpilation step in between the standard command- | S-command-tab-command-R workflow (this is also why I never | use SASS/LESS if I don't have to). | | Once JS itself has strict typing and real classes, and enough | time has passed that I can be assured 95% of people using | five-year-old browsers will be able to use it, then we can | talk about the wonders of JavaScript. Until then I don't get | why anyone would use it (or anything that transpiles to it) | when there are so many better alternatives for server-side | development. | | Let's not even get started with Electron. | osmarks wrote: | Why is the transpilation step an issue? You can set it up | to happen whenever the file is changed with most things. | cesarb wrote: | Because it's no longer the same language. You're not | programming in JavaScript, you're programming in | TypeScript, which happens to be compiled to something | JavaScript engines accept. All the praise towards | TypeScript does not necessarily apply to JavaScript. It | would be like praising Assembly while you're actually | programming in C. | goodoldneon wrote: | AFAIK, the only difference between TS and JS is types. TS | doesn't give you anything that's functionally different | than JS -- only types that are stripped during | compilation. You can't perform any logic on types at all | (e.g. you can't have conditional logic based on | interfaces). | | Comparing assembly/C to JS/TS doesn't make sense. | Cyberdog wrote: | With most things, yes, if the implementation for that | feature supports your operating system, and it doesn't | take long enough to be noticeable, and there's no weird | caching issues at any given level, then yes, it's | transparent in that case. | | Or you could just write the JS directly and be done with | it. | Waterluvian wrote: | People occasionally rely on compilers. I don't really see | this as much different. | | At the end of the day all I care about is if I build the | products and solve the problems I'm hired to do. Beyond | maintainability, the "engineering" stuff is a distraction | we need to be careful not to obsess over. | lanstin wrote: | Well yes. But as the problem solver, there is nothing | better than when someone has a problem, and you have a | solution ready at hand which came from lambda calculus or | distributed systems tricks or some crazy shit from On | Lisp. That is why they are paying you, not to cranks out | good dutiful straightforward solutions but for clever | ideas that are simple to implement and operate. The | engineering is both awareness and skill in following | processes to get great cheap and effective solutions. | Otherwise you end up with 20 million lines of code and | all the aesthetically sensitive people have have to leave | the company. | mnahkies wrote: | > I just don't like the idea of depending on transpilers to | not suck when creating the final code | | How does this differ from trusting a compiler or | interpreter? | | Every language has to be translated to machine code in some | way. | Cyberdog wrote: | > How does this differ from trusting a compiler or | interpreter? | | When was the last time you found a bug and it was the | compiler or interpreter's fault? | | At any rate, the big difference is debugging, as I | mentioned above. How fun is it to debug code which you | only kind of indirectly wrote? | mnahkies wrote: | The code output by typescript is generally pretty | readable depending on the target, and the source mapping | works very well regardless. The debuggers in all major | browsers and ides handle it fine. | | I've not come across any bugs caused by typescript itself | in the time I've been using it since 2014, and my point | was that this is the same for c or any other language - | how fun is it to debug assembly you only kind of wrote | j45 wrote: | Nice read. I wish something would speak to the increased | brittleness of software in this world too. | jonplackett wrote: | Another really good resource with a lot of examples and | explanation: https://javascript.info/ | jonplackett wrote: | https://web.archive.org/web/20210515151920/https://turriate.... | tyingq wrote: | Site seems a bit overwhelmed, archive.org copy: | https://web.archive.org/web/20210515151920/https://turriate.... | sandrot wrote: | thank you. I had to change my idle connection timeouts. Eeep! | tomxor wrote: | There's a lot to like in modern Javascript, pretty much | everything in the list I appreciate. | | The only thing I wish was never added is the new Array Functions, | I mean, ok they are "handy" sometimes, but they seem to get | abused heavily. Newbies like stringing them together and even | nesting them, when they could have achieved the same with a | single for loop and the same number of lines. In other words they | seem to encourage people to artificially increase the complexity | of a problem without any objective improvement in legibility, not | to mention lots of GC work with throw away arrays... many people | don't seem to even be conscious that under the hood of most of | the array functions is just another iterator of some kind. | halfmatthalfcat wrote: | Newbies aren't the only ones stringing them together and | nesting them, even seniors like me are...to great effect, | increased readability and are safer than potentially dangerous | mutations. | | I teach all my reports to lean heavily into the new array | functions because, if wielded correctly, are much more powerful | than using for loops while using less code. | contriban wrote: | Many array looping functions have been around since ES5 and | I've been personally replacing them to for-of loops with very | few exceptions (.map() and .filter() remain handy) | | Useful fresh additions are .find() and .includes() | rm_-rf_slash wrote: | Vectorized array functions are easier for the compiler to | optimize than for loops. Once things get nested the performance | comparison isn't even close. | Etheryte wrote: | As a standalone idea yes, however in practice this is not | actually the case [0], mostly due to those methods having a | number of extra checks, more functionality built into them | etc. | | [0] https://stackoverflow.com/q/21037888/1470607 | rm_-rf_slash wrote: | Fair point, although as the answer states, it depends on | use cases. Working with small datasets the performance | difference is negligible, but with decently large datasets | (~1-100mb) and nested loops the delta is night and day. | Buttons840 wrote: | That is a valid opinion, I agree there are advantages to plain | for loops. However, it is not a universal opinion and I would | argue against the for-loop, sometimes. Some languages people | love do not even have loops. | | You never know what structure a for-loop will take, it could | break early, skip items, build a new data structure, mutate a | data structure, or all the above. If I see a map and a filter, | I know exactly what each does. | | I don't want to argue over which is better. Pros and cons. I | just wanted to say that chaining and nesting array functions is | not a reliable sign that someone is a "newbie", maybe they're | just someone with different preferences. | django77 wrote: | I've usually seen more complexity with single for loops and | having complex logic mixed with imperative approach also makes | it a lot harder to read. | | Array methods convey meaning a lot better. There are some cases | where performance matters, but usually the performence cost is | negligible. | tim1994 wrote: | I just wish those methods were available on iterators (and | return iterators when called on arrays) and a collect method | that creates a new array (a bit like Java). That would reduce | the overhead and keep the advantages of this functional style. | globular-toast wrote: | A for loop is an imperative construct and can be used to do | literally anything. One has to read on into the body of the | loop to understand what's going on. Worse, there could be a bug | and now you have no idea what the programmer intended. | Array.map, on the other hand, only does one thing: turns an | array into another array. The intention is clear. It makes a | program much easier to understand. | jjnoakes wrote: | In javascript, what prevents the body of the map function | from doing arbitrary stuff? Don't you have to read that to | know for sure, just like a for loop? | | In some languages the map function may be restricted to not | have side effects, in which case I'd agree, but not | javascript, correct? | globular-toast wrote: | You can't stop bad programmers doing bad stuff. It's not | about that. It's about communicating intention. Code as | documentation. | lanstin wrote: | There is nothing more clear than code as a way to | communicate, at least for me. My writing in English | obviously could be better but easier just to show what I | mean. | django77 wrote: | This is correct, but there are some guarantees such as the | result will be an array of the same length, mapping | function will be called for each element, function itself | can be more easily tested in isolation and there are no | imperative constructs (creating accumulator array outside | of the scope, tracking the index, pushing to the | accumulator array) | | This lends itself very nicely to functional programming | (especially with typescript IMHO) | jamil7 wrote: | As someone who works in a few languages I find the array | methods really handy as they work similarly. It's usually a bit | clearer to me what the programmer's intention was with them | rather than a straight for loop. | malobre wrote: | The page HTML is weird, there's no `<html>`, `<head>` or | `<body>`. | butt__hugger wrote: | None of those are needed for proper HTML; they're implicit. | vmception wrote: | > The async/await keywords are here to save you from callback | hell | | but does it? | stevula wrote: | Absolutely, unless you're using node or library functions that | require callbacks. Even then there is usually a non-callback- | based alternative or you can wrap in a promise to use | async/await. | amerine wrote: | Hey Sandro, it's been a long time! Excellent post! | sandrot wrote: | Thank you, Mark! Super long time. ___________________________________________________________________ (page generated 2021-05-15 23:00 UTC)