I am beginning my graduate studies in engineering and will be working on computational science projects. I noticed that there has been some discussion about the advantages and disadvantages of implementing your own algorithms here. Is the cost-benefit analysis of implementing your own algorithms versus using libraries different when you're a beginning graduate student?
|
|
In my opinion, being a beginning graduate student doesn't change the answer by David Ketcheson here to the question you've linked in your post. Code minimal versions of algorithms you want to learn. Then set them aside. Coding your own algorithms is most useful for learning, but for research (or production) code, unless your research goals are to write software that improves upon the state-of-the-art libraries out there (if any even exist), you're better off using libraries. Libraries are likely to be better documented, more scalable, and more robust than what you code yourself, unless you are (or become) really good at coding. Also, libraries are likely to be tested and debugged for you (though of course, that depends on who wrote the library...). You will be responsible for supporting, debugging, and testing any code you write for your thesis, and to save time, it helps to minimize the amount of code you need to write. The only other scenarios that I can think of (i.e., there may be others) are:
|
|||
|
|
|
I'd like to give some more breadth to Geoff's thoughtful answer. In particular, I want to give you a little more perspective on the value of your programming efforts as opposed to your research efforts in your early career as an academic. You will find that being able to write software to augment your scientific research will make you a valuable member of almost any research team. However, this time will not be necessarily be considered "valuable" by your academic peers or those hiring for academic positions. From a 2011 research survey conducted at Princeton, "A Survey of the Practice of Computational Science":
That doesn't mean that it is not a good idea to implement or redesign a core library or applications, but if you are going to engage in any serious software development (more than 25% of your time working with code), keep these three thoughts in mind.
As a footnote: the number of one-man effort projects that significantly advance any computational field is steadily diminishing, be it an application area or something more technical such as dense linear algebra. An increasing number of the software packages that form the "bread-and-butter" of computational research are 10 years older or more. Scientific code that has not reached this level of maturity tends to have more bugs, less features, and sparse documentation. Try to avoid working with immature code that is not actively supported, regardless of how old it is. |
||||
|
|
I think the cost-benefit analysis depends upon the desired scientific computing literacy that you want to achieve during your studies. For most scientist who work with computers being proficient in scientific computing is enough, this requires: a high-level (abstract) understanding of the main algorithms used, and programming skills that allow you to effectively use software libraries (building software, linking, using mailing lists). In contrast, if you plan to become an expert in the scientific computing field, you will need a deep understanding of numerical methods, floating-point arithmetic, and computing technology. You can learn theory of these topics from books however experience through practice is needed to build and maintain advanced skills. Hence, it might be a great idea to program all you use while you learn (e.g. if you want to cook like a Chef: you learn by eating what you cook, and by cooking often!) What is the correct level of proficiency depends on your career. See what level of skills are used by working people in your field. |
|||
|
|