object oriented – Just Software Design

Anytime I managed to write a complete piece of software in the past, (none of my systems were huge), I never made any design artifacts such as a UML diagram or pseudocode document, but simply conceived of how parts of it should work and coded it until I had developed the full system. The only form of planning I did was the occasional use of a todo list.

I learned in my computer science courses that this is the wrong approach, and that design artifacts such as pseudocode documents, flow charts, etc, should be made before any code is written. But now I am getting stuck trying to figure out how to design an application.

I don’t know UML, and I can’t simply use hierarchical diagrams or flow charts because the systems I want to create consist of components/objects that interact with one another. Therefore, I need to use diagrams that represent objects/components, their interfaces, and the interactions among them. But without knowing UML I find myself unable to do this. Furthermore, I do not even know how to begin designing an application with such diagrams, as the last time I attempted it I immediately experienced a mental block.

I searched the internet for simple explanations on UML diagrams but I could not find any. Nor could I find any free software for drawing such diagrams. I also find it difficult to find information on how to design software. There are plenty of articles on design patterns, and for the most part I understand them, but there is hardly any information of software design itself.

I even had a job at a small startup where I built things without drawing diagrams and they worked without any problem. But now I find it difficult to code simple programs, either because I am too lazy to rewrite and extend code or because I am actually getting stuck. I need to learn how to design software with diagrams and pseudocode.

I tried to design an rewrite of a simple application I wrote for making and editing outlines and the only thing I wrote on the paper were names of interfaces similar to classes I had already partially implemented in C#: IOutlineDocumentsView, IOutlineDocumentsController, IOutlineDocumentView, IOutlineDocumentController, etc.

I don’t even code bottom-up, I code in a haphazard inside-out outside-in ways manner. I start coding a class and then when I am about to implement a call to a method I didn’t write yet, I stop writing the method I am already working on and start writing the other method. I can’t code top-down because then I would never get around to running my code and there is always a strong possibility that the bulk of my system will not function.

That’s why I like to start out with a small program and make it larger over time. I never really built a very large application, but I did build a web application at my job that grew as features were requested. And even for the first version I had to build it one feature at a time.

So my question is how am I supposed to design software seeing I am on disability for mental illness which probably has decreased my IQ to below average level?