Developing Tools
Improved awareness of which tools already exist, how they are structured, and how they are being used can help both developers and users be better prepared when embarking on a new tool development project or determining whether a new tool is needed. Recommendations and Cautions Software Architecture, Programming, Interface Design, Versioning New tool development, from the software developer’s perspective, is full of a range of choices as well as pitfalls. Increased awareness of existing tools, as well as being in contact with a network of developers, can help overcome common problems. Recommendations and Cautions Documentation Tool documentation is required and can be oriented towards three different audiences: 1) End users, 2) Technical professionals/programmers, and 3) Scientific staff. It can take the form of comprehensive self- help documentation, tutorials, or quick tips and tricks. It should cover all of the analytical assumptions and limitations inherent within the tool as well as all known issues with using the tool. Recommendations and Cautions Establishing credibility Tool users want to know that the results from using the tool are accurate, relevant for decision making, and transparent. This credibility is established through documentation, testing and validation, peer reviewed literature, and published case studies of application. Validation and case studies made independent of the tool developers will enhance a tool’s credibility. Recommendations and Cautions Maintenance Who will maintain and host the tool? How much time, resources, and money are required for long term upkeep and maintenance? How will customer feedback be collected, organized, and addressed? How will updates, bug fixes, and the release of new versions be handled? When should a tool project call it quits? All of these questions must be answered for any group that wishes to support and maintain a tool over the long term. Recommendations and Cautions Marketing and Communications A tool investment is not worth making if potential users never find out about the tool. From Web presence to publications and conferences, marketing and communication builds the awareness that will eventually increase the appropriate application of tools in critical coastal management applications. Recommendations and Cautions Training Training is essential to establishing and growing a user base for a new tool. A number of options exist for training new users on tools: 1) Tutorials and e-learning, 2) Standard training classes, 3) Customized training classes, and 4) One-on-one instruction and technical support. Recommendations and Cautions Field Deployment and Support What does it take to get a tool from its first release to it being used regularly in a real world setting and having a positive impact on the decision making process it was designed to address? It requires a keen understanding of how what kinds of human and technical resources are required to deploy a tool in the field. Understanding and planning this process is a crucial step for any organization that wishes to promote the appropriate use and application of tools. Recommendations and CautionsBest Practices for Developing and Deploying EBM Software Tools
Tool Conceptualization and Functional Specifications
Best Practices for Developing Interoperable EBM Software Tools
Ecosystem-based management involves integrating information and methodologies from diverse fields (such as ecology and economics), sectors (conservation, industry), and sources (scientific studies, traditional knowledge). It can also involve integrating diverse software tools, such as data acquisition tools, ecosystem models, conservation site prioritization tools, and stakeholder engagement tools. By designing tools to be easily linked—i.e., by making them “interoperable”—developers can ease the complexity of implementing EBM projects. The following best practices describe steps that tool developers can take to improve the interoperability of their tools.
Address interoperability early in the development cycle
Developing a tool that interoperates with others is more complicated than developing one that operates by itself. Maximize your chance for success by designing for interoperability from the start, rather than trying to add it on later. Allocate a larger budget than you would for a stand-alone tool, both for initial development and for ongoing maintenance. Recruit developers who have experience developing interoperable software.
Select an appropriate interoperability method Many considerations can factor into your choice of an interoperability method. Sometimes you will have no choice because you're trying to interoperate with an existing tool. When you do have a choice, consider these points: When in doubt, consult an experienced software developer. If possible, consult the developers of the tools that yours will interoperate with. Define and fully document a formal interoperability interface
Consider a simple EBM project that links two tools in a workflow: A → B There are several popular methods for linking the tools:
After selecting an interoperability method, identify the specific interoperability scenarios that you will support and those that you won't. Think through all of the details of interactions between your tool and those it links with. Write a formal specification of those details, including the sequential steps in the supported scenarios, the names and parameters of any functions your tool exposes to others, the complete description of data formats written and read by your tool, and so on. These details constitute the interoperability interface for your tool, and the document is called an interface specification. Use widely-adopted, stable technologies and data formats in your interface Select from the technologies and data formats that are most commonly encountered today. Do not select obsolete technologies or formats. Resist the temptation to select brand new ones if doing so would impose an unnecessary learning or programming burden on the developers of tools that will interoperate with yours. If possible, contact those developers and ask what they would prefer.
Provide interoperability examples
Most developers prefer to start from an example rather than an interface specification. Start by providing the simplest example possible, like the classic "Hello, world" program. Then provide more complex examples that illustrate the most common interoperability scenarios.
Make your source code available to other developers
Ideally, your interface specification should be complete enough that it answers all questions that a developer may have. But occasionally there are questions that can only be resolved by looking at your source code (or talking to you). If you do release your source code, you should select a licensing scheme compatible with the goals of your organization. See www.opensource.org/licenses for more information on open source licenses.
Manage changes to your interface very carefully
When you change your interface, it is very easy to break tools that interoperate with it. For example, if you change the parameters of a function, any code that calls that function will fail until it also is changed. Rather than changing the existing function, consider adding a new function that includes the new parameters. Keep both functions in your interface for a while, until your callers have migrated to the new one. Then remove the old one. When you must make a "breaking change," document it very clearly and notify developers that you know will be affected.
Choose your tool's dependencies very carefully
When your tool takes a dependency on an operating system, programming library, or other software, it forces this dependency upon other tools that interoperate with it. Carefully consider whether your tool's dependencies are satisfactory to the tools that interoperate with yours, and to the users of those tools. Select widely-adopted, stable technologies. Try to minimize the monetary cost and installation and operation complexity imposed on users.
Be careful with UI
If your tool has a user interface (UI), it is likely that developers of tools that interoperate with yours will want to replace or alter your UI. If your tool performs calculations, conducts a simulation, or something like that, separate the UI code from the computational code. Expose the computational functionality from your interoperability interface, so that other tools can present their own UI and then invoke your tool to do the computations. If your tool must present a UI, seek feedback from the developers of the tools that invoke yours.
Write high quality code
When another developer takes a dependency on your tool, he does so because he thinks he can save time. His dream is that your tool will solve some problems for him so he can forget about those problems completely. He doesn't know your code and he doesn't want to. When your code is defective, he usually can't fix it and must work around it. This can be extremely time-consuming and frustrating.
Test your interoperability interface rigorously
Write fake tools that interact with your tool through its interface and exercise its functionality as completely as possible. Run these programs whenever you produce a new version of your tool. If you know of real tools that interoperate with yours, run these tools and verify that they still work. Enlist the aid of the developers of those tools to run tests before you release a new version of your own tool.
Plan and test your packaging and installation strategy
If your tool is invoked by another tool, decide up front whether you will allow or require that tool to package yours with its setup program, or if the user must perform two separate installations. If you will support your tool being packaged by others, be sure to document how this should be done. Determine whether you will allow a multiple versions of your tool to be installed on the machine at the same time. If you will not allow multiple versions, plan how you will handle the "DLL Hell" problem, in which a program invokes your tool but it fails because the user has installed a newer version of your tool than that program was designed to invoke. Give developers of other tools a stable method for identifying the version of your tool that is installed on the machine. If your tool invokes other tools, determine whether it is permissible and feasible to package that tool with your setup program, and consider the other issues mentioned above.
Provide clear, actionable error messages
Do not assume that underlying libraries that you call will report meaningful error messages. Trap errors and report clear, actionable messages.
Provide your email archive, bug list, and source code online When you have a problem calling a function written by someone else and can't find a solution in the documentation for that function, you can often find the answer by searching the Internet. The solution often appears in a message posted to an email list, a forum posting, a bug description, or even the source code of the function you're calling. Make these sources of information available for your own tool by posting them on a web site.
Support developers who contact you
Clearly specify how to get in contact with you. When a developer contacts you, respond as quickly as possible. Plan to support developers after your project has completed. This may require a budget for ongoing maintenance. If you are unable to provide support anymore, clearly say so.
[These best practices were developed by Jason J. Roberts from Duke University with input from EBM Tools Network members.]
