Reengineering Technical Software
Objexx has a long track record of successful reengineering projects. These projects range from modernization to complete migration to a new language and/or platform. Smart reengineering requires different strategies than development of new applications. The process and experience Objexx applies to reengineering projects yield efficient, successful solutions.
Assessment and Planning
Understanding a system thoroughly is a necessary first step for any reengineering project. Technical applications may have subtle behaviors and dependencies that can affect how best to meet the project goals. Objexx uses a range of tools and methods to gain sufficient knowledge of a code base.
Assessing the goals of a reengineering project is an important step. Sometimes the broader project aims can be met more effectively and/or efficiently by adjusting the concrete goals or by resequencing the project stages. Languages and libraries more suited to some aspects of the system can allow for a more streamlined project and a better solution. Objexx works with clients carefully to find the right mix of strategies and tools to arrive at a smart project plan.
Planning is vital to any reengineering project. Sequencing of milestones to provide frequent releases of increasing functionality keeps clients in touch with progress and enables early feedback on design choices. Identifying decision points for key choices and planning those evaluations is important to avoid blocking tasks that hold up progress. Distributing tasks among developers and building in sufficient tasking flexibility keeps efficiency high.
Modernizing a technical application allows a valuable code base to be preserved while improving code quality and exploiting benefits of new languages and tools. These projects can include a number of activities such as:
- Moving a code base to new language version constructs and best practices. Objexx does many projects migrating C/C++ to modern C++11, and migrating legacy Fortran to Fortran 95-2008.
- Adapting a code base with platform dependencies to cross-platform, standard-compliant code.
- Refactoring to an object-oriented design to improve code quality and extensibility.
- Developing new input and/or output systems to improve functionality and extensibility or to exploit third-party libraries. Objexx has developed smart input systems built on layered configuration files that provide trivial input changes with zero GUI recoding, input customization schema layers, and minimal case files.
- Outputs can be migrated to a modern, portable, space-efficient data file format such as HDF5.
- Developing a GUI for a legacy application. Objexx develops innovative GUIs with cross-platform libraries such as Qt, PyQt, and PySide.
- Adding visualization and post-processing tools. Objexx has experience with a number of plotting and 3D visualization packages.
Reengineering goals are sometimes best met by larger scale migrations such as:
- Building a modern front-end application around an extracted computational core. Objexx has, for example, wrapped legacy Fortran with a Python-based GUI front end and connected with F2PY-generated bindings.
- Converting a legacy application to a new language that offers significant advantages (see Fortran Migration next).
- Rebuilding an application using commercial grade libraries in place of legacy code to obtain robustness and/or performance benefits.
Objexx provides a range of Fortran migration services:
- Porting to new platforms and compilers.
- Cross-platform redesign.
- Conversion to modern Fortran 95-2008 syntax and idioms.
- Migration to robust object-based designs using derived types and modules.
- Integration with object-oriented C++ or Python front-end and library code.
- Conversion to C++ or Python.
Improving application performance is often an important part of a reengineering projects. This can involve a range of activities including profiling/tuning, development of fast data structures and algorithms, and exploiting parallel computation capabilities of the hardware, as described on the Accelerating Technical Software page.
Reengineering projects usually have a significant testing aspect. It is important to have a strong testing safety net before undertaking major code changes. Legacy code may have poor test coverage with little or no unit or assertion testing. Particularly when converting to a new language it is important to identify and correct bugs that may have more serious impacts in the new language and may present an obstacle to validation of the converted code.
- Adding assertion and unit testing to a legacy application.
- Mock components to facilitate unit and integration testing.
- Special builds to facilitate bug detection with tools such as the Clang sanitizers.
- Running static and dynamic testing tools to identify code issues.
- Mentoring client developers in writing tests and test-driven development.
High-quality documentation can be provided in a variety of source and target formats including LaTeX, AsciiDoc, reStructuredText, DocBook, PDF, HTML, and Word.
Objexx typically provides ongoing development and lifecycle maintenance for reengineering projects.
An Objexx talk on Migrating to a C++ Object Oriented Design.