jump to navigation

How not to port software 7 February 2007

Posted by Matthew Fulmer in Uncategorized.

Three weeks ago, I received an assignment from my research adviser to
add a new, simple motion model to our path tracing program. Quite a
simple assignment. However, I do not like the code base for several

  1. It only works under Visual Studio on Windows
  2. It is monolithic
  3. It is not modular

So I thought, why not get around to cleaning up this code? I’ve been
wanting to do it all of last semester. First order of business is to get
it to work under Linux, as I didn’t have easy access to Windows or
Visual Studio at home. So I figured out how to use Autoconf and
Automake, and had the program building under Cygwin (but not linking) by
the end of the day. I then went home, thinking I could get the rest done
at home on Linux.

So I started examining what was preventing the program from running
anywhere. I found three things:

  1. A windows-only C++ threading package
  2. A windows/Mac only UDP Multicast client and server
  3. A possibly non-portable Mersenne Twister RNG

Being the over-confident programmer that I was, I figured I could solve
all these problems by refactoring to use glibmm, which had portable
implementations of all these things.

At the thought of refactoring, I had a bright idea: This would be so
much easier in Squeak Smalltalk! Why don’t I translate the program into
Squeak, then I could do the refactoring really fast! Also, I could do
the required visualizations in eToys and Morphic rather than learn how
to program in Max/MSP. So I started systematically translating the
relevant parts of the C++ code into Smalltalk.

By this time, I was about a week into the assignment. I had read enough
of the code to be able to decipher what was going on. Since I had this
understanding, why not make a simple, extensible framework that does the
same thing! So I installed the Smallapack matrix library for Squeak.
Then I set about creating the framework that does what the C++ code did
as a bunch of nested loops.

Two weeks go by, and I finally have a framework to send in data, process
it using the Matrix library, and draws a simple visualization. So I try
running it. Everything breaks. It seems that Smallapack for Squeak is
still in an early version, and diagonal matrices are unusably broken. So
I fixed that, and I find that I still have many of the calculations
wrong, and matrix inversion does not quite work in Smallapack. I did a
bit of Smallapack debugging, but by this time, I am tired of fixing
code, and just want to get it working. But also by this time, I have
spent so much time on this project that I have a few pending assignments
I need to work on.

About this time, Intel gave me a new Windows laptop. Well, that kind of
invalidated the entire reason I had been porting this software in the
first place. So I stopped working on this software for a week and worked
on the other projects I had to do.

That is what I have been up to for the past four weeks. I have the new
motion models in the Squeak version, but that version is broken, and
does not yet integrate into the rest of Smallab, although that would be
pretty easy to add.

So what do I have to show? I have a little bit of broken code with a
fraction of the functionality I started with. Sure, it is cleaner and
a bit easier to work with, but I don’t see an easy way to get it
functional without debugging Smallapack.

I now see that I went about the problem completely wrong:

  • I tried to refactor before I even solved the problem
  • I tried to change the build system while refactoring
  • I tried to change the platform out from under the system while
  • I tried to translate the program just to make the refactoring I hadn’t
    even started yet easier
  • I tried to rewrite the program on an unstable platform,
    with no commitment to fix the platform
  • I tried to fix the program with no way to run it or test it until the
    very end.

This was my biggest mistake.What I should have done is to suck in my arrogance, stay at the lab, and
use Visual Studio to add the new model to the C++ code base. I probably
would then have had a bit of time to go about refactoring the code in a
more leisurely manner. That would have prevented me from trying to do
the entire jump from Windows to glib or Squeak in one step. If I wanted
to port it to Squeak, I should have made the C++ code into a Squeak
plug-in, and wrote some tests for it. Then I should have translated it
method by method, refactoring as I translate, and keep running the

Finally, I would like to apologize to my adviser: Harvey, I am sorry I
spent my time taking the long path. I know that you value my time and I
see now that all we need is something that works, so that should be
given top priority. Again, I apologize for not following your advice, I
will most definitely have the new model and visualization working by
next Wednesday.



1. nicolas cellier - 20 February 2007

Hello Matthew,
very sorry Smallapack did not fit, but this is not amazing.
what you should learn before using a package:
– mind the tags: Squeak Smallapack is tagged bleding edge
– run the SUnit test cases: you should have seen they do not work
Only the VW version is usable (did not say bugfree).

If you persist in using Squeak version, correct some bugs or do some improvements, please share your work. Collaborating is the fastest way to obtain something working. Maybe you have done some good work that will be lost now.

And also, do not hesitate to ask for support, it costs nothing to ask…


2. nicolas cellier - 20 February 2007

Hello Matthew
I am very sorry your Smallapack experience failed.
Sorry but not amazed.
What you should learn before using a package:
– mind the tags: Smallapack is tagged bleding edge
– use provided SUnit test cases: you would see some are failing

In fact, Smallapack is usable only in VW by now (and i did not say bugfree, test cases need to be completed).

If you persist in using such a package, my advices would be:
– do not hesitate to ask support (it does not cost to ask)
– please share your critics, bugfixes, improvements
I think collaborating is the fastest way to improve such a general purpose package.


3. How not to port software, part 2 « And I thank God for… - 23 February 2007

[…] software, part 2 23 February 2007 Posted by Matthew Fulmer in Uncategorized. trackback In my previous post, I told about my experience trying to port a windows-only C++ program first to the cross-platform […]

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: