Its hard to truly understand a problem until you’ve tried to solve it once or twice. Towards this end, I’m going to stop speculating why engineering software is trapped in a quagmire, roll up my sleeves and start hacking.
I’m going to attempt modernizing an open source aerospace software package called xFoil. I decided to work with existing code rather than starting from scratch for several reasons, the strongest being that the project needs work and is widely used. I’m also somewhat familar with it from using it for UAV simulation work in college.
For those who have never heard of xFoil – here’s a brief overview:
XFoil 1.0 was written by Mark Drela at MIT in 1986 as an interactive replacement for batch mode computational fluid dynamics programs that were popular at the time, while at the same time employing new algorithms he had developed. XFoil is a Fortran77 app that uses plotting libraries written for the X Window System, which means its intended for Unix systems – but the developers seem to have gotten around this and distribute windows binaries. A quick google search will show that just about every aerospace engineering school on the planet uses this program for coursework, which makes this an especially good candidate for modernization – especially when you take a look at the interface:
Interaction is done via four letter commands in a console window, and plotting in a second window.
(Image lifted from the homepage of the
OS X distribution)
According to the documentation the last changes were made in 2008, and the project is frozen pending a next generation application. As this was two years ago at this point, I’m not holding my breath. So that being said, here’s the rough plan of attack:
Phase 0: Do some exploratory surgery on the code, make a spec, come up with rough estimates, generally standard prep work best practices.
Phase 1: Straight port to language ‘X.’ (Language to be determined, the goal here is just make it work). Test the shit out of it. Release early, release often – first usable code ships replicating what already exists.
Phase 2: Refactor core architecture and design into something much more maintainable. Start building a community around it, pull in domain specific experts to help steer the project and help validate output.
Phase 3: Experiment with interface and modern concepts (Cloud, mobile, touch, GPU acceleration)
This will probably be a much more difficult project than I currently estimate, but will be an awesome exercise in taming legacy code as well. Next time, updates on Phase 0 and preproduction work!