I’ve decided on a software project for December. Lines of code should make a good replacement for NaNoWriMo’s word count, though I don’t know what a good LoC quota would be and I doubt I’ll stick to it as closely as the word count goals of last month. It is important to have that arbitrary measurement of progress, I think, in order to keep the perfectionist inside me from ruining everything.
In this post I mentioned an integrated software testbed, which doesn’t really mean anything. What I want to create is difficult to explain.
I recently remembered making school presentations with HyperCard in the 9th grade. Are there any software packages like HyperCard anymore? Keep it in mind, as that is kinda/sorta how I want this project to look.
A lesson I learned early in my programming career is that breaking almost everything up into a library is generally a good idea because it allows for reuse. In fact, I have this ideal in my mind about how all programs should consist of dozens of libraries and a simple main.c file that just pulls in everything and ties it together.
Unfortunately, it seems that breaking code up into libraries often doesn’t help. Libraries that involve socket I/O often try to handle all file descriptor event processing (via select/poll). Data structure libraries might require that the data objects contain a next pointer as the first element. Or a library might require the use of threads when using threads isn’t desired.
Another issue I have with software is how difficult it can be to get at external data. How often do programs ask the user for data that really shouldn’t be too difficult for the program to get directly? Or perhaps the program could probe the network or hard drive for some possible clues and present them to the user for choosing?
To be fair, Apple and a few other companies seem to write software that often presents user with intelligent choices. I think the situation could still be improved, though.
As a professional developer I know why it is rare – software is complex and the data might be difficult to access. Perhaps the data is on another machine or there is a library to parse the data, but it requires the use of threads or it is slow and blocks the rest of the program while running (see above).
An issue related to external resources is the program screen. I love the way it allows me to run many programs on a system, detach, go to a different computer, and reattach to that session with all my programs in the same state. What I’d like is for that to apply to all of my programs, not just my Irssi and Emacs sessions.
Finally, I want software to be more flexible. That may take some more thinking, though, before I can explain it.
So my project is to create a testbed application that can be attached/detached, allows for easy access to internal or external data, can easily be enhanced with an internal scripting language, allows for true reuse of code, and is very flexible (again, more on this later).
Yeah, that’s all. Piece of cake.
Fortunately, this will work well as a month long project where the goal is to just write lots of code. It will certainly require lots of code to get running and even more for the benefits to become apparent.
I’ve started using git for revision control with my non-work projects. Over the past 8 years at 3 jobs I’ve used SourceSafe, CVS, Perforce, and Subversion. Perforce is pretty good and SVN is not bad. So far I like Git best. It is the type of revision control system I’d expect from a kernel developer, which makes sense as Linus started it.