As of now, I have been working with bioinformatics in the Mizuguchi lab at NIBIO, Osaka, for about two weeks. The lab environment is stimulating and I feel quite fortunate to be here.
It is interesting to compare computer science and bioinformatics with just the hindsight of this short period. In computer science and electronics, we study systems that have been built from the ground up with well known components at various scales. They have been designed with certain high level functionalities in mind, and it is always well known how these high level functions are being realised and what makes them tick. In biology, in contrast, we encounter systems designed by nature. These systems, organisms, have certain high level functions we are aware of. We are also aware of some of the low level functions, such as molecules, atoms and cells (although we may have only a partial understanding of some of these). The problem in biology is now to explain what makes a high level function tick or not tick, how to steer it, enhance it, or suppress it. The intermediate steps are not always revealed to us, and we must painstakingly tease them out with experiments. As always with empirical science, we can never be sure that we’ve obtained the whole picture.
This difference – the fact that we must reconstruct all the design principles and intermediate mechanisms for organisms, but not for computers – leads to different styles of teaching and thinking. Biology texts appear to be very top down and focus on what has been observed and what it appears to be. Technology texts can be bottom up, building up a complex design smoothly by adding one layer at a time, starting from the core, having the confidence that nothing is being omitted. The contrast is striking.
A limitation that both biology and computer science share is the problem of defining the exact capabilities of an organism or a system. In biology we often do not know, and I doubt if we ever will, considering how complex the genetic code is. In computer science, the capabilities of very simple programs can be completely understood, but understanding a nontrivial program — for example, verifying that it does what is desired and does not do what is not desired — usually requires nontrivial formal methods, if it is at all possible.