Hi there!

I am faced with having to re-think what we are doing in the company I work 
for with respect to GWT, existing and new projects and I am struggling, to 
say the least. We've been very much a GWT shop for years now and have used 
it to expedite the development of very large solutions and improve the end 
user experience. We did this and this was possible because:


   1. There is (was?) a *visible* big name behind the technology - Google. 
   There were regular updates and a lively community. 
   
   2. It allowed us to share a lot of code between the client and the 
   server properly and use a programming language suitable for very large 
   software - strong typing, encapsulation/visibility control and all the 
   works. JavaScript just isn't an option - it isn;t even a thought with all 
   the enhancements they are making.
   
   3. It allowed us to cleanly and efficiently segregate and encapsulate 
   functional responsibilities of both business and representation code. We 
   were able to create a foundation with clean APIs that other teams build 
   their modules on top - and we bring those modules together. We can evolve 
   that foundation and dramatically change it looks beyond just CSS because we 
   encapsulated units of UI into widgets and we came up with the means to 
   aggregate client-server communication from all modules into single 
   requests/responses via serialization (we otherwise used GWT RPC very little 
   - there is a single service with a single method in there).
   
   4. It offered integrated code optimization and debugging tools with what 
   seemed to be a promising future vision and dedication.
   
   
We've been following what is going on with GWT 3.0 and, admittedly, didn't 
like it. However, we were hoping that our problems are common and that it 
will become apparent that GWT 3.0 vision needs some adjustments. We've 
observed other people communicating similar perspectives to ours. 
Unfortunately, we've also seen little acceptance of these comments, little 
action and, essentially, no direction with respect to those beyond "waiting 
to see what happens with GWT 3.0". We believe that this effective limbo is, 
at least, a big part of the reason for frequent statements like "GWT is 
dead, past its time" and abandoning the technology simple because they have 
to move forward but are left behind.

I/we perfectly *understand *the reasons why one would want to do things 
planned for GWT 3.0. Removals of GWT RPC and widgets can simplify some code 
and increase the performance of the tools, among other things. At the same 
time, I believe that the perspective taken to decide what to do is wrong. 
Instead of finding ways to simplify GWT at the expense of making GWT-based 
products more complex and loosing any chance of being compatible with 
pre-3.0 code, efforts should have been focused on solving the problems. I 
know that these problems are hard, but they are also *possible* to solve. I 
know because I made solutions to similar problems. Yes, new GWT may produce 
code faster and it may produce faster code and it may interoperate better 
with the browser and JavaScript. But consider the following:


   1. For perfect interoperability with JavaScript one can use JavaScript 
   or TypeScript. Or, if you like Java (syntax), use JSweet or TeaVM.
   
   2. For sharing code with the server, some people use node.js (I do not 
   subscribe to this) but there are other options - JSweet, TeaVM, possibly 
   Dragome and others.
   
   3. For runtime performance of the code written in Java (via 
   optimizations and otherwise), TeaVM seems to yield better performance than 
   GWT with JavaScript output and also has experimental support for 
   WebAssembly, which yields about double the performance on some tests I've 
   seen. One could offer both options, to support browsers that can't do 
   WebAssembly.
   
   4. If one is forced to use external frameworks for serialization they 
   don't get any benefits from GWT that other alternatives don't also get.
   
   5. In terms of tooling - GWT seems to, now, be the worst. Super Dev Mode 
   proved to be essentially a failure because one does not really see the data 
   that matches the code. Runtime performance still suffers and debugger often 
   freezes for long periods of time doing who-knows-what if/when breakpoints 
   are set or we're stepping through code. Coding in JavaScript directly means 
   what-you-see-is-what you get and no wait times. Other solutions offer their 
   custom tooling which seem to be possibly better, at least on paper (did not 
   check, so cannot verify yet). JSweet and TeaVM translation is much faster 
   than GWT is, even without GWT RPC. TeaVM does not require source code, 
   which is better for companies who need to deliver a module but keep the 
   source closed. GWT needs *both* source and binaries...
   
   6. If we're to work directly with the metal, similar to how JavaScript 
   frameworks do things, then again - JSweet may be a better fit, possibly 
   TeaVM. Neither has widgets in a sense GWT does/did.
   
   
Put it simply, GWT 3.0 does not seem offer a path for existing users, does 
not have much novel for brand new users that isn't already available 
othewise *and better*, takes more time to do whatever it does and slows 
down the development and is losing trustworthiness - what guarantees that, 
if I start with GWT 3, I won't be left stranded when GWT 4 comes out... if 
it ever will?  So, who is GWT 3.0 for? Who will use it?

Does this mean that there really is no vision about how GWT can truly 
evolve and grow? If so, let me offer some of my challenges that would be 
best solved or need to be solved in GWT, in no particular order.


   1. Simulate synchronicity even for what would be, under the hood, 
   asynchronous calls. See TeaVM for how multithreading is supported in it, 
   Thread.yield() and related. We know why things must be asynchronous in 
   JavaScript, but that does not mean that this has to be exposed as such in 
   the Java world - a Java method could "block" at a call only to continue 
   when a relevant event is triggered. This would go a long way to simplifying 
   the code and increasing how much code can be shared between the client and 
   the server without exposing the server to unnecessary asynchronicity or the 
   client with synchronous methods that may/will not work.
   
   
   2. Doing the above will let you improve code splitting as you will be 
   able to load code at any point, not just at GWT.runAsync() points. It will 
   open up other possibilities of driving how the code is split - e.g. perhaps 
   per module, project or package.
   
   3. Separate widgets into an optional module but definitely keep them 
   going. They are important. They are used, both directly and via 3rd party 
   libraries.
   
   4. If you are so hung up on removing GWT RPC, do so, but provide the 
   means to replace all of its functionality externally, especially 
   serialization. This is possible in TeaVM with its "Metaprogramming API". 
   Arguments that "it is hard" are not helpful and "I don't need it" may apply 
   to a class of users who really don't need GWT at all or are not creating 
   very large scale products. Keep in mind - GWT RPC is *NOT* about APIs but 
   allowing matching OWN client and server code to communicate. Do include the 
   means to store discovered relationships so that they don't have to be 
   discovered again. Allow polymorphic serialization one way or another via 
   specific annotations. Whether done internally or externally, rethink RPC 
   with respect to (1) - synchronicity emulation and what plumbing code needs 
   to be written. There is a discussion about these things in 
   
https://groups.google.com/forum/#!msg/google-web-toolkit/34viZIdAjBQ/EPhzKi9iCgAJ
   
   
   5. Bring back (something like) *.gwtar files. Even better, replace them 
   with something that will be self-sufficient and *not* have the original 
   source code in it. This would be very useful for both increasing the 
   compilation performance and for delivering closed-source modules.
   
   6. Deferred binding and code generators are something we do not use 
   *directly *as we tried to be as "clean" as possible. As I am propagating 
   compatibility, you should not remove this but do provide means to not 
   depend on it. That may have a significant performance impact too.
   
   7. JSNI methods in comments were nice but are the *only thing* that 
   truly *requires* the source code. Find other ways of doing this, such as 
   via annotations or separate files, e.g. for each Foo.java there may be 
   Foo.jsni
   
   8. Think about how would one support post-development (e.g. install-time 
   or run-time) linking of multiple modules. For example, we build our 
   foundation product, but our partners build plugins for it. Customer chooses 
   and installs plugins they want. Right now this forces us to do a GWT 
   compilation step at that time and it is painfully long. (from the customer 
   perspective).  We are trying to hide this cost in various ways (store 
   results, reuse them across nodes, etc.) but I am sure you can figure out 
   the challenges. Since these modules only communicate via dedicated APIs, 
   obfuscation can be limited to the implementation only and/or there can be 
   an overlay of "exported" symbol maps for cross-module calls. This is a very 
   similar "problem" to Java class file obfuscation so nothing new.
   
   9. Clean up the tooling. Stop embedding everything in a single 
   monolithic jar, update code coverage tool support. Rethink debugging - 
   perhaps leverage existing work done outside GWT for this? Separate the 
   classpath of the compiler from what it is supposed to compile. These are 
   not the same thing and cause grief.
   
   
Without the above, what seems to be a closer alternative to existing GWT 
2.x users is a separate fork of GWT (that may not be coming any time soon) 
or a TeaVM enriched with a fork of GWT widgets and a module doing GWT RPC 
(possible!). It does not have code splitting support (yet) and, likely, no 
desire (or need) for "permutations" and related concepts. That would 
require widget libraries to be rewritten with that in mind, but that would 
be *possible* and would, it seems, yield a better dev environment with a 
better performing end result.

I don't want to see GWT fail. We have our future depending on it and, if we 
can't use it, I presently don't know what we can do. But we cannot use GWT 
3.0. Remember - "I don't need it" is not the same as "Nobody needs it" and 
"shouldn't need it" is a matter of perspective typically uttered by those 
who don't create projects as complex as many of us others do. 

-- 
You received this message because you are subscribed to the Google Groups "GWT 
Contributors" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to google-web-toolkit-contributors+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/google-web-toolkit-contributors/59e72304-d23c-4d60-9d9f-2586c7096edf%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to