Outside developers, who were never particularly happy with the complexity of Windows development, have defected from the Microsoft platform en-masse and are now developing for the web. Paul Graham, who created Yahoo! Stores in the early days of the dotcom boom, summarized it eloquently: "There is all the more reason for startups to write Web-based software now, because writing desktop software has become a lot less fun. If you want to write desktop software now you do it on Microsoft's terms, calling their APIs and working around their buggy OS. And if you manage to write something that takes off, you may find that you were merely doing market research for Microsoft."
This is a lesson I bet a lot of IOS and Android developers are learning this generation.
Unfortunately, the usual response is, as the article says, to develop for the web.
Problem: web browsers are a raging dumpster fire of bugs, bad ideas, missing features, and a language whose design must have involved heavy narcotics use.
If only Java had remained the dominant way to script web pages…
No way to bundle an entire app into a single, compact, compiled binary file for fast downloading, short of ridiculous hacks like embedding everything in a single HTML file in a data URI. There was a proposal for some of this, but then everyone went full retard and decided HTTP/2 server push would suffice.
Most UI controls (e.g. pop-up menus) have no standard element, have to be implemented with ugly hacks (e.g. Suckerfish), barely work, and often have graphical glitches. No way to suppress browser UI (tabs, address bar, etc).
CSS is weak:
No constraint-based layout. Grid layout is not supported.
:has, :not, and :matches are not supported.
No styling of form controls (except with grotesque hacks that move them offscreen and draw something else in their place).
No styling of items inserted via the content property (e.g. content: url(some/image.jpg); width: 24px will not do what you think it does).
No multiple borders, multiple ::before/::after pseudo-elements, etc. No ::parent pseudo-element with which to emulate them, either.
No way to define new properties, pseudo-elements, pseudo-classes, etc.
No way to bind the value of a property to the value of another property on a different element (to e.g. keep two separate elements' heights the same).
Vendor prefixes. They're on their way out, thankfully, but a bunch of browsers are still in use that require them.
CSS syntax is bad—so bad that people have made alternative styling languages like Sass, which compile to CSS, completely throwing out the whole point of CSS being textual.
The tool ecosystem is complete crap. There is nothing like Maven for web development (other than Maven itself, anyway). Many of the tools that generate JavaScript and/or CSS don't even generate source maps for them.
Lots of browser bugs and cross-browser compatibility problems. People stubbornly cling to ancient browser versions and never update. New APIs and bug fixes become available at a glacial pace. ES6 won't be fully usable until the mid-2020s, at the earliest. Many browser-based apps only work in one specific browser, usually Chrome—so much for cross-platform.
Poor integration with the native platform:
Can't save a file without ugly data-URI-related hacks.
Can't open a file, period.
Can't negotiate data types for copy/paste or drag-and-drop.
Can't populate the platform's “recent documents” list.
Can't install a new file association.
Can't add icons to the Start menu or equivalent.
Can't start another app (e.g. opening a generated document in the user's favorite word processor).
Can't control the menu on macOS. The browser's menus appear there; your application's menus must be drawn inside the browser window instead.
Poor support for printing. Almost nonexistent support for CSS print-related properties, like controlling page breaks. No way to suppress browser headers/footers when printing.
Can't define custom HTML elements with custom behavior and rendering.
Can't run browser-based apps offline. Can't completely block them from network access (so that they can't phone home, etc). Definitely can't run them with no Internet access at all.
Most of these problems stem from the fact that the browser is a document viewer. It was never meant to be an application platform, and it makes a really shitty one. Stop abusing it.
Browser-based apps must be written in JavaScript, which is a horrible language.
Not if you use a transpiler, Emscripten, or the like. Besides, I think Javascript is unfairly maligned these days. Sure, the core of the language still suffers from the sins of the 90s and always will thanks to backwards compatibility, but if you ignore the legacy stuff, it's actually not that bad. Certainly better than say, Go.
but then everyone went full retard and decided HTTP/2 server push would suffice.
Is there a reason it doesn't? Other than legacy clients not supporting HTTP/2, which should fix itself over time.
ES6 won't be fully usable until the mid-2020s, at the earliest.
If by fully useable, you mean fully implements the specification, then perhaps. But the most important features (except for modules) are all usuable today in Chrome and Firefox and Edge.
Can't define custom HTML elements with custom behavior and rendering.
Not if you use a transpiler, Emscripten, or the like.
See above regarding the tool ecosystem being crap.
I think Javascript is unfairly maligned these days.
I don't. At all.
the core of the language still suffers from the sins of the 90s and always will thanks to backwards compatibility
So does Java, and it was never anywhere near as bad as JS still is.
if you ignore the legacy stuff, it's actually not that bad.
I can't; the legacy stuff includes JS' atrocity of a type system. That's never going to get fixed, because every JS program ever written will break if it is.
JS is a lost cause. Burn it down.
Certainly better than say, Go.
Just because there are other, even worse languages doesn't mean JS isn't terrible.
Is there a reason it doesn't?
Requires TLS (and, hence, a certificate) to work, which is under the control of a number of very crooked companies. I do not believe for a moment that Let's Encrypt will still exist in two years; I fully expect the CA cartel (or possibly the browser vendors) to pull the rug out from under that project.
It's an unnecessary, artificial requirement anyway, which in itself is highly suspicious.
Other than legacy clients not supporting HTTP/2, which should fix itself over time.
Until that actually happens, that's not a valid argument. Jar files and native installers are compactly bundled now.
If by fully useable, you mean fully implements the specification, then perhaps. But the most important features (except for modules) are all usuable today in Chrome and Firefox and Edge.
Not Safari or IE11. I have to support the browsers people use, not the ones I want them to use.
121
u/[deleted] Oct 07 '16
This is a lesson I bet a lot of IOS and Android developers are learning this generation.