Occasionally a post is written about a technology that critiques what the author feels is entirely wrong with it. First, this is the beauty of the web: we all get to share our opinions. But we must also remember that just because we heard it on the Internet, doesn't make it the single source of truth. These opinions are interesting to read, but when the arguments are broken down the real truth usually comes out. This leads me to a recent post title What's Wrong with AngularJS. In a nutshell it makes it sounds like AngularJS is a terrible option. The author criticizes declarative HTML and two-way data binding, as examples of "what's wrong", but the substance behind it (the "why") is either missing or author's preference. Some of the comments are quite interesting while others I just chuckled. Hey, preference is fine. We all have our comfy blankets but I've often found it's important when stating a case for or against something to share "why".
My friends Dan Wahlin, Ward Bell and I were chatting about this and while I normally do not respond to these types of posts, but I imagine some folks may be wondering what is true and what isn't. So I want to offer some insight into my experience with Angular regarding the points the author makes, and then you can make your own decisions.
Without further ado, I'll explore the main points in the "what's wrong" post and share my thoughts.
Declarative HTML (I think) ?
App logic and structure expressed in HTML, which is enchanting for beginners (Look’ma no JS, magic!), but terrible for real development
Can you write poorly written Angular declarative code? Certainly. But you can also write poorly written C#, Java, ASP.NET, or any other language/platform. When you break down the application needs into smaller components (whatever the technology) it becomes easier to compose reusable pieces. When you create coupled inter-dependent code, it is harder to maintain. This true of Angular just like any other tool in your belt.
Let's get to the real meat of this ... if you do not like Angular, then don't use it. Certain technology stokes passion in some while making others go "meh". This doesn't make it "terrible".
Debugging an HTML Parser?
Angular is HTML parser. I really don’t want to debug any string based parser instead of my code
Two way databinding is an anti-pattern.
Really? Why? What is the alternative that is better ... and why is it better? No quantitative evidence is provided that there is a real cost to data-binding that would substantiate it as an anti-pattern. if we travel this road without data binding we could take our 20 data properties and map them to HTMl elements, locating them in the DOM and stuffing them with information. Then we can pull those data values out of the elements as needed too. We can also hook up event handlers for on blur, on click, on change. It's grunt work and data-binding makes this easier, often with considerably less code. Data-binding is not the holy grail, but it qualifies as a time saver and writing less code. Less code to write equates to less code to maintain or break, too.
I completely disagree with the author's point entirely. But again, data-binding is a choice. A preference. If you choose not to use it, great. But it is not anti-pattern.
While it certainly makes for a nifty demo, and works for the most basic CRUD, it doesn’t tend to be terribly useful in your real-world app
This is from a comment about data-binding in the post. Dan and I both wrote about this and I completely disagree that it is just for demos. Why is it just for demos? What makes it be not "terribly useful"? I've written tons of code with data-binding with KnockoutJS, DurandalJS and AngularJs as well as Silverlight and WPF. Many of these apps were very large, very useful, and not very basic. Data-binding was a key part of these apps and helped reduce code, make me more productive, and light up these apps.
My friend Dan says it best ... and I can't improve on this as I feel exactly as he does: "If Angular went away I’d still be a fan of two-way data binding." Dan goes on further to say "I’ve gone the other route where you manually handle getting the data back into the model layer from the UI and its not fun, very brittle, and much harder to maintain." Seriously, data-binding may not be your cup of tea, and I respect that. But as long as I've been using it, it has treated me well and provided a ton of efficiencies.
Dirty Checking and Object.Observe ?
Dirty checking, accessors (Ember and Backbone), Object.observe and all that stuff. Wrong! It’s slow and brittle and it will consume mobile battery like hungry dog, for no reason
The digest cycle is one place that feels like magic to some. It works in Angular and performs quite well. Can you get in trouble with it? Sure. But there are ways to avoid falling into holes, bindOnce is a great plugin, and AngularJS 1.3 is building in performance improvements for it (checkout the changelogs, too). Even without all of those there is a lot you can do without ever worrying about the digest cycle. I feel more comfortable in a observable world, but the author also lumps that in as "wrong". So none of these leading frameworks are right? Maybe. But they solve a real problem by handling changes and responding to them. Otherwise we need to write code to do that.
The slow and brittle comments are not substantiated so it's hard to quantify it. When is it slow? Slower and brittler than what? What's the better approach? Not much here to go on. I'm not arguing there aren't better ways ... there almost always is a better way to do everything, but I've seen no evidence that these are "wrong".
I hear this type of argument a lot with mobile about pushing too much to the device and making it do too much. The mobile devices are pretty darn fast today (quad processor anyone?). Lots of data ... of course you don't want to push a ton of data down a thin wireless pipeline to a mobile device. I find I'm not pushing a lot to mobile devices and I can only display so much anyway. So if there is any cost to doing this extra processing for dirty checking on the device, it hasn't reared its head in a tangible way for me to have to consider losing the productivity that Angular brings to mobile, especially when combining it with the Ionic Framework.
Duplicated App Structure ?
Duplicated app structure with obsolete angular.module.
Angular motivates you to use modular components. It makes it easy to break things apart and decouple. So I'm not sure why this is a bad thing to create modules. I'm shaking my head at this as I type. I'm just not seeing this as a "what's wrong". This makes me think i do not understand what the author means.
Going further down the module road there are improvements that I'd love to see. One of which is making it easier to take a large app and load angular modules on demand. RequireJS allows us to do this as a bundle or as file by file. But often my apps are constructed in groups (or bundles) and I want to load each bundle at a time. Can I do this? Sure. But it's not straight-forward. I'm digressing just to point out that there are places where Angular can and will improve (cool stuff coming in Angular 2.0 from what the team has shared publicly already), but the author's point missed me entirely.
Dan writes "I’m not sure where the author is going with this point given that Angular is very modular" ... exactly, what's the point here? What else is better? You can break the app up as you please. You can decouple components. And you can even decouple from any back-end, cloud service, or 3rd party libraries to work in concert with Angular.
Angular is slow
I used to hear this a lot, but not so much anymore. I think folks "thought" it was slow due to the digest cycle. Can it be slow? Sure, so can any code. What bottlenecks can you encounter? Perhaps 2000+ active bindings on a view (a suggested by some with experience). But we can battle that by reducing those bindings, ng-model-options or even using bindOnce (or both). Look, we can make anything slow .. Ember, Knockout, React, Durandal ... but we learn how to be better at avoiding poor programming practices. hey, we all fall down, but the trick is to learn form those mistakes, not cast the tool aside and say "bad tool".
Slower than what? What are you doing and how are you measuring slow?
At best this means you can write code that is faster than what Angular does. But what are you buying by doing this? What does it cost you? Saying "slow" is the wrong way to think about it, instead we should be thinking about if we need to improve performance and what measures we can take to get there.
Server-Side Rendering ?
No server side rendering without obscure hacks. Never. You can’t fix broken design.
There is absolutely not server-side rendering in Angular. Correct. There also isn't a hybrid engine or a talking dog in Angular, but I don't expect those to be there either. Angular is a client side library using Single Page Application (SPA) architecture concepts. It stays on the client and, in my opinion, thats one of the big draws to it as we get to keep the user on the client, avoid time consuming and poor user experience round trips to the server and back.
My best guess is that this has to be a reference to Search Engine Optimization (SEO). So let's assume that is the case. This is probably the biggest area of improvement that is begging for a better solution in the SPA space. Some companies must have SEO ready applications and it is not simple as it should be to use it with Angular. However, there are ways to tackle it such as prerender.io and these techniques. Google has stated they are aware of the rise of SPA (ahem, Angular) and are working on making the crawlers more aware of SPA apps. So let's call this what it is and agree SEO is far from elegant in SPA, but it is not unique to Angular.
Hard to Learn ?
Angular is hard to learn
Is it? And if it is, is this unique? React, Ember, Durandal all have learning curves and who is to say one is harder than the other? That depends on your experience mostly.
I argue that Angular is easier to learn pound for pound for what you get out of it. Is there a lot to it? Sure. I'm still learning things about Angular, but then again I figured out most of what I needed to build apps in a week with Angular. Watch Dan's video on Angular in 60-minutes-ish and see for yourself.
The author says "You have to learn a lot of Angular specific patterns useful only in Angular world. Yeah, its result of bad design. ". What's a lot? What patterns? Single Responsibility goes a long way with Angular and it certainly is not specific to Angular. Ive been doing that for years in many technologies. In fact, a huge part of my attraction to Angular is how I am able to apply many of my experiences directly to its concepts. I find there are many similarities of patterns that Java and .NET developers can make that slipstream the learning curve. DI, separation, modularity, data-binding, templating, MV* ... ? Been there. Are there new concepts? Sure ... dirty checking and the digest cycle stands out for me, but it doesn't hamper my productivity.
This point is all subjective.
Gmail and Angular ?
Google does not use Angular in production for their flag apps like Gmail or Gplus
Maybe not but they do use it internally and also publicly in apps like AdWords or Youtube. Regardless, this is not "what's wrong". Moving along.
Vendor Lock ?
Vendor lock. And because Google does not use Angular in production, they can kill Angular anytime
Sigh. I'm tired of this argument. I hear it every year about some technology. "Will X be here in 10 years?" Seriously?
Let's face it, we can't count on any vendor or author to support a tool forever. We always want long term support. Could they stop working on it? Sure, anything can happen. But is it likely in the near term? Heck no. And if Google did stop applying resources to Angular, what do you think would happen? Would it disappear entirely or would the OSS community pick it up? Or even another company and continue running with it? Who knows, but I don't spend my life worrying about the sky falling, personally.
How is any other framework proving that it will be here forever? React, Durandal, Ember, Knockout ... please.
All I know is that Google has a dedicated team working on Angular 1.x and Angular 2.0. Beyond that the community is thriving and building tremendous things around and integrating with Angular. It's pervasiveness, popularity and upward momentum are perhaps why it is the target of these attacks. That's kinda funny to me :)
Angular 2 ?
Will be rewritten entirely soon, which is a good thing for framework, but pain for you.
This is "what's wrong" with Angular? I tend to think of evolution of a framework with a full time team working on making it better "what's right" with Angular.
Is there pain in upgrading to a a new version? Sure, if you upgrade. But would you? If your app is working, why upgrade? New apps won't suffer this. Existing apps should carefully consider the ROI to upgrading or staying on 1.x. Do you have pain? I don't label learning as pain, but maybe that is what the author means.
Angular 2 has a lot of great features and promises to address some of the difficulties, make mobile easier, improve routing, and more. There is a trade-off for using the latest and greatest. You need to weigh the cost vs benefit and decide. That's all. And this is not unique to Angular.
Where Are We ?
One ring to rule them all doesn't exist. We are human and we will tend to search for it, but often the "right tool for the right job" is a more productive mindset. Angular isn't perfect. Nor is any other technology option in the Web space. But it solves a problem. If it solves your problem, then stick with it. If not, choose something that does.
Dan also wrote about his perspective, which I highly encourage you to read too.