1.One which does not allow you to write shit code, and generally guards your program.
2.One that allows you to write anything beyond and above #1 including shit code.
Both are useful, but it comes down to your preference.
I like 2, but which still allows you to develop code safely. Freedom is a bit more important to me. As long as error handling is done properly, it's okay... I think a more subtle and direct way of seeing this difference is between static and dynamic languages, one blocks you from writing non-well-typed code and ensures security at compile-time, but if you really want to write bad code, you still can, it'll just look even scarier; in the dynamic language, you can write anything, but if you mess up, you'll be getting a runtime error (which in a good language means you get a debugger, possibly a REPL, to investigate exactly what's going on at the time of the error).