Software architecture without knowing about it

I have to do a semester project in my fourth semester at my university. I already started planning a bit and me and others started writing a project specification, as we want to get this project done. The project has to be a software project, maybe included with some hardware stuff.

I don’t want to talk about the project itself now. I want to talk about the bad fact, that we need to do some planning on software architecture and software engineering beforehand, but we (I) don’t know how. We have these lessons in 3-5th semester, which is too late in my opinion, as the project is in the 4th semester. I’m currently planning the software, and we are thinking about a modular software setup, where we have one kernel which provides some infrastructure and modules which implement the actual functionality. Sounds great, I first thought it will be great, but I think it will not be. I ran into an argument with a good friend of mine yesterday. He argued that this is not how software works, in manner of how people want to develop software and how people want to use software.

The UNIX idea

The first idea is, we have a UNIX-Philosphy. We have very small programs which can do exactly one thing as perfect as possible. This is the idea of UNIX, and each piece of software should be designed with this philosophy. We could design our software to work in exactly this way, no problem! This implies, that we don’t have a big infrastructure. No framework or so. Just the small programs and a bit of abstraction around them to be able to “link them”.

The other point

But. There is always a “but” in there! If we want to have a lot of features and a lot of possibilities what the software is able to do, we must have good bit of abstraction. That’s the first point. The second point is: A user does not want to install a software and then install modules for it to enable himself to do basic things. So, the software must provide a minimal set of functionalities, which must be buildin. And this is exactly the opposite of the UNIX-Idea. We want features, we don’t want them to be outsourced, as it is not as userfriendly as it could be, so we have to break UNIX.

Is there a balance?

This is a double-edged sword. Or maybe a trible-edged one! We have three points:

  • UNIX-Idea
  • Much features
  • Modularity And they don’t harmonize. We have to break one of these points to fulfill the other two! Maybe there is someone out there who knows a solution to my problem?

The idea

My friend argued, that we should build one program which is able to do all the stuff we want to be able to do, and let others just “hack in” their functionality, as people do it in the kernel! I think the linux kernel is a very good example: There is a bit of infrastructure, but people always break things to introduce a new device-driver or whatever. His idea for our project would be the same: Write a kernel which can do a lot of stuff and let users hack in their stuff. The kernel has a interface to let the user load modules into the kernel, but the kernel per se is runable without them. And it works. So, we should provide a possibility to let people hack on the software without changing the actual software (by a module-interface or whatever) and, if they want to, let them add features to the software itself if they want to in a easy way. I don’t know if this is the way how to do such things, but for the kernel it works! Maybe this is a good idea. I don’t know. Tell me what you think!