As a student, if you want to do research work in Computer Science,
then you should have (necessary but not sufficient) the following skills.
- Problem Solving: This is about understanding a problem and its context and then crafting a solution to the problem that fits the context. Neither the problem nor the solution needs to be based on software. So, try to solve puzzles and describe your approach to solving the puzzle as an algorithm. Participate in coding challenges, e.g., TopCoder. Better yet, write software to address your favorite problem and then use the software.
- Experimentation and Data Analysis: This is about collecting, compiling, analyzing, and validating data and derived results. The data/results can range from simple performance measurements observed in a lab experiment to output from dedicated data collection exercises. So, learn about basics statistics and data analysis, e.g., What is a p-value anyway?, Manga Guide to Statistics, Head First Data Analysis, and Statistics Done Wrong (a bit advanced). Familiarize yourself with data analysis tools such as R and Microsoft Excel.
- Testing: This is about being able to test/check your program is correct, i.e., the program does what it supposed to do. Besides knowing how to test programs, you should know how to automate testing using various testing frameworks. So, learn about unit testing, TDD, and concepts common to various testing framework. Familiarize yourself with testing frameworks such as JUnit or PyTest. This applies equally well to testing results from experiments barring the tools and techniques used for such testing.
- (Software) Configuration Management: This is about managing configurations and versions of any artifacts such as manuscript drafts, source code, libraries/binaries, data sets, and beyond. This is not merely about software. So, learn how to use Git or Mercurial or SVN. Read about version control and configuration management, e.g. Software Configuration Management Patterns.
- Programming / Coding: This is about translating solutions into working software in your language of choice using appropriate features, idioms, and patterns of the language. So, translate algorithms from any algorithms text book into working program and then try to improve the program using alternative features, idioms, and patterns of the language. Read (yes, read) the source code of open-source projects, e.g., projects on GitHub and BitBucket.
- Technical Communication: This is about communicating the problem, the solution, and your route — what, why, and how — from the problem to your solution in a way that it is accessible to the audience in both written and spoken forms. This is probably the hardest skill to be good at. So, listen good technical talks, e.g., TED, and read good technical documentation, manuscripts, and blogs.
Having these skills will immensely help you with your research work; specifically, expedite the grunt work (yes, research involves quite a bit of grunt work) leaving you with more time for creative work. Further, it will benefit both your collaborators and you as it can reduce certain collaboration and coordination overheads, e.g., via version management, common lingo.
Even if you are not into research, having these skills can help you be a good software engineer.