What is the best way to program Mindstorms EV3?
You have various options.

If you use Linux mainly ev3dev is a good start I think. I've worked with Java (LeJOS) and C# (MonoBrick) in combination with the LEGO Mindstorms Education EV3. But there are more bindings for the EV3. If I recall correctly at least for Python, C, C++ and some more educational friendly languages. The information you need to write your own language/compiler for the EV3 platform are available on the LEGO Mindstorms website. I'm currently developing my own language, compiler and IDE for my master thesis.

The more general question you must answer yourself is: What's the goal you want to achieve? Do you want to learn how to program or do you have already knowledge in one or more languages? If you want to learn how to program you should IMHO use a more beginner friendly language like the EV3-G (the graphical language you mentioned). If you already have some knowledge you can start with a text-based language.

The second question is: Do you want to use/learn a graphical language or a text-based one? There are graphical alternatives to EV3-G like the Open Roberta Project. It uses a Scratch like language (based on the same JavaScript library).

Hopefully I could give you some hints because the topic is more complex than many think in first place. If you have more questions just feel free and ask.