Comment by zwnow

1 day ago

What modern language is a better fit for new projects in your opinion?

Elixir, with types

  • I love Elixir but you cannot compile it into a single binary, it is massively concurrent but single-threaded slow, and deployment is still nontrivial.

    And lists are slower than arrays, even if they provide functional guarantees (everything is a tradeoff…)

    That said, pretty much everything else about it is amazing though IMHO and it has unique features you won’t find almost anywhere else

  • That doesn’t exist yet. Also Elixir is in no way a replacement for Go.

    It can’t match it for performance. There’s no mutable array, almost everything is a linked list, and message passing is the only way to share data.

    I primarily use Elixir in my day job, but I just had to write high performance tool for data migration and I used Go for that.

  • My vote is for Elixir as well, but it's not a competitor for multiple important reasons. There are some languages in that niche, although too small and immature, like Crystal, Nim. Still waiting for something better.

    P.S. Swift, anyone?

    • Last I checked Crystal’s compile time was too slow for me to deal with for anything beyond toy projects.

  • yeah, if the requirement is "makes it pretty straightforward to write reliable, highly concurrent services that don't rely on heavy multithreading", Elixir is a perfect match.

    And even without types (which are coming and are looking good), Elixir's pattern matching is a thousands times better than the horror of Go error handling

Maybe weirdly I’d put swift in there.

  • Swift is my hope for the next big server language. Great type system, great error handling.

    • In my opinion they need to invest a lot more time and money into it for that. The development experience on VSCode was pretty bad (I think the LSP has a memory leak), and some important (for me) libraries aren't tuned very well yet (a Vapor webserver can sit around 100 MiB memory, whereas putting a bunch of load on the grpc implementation balloons the memory usage to >1 GiB).

    • I haven't followed swift too closely, but ref counting is not a good fit for typical server applications. Sure, value types and such take off a lot of load from the GC (yes, ref counting is a GC), but still, tracing GCs have much better performance on server workloads. (Reference counting when an object is shared between multiple cores require atomic increments/decrements and that is very expensive).

      4 replies →

For web frontend: js

For ML/data: python

For backend/general purpose software: Java

The only silver bullet we know of is building on existing libraries. These are also non-accidentally the top 3 most popular languages according to any ranking worthy of consideration.

  • I'd swap java with go any day of the week. I never liked how much 'code-padding' is required with java `public static void main`

    • For Java 25 which is planned to be released in a couple of weeks:

      ----- https://openjdk.org/jeps/512 -----

      First, we allow main methods to omit the infamous boilerplate of public static void main(String[] args), which simplifies the Hello, World! program to:

        class HelloWorld {
          void main() {
            System.out.println("Hello, World!");
          }
        }
      

      Second, we introduce a compact form of source file that lets developers get straight to the code, without a superfluous class declaration:

        void main() {
          System.out.println("Hello, World!"); 
        }
      

      Third, we add a new class in the java.lang package that provides basic line-oriented I/O methods for beginners, thereby replacing the mysterious System.out.println with a simpler form:

        void main() {
          IO.println("Hello, World!");
        }

      6 replies →

    • Always find 'java is verbose' to be a novice argument from go coders when there is so much boilerplate on the go side of things that's nicely handled on the java side.

    • Every function call is 3-5 lines in Go. For any problem which needs to handle errors, the Go code is generally >2x the Java LOC. Go is a language that especially suffers from the "code padding" problem.

    • It's rich to complain about verbosity coming from Go.

      Nonetheless, Java has eased the psvm requirements, you don't even have to explicitly declare a class and a void main method is enough. [1] Not that it would matter for any non-script code.

      [1] https://openjdk.org/jeps/495

  • Java, lol. Enterprise lang with too many abstractions and wrongly interpreted OOP. Absolutely not.

  • What about php/ruby for web?

    • An expert Ruby programmer can do wonders and be insanely productive, but I think there is a size from which it doesn't scale as nicely (both from a performance and a larger team perspective).

      PHP's frameworks are fantastic and they hide a lot from an otherwise minefield of a language (though steadily improved over the years).

      Both are decent choices if this is what you/your developers know.

      But they wouldn't be my personal first choice.

  • Absolutely no on Java. Even if the core language has seen improvements over the years, choosing Java almost certainly means that your team will be tied to using proprietary / enterprise tools (IntelliJ) because every time you work at a Java/C# shop, local environments are tied to IDE configurations. Not to mention Spring -- now every code review will render "Large diffs are not rendered by default." in Github because a simple module in Java must be a new class at least >500 LOC long.

    • When did you last touch java, before 2000?

      Local environments are not tied to IDEs at all, but you are doing yourself a disservice if you don't use a decent IDE irrespective of language - they are a huge productivity boost.

      And are you stuck in the XML times or what? Spring Boot is insanely productive - just as a fact of matter, Go is significantly more verbose than Java, with all the unnecessary if errs.

      3 replies →