As an academic in math and engineering, I like many of Mathematica's abilities, especially the ability to quickly prototype algorithms and check analytical results.
In addition to the many points mentioned, there is a major problem from a literature and research perspective: built in commands and solvers are generally black boxes with no references or citations.
Taking a function at (somewhat) random, consider SpherePoints
which "gives exactly equally spaced points in certain cases for small n. In other cases, it places points so they are approximately equally spaced." For what n is it exact or approximately equally spaced? How approximately equally spaced are these points, i.e., what tolerance is given? What algorithm is it using to do so and where is this algorithm in the literature? Is WRI's implementation of this algorithm correct for all n? What, exactly, is WRI's definition of "equally spaced" and how does it relate to the Thomson Problem and the Tammes Problem? As such, academic rigor and proper literature references generally require rebuilding built-in functions from scratch, with the built-in as an error-checker or useful tool in the rapid prototyping stage. And this is only a simple built-in command, not to mention more complex solvers and algorithms.
This seems to be a general weakness of WRI and Stephen Wolfram in particular. Consider that ANKOS is a ~1,000 page "research" tome that comes with a big old copyright notice, but fails to include proper citations and references. If such a document were submitted to a college course or as a dissertation/thesis, it would likely involve charges of plagiarism...
Edit: Due to continued strong interest in this question, I wanted to add some more information and examples to my answer.
Due to the discussed black box nature, my workflow generally uses Mathematica in the early prototyping stages. However, I then recreate any algorithms in Python/C++/... with commented and referenced code before finalizing a project. In this way I can ensure that I have proper literature references and any mistakes in my implementation are hopefully traceable for future researchers, giving code and data upon which I am willing to stake my academic reputation.
When proving analytical results, Mathematica can be a great boon in simplifying complex expressions or computing complex integrals. However, the standards of a mathematical proof require figuring out the necessary steps. This is often easier than trying to do so without Mathematica's help---knowing the end result often makes analytical work significantly easier. This makes me think of an SMBC comic, that "Mathematica said so" does not constitute a valid mathematical proof.
Mathematica is quite clever (hence my continued use), but is occasionally too clever for me to predict (especially in conjunction with the black box nature). Consider simple commands 200!
, Gamma[201]
, Product[i, {i, 200}]
, and Fold[Times, Range[200]]
, all of which compute the same result (check for yourself!). However, if I benchmark these commands using RepeatedTiming
, I find that 200!
runs ~2, ~250, and ~450 times faster than Gamma[201]
, Product[...]
, and Fold[...]
respectively. This is presumably due to the built-in factorial function knowing some clever tricks for optimizing the multiplication along with not needing to generate and store the list Range[200]
. This cleverness of Mathematica can cause some major headaches when trying to benchmark various algorithms. Perhaps algorithm A is in fact better than algorithm B, but my implementation of algorithm B used some built-in function with hidden optimizations, causing me to mistakenly think algorithm B is superior. This can make it quite difficult to separate out the signal (algorithm choice) from the noise (hidden optimizations), necessitating an implementation in a "dumber" language for a fair comparison.