I've always been interested in how things work. As a young person I took apart my fair share of toys, plants, and household appliances to see how they worked. Most of the appliances and toys I also put back together, but not always. I learned from these experiences and as I grew older I was the fixer in the house. I remember installing a phone jack in the house around 7th grade so we could get rid of our old rotary dial telephone and move to the modern era with a touch tone phone! A lot has changed in the last 40 years.
As a computer programmer and now as a Computer Science Professor I understand the value of learning how things work.If we understand a tool, we are more likely to use that tool to its fullest extent. We also have a much better understanding of what went wrong when the tool breaks or when we don't use it correctly.
Programming languages are one of the main tools of computer programmers. I have spent a lot of my career understanding programming languages and how they work. A couple of years ago I developed a framework for teaching the implementation of programming languages. Part of that project included building a virtual machine. A virtual machine is a computer program that simulates a computer in some ways but also provides a higher level of functionality than the bare hardware of the machine. This virtual machine was written using C++ and was called CoCo. I was happy enough with CoCo but I knew it lacked some features that I really would have liked to include in its implementation.
Sometimes when you build something new and start using it, you learn enough about it to see its flaws. I decided that CoCo could be written and implemented more effectively in Java. In January of this year I recruited a student, Jonathan Opdahl, to work with me and we began rewriting CoCo in Java, naming it JCoCo. The implementation is now complete, better than CoCo, and available at http://cs.luther.edu/~leekent/JCoCo. Jon and I learned a lot about virtual machine implementation and coding in Java as a result.
One of the cool things about CoCo and JCoCo is that they include a tool called a disassembler, which like its name suggests, lets us take apart programs to see how they work. This particular disassembler takes apart Python programs so you can see how they are implemented. And, if you need to further see how it works, you can look at the JCoCo code which will soon be available on the web at http://github.com/kentdlee/JCoCo. The ability to write a program, and then to take it apart and peer into its low-level implementation details makes learning how Python works so much easier. In my Programming Languages course students go on to use the knowledge of how Python works to implement other programming languages. By applying what they learn, students are able to concretely see it in practice, making their level of understanding that much deeper.
This process of prototyping leads to discovery which leads to better implementations. It happens all the time in computer science where one implementation is replaced by a new and improved version. The key is to not be afraid of making changes, but to make those changes in an informed and responsible way.
The key to being a great programmer is related to these ideas. Great programmers aren't afraid of trying new things. They aren't afraid of saying when they don't know how to do something. They learn from their mistakes but aren't afraid of making them either. But, they also want to take it apart and see how it works.
These ideas can apply to all of us as well, not just programmers. Sometimes we venture down a road that seemed to be a good idea, but when we start living it we discover there are flaws that we would like to fix. In life the key is also to be brave and not be afraid to make changes in a responsible way. Periodically doing a life assessment is a good thing. I think we should all take a look at our lives once in a while and decide what is going well and what is not. Making actual changes in our lives is hard. And, we don't get to prototype our lives and then start over. So the choices we make in our lives are a bit more important than deciding which programming language to use.
Life is all about the relationships we have with other people. We can't take anything with us when we leave this planet except our relationships. I think that should be a guiding principle in all our life choices. But, being a Lutheran as well as college professor, I know we all make mistakes. If our mistakes, or trying to prevent all mistakes, becomes our life focus, then we risk living our lives for ourselves and not in relationships with others. Anna Bolz Weber, a Luther minister with an extraordinary life story, gave a lecture at Luther College on Friday March 31st where she said many of these things that I believe so strongly. She teaches that God has freed us from the worry of being in charge. We are not perfect. But freedom from worry about ourselves means we can live as God intended, in relationship with others.
I would add that along the way we can still have a little fun taking things apart to see how they work!