Oh, and the reason it adds so few features is (well *one* to be in scope
for a summer programming gig, but *two:*) so that it's not overwhelming to
people.  Again: a small handful of features that help a *bit*, but don't
completely outshine Java's own features, and don't require constantly
checking docs for new stuff you can do.

On that note, it's possible that once we have a preprocessor framework
developed, we could expand on its functionality with plugins (with their
own *separate* documentations to avoid overwhelming people) to expand on
its features.



But uh, the biggest thing is that I want to spend my summer working on a
passion project with some really knowledgeable people and get real-world
experience in open-source software development.  So like, if this even
*somewhat* sounds like a good idea... would anyone be willing to mentor me?
🥺

On Mon, Mar 25, 2024 at 4:22 PM Caleb Brandt <calebbrand...@gmail.com>
wrote:

> IDEs will still interpret stuff incorrectly at times.*
>
> On Mon, Mar 25, 2024 at 4:17 PM Caleb Brandt <calebbrand...@gmail.com>
> wrote:
>
>> Thank you all so much for your insight!  And I'm not being facetious
>> here; you guys keep blasting away the points that don't hold water, so I
>> think I've finally nailed down *why* I feel this project is so necessary.
>>
>> Because you're absolutely right: Groovy already *does* do much of what I
>> want.  In terms of contributing new functionality to the ecosystem, my
>> project isn't necessary in the slightest.  My argument is entirely borne
>> out of *ignorance* to what Groovy can do.
>>
>> But to be honest... that's kind of the *point*.  It's absolutely
>> IGNORANT, and that's absolutely *WRONG*, but even still, it *is*.
>>
>>
>> See, I've been programming in Java for around seven years at this point.
>> I'm very immersed in the Minecraft dev space, and I've worked with others
>> on non-Minecraft things as well, like working on toolchains and libraries,
>> contributing to a handful of personal projects, etc.  And as a member of
>> those spaces, the "vibe" that I've gotten is this: "the non-Java JVM
>> languages are clunky".
>>
>>
>> See, Groovy has exactly two things going against it for reaching the most
>> people: it's a *language*, and it's *compiled*.  Now that might sound
>> odd to criticize, but bear with me.
>>
>>
>>  1. As another language, it is *inherently* intimidating to people who
>> aren't familiar with it.
>>
>> People are closed-minded, and like to stick to what they know. I know
>> when I see "Foo.groovy" on Github, I immediately go "oh god", though it
>> *absolutely* isn't warranted!  Fact is, people who use Java and know
>> their way around it like the back of their hand don't want to go relearn
>> how to speak in code just to do the same thing a tiny bit easier.
>>
>> Their instinct is to go:
>>
>>> "I've never used Groovy, and I never intend to, because I'm fine with
>>> Java.  I can do everything I need to with Java.  Why do people have to be
>>> weird and use something that isn't Java when writing a Java program?  I
>>> don't want to have to learn a new language just to sift through this."
>>>
>>
>> It doesn't really matter if it's identical to Java in most places, the
>> very *name* not being "Java" is enough to spook people who aren't
>> familiar with it.  Sure, once you get to know it, you realize there was
>> never any reason to be intimidated, but that's a leap too far for most
>> people when they could just... *not* use it, without any consequence.
>>
>> Even as someone who tries to be more open-minded than most people, I
>> *still* find myself having that instinct.  Even though I know my fear of
>> Groovy was unwarranted, it doesn't change the fact that it *took this
>> conversation* to change my mind about it.  Very few people are going to
>> have this conversation; most are just going to say "oh, that's neat, I
>> guess" and leave it.
>>
>>
>> And also:
>>
>> 2. As a compiled language, any analysis tools need to be specifically
>> written *for Groovy*, and they just can't match the ones for Java.
>>
>> And that's no fault of Groovy's!  See, even if we got the* brightest
>> minds* in the world together to make a static analyzer, debugger, and
>> suite of tools for Groovy, Java still has *twenty years* on us.  It's
>> just a fact: without massive resources, we can't match the tools made for
>> Java.  Debuggers will fail inside Closures, static analyzers will infer the
>> wrong types and throw false errors, and IDEs
>>
>> Even if we could theoretically do all of that *better than Java*, we'll
>> inevitably still be working in a *Java-based* ecosystem.  Any tools made
>> are implemented in a Java IDE: analyzers are slower, intellisense loses
>> track of where things are defined, postfix completions have to be
>> redefined, templates stop working; *every single thing* has to be
>> retooled for Groovy.  And that includes community-made plugins too!
>>
>> It's unfortunate, but it's a fact: any non-Java JVM language will - by
>> virtue of not being Java - be slightly more clunky than Java in a
>> Java-based ecosystem.
>>
>>
>>
>> But they're still worth it, right?
>>
>> Of course they are!  But that doesn't matter if no one *uses them*.
>>
>> See, you can *tell* when it fails where Java wouldn't.  You notice when
>> it takes slightly longer for errors to pop up, when types get inferred
>> incorrectly, when intellisense can't find your class and you have to
>> manually go and search for the reference to import.  It's *annoying* to
>> have to take over for something that worked seamlessly before.
>>
>> Again, it's no fault of the *language*, it's just the fact that our
>> tools are *inevitably* going to be slightly less refined than ones made
>> by a company doing it for profit.
>>
>> But when you're *already* feeling the malaise from being immersed in a
>> somewhat-new language and you notice that the things you've taken for
>> granted are suddenly *failing*, what impression do you get about the
>> language?  In my experience: that it's a novelty, one that's slightly worse
>> in your experience than the one you're used to.
>>
>>
>>
>>
>> *That's* what I'm trying to solve here.  It's not a matter of *features*,
>> it's a matter of *accessibility* and making sure people *don't feel
>> disinclined* to continue past their first glance at it.
>>
>> So how do you do that?  How do you get people to take that leap - to
>> continue past that cliff that stops people from continuing past their first
>> impression?
>>
>>
>> It's simple: don't let there be any leap at all.
>>
>> 1. Forget the "language" part.  Show your features for what they are: *tiny
>> addons* for the language they already know.
>>
>> There are a few parts to making it as approachable as possible:
>>
>> *1. The NAME:*
>>
>> There's a reason I didn't call it "Latte", "Javaccino", or "Mocha"
>> instead of "Java Plus".  To be honest, even *THAT* might be too much; 
>> *everything
>> about it* needs to emphasize that it is *NOT* a new language.
>>
>> I'd describe it as "A *few* *tiny* (eensy-weensy teeny-weeny) snippets
>> to save you time writing things you constantly use", and specifically
>> accentuate the *small* part.  It needs to *feel* like something you can
>> just "click on" without any commitment on your part.
>>
>>
>> *2. DROP-IN INSTALLATION:*
>> People need to be able to plug it into their preexisting project without
>> *any* action on their part besides pasting in the plugin.  *Not even any
>> file extension changes.*  If it *looks* like it isn't Java from far
>> away, people will *feel* like it isn't Java.
>>
>> We can do this fairly easily: take all of the Java files, scan them for
>> our constructs, generate new source files with their transpiled
>> counterparts, and give the new files to javac.  We actually do a very
>> similar thing in MinecraftForge already: source files are copied to the
>> `out` directory, where tokens are replaced and deobfuscated method calls
>> are mapped to their obfuscated counterparts before the new sources are
>> passed on to the `compile` task.
>>
>> The only problem with this approach is that you end up having two
>> identical sets of source files: one in the src directory, and one in the
>> out directory.  However, this actually turns from a bug into a *feature*
>> because of the third step:
>>
>>
>>
>> *3. DROP-OUT REMOVAL:*
>> It's Java allllll the way down.  If you want to stop using it, awesome!
>> Everything gets converted to plain ol' Java, so every single one of the
>> vanilla Java files are RIGHT THERE for you to use outside of this project.
>> This is also why TypeScript is so approachable: you can add or remove it at
>> any time without any impact to your project.  There's *no commitment* to
>> using the plugin in everything; you're still a Java developer like everyone
>> else, you just have some new things in your toolbelt that Oracle didn't add.
>>
>> Speaking of:
>>
>>
>> *4. IT'S JUST "MORE" JAVA:*
>> Everything that's added needs to "feel like Java".  Again, it's a
>> psychological thing: people will feel some malaise if they're using
>> something that doesn't look like something they're used to, so it all has
>> to be an *intuitive analogue* to something that already exists in Java.
>>
>> We all know what a getter and a setter is, so condensing them into one
>> place is easy to understand.  But what's a "closure"? What's a "delegate"?
>> What's a "virtual thread"??? (I'm kidding.)  People don't have a basis for
>> these things in Java, so it's just *more* stuff to learn instead of
>> already making sense to a Java-only programmer.
>>
>> I actually removed the idea of the `pojo` keyword from this proposal for
>> this very reason: while it's clever shorthand for something that people do
>> a lot, it *hides too much* from the writer.  Where are the getters?
>> Where are the setters? Do we access them by field or by method? How do we
>> do internal member referencing?  Can we extend classes?   It's just too
>> much hidden behind a single keyword, so it's not a good fit for this
>> project, instead being partially covered by the declaration get/setters.
>> Every addition needs to scan like Java at face value and feel like
>> something Oracle themselves would have added.
>>
>>
>> And on the backend:
>>
>> 2. Instead of COMPILING, we transpile it to Java source code
>>
>> Unlike with JVM bytecode, this one would transpile to Java 8 *source
>> code*, letting a few things happen that *completely* change the game:
>>
>>
>> *1. WE CAN USE JAVA'S TOOLS*
>> Yeah so remember what I said about how "nothing will ever match Java in a
>> Java space"?  If you can't beat 'em, join 'em.  By acting as a transparent
>> frontend to real Java source code, we can leverage existing Java analyzers
>> to do our linting for us.  The IntelliJ system already has a variant of
>> this for CLion's macro processing, being able to detect errors in the
>> applied macro and display the code it'll be replaced with in a hover popup.
>>
>> We can also use Java debuggers to their fullest extent too: it'll link to
>> the processed Java8 sources when we freeze on a breakpoint instead of the
>> J+ sources, but once again that's a *feature*, not a bug.  With a good
>> enough formatter on the processor, they'll even thank us for it.
>>
>> We don't return anything, only being *syntactic* sugar instead of
>> *library* sugar, so type-checking is a non-issue as well.  (I *wanted*
>> to add the ability to return from an outer function from inside an
>> Optional, so I wouldn't have to do the "Optional Dance" whenever I wanted
>> to get or return if null, but that would break the rules I highlighted
>> above so it was a no-go.)
>>
>> No Java syntax rules are broken either - nothing new goes outside a
>> method, for starters - so any community-made Java source plugins will work
>> exactly the same on the unprocessed source as they would on the vanilla
>> source.
>>
>>
>> *2. W E  C A N  U S E  J A V A ' S  T O O L S*
>> Again, you don't realize how huge this is.  There's *no* overhead.
>> There's no stuttering.  No incorrect typing, no invalid templates, no
>> broken plugins; it works *exactly* like normal Java, just with
>> additional features.  People won't have any excuse *not* to use it.
>> It's purely helpful without breaking people's workflows in the slightest.
>> (...save for some additional gradle configuration to point any other
>> plugins to the processed sources, but just *sneezing* on the project
>> does the same thing, so it's an acceptable loss imo)
>>
>>
>> *3. It's great marketing for Groovy*
>>
>> Like I said before, people don't like to stray too far from what they
>> know.  They know Java, so they stick with Java.  Oh, but now they know Java
>> Plus too!  But... by its very design, Java Plus can only do half of the
>> things that Groovy can.  So, if they want even *more* features, we tell
>> them to go try Groovy!  "It's just like this, but more!!!"
>>
>>
>>
>>
>> So, do you get what I'm going for now?  In the end, it *won't* end up
>> all that different from Groovy in function, but that's not the point.  The
>> point is to be something that doesn't exist yet: an approachable set of
>> useful features for people who otherwise would look at a whole other
>> "language" and run away.
>>
>>
>> As for marketing: I'm friends with some of the biggest Minecraft
>> developers in the space; if something's going to be used by new Java
>> developers, it'll be recommended by them.  I can even get it packaged into
>> the major modding frameworks for the game if it's intuitive enough, and
>> from there it'll spread by word-of-mouth as long as there's no learning
>> curve at all.  It will improve readability, make you have to keep fewer
>> things in your head while writing, and sort through your code easier; there
>> will be no reason *not* to use it, which is exactly what I have in
>> mind.  Hell, if the features prove stable enough, we could even pitch them
>> to Oracle for inclusion in the language proper.
>>
>> It'll be a great stress-test for some sorely-needed features in Java.
>> Plus, it'll let me keep track of where my getters and setters are without
>> having to open the Structure tab every five minutes.  Win-win.
>>
>>
>> So, have I sold you on it yet?
>>
>>
>> Cheers,
>>
>> Caleb
>>
>> On Mon, Mar 25, 2024 at 11:35 AM OCsite <o...@ocs.cz> wrote:
>>
>>> Caleb,
>>>
>>> On 24. 3. 2024, at 16:57, Caleb Brandt <calebbrand...@gmail.com> wrote:
>>>
>>>> I know you made Groovy, but if you're anything like me, you *love*
>>>> Java.
>>>>
>>>
>>> just for one, although I haven't co-operated on the Groovy creation (am
>>> just a very satisfied user), I *hate* Java very bitterly.
>>>
>>> The language design is simply *terrible*, all the worse since the
>>> people who made that abomination, i.e., Sun, knew Objective C well (they
>>> used to cooperate with NeXT on OpenStep) and thus *knew* how to do an
>>> object-oriented language right.
>>>
>>> Instead they botched it *terribly*. No real polymorphism. Very limited
>>> encapsulation. Type-system which effectively prevents (or at the very least
>>> makes highly complicated and expensive) all the best and most important
>>> object-oriented patterns like e.g., proxying and message forwarding.
>>> Classes are not objects and their „methods“ do not support inheritance
>>> properly. It is quite normal to access instance variables directly, instead
>>> of consistent usage of accessors. *Heaps and heaps* of boilerplate.
>>> Often, the darned thing limitations just force the IDEs to generate code —
>>> compare e.g., WOLips. Could rant on for months like this :(
>>>
>>> Whilst languages like e.g., Kotlin or Scala fix some of the problems all
>>> right, they, alas, do not allow to switch a big project from the Java
>>> disaster without re-writing it at once and completely, which is a big
>>> show-stopper.
>>>
>>> The vast advantage of Groovy is that you can take a big project, just
>>> rename all *.java to *.groovy, and it will essentially work (well, as
>>> someone already wrote, 99 % — my experience is rather 99.99 %, but indeed
>>> there are things which need fixing and there are a couple of gotchas, but
>>> there's really a very very small number of them). Then you can work on with
>>> the project and gradually change the stupid Java patterns to the pretty
>>> decent Groovy ones, part by part, method by method and if need be,
>>> practically line by line, without losing any functionality during the
>>> process. No other language I know of allows anything like this.
>>>
>>> All the best,
>>> OC
>>>
>>>

Reply via email to