software design rant

Page may contain affiliate links. Please see terms for details.

Yellow Fang

Legendary Member
Location
Reading
Are there any other programmers on here? If so, what are your opinions on the complete software lifecycle? I did an HND in software engineering twenty years ago. We learnt about Yourdon's methodology and breaking down software into processes and modules, writing pseudocode descriptions of modules and data dictionaries.

The first job I got was because the department manager was a convert to software engineering practices. They were trying to introduce it to their department. They developed aircraft simulator visual systems· Personally, I blame having to use software engineering practices for getting me the sack in that job. I was given the task for writing a diagnostics package for testing one of the processing units. I wrote iteration after iteration of the design documents, which would get picked over and bounced back by the senior engineers. I could never understand what the software actually did because I wasn't allowed to to start coding. When redundancies came around, I was first on the list.

I've never been able to understand software until I've started coding it. Design specs just bounce off my retinas. At that company, they were working to introduce the V model. They'd do the user requirements, review them, progress to the architectural design, detailed design, implementation then back up the other side with unit testing, validation against the equivalent design specs. Has this ever worked in history? The way it usually seemed to work was that initially someone would draw a design, and possibly do some pseudocode. Then people would discover mistakes in the design or think of a better way of doing it. By rights, they should go back and rectify the design, but instead they just implement it in the code. Before you knew it, the code and design documents would bear no relation. In one of my other jobs, I was barely allowed to touch the software, but I was allowed to modify the design so it reflected the implementation. Writing pseudo-code never seems to make much sense to me anyway. High level software languages are pretty much the same as pseudo-code. Having to write detailed design documents just meant having to duplicate work. Nobody ever reads the design documents, and if they do, they don't understand them. I don't think most engineers really start to understand the code until they start messing about with it.

One of my other jobs was writing and testing software for aircraft engine controllers. As it was safety critical, all the design specs were totally unambiguous, and everything had to be rigorously tested against the design documents. The designs were different to anything I'd studied up to then. Basically, they were logic diagrams, resembling circuit diagrams. The engineer from Pratt & Witney would send us the diagrams, we would implement and test them. Then Pratt & Witney would do their own tests back in Canada. Then we'd get another set of diagrams. It seems like everything was thoroughly designed and tested like you would hope, but basically what we were doing was compiling the designs the Pratt & Witney guy was giving us. If there had been a design package that could have compiled his designs into code, he would have used that instead of us. So basically, the Pratt & Witney engineer was hacking the designs until it worked.

My last job was not safety critical or high volume, so most of us just wrote code, tested it to our own satisfaction and sent it to the customer. If they were unhappy with it, we'd fix it. Sounds really unprofessional, but we never had any requirements specifications, and often the customer weren't sure what they really wanted anyway. It seemed to be that the more important the project, the less documentation there was for it. We had functional specs and software specs for some of the products. The functional specs were there to let the project engineers to know how to configure the systems. The software specs were to enable following software engineers to compile the software. They usually did have a few diagrams, which sometimes I updated for the good of my soul, but nobody ever read them. Generally I used the comms protocol documents to write the softwware.

Now I hear UML and object oriented design is all the thing, and Yourdons methodology and similar methodologies are consigned to the scrapheap. I've read about UML but I haven't used it. If it actually helps, then that's ok. If all it does is duplicate work and create inconsitency then I'm not sure it's a good thing. If a design tool actually:


  • generated some code, such as the function prototypes
  • reflected any changes made to the code back into the design
  • did not force any unnecessary duplication, such as pseudo-code and actual code
  • automatically generated documentation needed to satisfy the ISO9000 inspector

then I think it would be worthwhile. Otherwise I don't.
 

bonj2

Guest
we do 'agile' programming in the sense that we just do what is necessary to achieve what is asked for and no more. It's great up to a point, that point being the oft assumption by the boss that what's delivered in response to what he asks for, while equating to what he asked for, doesn't however always equate to what he 'had in mind'.
However, you can get sign-off for specific requirements without going completely anally bogged down in specifications and uml-crazy, which is i think what we're looking to move towards.
We follow other principles but we generally don't buy into the whole UML stuff, not 'cos we can't be bothered but largely because we've taken the decision that it's by and large a false god.

There's a whole raft of principles under the umbrella of 'agile' development, but one of the main ones is a 'just do it' approach, largely because as you correctly identify in your third paragraph programmers often only really understand software until they start coding it (so you're by no means alone in this regard).

My recommendation is you have a read up on 'agile' principles.
http://www.amazon.co.uk/Principles-Patterns-Practices-Robert-Martin/dp/0131857258 is a good book, it's for C# but a lot of it applies equally to any language. Perhaps if you like the sound of agile, then at your next job-hunting phase, you can look for companies that use it.

Another buzzword that 'agile' software development is known as is 'eXtreme Programming' (or 'XP'). I'm not sure whether the two are completely synonymous but they go hand in hand at least.
 

Abitrary

New Member
bonj said:
we do 'agile' programming in the sense that we just do what is necessary to achieve what is asked for and no more. It's great up to a point, that point being the oft assumption by the boss that what's delivered in response to what he asks for, while equating to what he asked for, doesn't however always equate to what he 'had in mind'.
However, you can get sign-off for specific requirements without going completely anally bogged down in specifications and uml-crazy, which is i think what we're looking to move towards.
We follow other principles but we generally don't buy into the whole UML stuff, not 'cos we can't be bothered but largely because we've taken the decision that it's by and large a false god.

There's a whole raft of principles under the umbrella of 'agile' development, but one of the main ones is a 'just do it' approach, largely because as you correctly identify in your third paragraph programmers often only really understand software until they start coding it (so you're by no means alone in this regard).

My recommendation is you have a read up on 'agile' principles.
http://www.amazon.co.uk/Principles-Patterns-Practices-Robert-Martin/dp/0131857258 is a good book, it's for C# but a lot of it applies equally to any language. Perhaps if you like the sound of agile, then at your next job-hunting phase, you can look for companies that use it.

Another buzzword that 'agile' software development is known as is 'eXtreme Programming' (or 'XP'). I'm not sure whether the two are completely synonymous but they go hand in hand at least.

Getting requirements signed off - iteratively if need be - is the most important thing in 90% of software projects. Stuff for critical systems, and very large projects involving dozens of programmers does need methodology (I hope), but then the most important aspect of that is the architecture of the code as a legacy... using OO and design patterns etc.

The most important thing to have is a project manager who continually asks the people wanting the software:

Are you sure this is what you want?
Are you sure this is what you want?
Are you sure this is what you want?
Are you sure this is what you want?
Are you sure this is what you want?
Are you sure this is what you want?
Are you sure this is what you want?
Are you sure this is what you want?
Are you sure this is what you want?
Are you sure this is what you want?
Are you sure this is what you want?
 
bonj said:
we do 'agile' programming in the sense that we just do what is necessary to achieve what is asked for and no more. It's great up to a point, that point being the oft assumption by the boss that what's delivered in response to what he asks for, while equating to what he asked for, doesn't however always equate to what he 'had in mind'.
However, you can get sign-off for specific requirements without going completely anally bogged down in specifications and uml-crazy, which is i think what we're looking to move towards.
We follow other principles but we generally don't buy into the whole UML stuff, not 'cos we can't be bothered but largely because we've taken the decision that it's by and large a false god.

There's a whole raft of principles under the umbrella of 'agile' development, but one of the main ones is a 'just do it' approach, largely because as you correctly identify in your third paragraph programmers often only really understand software until they start coding it (so you're by no means alone in this regard).

My recommendation is you have a read up on 'agile' principles.
http://www.amazon.co.uk/Principles-Patterns-Practices-Robert-Martin/dp/0131857258 is a good book, it's for C# but a lot of it applies equally to any language. Perhaps if you like the sound of agile, then at your next job-hunting phase, you can look for companies that use it.

Another buzzword that 'agile' software development is known as is 'eXtreme Programming' (or 'XP'). I'm not sure whether the two are completely synonymous but they go hand in hand at least.

Has User482 hacked your password and typed something really deep :sad:

I'm in geek land :smile:
 

bonj2

Guest
Abitrary said:
Getting requirements signed off - iteratively if need be - is the most important thing in 90% of software projects.

I wouldn't say it's the most important thing in 90% of software projects, I think it's more accurate to say that it's 90% of the importance in 100% of software projects.
So much so that it's possible to spend two years doing what seems like a great piece of work but that contains hardly anything that's of any use to the people selling it.

Abitrary said:
Stuff for critical systems, and very large projects involving dozens of programmers does need methodology (I hope), but then the most important aspect of that is the architecture of the code as a legacy... using OO and design patterns etc.

The most important thing to have is a project manager who continually asks the people wanting the software:

Are you sure this is what you want?
Are you sure this is what you want?
Are you sure this is what you want?
Are you sure this is what you want?
Are you sure this is what you want?
Are you sure this is what you want?
Are you sure this is what you want?
Are you sure this is what you want?
Are you sure this is what you want?
Are you sure this is what you want?
Are you sure this is what you want?

Yep, another thing though: it's also a case of "ok, this is what i've interpreted from your description of what you want - and I understand it to be this - am I on the right lines?!"
Someone can describe something, and he thinks he's described what's in his head perfectly completely unambiguously because HE can't imagine it as anything different, but someone else can...
In other words things can get 'lost in translation'.
 

bonj2

Guest
very-near said:
Has User482 hacked your password and typed something really deep :smile:

I'm in geek land :biggrin:

this is what i do for a living...
User482 couldn't come close to understanding it, he doesn't even understand climate change!:smile:
 
OP
OP
Yellow Fang

Yellow Fang

Legendary Member
Location
Reading
It seemed to be a bit different at my last job. Most software life cycles seem to assume you're designing some unique system for a particular customer. It wasn't really like that with my company. We made a product and whenever a customer wanted it to do something new or different, we tweaked it for them. This could be a problem if a customer wanted a change to a stable software build (or at least one they were used to) and numerous changes had been made to the current product. The project engineers were in constant negotiation with their clients, but usually we in software would just get handed and Engineering Task Form, which may just have one sentence on it. Obviously we'd have to satisfy our customers, but even if we'd got a detailed user requirements spec and had managed to deliver it in full, if it wasn't actually what they needed then waving the specs in their face wouldn't help us get repeat orders. On the other hand, we hand to resist feature creep, and some customers were just crap at signing off. I'm sure that someone must have done some initial conceptual design of the latest product, but I cannot remember ever seeing the document. The documentation I did was always after the fact and designed largely to help the project engineers with their installations. If a driver was required to control a new device, we'd copy the driver for a similar device and modify it. Updating a design document just seemed superfluous, especially as nobody reads them.

In the job before that, the user requirements were the design documents with very little scope for ambiguity. The job basically involved translating the logic diagrams into code and then testing them to buggery. It was slightly different on some other projects where the design documents were textual.
 
Top Bottom