cmake for c++, gradle for java, fake for c#, bitbucket/bamboo/artifactory. no clue about the details, I just get one working and add to it over the years.
After 20 years with C++ I am migrating to rust. It's a breath of fresh air. Pretty much all the build system / dependency hell just goes away.
I don't think the differences should be overstated. They're mostly "in your face" syntactical differences that make the leap from one to the other seem more difficult than it is. In quite a few ways jumping from C# to C++ is a bigger step.
You couldn't be any further from the truth. C# is dramatically different from Java in almost every way unless your metric of similarity is "both are C++ and smalltalk inspired OO-first languages". A lot of people refer to C# as "Java done right" because Java in both design and execution is a monstrosity. They refer to it this way because the similarities end after you leave the "everything descends from Object()" space that forces the "visual similarity" of some of the code. C# looks similar to C++/CLI. Java looks similar to...Java. Both took heavy influence from C++ but have executed it entirely differently. For example, there's no real good async, low-level, or LINQ-style fluent interfaces built into the Java standard (in fact, by language design you can't). https://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Java This Wikipedia article actually does a good job at explaining the majority of their differences.
C# was developed by Microsoft after a judge ruled that Microsoft could not legally continue to enhance Java even though Java was open source, because Oracle still controlled the language. Before Interactive Brokers had a C# API, I took their Java API source, several thousand lines, and within four hours was able to do a few a edit changes such as changing ".length" to ".Length", and had a working C# API. That's how close C# is to Java. I am referring to the language basics itself, not the libraries that are used with them.
once you learn one language and get the idea how logic is being constructed. It is not that hard. If you read a book on c# and do some exercises you should grasp it.
I was a web developer, then more systems/automation developer and in the last 5 years, I worked as a platform engineer (DevOps/SRE). If you are alone, I guess you are not doing HFT, so what is important is that you find good strategies, a CI/CD deployment pipeline is an overkill, keep it simple. The same applied to programming: use a language that allows you to develop with quick iterations, C++ is not one of those languages. C++ is an evolution of C, it is OOP, that kind of OOP which drives to complex and not reusable systems, at least not the way people hope. OOP tries to solve the problem of hiding the state behind objects, which is more avoiding the problem instead of solving it. Functional programming languages have solved the problem of state with immutability and constrained solutions to change state. Functional and more modern languages like Go and Rust are more oriented to data, abstraction is built towards data, not objects and to make a modular system you just use modules and you put functions in modules. I am using Python with Atom and the REPL, so I get immediate feedback and I can use it as a notebook, for instance, I can print a data frame of a plotting data in the editor. To build it I use Docker, I install the dependencies and I add the files, very simple. To respond to your question, I would use make or cmake. Many projects are using a Makefile to wrap scripts to build containers or deploy cloud infrastructure with Terraform. Make is very well known and it does the job. A benefit of a language of C++ is that it can find bugs at compile-time and the same applies to Java, C#, Go, and similar languages. Go is much better the C++, Java, and C# since it does not uses objects but structs, and you can build an interface base on the shape of data (the struct). More advanced languages like Rust and Haskell will catch more bugs than the other languages because they are functional, they use more advanced programming features and generics, but they are much harder. For instance, Jane Street uses OCaml which is part of the family of Rust and Haskell, because it is fast and safe. However, if you are a one-man shop, most of the people use Python or R.
@rtacconi Professional developer here: Well this is false at first face. Smalltalk introduced the concept of object oriented programming to the world. It provides an abstraction layer that when properly implemented separates concerns and hides details making developers more productive. If you've ever programmed in C, or Go for that matter you'd understand the level of complexity that emerges when you leave object space. You are confusing bad developers for bad languages. A common mistake. Functional programming is cool but let's not attribute immutability and constrained solutions to the field of functional programming. Immutability can be built into any language (hell, even javascript has it through ImmutableJS). What you are trying to get at is not immutability but pure functions. Pure functions are a functional tool that are difficult to implement in other places. The primary benefit of functional programming is derived from pure functions in that you can compose them without concerning yourself with side effects. A major boon of this is that multi-core and distributed programming become much simpler at the expense of a far more complicated and confusing developer experience. There's a lot to unpack here. Go is not good. How may I count the ways. Rust would be a good language if the community wasn't overrun with SJWs. I really can't commit to a language who's community and language standard can be so readily hijacked by militant crazies. Jane Street has gone on record that they used OCaml primarily because their chief technology guy refused to use anything else. They ex post facto claim that it's better, and in some ways it is, but don't be confused about the reason they use it. It has a lot of problems around multicore that have yet to be solved. I would be curious how Jane Street gets around this. For the record OCaml is in the family of ML-likes. A cousin of OCaml is Haskell. Rust shares nothing in common with this family of languages. This is referred to as static typing. To an extent you can enforce this in Python with MyPy, and many dynamic languages are actually strongly typed on the backend (common lisp for example). Funny enough, you're more likely to run into a runtime bug in a weakly typed language like C++ than any other language you listed.
It is the end result that counts. For us c# can do anything from automation and backtesting perspective that we require