$\begingroup$

"Computational Scientist" is somewhat broad because it includes people who doing numerical analysis with paper/LaTeX and proof-of-concept implementations, people writing general purpose libraries, and people developing applications that solve certain classes of problems, and end users that utilize those applications. The skills needed for these groups are different, but there is a great advantage to having some familiarity with the "full stack". I'll describe what I think are the critical parts of this stack, people who work at that level should of course have deeper knowledge.

Domain knowledge (e.g. physics and engineering background)

Everyone should know the basics of the class of problems they are solving. If you work on PDEs, this would mean some general familiarity with a few classes of PDE (e.g. Poisson, elasticity, and incompressible and compressible Navier-Stokes), especially what properties are important to capture "exactly" and what can be up to discretization error (this informs method selection regarding local conservation and symplectic integrators). You should know about some functionals and analysis types of interest to applications (optimization of lift and drag, prediction of failure, parameter inversion, etc).

Mathematics

Everyone should have some general familiarity with classes of methods relevant to their problem domain. This includes basic characteristics of sparse versus dense linear algebra, availability of "fast methods", properties of spatial and temporal discretization techniques and how to evaluate what properties of a physical problem are needed for a discretization technique to be suitable. If you are mostly an end user, this knowledge can be very high level.

Software engineering and libraries

Some familiarity with abstraction techniques and library design is useful for almost everyone in computational science. If you work on proof-of-concept methods, this will improve the organization of your code (making it easier for someone else to "translate" it into a robust implementation). If you work on scientific applications, this will make your software more extensible and make it easier to interface with libraries. Be defensive when developing code, such that errors are detected as early as possible and the error messages are as informative as possible.

Tools

Working with software is an important part of computational science. Proficiency with your chosen language, editor support (e.g. tags, static analysis), and debugging tools (debugger, valgrind) greatly improves your development efficiency. If you work in batch environments, you should know how to submit jobs and get interactive sessions. If you work with compiled code, a working knowledge of compilers, linkers, and build tools like Make will save a lot of time. Version control is essential for everyone, even if you work alone. Learn Git or Mercurial and use it for every project. If you develop libraries, you should know the language standards reasonably completely so that you almost always write portable code the first time, otherwise you will be buried in user support requests when your code doesn't build in their funky environment.

LaTeX

LaTeX is the de-facto standard for scientific publication and collaboration. Proficiency with LaTeX is important to be able to communicate your results, collaborate on proposals, etc. Scripting the creation of figures is also important for reproducibility and data provenance.