2020 Reengineering Project: GanttProject

Target Application

GanttProject is free open source software for project scheduling and management. This application focus on creating Gantt charts, which is a bar chart representing project scheduling.  

Links:

 

Assignment

 

1. Contextualization for Strategic Refactoring

Let's supposed you and your team were hired by a hypothetical company to refactor GanttProject since they use this open-source software in their daily activities. Although GanttProject is a good software for project scheduling, it lacks an important feature for the hypothetical company. In this company, employees (resources) can be shared among different projects. Each project has a different manager, and a manager should not have access to another project's schedule. Therefore, each project is on a different file with a specific manager responsible for it. 

The new feature that should be supported in GanttProject is to allow a shared pool of resources amongst different project files. That way, managers can verify resources' disponibility without having to share the whole projects.

 

2. Getting Started Instructions

Please pay attention to the following instructions. You need to send an email to Henrique Rocha and John Businge with:

  • Subject "Reengineering Lab 2020 - GanttProject" if you intend to work on this suggested software; or "Reengineering Lab 2020 - Custom Project" for a custom project proposal. Please try to contact us sooner than the deadline (March 25, 2020) if you want to work on a custom project.
  • Message Body:
    • The full name of the members in your group (including yours). Remember, a maximum of 3 people but you are allowed to work with less than 3 if you want to.
    • If you choose to work on a custom project, then you will need to explain/motivate why this project would allow you to demonstrate your reengineering skills.

 In order to work on this assignment, the following instructions apply:

  • Fork the GitHub project on GanttProject, and clone the source code for your team to work on it. In the Documentation webpage, you can find further instructions on how to build GanttProject (adapt accordingly, as many open source projects are a bit careless with keeping their documentation up-to-date).
  • If you are working on this assignment as a group, then all members should be added to the repository as collaborators.
  • Add the teaching assistants as collaborators to your fork (Henrique's GitHub Id, and John's Github Id).
  • Commit your changes regularly providing information on the activity performed. Any "single" activity that requires file maintenance must be committed as a single commit with a simple description of the maintenance performed. For example, if you change the system to remove a God Class, your commit should be:

refactoring God Class  or fixing God Class (Extract Class)  or fixing God Class (removing code clones)

Another example, let's suppose you also introduced new tests along with the refactoring:

refactoring God Class + new test added

Of course, pushing the tests on a separate commit would also be acceptable (actually, it would be better to do so).

It is not considered good practice to commit a big chunk of modified files without providing a reason that explains why those files have been modified. Therefore, try to split your commits into smaller units (that may help with the grading).

  • Be sure to commit the final version of your reengineering project before the final deadline. The final commit will be considered for evaluation as part of your assignment submission.
 
 

3. Development Activities 

Then, more specifically, we ask you to perform the following activities, and report about these in your project report:

[I. Design recovery]


  1. Describe the current design implementation of the selected feature in GanttProject. Clearly indicate how this design is located in the architecture of the project.


[II. Design]


  1. Compose a generic design that describes how the new functionality / feature should be integrated and how the design handles the interaction with the rest of the system. It should be clear that the new design not only supports the new feature but also does not severely impact the code quality.

    It will be necessary to redesign the test suite in such a way that it can cope with the new feature and design.


[III. Management]

Project Management Image

    1. Estimate the effort required for (i) refactoring towards the new requirements; and (ii) changing/extending the tests.


[IV. Refactoring]

Refactoring

    1. Refactor the current implementation of GanttProject such that it can handle the new feature.

      Adjust/extend the tests of the project to preserve their effectiveness and coverage during and after refactoring.


You will be required to perform a number of techniques presented during the lab sessions. These are:

  • AnalyzingMetrics and Visualization; Duplicated Code Analysis; and Mining Software Repositories.
  • RestructuringTesting; and Refactoring.

This project emphasizes the sound, systematic analysis of the presented problem, the associated solution space and the chosen solution(s). The software reengineering sessions are composed in such a way as to prepare you for such a project. We stimulate you to assess the benefits and drawbacks of the techniques presented in the lab sessions, and ask you to exploit the analysis techniques wisely. You are free to use alternative analysis techniques and tools as much as you deem necessary. 

What concerns the refactoring-part, we emphasize the use of tests. Our minimum requirements are:

  • Determine the extent to which the current tests provide feedback on your future refactoring-steps. Quantify this (i.e., show coverage information).
  • Compose an argument discussing why the tests are (in)adequate for your chosen refactoring scenario, and adjust the tests in case this is required. Be efficient with regard to the time invested in testing.
 
 

4. Evaluation

To show that you have passed the assignment, you will have to demonstrate the following:

  • You possess the knowledge to plan and selected the appropriate reengineering patterns for your project activities.
  • You have made a selection of analysis techniques (e.g., duplicated code analysis, mining software repositories, metric and visualization as seen in the lab sessions, but others are allowed as well), and have applied these techniques in a sound, systematic manner. You have indicated clearly (using screenshots, results of the interpretation of the output of the techniques) how you have used the results of these analysis techniques.
  • You have performed the above 5 activities (decomposed into (i) Design Recovery; (ii) Design; (iii) Management; and (iv) Refactoring) and discussed them in your project report.
  • The restructurings you have applied are behavior preserving.

      • You can demonstrate the mapping between each of the classes from the original structure with the new structure.
      • The compilation process succeeds flawlessly.
      • The tests run without flaws and show increased testing coverage making it more reliable.
  • The introduction of the new design clearly indicates the project is ready to be released in a language of choice. You are not supposed to carry out the refactoring process completely. Select and execute a set of refactorings that sufficiently illustrate your proposed solution.
  • The report is written in a clear manner detailing all the steps and reasoning for the project. Remember that the report is the document that registers all your work. Thus, it is the most important artifact for the evaluation process.

 

5. Report 

Aspects that we typically like to see addressed in the report are:

  • Context: Briefly discuss the context in which you are running your project.
  • The Problem at Hand: Clarify the problem at the base of the project, and indicate its intrinsic difficulties.
  • Reengineering Patterns: You explicitly state the patterns (from the OORP book) that you selected and used throughout the project.
  • Project management: Demonstrate how you have organized the work, and how you are controlling it (instead of the work controlling you!)
      • Scope: What are the boundaries of your project? What is not included in the project?
      • Risks: Which risks were envisioned, and which have been mitigated? What is the priority of the risks that still need to be mitigated? E.g., which external dependencies might have an effect on your outcome? Which alternatives have you prepared in case this risk instantiates?
  • Software reengineering:
      • Tests: How can you verify that you satisfy the requirements? Which testing strategy have you selected, and what are the arguments for this selection? How confident are you that your solution satisfies the requirements?
      • Quality assurance: What are the non-functional requirements? E.g., how do you differentiate between a good and a bad solution?

 

6. Final Remarks

If you have any questions about the project or the report, please contact the assistants.

Note: similar to previous years, it is once again possible to submit your own project proposals. These proposals will be approved in case they provide a well-structured exercise on the reengineering techniques presented in the lab sessions. You can always propose to reengineer another software system, for example, the software system used in your thesis, or written for another case.