Introduction

This project portfolio highlights the contributions I have made in for my project, KeyboardFlashCards, also known as KFC. A key part of our software engineering module in the National University of Singapore, we started off by morphing an address book application into our very own product, a Flashcard manager using purely the Command-Line Interface (CLI). This was a key requirement of the project, as we had to ensure users only utilise the application by keying in commands exclusively using the keyboard. In addition, this is a desktop application, used only on a computer.

This is a 6 week software engineering project, where we worked in a team of 5 who are students from the NUS School of Computing. Our team consists of 3 Computer Science sophomores and 2 Computer Engineering seniors (myself included).

Our finalised product, KeyboardFlashCards is an educational tool that aims to make remembering things easy. We wanted to provide an efficient way to study for our peers to NUS School of Computing. As such, we came up with an easy to use, FlashCard manager using CLI for efficient and quick storage of important revision material to aid their study.

Note the following symbols and formatting used in this document.

This section explains certain information that require the user to take note of. i.e. prefixes used in our application and what it represents, certain functionality of the command
This section is used clarify certain possible assumptions the user/developer might have when using our application. These assumptions could result in errors and exceptions in the application.

Summary of contributions

This section shows a summary of the personal contributions I had on our project. Contributions included enhancements to the application with new major features, project management implementations and additions to the documentation in the User Guide and Developer Guide.

  • Major enhancement #1: added the ability to store deadlines in a schedule

    • What it does: This feature allows the user to store specific tasks as deadlines. The user can now add specific dates that are important to their study and revision i.e. exam dates, revision dates. In addition, the user can have an overview of all upcoming deadlines by looking at the pop-up calendar.

    • Justification: This feature improves the product significantly as the user can now ensure they would not miss important dates and can now allocate their study and revision schedule according to these dates.

    • Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.

    • Credits: Credit goes to SirGoose3232 for the JavaFX Calendar GUI which was adapted before adding deadlines.

  • Major enhancement #2: added the ability to perform spaced repetition of FlashCards

    • What it does: This feature allows the user to store specific tasks as deadlines that will be reminded to the user. The user can now add specific dates that are important to their study and revision i.e. Exam dates, revision dates. In addition, the user can have an overview of all upcoming deadlines by looking at the pop-up calendar.

    • Justification: This feature improves the product significantly as the user keep track of FlashCard questions that they are weak at and be reminded to do these questions again. important dates and can now allocate their study and revision schedule according to these dates.

    • Highlights: This feature is not included by chance. I wanted to incorporate an effective study technique that is proven to work based on research. I decided to implement spaced repetition as it was an evidence-based learning technique.

    • Credits: This feature is inspired by the theory of Forgetting Curve by Hermann Ebbinghaus, who theorised that training in mnemonic techniques can help overcome speed of forgetting. One effective way is the use of active recall, especially using Spaced Repetition. I implemented a simple version of spaced repetition through rating of "Bad" FlashCards.

  • Code contributed: [Contributed code]

  • Other contributions

    • Project management

      • Allocated various tasks and issues to the team (Issues)

    • Enhancements to existing features

      • Added new panel with a list of Deadlines on the GUI(Pull requests #105)

    • Documentation

      • Did cosmetic tweaks to existing contents of the User Guide: (Pull requests #147)

      • Added the value proposition of our product, our target user profiles and user stories: (Pull requests #31)

    • Community

      • PRs reviewed (with non-trivial review comments): (Pull requests #151)

      • Reported bugs and suggestions for other teams in the class (Pull requests #23 #53, #177, #246)

    • Tools

      • Integrated a third party library (Gson) to the project (#150)

Contributions to the User Guide

Given below are sections I contributed to the User Guide. They showcase my ability to write documentation targeting end-users.

Add general Deadline: deadline t>TASK d>DUEDATE

This command adds a general Deadline into a list. The list will be displayed on the right-side pane. Note: DUEDATE has to be in dd/MM/yyyy format.

You can refer to the example below. deadline t>CS2103 Exam d>10/12/2019

deadline entry

After keying in the command, the result box will show the success message. The new Deadline will now be shown at the right-side pane.

deadline entered
Note that Deadline(s) entered will be sorted in ascending order i.e. earliest Deadline on index 1
Deadline(s) can only be after/on the current date. Leap year dates are also taken into account.

Remove Deadline from list: remove index

Removes a specific Deadline. The list on the right-side pane will no longer have the Deadline.

remove 2

  • Removes the Deadline at the specified INDEX from the list. The index refers to the index number shown in the displayed Deadline list on the right-side pane. The index must be a positive integer 1, 2, 3, …​

When a Deadline of re-test questions is removed, the list of questions will still be stored in the specific date.

Show monthly calendar with all Deadline(s): calendar

Shows the calendar filled with all deadlines in the month. The calendar will be shown as a new window pop-up.

calendar

The calendar will pop up, seen below.

calendar
The calendar window does not show the specific Deadline, but an overview of all your Deadline(s) for the month ahead.

Rate Flashcard as "Bad", with Deadline to re-test: bad index

Rates a specific FlashCard as "Bad". It will then be stored as a Deadline in the list on the right-side pane.

bad 2

  • Sets the FlashCard specified at INDEX as 'Bad'. The index refers to the index number shown in the displayed deadline list on the right-side pane. The index must be a positive integer 1, 2, 3, …​

Key the above mentioned example into the command box.

BadFlashcard

The command will add the 2nd FlashCard on the list, "How to declare a pointer in C?" as a "Bad" FlashCard. After which, the result box will show the success message. A new Deadline will now be shown at the right side-bar, 3 days later from the day it was entered.

BadFlashcardAdded
"Bad" rated FlashCard(s) will be added to as a Deadline which is due 3 days later. This is an approximated value that based on the theory of Spaced Repetition, referring to Ebbinghaus Forgetting Curve by Hermann Ebbinghaus who hypothesised this theory in 1985.

List all "Bad" FlashCards for a specific date listbad d>DATE

List all the "Bad" rated FlashCard(s) from a specific date. The FlashCard questions will be shown.

listbad d>14/11/2019

listbad
The automated test mode for the "Bad" FlashCard is not functional at this point and will be implemented in KFC v2.0.

Remove a specific "Bad" FlashCard for a specific date removebad d>DATE i>INDEX

You can remove a specific "Bad" rated FlashCard from the list

removebad d>14/11/2019 i>2

You can refer to the example above.

As seen from before, after listing all the "Bad" rated FlashCard(s) for a specific date using listbad d>14/11/2019, you can observe the full list as seen below.

listbad

Afterwards, you can choose to remove as specific "Bad" rated FlashCard from that list. Using the example removebad d>14/11/2019 i>2, you can observe this.

removebad

Once removed, a success message will be shown!

removebadsuccess
Using the remove command to remove a "ToDo: Bad Questions" Deadline does not remove all the "Bad" FlashCard stored for that date.

Contributions to the Developer Guide

Given below are sections I contributed to the Developer Guide. They showcase my ability to write technical documentation and the technical depth of my contributions to the project.

Add and Remove Deadline feature

Implementation

The deadline feature allows the user to add tasks with specific due dates, with a compulsory field of TASK and DUE DATE.

The following are new classes used to integrate the Deadline feature.

  • Deadline — Object class, containing important information such as the Task and DueDate.

  • UniqueDeadlineList — Contains a ObservableList of Deadline objects. The list will be initialised from the storage at start up of application. A Comparator class was added to arrange the list according to ascending DueDate.

  • DeadlineCommand —  Embodies the Deadline command by the user. It will hold all the information about the Deadline that will be added.

  • DeadlineCommandParser — Parses user input and uses it to construct a DeadlineCommand instance.

  • RemoveCommand —  Holds information on which Deadline to be removed. Contains an Index object.

  • RemoveCommandParser — Parses user input and uses it to construct a RemoveCommand instance.

In addition, various Exception classes are added to handle possible runtime errors while adding or removing Deadline(s). This is done to ensure that the user specified Deadline is valid for storage and processing.

  • DuplicateDeadlineException — This exception is thrown when the user attempts to add an identical Deadline object is added into the existing UniqueDeadlineList.

  • DeadlineNotFoundException — This exception is thrown when the user attempts to remove a Deadline object that does not exist in the UniqueDeadlineList.

For the add Deadline feature - deadline, the following are the prefixes for each field
- t> : TASK
- d> : DUE DATE - For DUE DATE : Date format must be in dd/MM/yyyy i.e. 01/01/2020

The upper cased Deadline represents the object class that contains Task and DueDate, while the lower-cased deadline represents the command used to add Deadline objects into our storage.

Given below is an example usage scenario of deadline command:

The user executes deadline t>Complete Homework d>04/10/2020 to add new Deadline to the task of completing homework by the 4th October 2020.

The deadline feature does not allow adding of duplicate/identical Deadline(s). Also, new Deadline(s) must be later than the current date and is a valid type of date i.e. 29/02/2019 is invalid as 2019 is not a leap year.

The following sequence diagram shows how the deadline operation works:

DeadlineSequenceDiagram

The following activity diagram summarizes what happens when a user executes a deadline command.

DeadlineActivityDiagram

The remove command works in a similar way, and hence the sequence and activity diagrams will be omitted for redundancy.

Design considerations

Aspect: How to implement Deadline
  • Alternative 1(current choice): Use command deadline together with prefixes like t> and d>

    • Pros: Easier to implement

    • Cons: User might miss the prefixes hence adding wrong Deadline(s)

  • Alternative 2: Make use of the GUI. after user execute deadline command, an add deadline window would pop up with a section for individual fields

    • Pros: More user friendly

    • Cons: Difficult to implement. Might be slower for the user to key in Deadline(s) as compared to using a one liner with prefixes

Bad rating feature

Implementation

The bad feature allows the user to rate specific FlashCard(s) as "Bad" if they did not perform well on them. These rated FlashCard(s) will then we stored as a Deadline dated 3 days later, where the user will then be reminded to re-test them.

This is a simple implementation of a type of evidence-based learning technique known as Spaced Repetition. This is used as a form of active recall technique which is said to overcome forgetting, theorised by Hermann Ebbinghaus, and his theory of Forgetting Curve.

The following are new classes used to integrate the "Bad" FlashCard rating feature.

  • BadQuestions — Main object class for the feature. Makes use of a HashMap of key-value pairing of a Date String that is converted to a LocalDate class as the key, and the value is a ArrayList of FlashCard(s). This allows ease of search for "Bad" rated FlashCard(s) based on the date stored.

  • BadCommand — Contains a ObservableList of Deadline objects. The list will be initialised from the storage at start up of application. A Comparator class was added to arrange the list according to ascending DueDate.

  • ListBadCommand —  Embodies the Deadline command by the user. It will hold all the information about the Deadline that will be added.

  • RemoveBadCommand — Parses user input and uses it to construct a DeadlineCommand instance.

In addition, two Exception classes are added to handle possible runtime errors while adding new "Bad" FlashCard(s). This is done to ensure that the user specified "Bad" FlashCard is valid for storage and processing.

  • NoBadFlashCardException — This exception is thrown when the user attempts to add an identical Deadline object is added into the existing UniqueDeadlineList.

  • DuplicateFlashCardAndDeadlineException — This exception is thrown when the user attempts to add an identical Deadline object is added into the existing UniqueDeadlineList.

Following are the prefixes for each field:
- bad INDEX
i.e. bad 2

Design considerations

Aspect: How to store "Bad" FlashCard in storage
  • Alternative 1(current choice): Use a HashMap with the specified date as the key and the values as ArrayList of FlashCard(s). Use of the Google Gson library to save and fetch HashMap from and to Json format.

    • Pros: Easier for searching and sorting purposes, as entire FlashCard object is stored and easily referred using the date as key. Can fetch more than just the answer of the FlashCard

    • Cons: Separated from the FlashCard UniqueFlashCardList, which might confuse the user as there will be two different lists of FlashCard

  • Alternative 2: Use similar implementation as how FlashCard and Deadline objects are stored in storage; use an ObservableList that can be displayed in GUI.

    • Pros: Easier to implement, clearer for user to see and fetch these "Bad" rated FlashCard(s)

    • Cons: Difficult to manipulate in the future, especially when we want to implement automated test reminders for these "Bad" rated FlashCard(s). A HashMap will allow easy fetching using the specified date as key