Around the time that Windows 98 was at its most popular, I used to dabble in programming Windows user interfaces with Visual C++ and the help of several thick MFC (Microsoft Foundation Class) manuals. I wanted to create packaged (and admittedly simple) engineering applications. But for a chemical engineer with little background in Windows programming, combining math functionality with a user interface was time-consuming and cumbersome. (MFC can be arcane unless you’ve invested considerable time in learning the API.)
Later, I migrated to VB6. Designing an interface was an order of magnitude easier, but I still had to roll many of my own math routines, or link to external libraries. While I may be interested in the mathematical mechanics of adaptive step sizing in Runge-Kutta algorithms at the intellectual level, it was secondary to my then goal.
A few years after that I had to link several LAPACK routines and an open source grid control to an existing (but deficient) calculation tool. I contended with concepts like pointers, dereferencing, and dynamic memory allocation. Again, this was a time-consuming but entirely necessary task that was not my primary focus.
//LAPACK routine to solve n linear equations in n unknowns
int dgesv_(integer *n, integer *nrhs, doublereal *a, integer
*lda, integer *ipiv, doublereal *b, integer *ldb, integer *info);
//LAPACK routine to solve an underdetermined or overdeteredmined linear system
int dgels_(char *trans, integer *m, integer *n, integer *nrhs, doublereal *a,
integer *lda,doublereal *b, integer *ldb, doublereal *work, integer *lwork, integer *info);
Using math routines once involved implementation steps unfamiliar to many engineers.
There’s a common thread running through these anecdotes; I wanted to create technical applications that combine math with a user interface. This was time-consuming until modern computing tools removed the lower-level implementation (that of designing the interface and linking the math routines) from the user who just wanted to get things done. This placed far greater deployment control and flexibility in the hands of engineers, for whom time is the critical factor.
I’ve attached a simple Maple example to this post. It’s an interactive diet optimizer that uses Maple’s embedded components and linear programming routines to optimize a diet. (I blogged about the background to this application in a previous post.) Maple enabled me to interactively prototype the initial application and then design an interface to allow users to interact with it. With one more step, I could also deploy it to the web via MapleNet.
Modern technical software tools, like Maple, let you get things done without worrying about minor implementation details. Of course, I now have to find another excuse for being late on my projects.