Web Programming Is Getting Unnecessarily Complicated
en.arguman.org
en.arguman.org
Over 90% of the time that prototype turns out to be good enough, either because the problem is abandoned or remains at a level where a rewrite isn't worth it.
So far I haven't regretted not investing time into learning Framework X every few years... Although I'm probably going to start deploying React instead of plain JS soon. The library is very useful for real-world UI problems, even though it's surrounded by a deafening amount of toolchain fetishism which tends to cloud React's fundamental simplicity.
(I'm 36, started writing C in 1990 and HTML in 1995, so I feel somewhat old in this industry already.)
> The library is very useful for (?) UI problems...
Components are good. But they didn't come from React and React isn't the only place to get them. Angular 1/2, Polymer, Ember are great in comparison. And so much more simple. React's position on simplicity is that the demos on the site are all 15 lines so that means it's simple right? You can't say it's complicated because it's 15 lines, see? It's "easy to reason about", i.e., "you're not smart if you don't get it".
Once you see the toolchain and ecosystem you will glimpse the price of those 15 lines.
> ...toolchain fetishism which tends to cloud React's fundamental simplicity
This is a very real thing. People who work in React spend way more time fixing toolchain stuff and trying to mix 10 artisanal-crafted "easy to reason about" libraries in order to accomplish tasks which are either solved or not even issues in other component frameworks.
Brevity isn't simplicity. The simplicity is being easier to install, build, read about, debug, consume APIs with, send data between, talk about to other developers... and yes, "reason" about.
myMod.component('Foo', {
template: '<h1>{{$and.better.templating}} {{see()}}</h1>',
controller: function() {
var and = {this_one: 'does_stuff'};
}
});Maybe I'm wrong but I feel like Angular likes to force projects to become big monoliths where people who don't understand the problem being solved are trying to architect a solution for all of the problems.
React does have jsx shock and JavaScript tooling fatigue. However, now that React is mature JavaScript tooling decision fatigue should be less of an issue. You aren't relying on one company to solve problems. You have a community solving problems for themselves. As they need it they can add it or take it away.
It's perfectly possible to just use React on its own, without getting bogged down with all the other buzzword-of-the-week stuff around it.
React itself has been reasonably stable for a long time in Web terms. It is much more tightly scoped and smaller in its interface than most JS frameworks. There are a couple of major design trade-offs, which often seem to get overlooked in React advocacy, but if you have a bit of experience using it and understand the practical pros and cons then you can quickly decide whether the balance is favourable for some new project.
People who work in React spend way more time fixing toolchain stuff and trying to mix 10 artisanal-crafted "easy to reason about" libraries in order to accomplish tasks which are either solved or not even issues in other component frameworks.
Some people who work with React might. Plenty of others don't.
When I first started with React, it felt awesome - just React still feels great. But I had just started then and then got introduced to redux (I had been using something similar custom built). That was good too, until I learnt react-redux. I get the concepts, I understand every bit of it and have used it correctly in many large apps - it is useful. But react-redux just feels awkward many times and I consistently feel something is wrong with it - but I don't know what. React-Redux just feels disconnected with the idea of independent web-components.
On a side note - If one is okay moving to Typescript, Angular2 is just amazing.
Define "meaningful".
You might want to spend some introspection time on that statement.
That's what nearly everybody does, when they're one person hacking on a one-off project.
I like to hate on Big Web Frameworks as much as anyone, but it should be understood that their value isn't replacing your hand-rolled code, their value is to let big 20-person projects avoid having 20 different flavors of hand-rolled code.
There is a difference though. When there's a big framework involved, discussion will tend towards "Is this the right way to do X in Angular?" rather than "How do we want to solve X?". That may be good or bad, depending on whether you want to build your career around being an "Angular expert" (or a "Rails expert" or "SAP expert" or "COBOL/IMS expert" or any other kind of framework expert).
https://github.com/johnpapa/angular-styleguide
We didn't need an expert.
I don't want to be hunting all over my code base just to figure out what is happening in a controller or component.
JPs styleguide is awesome!
Or we could just adopt good coding standards and build with reasonable software architecture. That's been working for longer than anything like the modern Web has existed, to build software orders of magnitude larger than any web app by any useful metric I can imagine, without the need to resort to huge frameworks to keep growing code bases organised and consistent.
Now that I think about it, the zeitgeist here really does feel like those cheesy "Learn C++ in just 20 minutes a day!!!!!" books
There seems to be a new generation of developers who think that 10,000 lines of code is a big program, a web app doesn't need to last more than a year or maybe two at most, and any sort of in-house programming or software design work will be inherently inferior to any external code you can import instead. These people are probably doomed no matter what they do.
There's a certain irony that in the one clear exception to that rule -- if you really are building a throwaway MVP in the expectation that it will either fail quickly or succeed enough be be worth rewriting properly later -- it mostly doesn't matter what tools or practices you follow. As long as you have some basic competence regarding security and you're keeping any important data somewhere safe so it can be transferred reliably to a new system later, the strategy is what it is. However, that also means many of the claimed advantages of frameworks are irrelevant to such projects, because you don't really care about things like longevity or being able to hire more developers already familiar with the framework or keeping growing teams consistent in how they design a growing code base.
This one made my day xD
10kLOC is a top limit for my programs (I say that whatever has higher line count starts boring me), and those were just small tools for sysadmins since forever.
Web frameworks have architecture to them, but their value lies in solving technical problems, not architectural ones.
I respectfully disagree. You don't need a framework to do any of those things.
I do a lot of work with relatively complicated browser-based UIs. In my experience, the DOM/layout thrashing and jank issues that have been getting a lot of attention lately only became a big deal in the first place because the early frameworks were so horrifically slow compared to just doing manual updates of exactly what you needed to change. Even in the most demanding applications -- and not many web apps actually are this demanding -- you could achieve pleasant, smooth results with some modest attention to how you applied updates so you didn't cause the browser to regenerate layout unnecessarily. (This would be an example of a useful coding standard, BTW.)
Flashes of unstyled content/text/whatever are a symptom of serving web pages in chunks and how browsers render incrementally as more of the chunks are available. Again, dealing with these effects just requires some understanding of what causes them and a little care in how your site/app is served and does its initial setup. The frameworks don't do anything magic that you can't do in your own code.
And finally, we were solving cross-browser portability problems with script repositories and then libraries like jQuery a long time before any of the modern frameworks were on the scene, and in a much more varied environment in the early days. IE has certainly had its issues over the years, but for the most part at least the issues were well known and you could just work around them. And again, there weren't really that many horrible issues, and this was an area where having some basic coding standards worked OK even if for some reason you didn't want to just use one of the many utility libraries.
If you or your company needs a basic website, then wordpress will almost always take you as far as you need to go. There's not a huge need for devs and nobody who's good at the web wants to be there because it's a race to the bottom financially. That part of the web (the overwhelming majority I might add) is pretty stagnant with few real changes or advancements having happened in the past decade.
Apps failed in that nobody wants to install your app on their device unless it's a game, a free utility, or one of a few popular apps made by large companies. WebOS got the idea of web technologies right, but the devices were too limited. Today, the idea of a web app that runs everywhere is very appealing and much more accessible to clients. All the new frameworks are really targeting this kind of use. Pounding the square that is web apps through the round hole that is the browser is hard, but still better than the alternatives.
If you're making a website, jQuery and simple JS is usually all you need. If you're making a web app with complex data and complex UI, you need a framework to keep things sane.
It's only the complex UI which requires JS frameworks and libraries, but building such a UI is already a losing proposition and the main reason why web programming is getting "unnecessarily complicated".
Web developers think that web apps can compete with native applications - they still can't and in the process of trying to get them there, they turned the process of building websites into a mess.
Only if you make a baseless assumption about the user's internet connection. Someone whose connection drops out regularly, or who faces periods without a connection at all, is going to hate your server-side app compared to my offline-first progressive web app that they can have cached on their device and that syncs their changes using pouchdb/couchdb.
My app will have a ton of JS that yours doesn't, but that extra code makes it work when they're not online. That's a huge advantage.
Not all progress is designed for added shininess. Some of the changes that are happening are designed to fix real problems that people face.
There are a lot of things that you have to do regardless of how the app is delivered - you need to work out what the app actually needs to do, you need to design the business logic, you need to design the look and feel, you need to get the UX right, you have to throughly test it. On a decent size app, the job of actually writing the code is about 25% of the work required. In my opinion, something that represents a quarter of the project probably shouldn't drive the entire process.
https://developers.google.com/web/fundamentals/getting-start...
As it is though, the API for file system access in JS might not be standard yet (and might never be) but it works well in Chrome: https://developer.mozilla.org/en-US/docs/Web/API/File_System...
If that's not the case, it's pointless to create a web-based product. Just offer the full thing as an app and a simple web UI.
I looked at the WaPo link that you posted and it seems to be exactly this type of product with an identity crysis - my browser already allows me to save pages for later reading and if that won't work, there are a multitude of offline reading apps to choose from, I don't need a WaPo "progressively enhanced" app for that.
For such an app, having a longer load upfront in order to facilitate vastly better UX than using purely server-side rendered pages is a huge win for our customers, and having the time to load & interact being low also adds tremendous value to the customers, to the point that they flock to us over our competitors.
I don't find myself having a problem with frontend web app architecture - most of the problems out there are already solved or solvable with a little time spent on thought, but the knowledge is not widespread, and so we have a lot of people who have never seen what good structure looks like.
There's always cases where it makes sense to make use of particular technologies. It absolutely does not make sense to transform most websites into web apps that are completely broken without JavaScript, which is what's happening right now.
Literally every time I update one of our sites using a Facebook SDK, they've changed around how the whole SDK is designed and I have to rewrite basic things like session management.
Let's face it, classic front-end web development works fine and is well understood. Doesn't get you into conferences or help you sell courses.
So we get the web of today, piles of Javascript and unnecessary complexity all wrapped together with ads and tracking. And excuses about how today's customers expect an app-like experience.
Yes. If anyone has evidence of this I'd love to see it.
That soon changed. In learning about programming, one can't help but to come across the writings of those preaching the gospel of the holy virtues of 'reusable code'. Modular code, libraries, object-oriented code, design patterns, frameworks, plugins, APIs, services, stacks and toolchains!
So programming is now largely about resolving a ton of dependency issues and getting scores of different modules, frameworks, libraries, APIs, etc. to play nicely with each other. Instead of using our brainpower to understand and model the domain problems that are ostensibly the reason for our software, we're using it trying to figure out how the heck to glom together all this generic abstract code and modify the output to vaguely resemble something in the domain, in a way that won't perform so horrendously that customers immediately give up on it.
We write hooks, overrides, and underrides to throw out the work that the reusable code is doing and get it to do what we want (more-or-less). We write translation and adaptation and bridge layers to convert the data structures used by one module to those used by another (and vice-versa) and eventually to something roughly approximating the domain data. We set up elaborate clusters of interdependent modules, submodules, plugins for our plugins, all on top of a generic framework that wasn't even designed with the domain in mind.
As a profession, we've gone way too overboard trying to do everything with reusable code. This is why it can take several hours to do something as simple as change a link (and that can completely break something seemingly-unrelated elsewhere in the system). And it's kind of amusing that we're now adding layers of complexity to manage the layers of complexity.
I want to get back to focusing on building logical models that fit the domain, solving problems, and simulating things. For that we need a new doctrine of vertical development that doesn't just religiously say "Throw another layer of indirection and generic abstraction on it! Yay reusable code!" as a sacred solution for everything. Sure, code reuse can be good, but let's be sensible about it, not kid-in-a-candy-store crazy.
Now I can assemble a website that works everywhere and has best practices, by expressing exactly what I want in high level code. When modeling a new app or talking to our developers about architecture, we can use a common language of users, communities, streams, access, realtime pushes and offline notifications etc. People know what I mean when I say "the Patients/account streams should be published by the community and have Patients/photo stream templates for the admin role, related to Patients/gallery category stream published by the logged-in user."
Everything is namespaced, reusable, interoperable and works on every device. It took a long time to make the system but now we can assemble apps like out of building blocks, and have anyone work on anything and know what the conventions are. So yeah, it's paid off!!
Now I have some choices: allow javascript in order to read plain text, or ignore your web framework.
Guess which one I picked.
This is the often-forgotten cost of competition (for all its merits) as opposed to cooperation: it wastes time and energy.
I do not buy that this is a problem. It's not an apples-to-apples comparison, but anyone can publish a 'book' on Amazon as easily as publishing an NPM module (and they do), however, no one is complaining that there are "too many low quality books". Why is it easy to ignore books but harder to ignore shitty projects? Similarly there are countless instances of bad poetry online, and very bad fan-fiction, but the sky isn't falling in the literary world. Can someone educate me: why do other people's shitty software projects elicit such strong reactions?
They also don't purport to solve a specific problem. (Like left-pad.)
And they're not boosted by a FOSS ideology which their existence a political choice and not just a practical issue.
So basically interdependence. You need at least some external code to finish most projects, and the chances are good it will be somewhere between overcomplicated, unreliable, poorly documented, poorly maintained, and unnecessary.
Maybe package managers need active best-of-breed curation and industry-wide coding and documentation standards. But professional standards are anathema to the move-fast-and-break-things crowd, so I doubt that will ever happen.
If you want to make a comparison you can equate things to hardware where things like quality control and yield is instrumental. If you buy a plastic case that after a year self-disintegrates because while it looked the same it wasn't manufactured to spec. When this could potentially happen to every part of your device this quickly becomes annoying.
Yet, this is how software is all the time and is further worsened by a lack of due diligence and quality control. How many developers can get the time to properly verify a technology or library. Not to speak of if it's even fair to expect developers to be able to reach those conclusions.
1: http://www.nature.com/news/there-are-fewer-microbes-out-ther...
It sort of succeeded, but only at the data structure layer. Perhaps the high point of reuse is npm-style dependency-orientated programming, where people really do reuse tiny functions like leftpad(). But it's not stable. Because nobody is interested in providing that stability, and there's no money in it. There can't possibly be, because nobody will pay for tiny software components like leftpad. The market doesn't exist.
You can't second-source leftpad(), and that makes it possible for one person to break a lot of random builds across the world.
The interesting bit is that these people are often very eloquent and convincing in making others believe that they have an objectively better way to program, and that this is THE way to advance in the field, and not just some elaborate game created to stave off boredom. Never mind the fact that you're still just doing things like validating phone numbers and moving buttons slightly to the right. This is nothing less than the future of computer science!
So you end up with a herd effect where greener or less-capable developers follow these "thought leaders" blindly, resulting in the fragmentation we're in now. I find it interesting how "Five Whys" has made its way into dev culture as a line of questioning for business requirements, but never for tech requirements. "It's getting more and more popular every day," or, "It's going to look great on your resume," is often the end of the discussion.
But what is simple, really? Let's look at some past experiences:
1. At a very first gig, when I was doing my very little first steps in this software thing, I had to build a website prototype. Pure static html pages inside a folder, that were linked to each other, didn't need to deploy, it was just a demo. It didn't use CSS. It didn't use a template engine. Really simple. But, every change was a PITA, because the website had a header, so every change, meant you had to open the file, and rewrite the whole header... in all files, manually!
2. In another moment of my past, I had to do some changes in an app was built with JQuery. JQuery is a library, but it's pretty simple. Select dom elements, and apply changes and hook events up. Simple.
Only, following and understanding the flow of the app was hard as hell. Each page had a lot of code and it wasn't obvious at all what was happening. Complex transformations of the dom were daunting. Small changes would break in intractable ways.
3. PL/SQL Stored procedures + tables. Pure SQL + structured programming is simpler than objects, and way simpler than using ORMS. Of course we had no tests, so less stuff to look at. I'm not even going to describe the downsides because you all people surely know that.
My point is, let's always look at the other side of things, and really weight at all the tradeoffs. I get what you mean but when I read a line like:
> I want to get back to focusing on building logical models that fit the domain, solving problems, and simulating things.
I feel that it's really a little _naive_. I mean, of course you focus on that kind of things. You need to work on backend, solving some kind of problems. But in some other problems, like for example, visual interfaces, you better be reusing shit.
I'm not entirely against code reuse, sure, reuse bits like visual interface if they fit, but the idea that it can solve everything by just sticking existing bits together is a false lead. It takes much longer than expected and it makes an unmaintainable mess.
I for one will go against the flow (or am I with the flow?) and say that what I see coming out of Angular 2 looks FANTASTIC. Many of the things I love as a Scala developer are finally becoming mainstream on the client side. Add in the promise of NativeScript (mobile apps) and Electron (desktop apps) and this is an incredible time to be a web developer.
Callbacks, promises, generators are all there to essentially make async code sync, which seems to make the code hard to follow, difficult to scale, modularise and debug.
I think JS took this approach because of the limitation of older browsers, which were unable to use threading, so as to not block IO they forced concurrency using queues requiring async style code.
We must have just stuck with it because it's just been around for long enough and it would be hard to get everyone to change.
it's 2016 and I like being able to use the return values of my methods without sweating. PLEASE, for the love of god, replace JS with something with the same cushy syntax but makes sense.
Then again, I could just be bad at programming and not know what I am talking about - I sincerely hope that is the case.
</rant>
I think they actually do quite the opposite: they keep async code async. JavaScript doesn't really have a (non-terrible) way to make async code sync.
Note that I'm assuming that by "being able to use return values of my methods without sweating," you mean "get the thing I want out of the return type somehow." Or, in other words, things like getting a value out of a Future. The problem with that approach is that it blocks the calling thread, so what happens if you have 50 connections? Or 200? Or 10,000?
The same reason I like that JavaScript and JavaScript libraries try very hard to keep things asynchronous is the same reason highly concurrent software tends to be event based rather than thread based: it's simply more efficient.
I think it can be a challenge to keep mental track of state in JavaScript due to the nature of async stuff, but it can also be liberating in a way once you figure out the right way to pack away your state for whatever problem your working on. It makes it easy to break things into small components and reason about pieces instead of the whole while maintaining decent efficiency compared to having tons of threads around.
There's also of course the incredible niceness of JavaScript being single threaded in that typical multithreading concerns are not a problem. If you want to update a variable in some callback, you just do it. You don't have to worry about locking or atomicity, etc. I can't tell you how many times I've ended up with a mess of Java code in which I'm not actually sure if it's correct or not. That's likely my fault, but still something I enjoy getting to not think about when doing JS.
In short, I suppose it just comes down to different preferences. I often find myself working on concurrency in Java and wishing that it were more like JavaScript :). Interesting, the JavaScript approach can be pretty easily recreated in Java (and sometimes a very useful tool), but the Java approach is much harder to do in JS, at least with Node.
Big threaded reactor style designs can be, but those aren't exactly event driven.
Small events generally are the opposite of performance, increasing concurrency and synchronisation dependencies between threads.
If you meant responsiveness or latency, maybe you have a point, but current UI frameworks have been event driven since about forever.
Another factor that complicates web page development is ads. They bring a huge pile of Javascript with them, but they go ignored most of the time and usually are a burden to the user. Ad providers, instead of publishing ads that would indeed get clicked intentionally (like the Deck network), bribe the publishers paying for user actions that aren't actual impressions. Thus they also create exaggerated statistics which they use to lure low quality ads which get the most clicks from accidental behaviour, leading to worse and worse ads that do whatever to catch attention but be actually interesting.
Lastly, it is a fact that coding Javascript is more fun than writing a document. For the web developer, rendering innyeractive graphics with Javascript is certainly more fun than making them with R or gnuplot and insert into the page with an img tag and providing data and code used to generate them.
Seeking Junior Developer 19k.
Must know all the CSS preprocessors, all CMS's, all modern frameworks, all of software engineering, all of the server side in all languages.... Ideally has experience of everything. Must have worked Agile.
Needless to say, 7 years into my actual Web Programming career and I am resigned to being stuck in a bad role. I don't have the confidence to apply to anything since your expected to be an expert in what they announce tomorrow in the next conference (and you had to do it in your own time) and if I do, the pay is garbage.
I personally blame Recruitment Agencies for not having a clue what is being asked for, setting a false market rate (maxium commission = race to the bottom), and making the barrier to entry or even sell yourself impossible.
In short, I hope this year to re-boot my career outside of computing as pretty much everyone I know makes more money than I do.
The only exception is contracting where we charge a bill rate to the client and pay the developer a rate but usually people don't mind when they are making $70+ an hour.
Keep in mind, if you're getting paid a commission only after a deal happens, would you want to make a deal that day for 5% of $1mil, or wrangle for months and risk the deal to close at $1.1mil?
Now sure, 200k vs 1mil is a big deal, but that kind of difference isn't that common. Typically a recruiter would prefer to get a higher salary for you, sure, but not if it entails far more work or risking the deal.
There is, of course, reputation to consider - a real estate agent who develops a reputation of closing deals far too quickly in order to get a quick payday may start to have trouble finding clients.
It's especially the case in regards to agencies, jobs referred by recruiters, etc. And a lot of companies even offer this in places like London, where the rent is far higher.
So web programming should be more complicated because the world we now reach is far more complicated. But I don't feel like complexity has grown nearly as much as potential audience. And when things do get frustrating, such as trying to do a heavy client-side app, I just have to look at the PHP Reddit/stack overflow groups to get a reminder of how truly fucking annoying and confusing it was to build a full stack app a decade ago.
On top of replacement, theres another question "is the common road the best road?". Something as simple as a html5 video tag can be replicated through a canvas, html5 audio and some ui elements. And as things get more complicated, are we better off pretending complexity is the enemy?
The reality is that these are problems all languages have to deal with. The reason the web is getting the most is because its the most widely consumed abd provided. Why be involved in an ecosystem dominated by coorperate entities that would only pay you just enough so you wont leave when you can be in an environment where insanity is an acceptable road to sanity. Why the hell does coffee script exist? It doesnt matter.
With that out of the way... I'm firmly in the "but" camp here. I've been doing web programming for 17 years now. I remember the bad old days. Things were simple if all you wanted was HTML and images (CSS was still pretty iffy). But the moment you needed more than a static page? The complexity of getting up and running ballooned really quickly. And worst of all there were so few resources to really learn from. And it was expensive. Granted I was a teenager back then so anything more than a few dollars a month was pricey to me, but if you compare the kinds of hosting offerings of two decades ago to something like Digital Ocean or AWS today then the amount of possibilities is staggering (no more shared environment!) and for prices that are almost too cheap to believe.
My recollection of getting anything up and running that used a database back then was that it was not for the faint of heart. Compare that to today and the process of getting everything set up and connected with Rails, Djano, Express, etc. Yes there's more stuff you "just have to know" in terms of code you write and yes you have a box you have to stay within because of the framework but I'll take that any day over gluing together some Perl scripts and hoping you've got CGI configured correctly.
Maybe I'm conflating two separate things here: actual programming and operations. But I strongly contend that with web programming you can't disentangle those two things in any practical way. You will always be bound to the context of your environment. Anything that makes getting a sane environment easier leaves much more time to focus on the problem you actually care about. And it's not like you have to use all of the shiny new toys if you want to keep your code simple.
I made some boilerplate to solve this problem. If you are familiar with react, it shouldn take a few minutes of `git clone && npm i` to get started.
https://github.com/Jon-Biz/simple-static-react
There are a few version up there: one has a router, one has a firebase backend, one has Virtual Reality bindings. They all have the same purpose: to get out of your way as fast as possible.
So, I did a little bit of work to simplify my set up(s) and then to make it useful to others.
I am sort of curious if this pile of complexity will at some point implode, but mostly I am happy that I got out of webdev when I did. Today's web development is making a mockery of the ideas of usability, accessibility and standards.
When we build web apps for clients, they generally don't care what tools we use as long as the results are good. There's still plenty of work out there like this and there are still plenty of success stories.
You just have to avoid the parts of the industry, particularly around the startup scene, where most developers have just a few years of experience and are heavily influenced by high profile online commentary. That type of business tends to hire buzzword-compliant people because even their own "senior" developers don't have enough experience to know any better.
This is a great piece of advice.
Frameworks are commonly used across many programming industries. It's also not any framework's fault that the PM (or you) chose the wrong framework.
>just don't expect to be able to get a job doing that and do expect to be mocked as some sort of luddite.
I've never heard anyone mocked as a luddite for using the simplest solution necessary to meet requirements, that sounds like something programmer's are complimented for (if they can show results). If you want a job where the employer uses a trendy framework... just learn the framework; it's either that or learn the company's hand-rolled framework, at least with a trendy framework you're also investing in potential future prospects.
Starts off nice...
>Nothing is stopping you from writing for the web like it's 1991 if that's all you feel is necessary for your site.
Then you get that little jab in there.
Compare food nowadays to centuries ago, I'm glad things got unnecessarily complicated.
that's when the recipe shows up on Pinterest...
I'm just glad I don't have to hunt every day.
1. It takes longer to teach someone even "simple" web dev than it does to leverage the programming talents of experienced devs. This means businesses are better off making tools that allow a small group of devs to create many simple websites or a few really complex websites than just keeping it simple. Even a small dev company can produce output that matches what used to only be possible with the resources of a much larger software company.
2. As they mentioned, the path web dev is going is towards a device independent software dev environment instead of simply serving up content or a few simple tools. This is across the board from internal IT, to small B2B, to large B2C resources. Alot of my personal programming time is adjusting the generic B2B platform to meet the needs of a specific client we have that doesn't quite fit the original project. It's frustrating, but a large source of complexity and not "unnecessary" since it pays the bills.
3. The number of devices that have to be supported by a platform is also greatly increasing, and it makes the code itself, especially on the js side, much more complex in response. I'm continually thinking "why do you want to squish our site down to your piddly little phone", but that's the primary way alot of users have access, and if you don't support it, you'll lose out to competitors that do.
The language does not make the difficult problems easy to solve.
More: http://medium.com/@velmu/on-ubiquitous-javascript-and-the-un...
I bet the problem is Github! I mean, we are the victim of their success in solving one of our bottlenecks: collaboration. Now it is not only easier to start a project but equally easier to get followers, adapters, and contributors.
Also worth noting that analytics makes it easy to determine what device/OS the majority of your visitors are using. Anyone building an app would be wise to pay close attention to this to guide dev efforts.
The process can be quicker or longer than that.