My desire to teach grew out of my experiences as an undergraduate at Birmingham-Southern College and was confirmed through experiences as an instructor during graduate school. As a teacher I like to teach students first to ask questions and then show them how to find answers, which allows them to explore and learn on their own. My current research interests are in rapid prototyping of programming languages, whole genome sequencing, the composition model of cyclomatic complexity, and vertex cover algorithms.
As an undergraduate at Birmingham-Southern College, I found myself visiting the campus computer labs in the evenings to find underclassmen who needed help with their computer science projects. That’s when I realized I wanted to teach at the college level, envisioning myself returning to Southern or finding a job at a similar institution, one where small classes permit considerable interaction between students and professors.
I have since had the opportunity to teach four courses at Stillman College and many more at The University of Alabama and have found that the environment I so loved at Birmingham-Southern, while more difficult to replicate, is achievable even with enrollments 10 times greater. This close relationship with students is achieved by being oneself in the classroom and available outside the classroom — in the office, in the labs, and on message boards. As a graduate teaching assistant at Alabama, I have had the privilege of teaching Unix systems programming, data structures and algorithms, MFC, C++ , and Ada. Advanced programming classes are my forte.
The greatest challenge is to get students to talk and ask questions. Students have a natural fear of asking questions, particularly in large classes. At Birmingham-Southern a rapport formed easily because classes consisted of only five or eight students and we often had the same instructor year after year. One of my primary goals in teaching has become to encourage students to discard their fear of embarrassment and ask questions. When students ask questions they facilitate learning not only by getting the answers to things they want to know and are thinking about, but also by helping me adjust the pace and style of my teaching so I can effectively teach, rather than merely cram information into their craniums. Of course, we still have to cram material into their craniums, as part of fulfilling course objectives, but it seems to fit more neatly when the students assist in the process.
That leads toward my second goal: to get students to think and act independently, to help them trust their own instincts and seek out answers on their own. I have seen over and over that students who readily ask questions very soon no longer need to. The process of formulating good questions often brings them to the answers they seek — or the answers to their questions spark a curiosity that drives them to deeper research. Through this independent research a student's abilities in certain areas of computer science even occasionally go beyond my own knowledge and I start learning from them. These are the times I truly feel I have been a success.
My final goal is to encourage students to explore frontiers. The course I am currently teaching introduces students to Unix and Windows programming with MFC. Both areas are broad enough that it is virtually impossible to cover, much less know, all the ins and outs of the constantly improving technologies. Each year I find my brightest students exploring regions I have yet to visit. I leave the final project almost entirely up to the students and some bring back programs I would not have guessed possible for them. When given room to explore, students can choose a path that excites them, and when they are excited, they work harder and learn more. Two of my favorite programs include a clock that shows the current phases of the moon, and a game of Othello with an animated, talking head. The students who developed these programs, and others like them, explored creative and programming frontiers far beyond those presented in the classroom.
My dissertation focused on rapid prototyping of languages by incorporating the null-object pattern into a compiler compiler, and while language implementation remains a research interest, I am currently developing papers in bioinformatics, software engineering, and selected graph problems, as well as code generation, secure computing, cryptography, and complexity.
My interest in bioinformatics centers on genome sequencing, and I am threshing out a polynomial solution to the contig-scaffolding problem that arises in the double-shotgun approach pioneered at Celera. The key to my algorithm is to recognize the linear characteristics of the resulting graph problems introduced by double-shotgun sequencing methods and exploit these characteristics to find fast optimal solutions in polynomial time. It is my hope to develop a grant proposal to allow further exploration in this area. Bioinformatics is a huge emerging field, filled with NP-hard problems that need strong and efficient heuristic solutions. While I believe my strength in algorithms outweighs the weaknesses of my background in biology, it is my goal to continue educating myself in the field.
Graph problems often tie in to bioinformatics. I am also exploring heuristic methods for finding approximate solutions to the NP-hard vertex cover graph problem. While our current heuristics are delivering optimal or near optimal results for random graphs, theoretically the algorithm is potentially much worse than a two-approximation. The question remains, are the graphs that present complications for the algorithm identifiable through algorithmic means?
In software engineering I am looking for metrics that can weight grammars in complexity. Currently I am applying McCabe’s cyclomatic complexity model. Out of this I am discovering some flaws in the compositional aspects of McCabe’s cyclomatic complexity and am formulating corrections to the model that lead to more accurate compositions. The key observation is that McCabe’s measures inflate compositional complexity during trivial re-factoring of code.
Code generation is an exciting field in computer science. Many have trouble understanding the nuances of meta languages and the role of active and or passive code generating techniques. As a programmar I am always alert for patterns that lead to elegant refactorings across modules, many of these refactoring patterns lead one to code wizardry. I recently developed an application to write applications. Using techniques developed over a semester in a introductory Java lab I was able to create a code generator to map out and build a complete GUI database application from a small describtion of the primary table. While the resulting application is primitive, I can give this code builder to my students as a gift to provide a quick start to all theiur future projects.
Secure computing seems to be on everyone's toungue and I'm working on a simple idea based on trusting only source and a compiler. Virus and other malware violates system trust and executes in unsafe manners. If we can detect perfectly and efficiently when untrusted code is executing we can solve half of the problem. I have devised a simple hardware solution that may enable trusted computation in an unsafe world by detecting when intrusive code is executing.
Cryptography is also critical to secure computing and every day we learn that new methods have been discovered which break current best encryption models in seconds. Yet, perfect encryption is theorectically possible using one time pads. I am working on a system of devising one time pads in a semi-efficient public way. The semi-efficient is itself meant to make breaking the model, while possible, prohibitively expensive. In addition the model hase the property that it can be recusively applied to arbitrary depths which adds another level of information hiding. Removed is the concept of n-bit encryption, as even n will be encrypted, and 64 bit or 128 bit bear the same overall cost.
I am also interested in the comcept of complexity and I have been following complexity from several angles. Complexity from student perspectives is often very different from complexity as viewed from the instructor level. This dichotomy is also seen in the developer vs user view of software as well. Developers are rarely able to predict where users will have trouble with the software. Even large companies that make their living by removing complexity, occassionally seem to leave the masses in a lurch. When experts become novices for a day due to system upgrades, much can be learned about how those upgrades might have gone smoother or added to system complexity. When proficiency is replaced by complexity management tools and models, the argument has been that overall system complexity goes down, but when the entry becomes steep to manipulate the models and tools it can be argued that the tools and models do less to reduce complexity and more to encourage it.