About the Project

HireLah! is targeted to bring greater convenience to interviewers who can type quickly and prefer typing over mouse
commands. Additionally, we included customised features in our desktop apps to help interviewers to manage interviews.

My Role

My role was to create the building blocks of the components of HireLah! such as the attribute, questions, metrics, etc. I have also contributed in creating the CRUD commands for attributes, questions, and metrics. I have also created for the Find Best Interviewees feature. The section that follows the document will follow in more detailed discussion.

I have also made notable contributions to the User Guide and Developer Guide.

Listed in the table below are some notations that are used throughout the document.

Table 1. Legend table
Icon Description

command

Command that can be executed, or a component, class or object in the architecture of the application

Tips that might be helpful in navigating the application

Important information that should be noted

Useful information for a deeper understanding of the command

As shown in Table 1, “Legend table”, these icons associated to their following descriptions, such as commands, tips, important information and useful information, enable greater clarity in understanding the document. Note that useful information will have text enclosed in its box.

Summary of contributions

This section shows a summary of my contributions to the team project.

  • Major enhancement #1: Implemented create, update, and delete feature for attributes, questions, and metrics

    • What it does: It allows the user to perform create, update, and delete commands for attributes, questions, and metrics as fundamental components in interviewing and assessing the capabilities of the interviewees.

    • Justification: It enables the users to take note of which attributes that they want to find in the interviewees they want to interview, questions that would like to be asked, as well as the metrics that could be used as a parameter to systematically rank the interviewees.

    • Highlights: This enhancement is an upgrade of the existing commands from the initial codebase.

  • Major enhancement #2: Implemented Find Best N Interviewees feature

    • What it does: It allows users to list the best N interviewees in the decreasing order, based on a certain parameter, or overall score.

    • Justification: It enables users to determine the top N interviewees that the interviewer wants to hire, either based on overall score, a particular attribute, or even a weighted score.

    • Highlights: This enhancement is relatively challenging, since it is a whole new feature that requires a well-designed strategy to execute the plan.

  • Major enhancement #3: Implemented Load Attributes and Questions from other Session feature

    • What it does: It allows users to load attributes and questions from other sessions

    • Justification: It provides a convenience for the user when the user has multiple sessions with the same attributes and questions. Instead of starting from scratch, the user can add all the attributes and questions in one session, and load from this session for the rest.

    • Highlights: This enhancement requires some time to do it because it involves both Model and Storage to obtain the attributes and questions from the other sessions, which are managed by the Storage, before copying it to the Model.

  • Code contributed: [Collated code]

Other contributions

  • Project management

    • Reminded weekly deadlines in the team

    • Created several milestones on GitHub page

    • Assigned members to issues upon discovery of bugs (Examples: #15, #83)

    • Reviewed Pull Requests (Examples: #57, #121, #173)

  • Enhancements to existing features:

    • Refactored and modified existing classes, to satisfy the requirements of the application

  • Documentation:

    • Cleaned up and rework the User Guide and Developer Guide (Examples: #10, 27, 84)

    • Works on the Instruction for Manual Testing

  • Community:

    • Offered suggestions for other teams in the class (Examples: 12)

Contributions to the User Guide

Listed below are sections I contributed to the User Guide, which includes the create, edit, and delete commands feature for attributes, questions, and metrics, as well as finding the best N interviewees from a certain parameter.

Load Attributes and Questions from other Session

In case of having multiple sessions with the same attributes and questions. There is a load command to load attributes and questions from other session. Therefore, there is no extra work to do.

Command

load attributes <session>
load questions <session>

Example

> load attributes ceo
> load questions janitor

Output:

Loaded attributes from ceo

Loaded questions from janitor
Load


Command Summary

Utility commands

  • Open User Guide: help

  • Exit app: exit

Sessions

  • Start new session: new <session name>
    e.g. new ceo interview

  • Open existing session: open <session name>
    e.g. open ceo interview

  • Delete existing session: delete <session name>
    e.g. delete ceo interview

Initialization Phase

  • Add an interviewee: add interviewee <full name> [-aka <alias>]
    e.g. add interviewee Jane Doe -aka Doe

  • Edit an interviewee: edit interviewee <interviewee> [-n <new full name>] [-aka <new alias>]
    e.g. edit interviewee Jane Doe -n Janice Doe -aka JDoe

  • Delete an interviewee: delete interviewee <interviewee>
    e.g. delete interviewee Doe

  • List interviewees: interviewees

  • Add an attribute: add attribute <attribute>
    e.g. add attribute teamwork

  • Edit an attribute: edit attribute <old attribute> -a <new attribute>
    e.g. edit attribute -a leadership

  • Delete an attribute: delete attribute <attribute>
    e.g. delete attribute productivity

  • List attributes: attributes

  • Add a question: add question <question description>
    e.g. add question What are your relevant experiences?

  • Edit a question: edit question <question number> -q <edited question>
    e.g. edit question 1 -q What do you hope to accomplish in 5 years?

  • Delete a question: delete question <question number>
    e.g. delete question 1

  • List questions: questions

  • Upload resume: upload <interviewee> [-p <path>]

  • Open resume: resume <interviewee>

Interviewing Phase

  • Start: interview <interviewee>
    e.g. interview Jane Doe

  • Add Remarks: <remarks>
    e.g. This guy is good at bluffing

  • Start a Question: :start q<question number>
    e.g. :start q1

  • Score an attribute: :set <attribute> <score>
    e.g. :set Agility 10

  • List attributes: :attributes

  • List metrics: :metrics

  • List questions: :questions

  • Show resume: :resume

  • End: :end

Decision Phase

  • Open an interviewee report: open <interviewee>
    e.g. open Jane Doe

  • Close an interviewee report: close report

  • Export interview report of an interviewee: export <interviewee>

  • Navigate to answer of interviewee: goto q<question number>
    e.g. goto q4

  • Navigate to a time of interviewee: goto <time>
    e.g. goto 30.00

  • Create a new metric: add metric <name> -a <attribute> -w <weight> [-a <attribute> -w <weight>]…​
    e.g. add metric -a ambition -w 0.9 -a leadership -w 0.1

  • List metrics: metrics

  • Find the Best N candidates based on average attribute: interviewees -best <no_of_candidates>

  • Find the Best N candidates based on a particular attribute: interviewees -best <no_of_candidates> -a <attribute>
    e.g. interviewees -best 3 -a strength

  • Find the Best N candidates based on a metric: interviewees -best <no_of_candidates> -m <metric>
    e.g. interviewees -best 5 -m extremeDictatorship

Contributions to the Developer Guide

Listed below are sections I contributed to the Developer Guide, which includes the logic components, which includes the UML diagram, as well as the sequence diagram for an add attribute command.

Logic component

LogicClassDiagram
Figure 1. Structure of the Logic Component

API : Logic.java

  1. Logic uses either the NormalParser or InterviewParser class to parse the user command, depending on the app phase stored in the Model.

  2. This results in a Command object which is executed by the LogicManager.

  3. The command execution can affect the Model (e.g. adding an attribute).

  4. The command execution may also call the storage to save the Model if the command modified the Model.

  5. The result of the command execution is encapsulated as a CommandResult object which is passed back to the Ui.

  6. The CommandResult object then instructs the Ui to perform certain actions, such as displaying the list of the current attribute. CommandResult is subclassed to provide polymorphism on the UI actions performed.

Given below is the Sequence Diagram for interactions within the Logic component for the execute("add attribute leadership") API call.

AddSequenceDiagram
Figure 2. Interactions Inside the Logic Component for the add attribute leadership Command
The lifeline for AddCommandParser should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.
The exact details of how AddAttributeCommand gets the AttributeList from Model, then modifies the list, then passes the AttributeList to Storage is left out in this diagram.

Find Best Interviewees Feature

Description

When an interviewer wants to take a decision on hiring interviewees, it will be cumbersome for the interviewer to take a look of the interviewees' score, to take a decision, especially when it comes to a large scale hiring pool. Therefore, HireLah! provides a Find Best Interviewees feature to show the top interviewees, depending on how many employees the company need, and what kind of employees does the company desire.

Implementation

The Find Best Interviewee feature is facilitated by the BestCommand. It has the following fields:

  • numberOfInterviewees: The number of interviewees that the interviewer wants to hire

  • paramPrefix: The prefix of the parameter that wants to be used as a comparator between interviewees.

  • paramType: The type of parameter that wants to be used by the interviewer. The possible values are the following: OVERALL, METRIC, and ATTRIBUTE.

Given below are several examples of usage scenarios when the user prompts for Best Interviewees:

Scenario 1. When the user provides a command with incomplete compulsory fields (e.g. number of interviewees), the BestCommandParser will throw ParseException, informing that the size provided is not an integer because the parser takes the preamble of the command to get the value for numberOfInterviewees.

FindBestScenario1SequenceDiagram

Scenario 2. When the user provides a command with valid fields, yet there are no interviewees that has been interviewed, a CommandException is thrown instead, informing that there is no interviewee that has been interviewed, thus no result can be shown.

FindBestScenario2SequenceDiagram

Scenario 3. When the user provides a command with multiple parameters that want to be used for a comparator, a ParseException is thrown instead, informing that the user has provided more than 1 parameter.

FindBestScenario3SequenceDiagram

Scenario 4 (Ideal Scenario). Here is the Sequence Diagram for FindBestCommand for an ideal case (minor method calls are omitted):

FindBestSequenceDiagram
Getting the best interviewees from Model

To obtain the list of best interviewees, the BestCommand has a private method called getBest which takes in a model, a comparator, and size. The getBest method retrieves the best interviewees using an Iterator design pattern. It does the following:

  • Retrieve intervieweeList and bestNIntervieweeList from model

  • Clear the current bestNIntervieweeList

  • Since the comparator only compares interviewees that have been interviewed, a filter operation needs to be done to filter out interviewees that have not been interviewed

  • Sort the filtered interviewees based on the comparator

  • Insert the first size interviewees to the bestNIntervieweeList

There are cases where getBest method does not reflect exactly the number of interviewees that the user entered:

  • The number of interviewees that has been interviewed is less than the number of interviewees the user prompted. In this case, all the interviewed interviewees will be shown, in a sorted order based on their score. Therefore, the number of interviewees shown will be less than what the user entered.

  • There are ties between interviewees at the cut-off position. For example, a case where the fifth interviewee, and the sixth interviewee have the same scores, while the user prompts for the best 5 interviewees. In this case, the sixth interviewee will also be shown. Therefore, the number of interviewees shown will be more than what the user entered.

Below is the activity diagram to summarize and show how getBest method works:

GetBestActivityDiagram

Design Considerations

Aspect: How to display the best interviewees
  • Alternative 1 (current choice): Clears the current content of best interviewees, then add the best interviewees one by one.

    • Pros: Easy to implement.

    • Cons: Have a slightly lower execution time.

  • Alternative 2: Creates a new ObservableList for the best interviewee list, then change the Model’s best interviewees list to point to this list, and the MainWindow’s BestIntervieweeListPanel.

    • Pros: Have a slightly faster theoretical execution time.

    • Cons: The implementation is slightly trickier compared to alternative 1 since it involves multiple components of the app.