Skip to content

Carts Before Horses

  • by

I have just started supporting a new client. We’ll call this client Client B. Client B did a pilot of DOORS, then a few months later hired a some consultants a month or so before they had a deliverable due. They did not, however, hire a consultant from the beginning. They learned DOORS themselves.

As Client B was starting up their DOORS pilot, I was starting up at Client A, setting up a full DOORS implementation for them. Client A had just performed a DOORS proof-of-concept, but they knew that they would need someone who had used DOORS before. They were migrating from another requirements management software package, and they didn’t want a repeat of what happened with that package.

Client A knew they were in over their head and they hired me to help them out.

Client A is in great shape as far as their DOORS database and requirements go today. Sure, there are still some battles to be fought and some decisions to be made, but the company knows where all the current requirements are and more importantly what all the current requirements are, and they didn’t know that before I started.

I created targeted DOORS training for Client as well as listened to their needs and structured the database so they would be successful. I also wrote processes tailored to what they were trying to do, and together we came up with attributes and levels of documents.

There were some arguments with Client A. Client A did not always understand why I was suggesting to do things a certain way. But in the end, they trusted my experience and judgement, and I believe they are very satisfied with their current RM processes and tools.

As I said above, Client B did a pilot, and they read the DOORS manuals and even went to some Telelogic training. But they never stopped their proof-of-concept. Instead, the POC just became their process, without a formal review. A few months into work they hired some consultants on a temporary basis, and as happens many times, these consultants were more interested in customizing the client’s DOORS needs (triggers, unnecessary attributes) rather than assessing what the client actually needed. For instance, this client had MS Word documents with huge, complex tables that they imported into DOORS. DOORS turned them into native DOORS tables and now Client B is trying to get them to look professional upon export to Word.

Client B has quite a bit of rework in their future, and more importantly they weren’t set up to be successful. There is no clearly defined schema. There are no clear processes. There are no definitions for what goes into DOORS and what doesn’t. They do have a doc tree and they have an idea of what they want, but they didn’t know all the correct questions to ask, and because they didn’t have an expert come in right away, there is quite a bit of cleanup to do, both in the database and in the users’ heads, as there are also some misconceptions about DOORS.

I believe if Client A had tried to figure things out themselves, Client A would be totally dissatisfied with DOORS and think that they wasted their time, effort, and budget. And that would have led to more resources wasted in fixing their implementation.

To be a great DOORS administrator and requirement manager, you need to know what your customer needs better than your customer. You don’t have to know every nook and cranny of every project, but you do need to know the project’s goals and their specific RM needs. The customer may tell you that they want an attribute for requirement priority, but do you know what they hope to get out of it? Do they want it just because it would be nice to have, or do they want it for budgeting/safety, etc, and is there a better solution for their need?

Many DOORS Administrators come from a SW Engineering or other database background, where they are simply told what to do and are used to just doing it without asking too many questions. (I don’t mean to pick on SW folks here and I don’t mean to be disparaging–I’m just going by what I’ve seen in my own personal experience!)

My customers sometimes hate me for it, but I ask lots of questions. Nobody just tells me to create an attribute and expects it to be done. They have to follow the process, and that process dictates that they need to justify the attribute’s existence. They also need to define the attribute clearly. With requirements, and especially DOORS schema, not having an admin to constantly ask “Why” is a sure-fire way to get a database that has little value.

Requirements exist to document and even sometimes to elicit the customer’s needs. As a DOORS Administrator, you have to elicit your customers’ needs to ensure a quality database. If you’re a project manager who wants to use DOORS, it is

critical to have an DOORS and Requirements Management expert on board from the very beginning. I think many DOORS Admins get so caught up in customization, writing DXL, and being told what to do by management/users that they sometimes lose sight of the true needs of their customers.

In any case, it’s very interesting to see how critical DOORS expertise is to a successful DOORS implementation. Anyone thinking about purchasing and deploying DOORS would do well to keep this in mind. The main difference between Client A and Client B is that Client A knew that they needed an expert, and they made obtaining an expert a priority from the very beginning. This greatly improved their chances for a successful DOORS implementation.

White Papers Galore

  • by

For those of you who couldn’t attend the US 2007 UGC conference, I thought I would pass along some information that was provided to those who did.

Telelogic has posted the white papers from this year’s conference here:

http://www.telelogic.com/campaigns/2007/ugc/agenda_postevent.cfm?region=us

Not all white papers will be posted due to some companies not giving Telelogic permission to share. And according to the email, not all white papers have been posted yet, so you have to keep checking back

It’d be nice to have all those white papers in one place instead of having to poke and prod around. But if you’re willing to do that poking and prodding, I’m sure you’ll find some useful information.

DOORS Link Modules – Explained!

  • by

One thing that really confuses new DOORS adminisrators is link modules. When I say that DOORS is not Access, one thing that makes DOORS different than other databases is link modules.

I think Telelogic, both in their documentation and in the DOORS UI, makes way too big a deal out of link modules. Link modules are just a container, yet going through the documentation it’s not clear exactly what that container holds.

Link modules are like airports, and linksets and link mappings are like flight paths. Source formal modules objects are passengers, and target formal modules and objects are destinations.

Is everyone with me so far?

Let’s say we have DOORS modules representing Customer Requirements, System Requirements, and Software Requirements. Let’s say no link module exists, and no link mappings yet exist. Someone creates a link from Software to System. DOORS will ask if a link module should be created, and if the user says yes, DOORS will ask if a linkset should be made. If the user says yes to that, the link gets made.

The created link module, named DOORS Links, will be created in the same folder as the Software module. DOORS will have created a linkset for the relationship Software to System requirements. This linkset will be contained in the link module. At this point we should rename DOORS Links to something a little cleaner, like “Links to System.”

This linkset is like a flight path. A passenger just took a flight from Software through the DOORS Links airport, arriving at target destination System.

Let’s say another airport is created. We want to use this airport to link Software Requirements to a new module, SSDD. Let’s call this airport “Links to SSDD”. (In other words, in the same folder, create a link module called “Links to SSDD.”) In the Software Module, I can go to File>Module Properties and choose the “Linksets” tab. The name of this tab is misleading. What you are doing here is defining link mappings. Linksets are defined in Link Modules.

Link mappings are flight paths too. But unlike linksets, they can be mandatory flight paths.

In the “Linksets” tab, click the “Add…” button. As the target module choose SSDD, and then set “Links to SSDD” for the link module. Check the Mandatory checkbox and make sure Overridable is unchecked. Click ok. Finally, check the “Only allow outgoing links as specified in the above list” checkbox. Click OK.

When a user creates a link from a SW requirement to the SSDD requirement, DOORS will now use the “Links to SSDD” as the link module. When the first link is created, DOORS will ask to create a linkset for SW to SSDD links. When the user agrees to have DOORS create the linkset, the link is made.

In other words, SW passengers traveling to destination SSDD will be required to use the “Links to SSDD” airport and the SW to SSDD flightpath. Yes, there’s the “Links to System” airport as well, but that airport doesn’t feature the same flight path, and even if it did (and it can, in case you were wondering), we’ve mandated that our SW passengers traveling to SSDD have to use the Links to SSDD airport. They don’t have a choice, similar to many passengers who use the airport in real life.

What if we didn’t make that airport mandatory, or we made the airport overridable. Well, in DOORS you can do that, and in my opinion it’s a horrible idea. As Administrators, we’re like the FAA. We control the flight paths. Letting commercial pilots fly freely without using flight paths is a recipe for a crash, or at the very least, some near-misses.

This all sounds really complicated, I bet. To me, there is too much thought invovled for my end users, and I like to make things really easy for my users. The easier things are for them, the easier my job is.

 Once the above has been set up to be mandatory, DOORS does the work for the users automatically when it comes to creating links. Users don’t have to worry about link modules and mappings and linksets when it comes to creating links through the interface. But as soon as they use Link By Attribute, Delete Links, or the Analysis Wizard, they have to start worrying about link modules. And when you have multiple link modules, the user has be savvy enough to realize what they’re doing.

My rule of thumb is unless there is a very good reason to do otherwise, every folder should have a link module within it in DOORS, and every module within said folder should use the same link module.

So if I have a folder for Use Cases, with 10 Use Case modules inside, I set up my databases to have just one link module for Use Case Links. Now the target module (ie., destination) for each and every Use Case may be different.

So if Use Case 3 links to System Requirement modules A and B, and SSDD Modules 1 and 2, when I run the Analysis Wizard for all modules and choose the Use Case Links link module, I’m going to get all outgoing links. Whereas if I had set up a separate link module for System requirements versus for SSDD requirements, then using the analysis wizard, it would be much easier for me to see just the SSDD links, not bothering with the System links.

Why, then, would I put all outgoing links in one module? It’s simple–I can always edit the DXL that shows traceability to exclude certain target modules!

Therefore it’s a trade-off. I make my life a little harder because I have to create custom trace reports from time to time, to make everyone else’s life easier with not having to worry about which links go in which link module. There is nothing to worry about, as there is only one link module in each folder!

My personal opinion is that this is bad design in DOORS. An end user should never, ever have to worry about link modules. And most of the time they don’t. But if they ever do, you can make it easier on them by letting the answer be obvious.

And that can be done using multiple link modules or just one. The choice is up to you. The important thing for admins to realize is that link modules are containers for linksets, and a link “travels” along a linkset, thus you really want to define your flight paths, so that when it comes time to do traceability, your traceability matrix is easy to understand.

Each module that gets created needs to be maintained. This includes link modules. So my last piece of advice is to make link module maintenance easy. Since links can only be created from a user who has edit access on the source module, make the link module have permissions for group “Everyone else” to “RMC”. This way, you don’t have to manage group permissions for link modules. If I don’t have edit access to a module, then I can’t create a link. But once I do have rights to that module, you as the Admin won’t have to go in and grant me rights to the link module. I’ll be able to create links instantly, and thus don’t run the risk of creating another link module called “DOORS Links”.

 Once you make the choice on how to set up your link modules, be sure you know why and be sure it’s documented. Maybe you want a separate link module just for internal links rather than external links. Maybe you want to control traceability via DXL, like I tend to do. Just know why you’re doing what you’re doing and then be consistent. Easier said than done most of the time, but not with link modules.

DXL Tutorial – Part I

  • by

I’ve seen a few DXL guides in my day, and I’ve seen a lot of DXL snippets, but I’ve never seen an in-depth DXL tutorial. I’m writing this to help plug a gap in the world of DOORS and DXL.

DXL coding is like coding in any other type of language, you have to practice it and do it over and over and over again until you learn its intricacies. The problem that DXL has, unlike many languages, is that it only has a reference guide, and not a full API manual. The reference guide assumes that the programmer is only using the guide as a reference, so explanations are generally on the shorter side, and details are generally not always given where they ought to be.

Telelogic wants to sell training, and that’s fine, but in my opinion, they cripple their user guides as a result. I think they could put every ounce of information about DOORS and DXL in their documentation and they would still sell training, as most projects have managers that understand the importance of getting requirements right the first time.

There I go, digressing again.

The reason I bring it up in the first place is that there are just many different places to go to find critical information. Why isn’t the DXL I wrote showing up in my user menu? Why am I getting an error on a print statement? Finding the answers to these questions takes a lot of time, as you may find them on the Telelogic forums, in the reference guide, via a Google search or by studying code yourself, but there isn’t just one or two single places to go.

The purpose of this series is to take a relatively simple script and add on to it and make it robust, providing a great DXL tutorial in the process. I shall do my best to document the reason for every single line of code.

I was recently tasked with finding out which modules in our database have incoming links. So I wrote a simple function to accomplish the task. This series will take that function and expand upon it incrementally, giving it more features.

Please leave me comments and ask as many questions as possible. Also, make some requests for features. We can all try to build this together. Remember, the goal here is to document as much as possible in an easy tutorial—so people can look at this example and see all the basics to lookout for in one place.

I do assume that you have a basic understanding of programming. This isn’t about teaching programming. You should know the difference between an int and a string. You should know the difference between a for loop and a while loop. If you know the basics–if statements, Boolean logic, etc, you will likely be able to learn some DXL from this tutorial.

So without further ado, let’s begin.

For now, I am setting our goal to be finding out if the current module has any objects that contain incoming links. This seems pretty easy overall. We will eventually expand upon it and include every module in a folder, but for right now, we’re going to concentrate on just the current module.

Thus, step one is to open a module.

The first thing to get out of the way is how to format the comments at the beginning of the file. This header information is important in case someone else has to maintain our DXL and/or we ever want to put it in a DOORS menu.

If we want to use this in a DOORS DXL menu, our code must begin with each of the comment styles, in this order.

//

/*
*/

You can run any DXL you want without this at the beginning, but it will never show up in a DOORS menu.

So I’m going to populate this code.

//Module has incoming links.dxl

/*
$FILENAME: Module has incoming links.dxl
$VERSION: 0.1
$DATE_MODIFIED: 2007-09-23
$DESCRIPTION:
The purpose of this DXL is to report whether the current module has any objects with incoming links.
$CHANGE_HISTORY:
2007-09-23: Initial Release
*/

DXL, like C and C++, uses // and /* */ for comments. You can put anything you like in here and you’ll never get errors. The // is for a single line and /* */denotes multi-line comments.

So we’ve got our description. We should save the file as “Module has incoming links.dxl”.

Now let’s actually start some coding.

For now, the requirement is only to determine whether or not any objects have incoming links. We don’t need to count the number of objects, nor do we need any additional link information.

We have two methods of accomplishing this. We can look at every single object in the module one-by-one, or we can apply a filter. The better way to accomplish this is to apply a filter. Before we apply it, we have to define it.

//Declare filter integers for accepted and rejected objects
int iAcc = 0
int iRej = 0

//Turn off current filter
filtering off

//Define the filter
Filter f = hasLinks( linkFilterIncoming, "*" )

The above code will not give any errors in DOORS, but it won’t give any output either. However, I want to discuss what has already been done.

I declared integer variables for the number of objects accepted and rejected by the filter. This is necessary because if 0 objects are accepted, then our module has no objects with incoming links, and we need to know that. We likely won’t use the iRej variable, but we need it because the function that sets the filter requires it. I also initialize the variable because it’s just good practice. Without initializing it first, if I were to say, print iAcc, and it didn’t have a value, the user would get a DXL error.

Notice, also, how DOORS does not end statements with a semicolon. This makes it different than many other languages. If you don’t like this, you may put a semicolon at the end of every statement. DOORS will ignore it, but will still run DXL.

I did turn filtering off in case there is a filter applied. I do this because DOORS can be quirky sometimes and it’s best to be as explicit as possible. I believe you may omit this statement and the code will still work flawlessly, but I prefer to be safe when it comes to DXL.

Finally, notice where we define the actual filter. Notice that Filter is capitalized. When we declared integers, int was not capitalized. The reason for this is that DXL custom types are capitalized. In C, there are strings, reals, ints, bools, etc. If it exists in standard C, then it is not capitalized in DXL. The filter type is not found in C, so Filter must be capitalized, as must other DXL types, such as Module, Link, Object, and so forth.

There is a function for a filter called hasLinks. If you reference the DXL manual, you’ll see that you can filter on linkFilterIncoming, linkFilterOutgoing, or linkFilterBoth. These values correspond to the values in the links tab of the define filter dialog in DOORS.

The “*” means that we are ignoring specific link modules. Instead, we just want to know if there are any incoming links, regardless of which link module those links may be going through. If we wanted to look at a specific link module, the line would change to:

Filter f = hasLinks( linkFilterIncoming, “/path/to/link module/actual link module name” )

Is everyone with me so far? Now we just need to set the filter and turn filtering on and see what we get.

//set filter
set( current Module, f, iAcc, iRej)

The above code sets the filter f in the current Module. It passes the variables iAcc and iRej by reference, so that both iAcc and iRej are updated with the results. (The & symbol in front of iAcc and iRej in the DXL reference manual for this function means that these variables will get updated by the function).

At this point, we could turn filtering on with a line that said, “filtering on,” but there is no need to do so. We have the information we need. You can turn filtering on if you want to do a quick check, as every object should have at least one incoming link.

If any objects were accepted, we know we have incoming links. So we just need to print out whether we do.

( iAcc > 0 ) ? print "true" : print "false"

This is a unary if statement. Since we’re just wanting to do something simple, we can use this method. It is equivalent to the following code.

if ( iAcc > 0 ) {
print "true"
} else {
print "false"
}//end if

The above code, whichever if statement method is used, will print out true or false in the DXL Interaction window, even if the DXL Interaction window is not being displayed. Calling print will always display it.

Since this may be a menu option one day, we shouldn’t use the print statement. So I’m going to change the code.

( iAcc > 0 ) ? ack "true" : ack "false"

Ack is equivalent to msgBox for you VB programmers out there. It displays a dialog box with an OK button. It’s more interactive and user friendly. (I apologize for using buzzwords from the 1990s, but in this case, it’s true. An ack box is generally better to use than a print statement in DXL.)

So for now, we’re done. I’ve included the entire code below. We’re going to add on to it. My plans eventually are to choose an individual module to run this on via a dialog box. Then maybe to choose a folder to run this on. Finally we may output a report to Microsoft Excel. And we’ll do it from scratch.

Next time we’re going to talk about making the above code into a function. This will let us reuse the code in other scripts very easily.

If anyone has any ideas on how to enhance this, or what tutorial features you’d like to see, feel free to comment below.

//Module has incoming links.dxl

/*

$FILENAME: Module has incoming links.dxl
$VERSION: 0.1
$DATE_MODIFIED: 2007-09-24
$DESCRIPTION:
The purpose of this DXL is to report whether the current module has any objects with incoming links.

$CHANGE_HISTORY:
2007-09-24: Initial Release

*/

//Declare filter integers for accepted and rejected objects
int iAcc = 0
int iRej = 0

//Turn off current filter, in case there is one already applied
filtering off

//Define the filter
Filter f = hasLinks( linkFilterIncoming, "*" )

//set filter
set( current Module, f, iAcc, iRej)

( iAcc > 0 ) ? ack "true" : ack "false"

To run this, in the module you’ve opened, choose Tools>DXL Interaction, paste the code, and click Run.

DOORS Is Not Access — Part II

  • by

In my last entry I explained the concept of a public database. DOORS is a public database. Access is semi-public, as an Access developer can take steps to expose or hide the database from the users, where Oracle is usually intended to completely backend all data. Users don’t really go into an Oracle database and poke around.

This isn’t true for DOORS. When DOORS is used as anything other than a repository, users can usually see more than they absolutely need to. This makes DOORS different from other databases.

Let me illustrate my point with a story.

DOORS Is Not Access — Part II

DOORS Is Not Access – Part I

  • by

It is my sincere hope that one day, someone who has just been tasked to administer DOORS for their company and who knows nothing about DOORS will come across this entry and think a little bit before jumping in head first.

Merriam-Webster defines a database as “a usually large collection of data organized especially for rapid search and retrieval.” In this sense, DOORS is a database. There is a DOORS server, with organized data that can be accessed by clients.

But just because DOORS is a database, that does not mean that it’s just like every other database. And I’m not talking about the difference between, say, MySQL and PostgreSQL. Or even Access and Oracle. Yes, Access and Oracle are vastly different, but all of the database servers/tools listed above have one thing in common: most of the time, the customers of the data they house never see the structure of the database.

DOORS Is Not Access – Part I

Kevin Murphy

Chat with us!

Work with an IBM Champion to master your ELM tools.

Get in touch