By "familiar" I mean that I bought and read the manuals, but decided not to pursue them any further. Specifically, none of them provided me with any useful capabilities, nor did I feel the expense was justified.


MATLAB is easy to learn and easy to use, much like driving with an automatic transmission after learning on a standard. The problem with this analogy is that MATLAB costs about 100 times as much as a C compiler. If an automatic transmission cost 100 times as much as a standard, no one in their right mind would ever buy one.

While most languages use variable names to refer to specific locations in memory, MATLAB dynamically assigns the variable names to wherever the data is located. Consider the expression

A = A * B;

when A and B are matrices. MATLAB allocates memory to store the result of A*B, computes it then assigns this location as the new A (releasing the old A).

It should also be noted that one can create an array where every element has a different data type. This means that MATLAB variables are actually data structures and the data type is one of the entries in the structure.

If I were creating an open source version of MATLAB, I would use the following C definitions:

union child {
	struct sparse *s;	/* start of linked list */
	struct full *f;	/* array pointer */
	char *text;

union data {
	double d;
	long l;

typedef struct sparse {
	struct sparse *next;	/* linked list */
	long index;
	short type;	/* 0=undefined, 1=integer, 2=real, 3=complex */
		/* 4=sparse linked list, 5=full array, 6=text string */
	union child p;
	union data u;

typedef struct full {
	short type;	/* 0=undefined, 1=integer, 2=real, 3=complex */
		/* 4=sparse linked list, 5=full array, 6=text string */
	union child p;
	union data u;
 } FULL;
One could use the SPARSE structure exclusively, which would greatly simplify memory management and program logic. However, there would then be no point in ever using a full matrix, and accessing array elements by index IS faster than searching through a linked list.

Data type code type directs which entries in unions p and u to use. For complex variables, u.d contains the real part and p.s links to another structure containing the imaginary component. For arrays, u.l contains the array size (max index). It is not clear whether MATLAB uses integer variables at all (like BASIC). Needless to say, one can always convert integers to floating point as needed.


The primary goal of JAVA is to achieve portability. JAVA will run on any machine which has a JAVA emulator installed. Then again, anything will run on any machine using an appropriate emulator.

What most impressed me was the following message which was found several times in the JAVA manual. "Programmers tend to get into trouble when they attempt to do X, so JAVA does not allow programmers to do X." There is nothing I enjoy more than being treated like an idiot (sarcasm intended).

DSP Programming

With a background in digital signal processing, experience with array processors and a fondness for assembly language, DSP programming is both a logical career move and something I would probably enjoy. The only problem is that employers want prior experience.

I could actually afford to buy a DSK (about $300); I just have difficulty justifying the expense. There is nothing a DSP can do that I can't do with my current computer, except that a DSP can do it in real time. I just can't think of any interesting real time applications which do not involve even more expensive hardware.

Software Engineering

At one point in my career all the developers at EPR were given a book on software engineering and access to a CASE tool. The book was long on sales and short on useful ideas (or at least of studies to determine which of the ideas were any good).

As best I can figure, a software engineer is a developer who uses CASE tools to document his work. Either that or it is a variation of project engineering (management).

The CASE tool was interesting in that the drop down menus consisted almost entirely of acronyms. It was like someone made a GUI version of UNIX and filled the menus with things like ls, cat and man. Since we had no manuals or online help, no one ever figured out what the acronyms stood for. We did learn to navigate by rote to produce data flow diagrams. (Why anyone would WANT a data flow diagram...)

Of course, this was after the price of oil no longer justified exploration and management was desperately trying to find new ways to keep us busy.

Computer Science

It seems like the goal of computer science is to teach programming to as many people as possible, including those with no aptitude for it. Mostly what they do is "dumb down" software development. While this can reduce problems, so long as programmers have any capabilities whatsoever they can still make mistakes.

Truth is, I never met a computer science major who could program worth a damn. I suspect they keep coming up with new paradigms just to hide their own inadequacies.

The most useful software development tool I have ever used is a WYSIWYG GUI editor, but they seem to be peculiar to the GEM OS. Isn't this precisely the sort of thing that computer science is supposed to be promoting?

Windows XP

At one point installed XP on an old PC. What a RAM hog! The Cray 1 supercomputer had only 32 MB of RAM and no virtual memory capability, whereas I had to increase the RAM on the PC from 64 MB to 256 MB just to keep from thrashing. Response time for mouse events is still on the order of several seconds.

My conclusion is that Windows was designed specifically to waste resources so as to force users to buy new computers (which I eventually had to do). Nothing could be that inefficient accidentally.